# wasmer-js
**Repository Path**: mirrors/wasmer-js
## Basic Information
- **Project Name**: wasmer-js
- **Description**: Wasmer-JS 允许开发人员在 Node 和浏览器中运行 Wasi 模块
- **Primary Language**: JavaScript
- **License**: MIT
- **Default Branch**: main
- **Homepage**: https://www.oschina.net/p/wasmer-js
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2019-10-13
- **Last Updated**: 2025-12-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# The Wasmer JavaScript SDK
[](https://npmjs.org/package/@wasmer/sdk)
[](https://npmjs.org/package/@wasmer/sdk)
[](./LICENSE)
[](https://discord.gg/qBTfsNP7N8)
[](https://wasmerio.github.io/wasmer-js/)
Javascript library for running Wasmer packages at ease, including WASI and WASIX modules.
## Getting Started
### Install from NPM
For instaling `@wasmer/sdk`, run this command in your shell:
```bash
npm install --save @wasmer/sdk
```
You can now run packages from the Wasmer registry:
```js
import { init, Wasmer } from "@wasmer/sdk";
await init();
const pkg = await Wasmer.fromRegistry("python/python");
const instance = await pkg.entrypoint.run({
args: ["-c", "print('Hello, World!')"],
});
const { code, stdout } = await instance.wait();
console.log(`Python exited with ${code}: ${stdout}`);
```
### Use with a `
```
### Using a custom Wasm file
By default, `init` will load the Wasmer SDK WebAssembly file from the package.
If you want to customize this behavior you can pass a custom url to the init, so the the wasm file
of the Wasmer SDK can ve served by your HTTP server instead:
```js
import { init, Wasmer } from "@wasmer/sdk";
import wasmerSDKModule from "@wasmer/sdk/wasm?url";
await init({ module: wasmUrl }); // This inits the SDK with a custom URL
```
### Using a JS with the Wasm bundled
You can also load Wasmer-JS with a js file with the Wasmer SDK WebAssembly file bundled into it (using base64 encoding),
so no extra requests are required. If that's your use case, you can simply import `@wasmer/sdk/wasm-inline`:
```js
import { init, Wasmer } from "@wasmer/sdk";
import wasmerSDKModule from "@wasmer/sdk/wasm-inline";
await init({ module: wasmerSDKModule }); // This uses the inline wasmer SDK version
```
### Cross-Origin Isolation
Browsers have implemented security measures to mitigate the Spectre and Meltdown
vulnerabilities.
These measures restrict the sharing of `SharedArrayBuffer`` objects with Web
Workers unless the execution context is deemed secure.
The `@wasmer/sdk` package uses a threadpool built on Web Workers and requires
sharing the same `SharedArrayBuffer` across multiple workers to enable WASIX
threads to access the same address space. This requirement is crucial even for
running single-threaded WASIX programs because the SDK internals rely on
`SharedArrayBuffer` for communication with Web Workers.
To avoid Cross-Origin Isolation issues, make sure any web pages using
`@wasmer/sdk` are served over HTTPS and have the following headers set:
```yaml
"Cross-Origin-Opener-Policy": "same-origin"
"Cross-Origin-Embedder-Policy": "require-corp"
```
See the [`SharedArrayBuffer` and Cross-Origin Isolation][coi-docs] section under
the *Troubleshooting Common Problems* docs for more.
### Creating packages
Users can create packages providing a manifest and using the `Wasmer.createPackage()` function:
```js
import { init, Wasmer } from "@wasmer/sdk";
await init({ token: "YOUR_TOKEN" });
const manifest = {
command: [
{
module: "wasmer/python:python",
name: "hello",
runner: "wasi",
annotations: {
wasi: {
"main-args": [
"-c",
"print('Hello, js!'); ",
],
},
},
},
],
dependencies: {
"wasmer/python": "3.12.9+build.9",
}
};
let pkg = await Wasmer.createPackage(manifest);
let instance = await pkg.commands["hello"].run();
const output = await instance.wait();
console.log(output)
```
### Publishing packages
User can publish packages following the same flow used to create a package and then calling the `Wasmer.publishPackage()` function:
```js
import { init, Wasmer } from "@wasmer/sdk";
await init({ token: "YOUR_TOKEN" });
const manifest = {
package: {
name: "/"
}
command: [
{
module: "wasmer/python:python",
name: "hello",
runner: "wasi",
annotations: {
wasi: {
"main-args": [
"-c",
"print('Hello, js!'); ",
],
},
},
},
],
dependencies: {
"wasmer/python": "3.12.9+build.9",
}
};
let pkg = await Wasmer.createPackage(manifest);
await Wasmer.publishPackage(pkg);
```
Trying to publish packages without a `package.name` property in the manifest will result in a failure.
### Deploying apps
User can deploy apps by providing an app configuration and calling the `Wasmer.deployApp()` function:
```js
import { init, Wasmer } from "@wasmer/sdk";
// Get your token here: https://wasmer.io/settings/access-tokens
await init({ token: "YOUR_TOKEN" });
let appConfig = {
name: "",
owner: "",
package: "wasmer/hello"
default: true,
};
await Wasmer.deployApp(appConfig);
```
Users can also publish apps with their own packages simply providing the package in the config:
```js
import wasmUrl from "@wasmer/sdk";
// Get your token here: https://wasmer.io/settings/access-tokens
await init({token: "YOUR_TOKEN"});
const echo_server_index = `
async function handler(request) {
const out = JSON.stringify({
env: process.env,
});
return new Response(out, {
headers: { "content-type": "application/json" },
});
}
addEventListener("fetch", (fetchEvent) => {
fetchEvent.respondWith(handler(fetchEvent.request));
});
`;
const manifest =
{
"command": [
{
"module": "wasmer/winterjs:winterjs",
"name": "script",
"runner": "https://webc.org/runner/wasi",
"annotations": {
"wasi": {
"env": [
"JS_PATH=/src/index.js"
],
"main-args": [
"/src/index.js"
]
}
}
}
],
"dependencies": {
"wasmer/winterjs": "1.2.0"
},
"fs": {
"/src": {
"index.js": echo_server_index
}
},
};
let wasmerPackage = await Wasmer.createPackage(manifest);
let appConfig = {
name: "my-echo-env-app",
owner: "edoardo",
package: wasmerPackage,
default: true,
};
let res = await Wasmer.deployApp(appConfig);
console.log(res.url)
```
# Features
The Wasmer SDK Javascript Package supports:
* [X] WASI support
* [X] Environment variables
* [X] FileSystem access
* [X] Command-line arguments
* [X] Stdio
* [X] WASIX support
* [X] Multi-threading
* [X] Spawning sub-processes
* [ ] Networking (on the works)
* [X] Mounting directories inside the WASIX instance
* [X] Running packages from the [Wasmer Registry](https://wasmer.io)
* [X] Platforms
* [X] Browser
* [x] NodeJS
* [ ] Deno
* [X] Registry API
* [X] Create a package
* [X] Publish a package
* [X] Deploy an application
# License
The entire project is under the MIT License. Please read [the
`LICENSE` file][license].
[coi-docs]: https://docs.wasmer.io/javascript-sdk/explainers/troubleshooting#sharedarraybuffer-and-cross-origin-isolation
[license]: https://github.com/wasmerio/wasmer/blob/master/LICENSE