From 6f49f189371f279512db2c68cbedc35cda8fe00d Mon Sep 17 00:00:00 2001 From: Andrea Giammarchi Date: Wed, 26 Jun 2024 14:01:22 +0200 Subject: [PATCH] Updated Polyscript with its workers feature (#2104) * Updated Polyscript with its workers feature * Worked around the inconsistent behavior between Pyodide and MicroPython * Fixed Pyodide greedy access to undesired Proxy fields --- pyscript.core/package-lock.json | 169 ++++++++++-------- pyscript.core/package.json | 8 +- pyscript.core/src/stdlib/pyscript/__init__.py | 3 + pyscript.core/src/stdlib/pyscript/workers.py | 43 +++++ pyscript.core/test/mpy.spec.js | 5 + pyscript.core/test/workers/config.toml | 2 + pyscript.core/test/workers/index.html | 30 ++++ pyscript.core/test/workers/test.py | 19 ++ pyscript.core/test/workers/worker.py | 7 + pyscript.core/types/stdlib/pyscript.d.ts | 1 + 10 files changed, 204 insertions(+), 83 deletions(-) create mode 100644 pyscript.core/src/stdlib/pyscript/workers.py create mode 100644 pyscript.core/test/workers/config.toml create mode 100644 pyscript.core/test/workers/index.html create mode 100644 pyscript.core/test/workers/test.py create mode 100644 pyscript.core/test/workers/worker.py diff --git a/pyscript.core/package-lock.json b/pyscript.core/package-lock.json index 457c1ccd..e3af4581 100644 --- a/pyscript.core/package-lock.json +++ b/pyscript.core/package-lock.json @@ -1,17 +1,17 @@ { "name": "@pyscript/core", - "version": "0.4.52", + "version": "0.4.53", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@pyscript/core", - "version": "0.4.52", + "version": "0.4.53", "license": "APACHE-2.0", "dependencies": { "@ungap/with-resolvers": "^0.1.0", "basic-devtools": "^0.1.6", - "polyscript": "^0.13.7", + "polyscript": "^0.13.8", "sticky-module": "^0.1.1", "to-json-callback": "^0.1.1", "type-checked-collections": "^0.1.7" @@ -22,14 +22,14 @@ "@codemirror/language": "^6.10.2", "@codemirror/state": "^6.4.1", "@codemirror/view": "^6.28.2", - "@playwright/test": "^1.44.1", + "@playwright/test": "^1.45.0", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-terser": "^0.4.4", "@webreflection/toml-j0.4": "^1.1.3", "@xterm/addon-fit": "^0.10.0", "@xterm/addon-web-links": "^0.11.0", - "bun": "^1.1.16", + "bun": "^1.1.17", "chokidar": "^3.6.0", "codemirror": "^6.0.1", "eslint": "^9.5.0", @@ -44,9 +44,9 @@ } }, "node_modules/@codemirror/autocomplete": { - "version": "6.16.2", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.16.2.tgz", - "integrity": "sha512-MjfDrHy0gHKlPWsvSsikhO1+BOh+eBHNgfH1OXs1+DAf30IonQldgMM3kxLDTG9ktE7kDLaA1j/l7KMPA4KNfw==", + "version": "6.16.3", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.16.3.tgz", + "integrity": "sha512-Vl/tIeRVVUCRDuOG48lttBasNQu8usGgXQawBXI7WJAiUDSFOfzflmEsZFZo48mAvAaa4FZ/4/yLLxFtdJaKYA==", "dev": true, "license": "MIT", "dependencies": { @@ -105,9 +105,9 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.0.tgz", - "integrity": "sha512-lsFofvaw0lnPRJlQylNsC4IRt/1lI4OD/yYslrSGVndOJfStc58v+8p9dgGiD90ktOfL7OhBWns1ZETYgz0EJA==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.1.tgz", + "integrity": "sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg==", "dev": true, "license": "MIT", "dependencies": { @@ -462,9 +462,9 @@ } }, "node_modules/@oven/bun-darwin-aarch64": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@oven/bun-darwin-aarch64/-/bun-darwin-aarch64-1.1.16.tgz", - "integrity": "sha512-a5lnLoyyw24n0uvVSSJVT8kZjA7m3xO2FRBenpr+01A+SIkA8q255ybEBEz+7X30M5ZhYJwb11KgkScd0MB8Mg==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@oven/bun-darwin-aarch64/-/bun-darwin-aarch64-1.1.17.tgz", + "integrity": "sha512-HQ02LWSjQ8al2I/lqzlFA30Kqr39/8Cc9CrhPbVoZDvM1oC6rgJOeyiTfWSm9QX5wA6tZZAHrI/mJffC0on+8w==", "cpu": [ "arm64" ], @@ -476,9 +476,9 @@ ] }, "node_modules/@oven/bun-darwin-x64": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64/-/bun-darwin-x64-1.1.16.tgz", - "integrity": "sha512-LYm6KnALYdDJEaxV1HYWIttgQMECMV5akvlnKULDYXp2anxjQDYGoZ4VpVwdDiKel3m/pnG0RSPLDHiX5NCYWg==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64/-/bun-darwin-x64-1.1.17.tgz", + "integrity": "sha512-OiXCKBz3FehOCMCxAA7pUHgE+/Kmbu+INAO+0zUnvLSV2S++UxZVPpseCW/COGtbHVN1F+qTo52rBLNcZBKSLw==", "cpu": [ "x64" ], @@ -490,9 +490,9 @@ ] }, "node_modules/@oven/bun-darwin-x64-baseline": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64-baseline/-/bun-darwin-x64-baseline-1.1.16.tgz", - "integrity": "sha512-NwnowvNIwT9JsLVQ8YgjzobvVYxC3F3bHN7jGTSX6b5ogLQ+LGzRlzFfnRJNV9JbyLLYeA7jQAS0CPvQoon6gQ==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64-baseline/-/bun-darwin-x64-baseline-1.1.17.tgz", + "integrity": "sha512-2y0VY4TjX1YAM0Lo0iMKylF6Z9lU9RItYoHRHWGRRAgdJbxD4sMk4RMP4Q7vcj9kiCmzfxH9vRap5OPpP6CWaw==", "cpu": [ "x64" ], @@ -504,9 +504,9 @@ ] }, "node_modules/@oven/bun-linux-aarch64": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-aarch64/-/bun-linux-aarch64-1.1.16.tgz", - "integrity": "sha512-RiUVrMLuROwezg8iTnTgbkvPz3k7G6o07WGVEXVFr6umxlaRc8jB2uVlc2BCrPtJtm27iJJpu7SnwpHg+Rr8Qw==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-aarch64/-/bun-linux-aarch64-1.1.17.tgz", + "integrity": "sha512-uzP+V2uuVtDiDBWExbUwop9JgSWCgICSPiAuHYODk6zqJMsMnXocVlREVy9g7wS3mxOApn0IE9ak4SyHjsTodw==", "cpu": [ "arm64" ], @@ -518,9 +518,9 @@ ] }, "node_modules/@oven/bun-linux-x64": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.1.16.tgz", - "integrity": "sha512-T6YDz/KnbH/FZH+2QI3C3CZcGqlGe2Nmk5haMvWPlW7y6B/ejQ84/Y88FNxD7V9rSLlnY+PZX5IQjN0rZ/CaHw==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.1.17.tgz", + "integrity": "sha512-aP+0FclnRNrz0s5DTaRbccqW0ZsGWNImHeVw2xUazTNfLiK35YcyIakgzSSE5D+Q/c2wh23Yk6TR6f4Nhmcqtg==", "cpu": [ "x64" ], @@ -532,9 +532,9 @@ ] }, "node_modules/@oven/bun-linux-x64-baseline": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.1.16.tgz", - "integrity": "sha512-AWD3Kmb7gvlVqyW8qk/2MbHPS/HzsoNYz0SVjKiJMMzDbRE7cILk5OSYafi+iSnJKy1Qw7p25LP6LpkGzrBnyA==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.1.17.tgz", + "integrity": "sha512-rwBJT8TCeA2dplaTLLniOz6HU+eWIoYEKHlvp2WJ0uWP/1nWyXd78Xq0G69vgFJPcOVT52R3aE/K5hK9MkTEbg==", "cpu": [ "x64" ], @@ -546,9 +546,9 @@ ] }, "node_modules/@oven/bun-windows-x64": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64/-/bun-windows-x64-1.1.16.tgz", - "integrity": "sha512-HMcwQq0lvqSbbXMqrUhLIwhOAMdt5IUCTPDkcMEPKQpWk7FUTfLkeH/8928kqpVmN7LHHH7I9PqMY7Q/Q3gZBA==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64/-/bun-windows-x64-1.1.17.tgz", + "integrity": "sha512-ap9ZVcC2hsoNRyf77C4aZ6hWupXXOQG4WmL/K3i07p9toTPAhJUmcsr5jGQ9wH98lm6vRsGd49jjOp0tIDUUhA==", "cpu": [ "x64" ], @@ -560,9 +560,9 @@ ] }, "node_modules/@oven/bun-windows-x64-baseline": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64-baseline/-/bun-windows-x64-baseline-1.1.16.tgz", - "integrity": "sha512-SspbjEgeXh7NkB61rhHcQDGqWl/nPQcn7NKb5wkxZyDmrwITciq2J8iaYsw/WEyYUFubjkjvpJala+cGS7voLA==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64-baseline/-/bun-windows-x64-baseline-1.1.17.tgz", + "integrity": "sha512-mSATxyrFXmoMHk5Xz8rsAsc9fmhp0JCMO8++qaQh0dTeObOKtbgx/O5Txv3RQV8PfndYGOjiRHBmV3Mqqlatfg==", "cpu": [ "x64" ], @@ -585,19 +585,19 @@ } }, "node_modules/@playwright/test": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.44.1.tgz", - "integrity": "sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.45.0.tgz", + "integrity": "sha512-TVYsfMlGAaxeUllNkywbwek67Ncf8FRGn8ZlRdO291OL3NjG9oMbfVhyP82HQF0CZLMrYsvesqoUekxdWuF9Qw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.44.1" + "playwright": "1.45.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@rollup/plugin-commonjs": { @@ -1202,9 +1202,9 @@ } }, "node_modules/bun": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/bun/-/bun-1.1.16.tgz", - "integrity": "sha512-t2AwDuJsLA3cBAxNQv/hJ66SLGtVkKFjrxdpcztkUwjVst6G9ynWiVwQOlg6VSN7niF2EZptTvDg6Jb+MKEGMQ==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/bun/-/bun-1.1.17.tgz", + "integrity": "sha512-x2vUqI75XQ11Qxb3FzQCd/AkbA8A3AiJ35xfw49JeNgu0MTi0RCuW+1zOyFf5iJM0xU07LKf2H69n4ASuEqhtQ==", "cpu": [ "arm64", "x64" @@ -1222,14 +1222,14 @@ "bunx": "bin/bun.exe" }, "optionalDependencies": { - "@oven/bun-darwin-aarch64": "1.1.16", - "@oven/bun-darwin-x64": "1.1.16", - "@oven/bun-darwin-x64-baseline": "1.1.16", - "@oven/bun-linux-aarch64": "1.1.16", - "@oven/bun-linux-x64": "1.1.16", - "@oven/bun-linux-x64-baseline": "1.1.16", - "@oven/bun-windows-x64": "1.1.16", - "@oven/bun-windows-x64-baseline": "1.1.16" + "@oven/bun-darwin-aarch64": "1.1.17", + "@oven/bun-darwin-x64": "1.1.17", + "@oven/bun-darwin-x64-baseline": "1.1.17", + "@oven/bun-linux-aarch64": "1.1.17", + "@oven/bun-linux-x64": "1.1.17", + "@oven/bun-linux-x64-baseline": "1.1.17", + "@oven/bun-windows-x64": "1.1.17", + "@oven/bun-windows-x64-baseline": "1.1.17" } }, "node_modules/callsites": { @@ -1256,9 +1256,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001637", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001637.tgz", + "integrity": "sha512-1x0qRI1mD1o9e+7mBI7XtzFAP4XszbHaVWsMiGbSPLYekKTJF7K+FNk6AsXH4sUpc+qrsI3pVgf1Jdl/uGkuSQ==", "dev": true, "funding": [ { @@ -1705,9 +1705,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.805", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.805.tgz", - "integrity": "sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==", + "version": "1.4.812", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.812.tgz", + "integrity": "sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==", "dev": true, "license": "ISC" }, @@ -2078,9 +2078,9 @@ } }, "node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "license": "ISC", "dependencies": { @@ -2088,6 +2088,7 @@ "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { @@ -2124,9 +2125,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -2304,13 +2305,16 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2774,6 +2778,13 @@ "node": ">=8" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2871,35 +2882,35 @@ "license": "ISC" }, "node_modules/playwright": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.1.tgz", - "integrity": "sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.0.tgz", + "integrity": "sha512-4z3ac3plDfYzGB6r0Q3LF8POPR20Z8D0aXcxbJvmfMgSSq1hkcgvFRXJk9rUq5H/MJ0Ktal869hhOdI/zUTeLA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.44.1" + "playwright-core": "1.45.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.1.tgz", - "integrity": "sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.0.tgz", + "integrity": "sha512-lZmHlFQ0VYSpAs43dRq1/nJ9G/6SiTI7VPqidld9TDefL9tX87bTKExWZZUF5PeRyqtXqd8fQi2qmfIedkwsNQ==", "dev": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/playwright/node_modules/fsevents": { @@ -2918,9 +2929,9 @@ } }, "node_modules/polyscript": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/polyscript/-/polyscript-0.13.7.tgz", - "integrity": "sha512-GVJHVw3EjNgWyZIN1yKVd2AtzF+ARwYGYvzN5VHO0WqWXL3w+8CifQIbEDgBgvalOWfF/YxyK4C+0LKVx9lnGA==", + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/polyscript/-/polyscript-0.13.8.tgz", + "integrity": "sha512-TWaguInlgyN9FKT+GrKPc83VcRISevXIAVOetHLoJP8pGG38RRvdOKTZWyhE4bUzl0FLo6xo33TgOgv+zKP1kA==", "license": "APACHE-2.0", "dependencies": { "@ungap/structured-clone": "^1.2.0", diff --git a/pyscript.core/package.json b/pyscript.core/package.json index 03c53082..d84a354d 100644 --- a/pyscript.core/package.json +++ b/pyscript.core/package.json @@ -1,6 +1,6 @@ { "name": "@pyscript/core", - "version": "0.4.52", + "version": "0.4.53", "type": "module", "description": "PyScript", "module": "./index.js", @@ -44,7 +44,7 @@ "dependencies": { "@ungap/with-resolvers": "^0.1.0", "basic-devtools": "^0.1.6", - "polyscript": "^0.13.7", + "polyscript": "^0.13.8", "sticky-module": "^0.1.1", "to-json-callback": "^0.1.1", "type-checked-collections": "^0.1.7" @@ -55,14 +55,14 @@ "@codemirror/language": "^6.10.2", "@codemirror/state": "^6.4.1", "@codemirror/view": "^6.28.2", - "@playwright/test": "^1.44.1", + "@playwright/test": "^1.45.0", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-terser": "^0.4.4", "@webreflection/toml-j0.4": "^1.1.3", "@xterm/addon-fit": "^0.10.0", "@xterm/addon-web-links": "^0.11.0", - "bun": "^1.1.16", + "bun": "^1.1.17", "chokidar": "^3.6.0", "codemirror": "^6.0.1", "eslint": "^9.5.0", diff --git a/pyscript.core/src/stdlib/pyscript/__init__.py b/pyscript.core/src/stdlib/pyscript/__init__.py index 518ede3b..8368daf5 100644 --- a/pyscript.core/src/stdlib/pyscript/__init__.py +++ b/pyscript.core/src/stdlib/pyscript/__init__.py @@ -46,6 +46,9 @@ from pyscript.magic_js import ( from pyscript.storage import Storage, storage from pyscript.websocket import WebSocket +if not RUNNING_IN_WORKER: + from pyscript.workers import create_named_worker, workers + try: from pyscript.event_handling import when except: diff --git a/pyscript.core/src/stdlib/pyscript/workers.py b/pyscript.core/src/stdlib/pyscript/workers.py new file mode 100644 index 00000000..019ce30d --- /dev/null +++ b/pyscript.core/src/stdlib/pyscript/workers.py @@ -0,0 +1,43 @@ +import js as _js +from polyscript import workers as _workers + +_get = _js.Reflect.get + + +def _set(script, name, value=""): + script.setAttribute(name, value) + + +# this solves an inconsistency between Pyodide and MicroPython +# @see https://github.com/pyscript/pyscript/issues/2106 +class _ReadOnlyProxy: + def __getitem__(self, name): + return _get(_workers, name) + + def __getattr__(self, name): + return _get(_workers, name) + + +workers = _ReadOnlyProxy() + + +async def create_named_worker(src="", name="", config=None, type="py"): + from json import dumps + + if not src: + raise ValueError("Named workers require src") + + if not name: + raise ValueError("Named workers require a name") + + s = _js.document.createElement("script") + s.type = type + s.src = src + _set(s, "worker") + _set(s, "name", name) + + if config: + _set(s, "config", isinstance(config, str) and config or dumps(config)) + + _js.document.body.append(s) + return await workers[name] diff --git a/pyscript.core/test/mpy.spec.js b/pyscript.core/test/mpy.spec.js index 7805eb45..c740f4f9 100644 --- a/pyscript.core/test/mpy.spec.js +++ b/pyscript.core/test/mpy.spec.js @@ -93,3 +93,8 @@ test('MicroPython + Storage', async ({ page }) => { await page.goto('http://localhost:8080/test/storage.html'); await page.waitForSelector('html.ok'); }); + +test('MicroPython + workers', async ({ page }) => { + await page.goto('http://localhost:8080/test/workers/index.html'); + await page.waitForSelector('html.mpy.py'); +}); diff --git a/pyscript.core/test/workers/config.toml b/pyscript.core/test/workers/config.toml new file mode 100644 index 00000000..7cb628e8 --- /dev/null +++ b/pyscript.core/test/workers/config.toml @@ -0,0 +1,2 @@ +[files] +"./test.py" = "./test.py" diff --git a/pyscript.core/test/workers/index.html b/pyscript.core/test/workers/index.html new file mode 100644 index 00000000..b0ab9a72 --- /dev/null +++ b/pyscript.core/test/workers/index.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + diff --git a/pyscript.core/test/workers/test.py b/pyscript.core/test/workers/test.py new file mode 100644 index 00000000..55a99a42 --- /dev/null +++ b/pyscript.core/test/workers/test.py @@ -0,0 +1,19 @@ +from pyscript import document, workers + + +async def test(interpreter): + # accessed as item + named = await workers.micropython_version + + version = await named.micropython_version() + document.body.append(version) + document.body.append(document.createElement("hr")) + + # accessed as attribute + named = await workers["pyodide_version"] + + version = await named.pyodide_version() + document.body.append(version) + document.body.append(document.createElement("hr")) + + document.documentElement.classList.add(interpreter) diff --git a/pyscript.core/test/workers/worker.py b/pyscript.core/test/workers/worker.py new file mode 100644 index 00000000..59b78330 --- /dev/null +++ b/pyscript.core/test/workers/worker.py @@ -0,0 +1,7 @@ +def micropython_version(): + import sys + + return sys.version + + +__export__ = ["micropython_version"] diff --git a/pyscript.core/types/stdlib/pyscript.d.ts b/pyscript.core/types/stdlib/pyscript.d.ts index 8dd1c7c3..88a4f2b8 100644 --- a/pyscript.core/types/stdlib/pyscript.d.ts +++ b/pyscript.core/types/stdlib/pyscript.d.ts @@ -16,6 +16,7 @@ declare namespace _default { "media.py": string; }; "websocket.py": string; + "workers.py": string; }; let pyweb: { "__init__.py": string;