# APIs do Node.js

O Azion Runtime é compatível com uma parte das APIs do Node.js, não com todas. Uma function, e cada pacote npm de que ela depende, pode importar os 68 módulos do Node.js da tabela abaixo. Cada um é resolvido quando o build empacota a function e carrega em uma function após o deploy e no `azion dev`. O status de um módulo informa quanto da API dele funciona quando a function o chama.

> **nota**
>
> No `azion dev`, alguns módulos se comportam de forma diferente de uma function após o deploy. Os caminhos de `node:fs` são resolvidos na pasta `.edge/storage/` do projeto, um import de `pipeline` de `node:stream` faz o build falhar, e `timingSafeEqual()` e `generateKeyPairSync()` de `node:crypto` lançam erro.

---

## Importação de módulos

Uma function importa um módulo do Node.js com a sintaxe padrão de `import` e o prefixo `node:`:

```javascript
import { AsyncLocalStorage } from "node:async_hooks";
import os from "node:os";
```

Um polyfill é um código que adiciona um recurso a um ambiente que não o tem. O build resolve por meio de polyfills as APIs do Node.js que o runtime não oferece, e a configuração `polyfills` do [azion.config.js](/pt-br/documentacao/devtools/cli/azion-config-js/) define se o build os adiciona. A lista de APIs que o build resolve por meio de polyfills está no [pacote `@aziontech/unenv-preset`](https://github.com/aziontech/lib/blob/main/packages/unenv-preset/src/index.ts), que também aceita contribuições.

---

## Suporte aos módulos

A tabela lista cada módulo com o seu status. Quando existe uma página do módulo, o nome do módulo leva a ela. A coluna Observações informa o que uma function recebe quando chama o módulo, quando esse comportamento é conhecido.

- 🟢 **Suportado**: a API funciona normalmente em tempo de execução.
- 🟡 **Parcialmente suportado**: apenas alguns métodos ou recursos estão disponíveis.
- 🔴 **Somente para build**: o módulo é incluído para que o build seja concluído sem erros, mas as chamadas à API dele não funcionam em tempo de execução.

> **nota**
>
> Uma function na Azion executa dentro de uma **Cell**, o ambiente de isolamento que a Azion constrói sobre **V8 isolates**. Uma Cell é um contexto de execução leve e seguro, e o código dentro dela não tem acesso direto ao sistema operacional subjacente.
>
> Por segurança multilocatário e integridade da infraestrutura, uma Cell não oferece a uma function:
>
> - As propriedades da máquina que a executa. `node:os` e `process` retornam valores fixos no lugar delas, como `linux` para `os.platform()`, uma string vazia para `os.hostname()` e `0` para `os.totalmem()`.
> - Resolução de DNS por meio de chamadas de sistema nativas (`node:dns`, `node:dns/promises`).
> - Sockets TCP ou UDP de baixo nível que exigem chamadas de sistema diretas.
>
> Os módulos marcados como 🔴 **Somente para build** são incluídos como stubs, para que pacotes npm com imports estáticos deles ainda passem pelo build. As chamadas deles não funcionam em tempo de execução: `dns.lookup()` lança `Error: [unenv] dns.lookup is not implemented yet!`.

| Módulo                                                                       | Status                    | Observações                                                                                                                                                                                                                                                                                                                                                           |
| ---------------------------------------------------------------------------- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| \_http\_agent                                                                | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| \_http\_client                                                               | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| \_http\_common                                                               | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| \_http\_incoming                                                             | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| \_http\_outgoing                                                             | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| \_http\_server                                                               | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| \_stream\_duplex                                                             | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| \_stream\_passthrough                                                        | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| \_stream\_readable                                                           | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| \_stream\_transform                                                          | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| \_stream\_wrap                                                               | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| \_stream\_writable                                                           | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| \_tls\_common                                                                | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| \_tls\_wrap                                                                  | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| assert                                                                       | 🟡 Parcialmente suportado | `assert.strictEqual(1, 2)` lança um `AssertionError`.                                                                                                                                                                                                                                                                                                                 |
| assert/strict                                                                | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| [async\_hooks](/pt-br/documentacao/devtools/runtime/node/async-hooks/)       | 🟡 Parcialmente suportado | Apenas [AsyncLocalStorage](https://nodejs.org/api/async_context.html#class-asynclocalstorage) e [AsyncResource](https://nodejs.org/api/async_hooks.html#class-asyncresource) estão implementados, e ambos funcionam. [Exemplo de código](https://github.com/aziontech/azion-samples/tree/dev/samples/node-async-hooks).                                               |
| [buffer](/pt-br/documentacao/devtools/runtime/node/buffer/)                  | 🟡 Parcialmente suportado | `Buffer` também é uma global. As funções de nível de módulo, como `buffer.isAscii()`, não são suportadas.                                                                                                                                                                                                                                                             |
| child\_process                                                               | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| cluster                                                                      | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| console                                                                      | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| constants                                                                    | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| [crypto](/pt-br/documentacao/devtools/runtime/node/crypto/)                  | 🟡 Parcialmente suportado | `createHash()`, `createHmac()`, `randomBytes()`, `randomUUID()` e `subtle` funcionam.                                                                                                                                                                                                                                                                                 |
| dgram                                                                        | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| diagnostics\_channel                                                         | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| dns                                                                          | 🔴 Somente para build     | `dns.lookup()` lança `Error: [unenv] dns.lookup is not implemented yet!`.                                                                                                                                                                                                                                                                                             |
| dns/promises                                                                 | 🔴 Somente para build     | —                                                                                                                                                                                                                                                                                                                                                                     |
| domain                                                                       | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| [events](/pt-br/documentacao/devtools/runtime/node/events/)                  | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| [fs](/pt-br/documentacao/devtools/runtime/node/fs/)                          | 🟡 Parcialmente suportado | Uma function não pode gravar arquivos: `fs.writeFileSync()` lança `Error: unsupported`. As leituras síncronas usam o sistema de arquivos em memória que a configuração `build.memoryFS` preenche. Em um caminho que o build não incorporou, `fs.readFileSync()` lança `ENOENT`, e a forma com callback de `fs.readFile()` recebe `Error: missing storage annotation`. |
| fs/promises                                                                  | 🟡 Parcialmente suportado | Em um caminho que o build não incorporou, `readFile()`, `writeFile()`, `readdir()` e `stat()` rejeitam com `Error: missing storage annotation`.                                                                                                                                                                                                                       |
| [http](/pt-br/documentacao/devtools/runtime/node/http/)                      | 🟡 Parcialmente suportado | `http.STATUS_CODES` e `http.METHODS` podem ser lidos. `http.request()`, `http.get()` e `http.createServer()` lançam `[unenv] … is not implemented yet!`.                                                                                                                                                                                                              |
| http2                                                                        | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| https                                                                        | 🟡 Parcialmente suportado | `https.get()` lança `Error: [unenv] https.get is not implemented yet!`.                                                                                                                                                                                                                                                                                               |
| inspector                                                                    | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| inspector/promises                                                           | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| [module](/pt-br/documentacao/devtools/runtime/node/module/)                  | 🟡 Parcialmente suportado | Comporta-se da mesma forma em uma function após o deploy e no `azion dev`. `module.builtinModules` lista 65 nomes, e `module.createRequire()` retorna `undefined`.                                                                                                                                                                                                    |
| net                                                                          | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| [os](/pt-br/documentacao/devtools/runtime/node/os/)                          | 🟡 Parcialmente suportado | Todos os membros retornam sem lançar erro, com valores fixos que não descrevem a máquina: `os.platform()` retorna `linux`, `os.type()` retorna `Linux` e `os.hostname()` retorna uma string vazia.                                                                                                                                                                    |
| [path](/pt-br/documentacao/devtools/runtime/node/path/)                      | 🟢 Suportado              | Todas as funções operam sobre strings de caminho, sem acesso ao sistema de arquivos.                                                                                                                                                                                                                                                                                  |
| path/posix                                                                   | 🟢 Suportado              | `path.posix.join()` retorna os mesmos caminhos que `path.join()`.                                                                                                                                                                                                                                                                                                     |
| path/win32                                                                   | 🟡 Parcialmente suportado | Une os segmentos com `/`: `path.win32.join("C:\\a", "b")` retorna `C:/a/b`.                                                                                                                                                                                                                                                                                           |
| perf\_hooks                                                                  | 🟢 Suportado              | `performance.now()` é uma função.                                                                                                                                                                                                                                                                                                                                     |
| [process](/pt-br/documentacao/devtools/runtime/node/process/)                | 🟡 Parcialmente suportado | `process.env` contém as variáveis de ambiente da sua conta: leia uma delas como `process.env.VAR_NAME`. `process.platform` e `process.arch` são strings vazias, e `process.pid` é `200`.                                                                                                                                                                              |
| punycode                                                                     | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| querystring                                                                  | 🟡 Parcialmente suportado | `querystring.stringify({ a: [1, 2], b: 'x y' })` retorna `a=1&a=2&b=x%20y`.                                                                                                                                                                                                                                                                                           |
| readline                                                                     | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| readline/promises                                                            | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| repl                                                                         | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| [stream](/pt-br/documentacao/devtools/runtime/node/stream/)                  | 🟡 Parcialmente suportado | `Readable`, `Writable`, `Duplex`, `Transform`, `PassThrough` e a forma com callback de `pipeline()` funcionam.                                                                                                                                                                                                                                                        |
| stream/consumers                                                             | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| stream/promises                                                              | 🟡 Parcialmente suportado | `pipeline()` lança `Error: [unenv] stream.promises.pipeline is not implemented yet!`.                                                                                                                                                                                                                                                                                 |
| stream/web                                                                   | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| [string\_decoder](/pt-br/documentacao/devtools/runtime/node/string-decoder/) | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| sys                                                                          | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| [timers](/pt-br/documentacao/devtools/runtime/node/timers/)                  | 🟡 Parcialmente suportado | O callback de um timer deve ser uma função: uma string ou um número no lugar dele lança `EvalError: eval not allowed on setTimeout/setInterval parameter`.                                                                                                                                                                                                            |
| timers/promises                                                              | 🟡 Parcialmente suportado | O iterador assíncrono que `setInterval()` retorna produz um valor e depois termina.                                                                                                                                                                                                                                                                                   |
| tls                                                                          | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| trace\_events                                                                | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| tty                                                                          | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| [url](/pt-br/documentacao/devtools/runtime/node/url/)                        | 🟡 Parcialmente suportado | `URL` e `URLSearchParams` são globais. `url.parse()`, `url.format()`, `url.resolve()`, `url.fileURLToPath()`, `url.pathToFileURL()` e `url.domainToASCII()` funcionam.                                                                                                                                                                                                |
| [util](/pt-br/documentacao/devtools/runtime/node/utils/)                     | 🟡 Parcialmente suportado | `util.promisify()`, `util.inspect()` e `util.format()` funcionam.                                                                                                                                                                                                                                                                                                     |
| util/types                                                                   | 🟡 Parcialmente suportado | `util.types.isNativeError()` lança `Error: [unenv] util.types.isNativeError is not implemented yet!`.                                                                                                                                                                                                                                                                 |
| v8                                                                           | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| [vm](/pt-br/documentacao/devtools/runtime/node/vm/)                          | 🟡 Parcialmente suportado | Nenhum método executa código: `runInThisContext()`, `runInNewContext()`, `runInContext()` e `Script.runInThisContext()` lançam `[unenv] … is not implemented yet!`.                                                                                                                                                                                                   |
| wasi                                                                         | 🟢 Suportado              | —                                                                                                                                                                                                                                                                                                                                                                     |
| worker\_threads                                                              | 🟡 Parcialmente suportado | —                                                                                                                                                                                                                                                                                                                                                                     |
| [zlib](/pt-br/documentacao/devtools/runtime/node/zlib/)                      | 🟡 Parcialmente suportado | `zlib.constants` está disponível, mas nenhuma função comprime dados: `zlib.gzipSync()` lança `Error: [unenv] zlib.gzipSync is not implemented yet!`. Para comprimir dados, use a API Web `CompressionStream`.                                                                                                                                                         |

---

## Recursos relacionados

- [Web APIs](/pt-br/documentacao/devtools/runtime/api-reference/javascript.md): As Web APIs que uma function pode chamar, como fetch e as APIs de stream.
- [Compatibilidade com frameworks](/pt-br/documentacao/devtools/runtime/frameworks/compatibilidade-frameworks.md): Os frameworks web que passam pelo build e executam no Azion Runtime.
- [Use APIs do Node.js com polyfills](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/functions-e-runtime/use-polyfills.md): Como o build resolve APIs do Node.js por meio de polyfills, mostrado em um projeto JavaScript.
- [Globais](/pt-br/documentacao/devtools/runtime/api-reference/azion-runtime-globals.md): Os objetos globais do Azion Runtime, que uma function usa sem import.
