open-index/open-npm huggingface dataset:
npm package: @pyscript/bridge
Description: A JS based way to use PyScript modules
Author: Anaconda Inc.
Latest version: 0.2.2

# @pyscript/bridge

Import Python utilities directly in JS

```js
// main thread
const { ffi: { func_a, func_b } } = await import('./test.js');

// test.js
import bridge from 'https://esm.run/@pyscript/bridge';
export const ffi = bridge(import.meta.url, { type: 'mpy', worker: false });

// test.py
def func_a(value):
    print(f"hello {value}")

def func_b():
    import sys
    return sys.version
```

### Options

  * **pyscript**: the release version to automatically import if not already available on the page. If no version is provided the *developers' channel* version will be used instead (for developers' purposes only).
  * **type**: `py` by default to bootstrap *Pyodide*.
  * **worker**: `true` by default to bootstrap in a *Web Worker*.
  * **config**: either a *string* or a PyScript compatible config *JS literal* to make it possible to bootstrap files and whatnot. If specified, the `worker` becomes implicitly `true` to avoid multiple configs conflicting on the main thread.
  * **env**: to share the same environment across multiple modules loaded at different times.


## Tests

Run `npx mini-coi .` within this folder to then reach out `http://localhost:8080/test/` that will show:

```
PyScript Bridge
------------------
no config
```

The [test.js](./test/test.js) files uses the following defaults:

  * `pyscript` as `"2025.8.1"`
  * `type` as `"mpy"`
  * `worker` as `false`
  * `config` as `undefined`
  * `env` as `undefined`

To test any variant use query string parameters so that `?type=py` will use `py` instead, `worker` will use a worker and `config` will use a basic *config* that brings in another file from the same folder which exposes the version.

To recap: `http://localhost:8080/test/?type=py&worker&config` will show this instead:

```
PyScript Bridge
------------------
3.12.7 (main, May 15 2025, 18:47:24) ...
```

Please note when a *config* is used, the `worker` attribute is always `true`.
npm package: @pyscript/sw
Description: PyScript Service Worker
Author: Anaconda Inc.
Latest version: 0.0.1

# @pyscript/sw

<sup>**[PyScript](https://github.com/pyscript/pyscript) Service Worker**</sup>

---

## Documentation

This module provides a single, standalone, *script* able to bootstrap a Service Worker which can drive a whole site via Python code.

Please note the file *must* be available locally and it *must not* be loaded as a module, as a Service Worker is *not a module*.

### Example

This is the bare minimal example of an `index.html` file at the root of the site.

```html
<!doctype html>
<script src="./pyscript.sw.js"
        handler="./handler.py"
        config="./handler_config.toml"
        scope="."></script>
```

  * **src** is where the PyScript Service Worker is located.
  * **handler** is where Python code is located. This *must* provide a `handle_request` method that will be invoked per each browsing *fetch* operation. Such method should return a `[body, status, headers]` tuple where *body* is the content of the page, *status* is its *HTTP* status and *headers* contain the `content-type` or any other useful header.
  * **config** is an *optional* attribute that indicates packages to load, files to fetch, and all other usual [py-config goodness](https://docs.pyscript.net/latest/reference/elements/py-config.html).
  * **scope** (advanced use-case) is an *optional* attribute that indicates [where the Service Worker operates](https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerGlobalScope). By default it operates from the same folder, and any subfolder, the `pyscript.sw.js` is.

#### How to update `handle_request`

Because the Service Worker, once activated, will persist over any further session, it is pretty hard to change its operating handler.

To do so, there are two options:

  * unregister the Service Worker, clear all browsing data per that domain and hard-refresh the browser
  * change and save your `handler.py` file and, once saved, reach the `/pyscript.sw/update_handler` via browser, or run the following code in console:

```js
fetch('/pyscript.sw/update_handler')
  .then(b => b.text())
  .then(console.log, console.error);
```

This operation will be intercepted behind the scene and the new file will be parsed.

The result should be an `OK` response, with status `200`, or an error message with status `500` handled by the `console.error` or visible within the page once reached.