From 4cefe662d4875884f4063a071b2b057f1f733863 Mon Sep 17 00:00:00 2001 From: Kai Salmen Date: Sat, 2 Dec 2023 21:40:58 +0100 Subject: [PATCH] WorkerTaskMessage uuid handling is done internal. WorkerTaskMessageConfig is only used for config --- package-lock.json | 622 +++++++++++------- package.json | 14 +- packages/examples/package.json | 10 +- packages/examples/src/com/WorkerCom.ts | 7 +- .../examples/src/helloWorld/HelloWorld.ts | 2 +- .../src/helloWorld/HelloWorldWorkerTask.ts | 2 +- .../infinite/PotentiallyInfiniteExample.ts | 60 +- packages/examples/src/threejs/Threejs.ts | 49 +- .../src/transferables/TransferablesTestbed.ts | 20 +- packages/examples/src/worker/Com1Worker.ts | 41 +- packages/examples/src/worker/Com2Worker.ts | 44 +- .../src/worker/HelloWorldThreeWorker.ts | 19 +- .../examples/src/worker/HelloWorldWorker.ts | 13 +- .../worker/InfiniteWorkerExternalGeometry.ts | 15 +- .../worker/InfiniteWorkerInternalGeometry.ts | 17 +- .../examples/src/worker/OBJLoaderWorker.ts | 27 +- .../src/worker/TransferableWorkerTest1.ts | 17 +- .../src/worker/TransferableWorkerTest2.ts | 17 +- .../src/worker/TransferableWorkerTest3.ts | 17 +- .../src/worker/TransferableWorkerTest4.ts | 13 +- packages/wtd-core/package.json | 2 +- packages/wtd-core/src/WorkerTask.ts | 57 +- packages/wtd-core/src/WorkerTaskDirector.ts | 32 +- packages/wtd-core/src/WorkerTaskMessage.ts | 50 +- packages/wtd-core/src/WorkerTaskWorker.ts | 36 +- .../wtd-core/src/offscreen/OffscreenWorker.ts | 14 +- packages/wtd-three-ext/package.json | 8 +- 27 files changed, 704 insertions(+), 521 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9dbdc84..6090207 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,15 +14,15 @@ "packages/examples" ], "devDependencies": { - "@types/node": "~18.18.8", - "@typescript-eslint/eslint-plugin": "~6.9.1", + "@types/node": "~18.18.14", + "@typescript-eslint/eslint-plugin": "~6.13.1", "editorconfig": "~2.0.0", - "eslint": "~8.52.0", + "eslint": "~8.55.0", "shx": "~0.3.4", - "typedoc": "~0.25.3", - "typedoc-plugin-markdown": "~3.17.0", - "typescript": "~5.2.2", - "vite": "~4.5.0", + "typedoc": "~0.25.4", + "typedoc-plugin-markdown": "~3.17.1", + "typescript": "~5.3.2", + "vite": "~5.0.4", "vitest": "~0.34.6" } }, @@ -36,9 +36,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", + "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", "cpu": [ "arm" ], @@ -52,9 +52,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", + "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", "cpu": [ "arm64" ], @@ -68,9 +68,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", + "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", "cpu": [ "x64" ], @@ -84,9 +84,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", + "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", "cpu": [ "arm64" ], @@ -100,9 +100,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", + "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", "cpu": [ "x64" ], @@ -116,9 +116,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", + "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", "cpu": [ "arm64" ], @@ -132,9 +132,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", + "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", "cpu": [ "x64" ], @@ -148,9 +148,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", + "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", "cpu": [ "arm" ], @@ -164,9 +164,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", + "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", "cpu": [ "arm64" ], @@ -180,9 +180,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", + "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", "cpu": [ "ia32" ], @@ -196,9 +196,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", + "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", "cpu": [ "loong64" ], @@ -212,9 +212,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", + "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", "cpu": [ "mips64el" ], @@ -228,9 +228,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", + "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", "cpu": [ "ppc64" ], @@ -244,9 +244,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", + "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", "cpu": [ "riscv64" ], @@ -260,9 +260,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", + "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", "cpu": [ "s390x" ], @@ -276,9 +276,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz", + "integrity": "sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==", "cpu": [ "x64" ], @@ -292,9 +292,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", + "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", "cpu": [ "x64" ], @@ -308,9 +308,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", + "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", "cpu": [ "x64" ], @@ -324,9 +324,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", + "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", "cpu": [ "x64" ], @@ -340,9 +340,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", + "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", "cpu": [ "arm64" ], @@ -356,9 +356,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", + "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", "cpu": [ "ia32" ], @@ -372,9 +372,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", + "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", "cpu": [ "x64" ], @@ -412,9 +412,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -457,9 +457,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -579,6 +579,162 @@ "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", "dev": true }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.6.1.tgz", + "integrity": "sha512-0WQ0ouLejaUCRsL93GD4uft3rOmB8qoQMU05Kb8CmMtMBe7XUDLAltxVZI1q6byNqEtU7N1ZX1Vw5lIpgulLQA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.6.1.tgz", + "integrity": "sha512-1TKm25Rn20vr5aTGGZqo6E4mzPicCUD79k17EgTLAsXc1zysyi4xXKACfUbwyANEPAEIxkzwue6JZ+stYzWUTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.6.1.tgz", + "integrity": "sha512-cEXJQY/ZqMACb+nxzDeX9IPLAg7S94xouJJCNVE5BJM8JUEP4HeTF+ti3cmxWeSJo+5D+o8Tc0UAWUkfENdeyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.6.1.tgz", + "integrity": "sha512-LoSU9Xu56isrkV2jLldcKspJ7sSXmZWkAxg7sW/RfF7GS4F5/v4EiqKSMCFbZtDu2Nc1gxxFdQdKwkKS4rwxNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.6.1.tgz", + "integrity": "sha512-EfI3hzYAy5vFNDqpXsNxXcgRDcFHUWSx5nnRSCKwXuQlI5J9dD84g2Usw81n3FLBNsGCegKGwwTVsSKK9cooSQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.6.1.tgz", + "integrity": "sha512-9lhc4UZstsegbNLhH0Zu6TqvDfmhGzuCWtcTFXY10VjLLUe4Mr0Ye2L3rrtHaDd/J5+tFMEuo5LTCSCMXWfUKw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.6.1.tgz", + "integrity": "sha512-FfoOK1yP5ksX3wwZ4Zk1NgyGHZyuRhf99j64I5oEmirV8EFT7+OhUZEnP+x17lcP/QHJNWGsoJwrz4PJ9fBEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.6.1.tgz", + "integrity": "sha512-DNGZvZDO5YF7jN5fX8ZqmGLjZEXIJRdJEdTFMhiyXqyXubBa0WVLDWSNlQ5JR2PNgDbEV1VQowhVRUh+74D+RA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.6.1.tgz", + "integrity": "sha512-RkJVNVRM+piYy87HrKmhbexCHg3A6Z6MU0W9GHnJwBQNBeyhCJG9KDce4SAMdicQnpURggSvtbGo9xAWOfSvIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.6.1.tgz", + "integrity": "sha512-v2FVT6xfnnmTe3W9bJXl6r5KwJglMK/iRlkKiIFfO6ysKs0rDgz7Cwwf3tjldxQUrHL9INT/1r4VA0n9L/F1vQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.6.1.tgz", + "integrity": "sha512-YEeOjxRyEjqcWphH9dyLbzgkF8wZSKAKUkldRY6dgNR5oKs2LZazqGB41cWJ4Iqqcy9/zqYgmzBkRoVz3Q9MLw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.6.1.tgz", + "integrity": "sha512-0zfTlFAIhgz8V2G8STq8toAjsYYA6eci1hnXuyOTUFnymrtJwnS6uGKiv3v5UrPZkBlamLvrLV2iiaeqCKzb0A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -601,24 +757,24 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/node": { - "version": "18.18.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", - "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "version": "18.18.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.14.tgz", + "integrity": "sha512-iSOeNeXYNYNLLOMDSVPvIFojclvMZ/HDY2dU17kUlcsOsSQETbWIslJbYLZgA+ox8g2XQwSHKTkght1a5X26lQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "node_modules/@types/stats.js": { @@ -628,9 +784,9 @@ "dev": true }, "node_modules/@types/three": { - "version": "0.158.1", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.158.1.tgz", - "integrity": "sha512-U7SimpoMrlpY2TjYedb9sQeOVHdRWJEiaNQxywJETMGMoEhWEfpP0sywRADR/xOQbaixZ6lk5Hv+3IOFriprkw==", + "version": "0.159.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.159.0.tgz", + "integrity": "sha512-2gybdh7HtX+rGUgslzK7QEJfzD2I0qrbUGzKk+dK0FDx49UHkNX0rqZVRzIgeFjBd1HzzhNNgwNoMacm3Wyc7w==", "dev": true, "dependencies": { "@types/stats.js": "*", @@ -646,16 +802,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", - "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz", + "integrity": "sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/type-utils": "6.9.1", - "@typescript-eslint/utils": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/type-utils": "6.13.1", + "@typescript-eslint/utils": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -681,13 +837,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", - "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", + "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1" + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -698,9 +854,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", + "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -711,12 +867,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", + "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/types": "6.13.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -775,13 +931,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", - "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz", + "integrity": "sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/utils": "6.13.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -802,9 +958,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", + "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -815,13 +971,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", - "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", + "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -842,12 +998,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", + "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/types": "6.13.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -901,17 +1057,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", - "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", + "integrity": "sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", "semver": "^7.5.4" }, "engines": { @@ -926,13 +1082,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", - "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", + "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1" + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -943,9 +1099,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", + "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -956,13 +1112,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", - "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", + "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -983,12 +1139,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", + "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/types": "6.13.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1486,9 +1642,9 @@ } }, "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.8.tgz", + "integrity": "sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==", "dev": true, "hasInstallScript": true, "bin": { @@ -1498,28 +1654,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "@esbuild/android-arm": "0.19.8", + "@esbuild/android-arm64": "0.19.8", + "@esbuild/android-x64": "0.19.8", + "@esbuild/darwin-arm64": "0.19.8", + "@esbuild/darwin-x64": "0.19.8", + "@esbuild/freebsd-arm64": "0.19.8", + "@esbuild/freebsd-x64": "0.19.8", + "@esbuild/linux-arm": "0.19.8", + "@esbuild/linux-arm64": "0.19.8", + "@esbuild/linux-ia32": "0.19.8", + "@esbuild/linux-loong64": "0.19.8", + "@esbuild/linux-mips64el": "0.19.8", + "@esbuild/linux-ppc64": "0.19.8", + "@esbuild/linux-riscv64": "0.19.8", + "@esbuild/linux-s390x": "0.19.8", + "@esbuild/linux-x64": "0.19.8", + "@esbuild/netbsd-x64": "0.19.8", + "@esbuild/openbsd-x64": "0.19.8", + "@esbuild/sunos-x64": "0.19.8", + "@esbuild/win32-arm64": "0.19.8", + "@esbuild/win32-ia32": "0.19.8", + "@esbuild/win32-x64": "0.19.8" } }, "node_modules/escape-string-regexp": { @@ -1535,15 +1691,15 @@ } }, "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -1950,9 +2106,9 @@ } }, "node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2302,9 +2458,9 @@ } }, "node_modules/lil-gui": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.19.0.tgz", - "integrity": "sha512-02/Z7rPng3GXWFwkQVj1hQaJYo2fIEYctqe0ima5uI/N2HEagB9ZGCQKkVWr3UuKfTr0arto3Q9prTB8sxtJJw==" + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.19.1.tgz", + "integrity": "sha512-9dbIg+UxS8RIROI6OH5gV2KrVE0Cn37bcLOQGF2GKN8ibTxDrUSLzzZfkQR82LnZsgs7DEZOOGfn3zhtd6hk0Q==" }, "node_modules/local-pkg": { "version": "0.4.3", @@ -2779,9 +2935,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -2898,18 +3054,30 @@ } }, "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.6.1.tgz", + "integrity": "sha512-jZHaZotEHQaHLgKr8JnQiDT1rmatjgKlMekyksz+yk9jt/8z9quNjnKNRoaM0wd9DC2QKXjmWWuDYtM3jfF8pQ==", "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.6.1", + "@rollup/rollup-android-arm64": "4.6.1", + "@rollup/rollup-darwin-arm64": "4.6.1", + "@rollup/rollup-darwin-x64": "4.6.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.6.1", + "@rollup/rollup-linux-arm64-gnu": "4.6.1", + "@rollup/rollup-linux-arm64-musl": "4.6.1", + "@rollup/rollup-linux-x64-gnu": "4.6.1", + "@rollup/rollup-linux-x64-musl": "4.6.1", + "@rollup/rollup-win32-arm64-msvc": "4.6.1", + "@rollup/rollup-win32-ia32-msvc": "4.6.1", + "@rollup/rollup-win32-x64-msvc": "4.6.1", "fsevents": "~2.3.2" } }, @@ -3247,9 +3415,9 @@ } }, "node_modules/typedoc": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.3.tgz", - "integrity": "sha512-Ow8Bo7uY1Lwy7GTmphRIMEo6IOZ+yYUyrc8n5KXIZg1svpqhZSWgni2ZrDhe+wLosFS8yswowUzljTAV/3jmWw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.4.tgz", + "integrity": "sha512-Du9ImmpBCw54bX275yJrxPVnjdIyJO/84co0/L9mwe0R3G4FSR6rQ09AlXVRvZEGMUg09+z/usc8mgygQ1aidA==", "dev": true, "dependencies": { "lunr": "^2.3.9", @@ -3264,13 +3432,13 @@ "node": ">= 16" }, "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x" + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x" } }, "node_modules/typedoc-plugin-markdown": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.17.0.tgz", - "integrity": "sha512-+uh5fHNfNSGdUxae0FWOuJ8Xu9Sl08jkdshOg6dilAqN/ZXmYsUFFDKw70fYfiGxdCLvpUuyr9FYO+WAa2lHeA==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.17.1.tgz", + "integrity": "sha512-QzdU3fj0Kzw2XSdoL15ExLASt2WPqD7FbLeaqwT70+XjKyTshBnUlQA5nNREO1C2P8Uen0CDjsBLMsCQ+zd0lw==", "dev": true, "dependencies": { "handlebars": "^4.7.7" @@ -3295,9 +3463,9 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -3360,29 +3528,29 @@ "dev": true }, "node_modules/vite": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.4.tgz", + "integrity": "sha512-RzAr8LSvM8lmhB4tQ5OPcBhpjOZRZjuxv9zO5UcxeoY2bd3kP3Ticd40Qma9/BqZ8JS96Ll/jeBX9u+LJZrhVg==", "dev": true, "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "esbuild": "^0.19.3", + "postcss": "^8.4.31", + "rollup": "^4.2.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", @@ -3628,34 +3796,44 @@ "name": "wtd-examples", "version": "0.0.0", "dependencies": { - "lil-gui": "~0.19.0", - "three": "~0.158.0", - "wtd-core": "~3.0.0-next.3", - "wtd-three-ext": "~3.0.0-next.3", + "lil-gui": "~0.19.1", + "three": "~0.159.0", + "wtd-core": "~3.0.0-next.4", + "wtd-three-ext": "~3.0.0-next.4", "wwobjloader2": "6.2.0-next.4" }, "devDependencies": { - "@types/three": "~0.158.1", + "@types/three": "~0.159.0", "http-server": "~14.1.1" } }, + "packages/examples/node_modules/three": { + "version": "0.159.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.159.0.tgz", + "integrity": "sha512-eCmhlLGbBgucuo4VEA9IO3Qpc7dh8Bd4VKzr7WfW4+8hMcIfoAVi1ev0pJYN9PTTsCslbcKgBwr2wNZ1EvLInA==" + }, "packages/wtd-core": { - "version": "3.0.0-next.3", + "version": "3.0.0-next.4", "license": "MIT" }, "packages/wtd-three-ext": { - "version": "3.0.0-next.3", + "version": "3.0.0-next.4", "license": "MIT", "dependencies": { - "three": "~0.158.0", - "wtd-core": "~3.0.0-next.3" + "three": "~0.159.0", + "wtd-core": "~3.0.0-next.4" }, "devDependencies": { - "@types/three": "~0.158.1" + "@types/three": "~0.159.0" }, "peerDependencies": { "three": ">= 0.137.5 < 1" } + }, + "packages/wtd-three-ext/node_modules/three": { + "version": "0.159.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.159.0.tgz", + "integrity": "sha512-eCmhlLGbBgucuo4VEA9IO3Qpc7dh8Bd4VKzr7WfW4+8hMcIfoAVi1ev0pJYN9PTTsCslbcKgBwr2wNZ1EvLInA==" } } } diff --git a/package.json b/package.json index 61ddc7d..2e661e0 100644 --- a/package.json +++ b/package.json @@ -38,15 +38,15 @@ "npm": "9.8.1" }, "devDependencies": { - "@types/node": "~18.18.8", - "@typescript-eslint/eslint-plugin": "~6.9.1", + "@types/node": "~18.18.14", + "@typescript-eslint/eslint-plugin": "~6.13.1", "editorconfig": "~2.0.0", - "eslint": "~8.52.0", + "eslint": "~8.55.0", "shx": "~0.3.4", - "typedoc": "~0.25.3", - "typedoc-plugin-markdown": "~3.17.0", - "typescript": "~5.2.2", - "vite": "~4.5.0", + "typedoc": "~0.25.4", + "typedoc-plugin-markdown": "~3.17.1", + "typescript": "~5.3.2", + "vite": "~5.0.4", "vitest": "~0.34.6" }, "workspaces": [ diff --git a/packages/examples/package.json b/packages/examples/package.json index a45829a..b739ba4 100644 --- a/packages/examples/package.json +++ b/packages/examples/package.json @@ -28,14 +28,14 @@ "preview": "http-server ./preview" }, "dependencies": { - "lil-gui": "~0.19.0", - "three": "~0.158.0", - "wtd-core": "~3.0.0-next.3", - "wtd-three-ext": "~3.0.0-next.3", + "lil-gui": "~0.19.1", + "three": "~0.159.0", + "wtd-core": "~3.0.0-next.4", + "wtd-three-ext": "~3.0.0-next.4", "wwobjloader2": "6.2.0-next.4" }, "devDependencies": { - "@types/three": "~0.158.1", + "@types/three": "~0.159.0", "http-server": "~14.1.1" }, "repository": { diff --git a/packages/examples/src/com/WorkerCom.ts b/packages/examples/src/com/WorkerCom.ts index 8686291..08ad568 100644 --- a/packages/examples/src/com/WorkerCom.ts +++ b/packages/examples/src/com/WorkerCom.ts @@ -2,7 +2,6 @@ import { RawPayload, WorkerTask, WorkerTaskMessage, - WorkerTaskMessageConfig, initChannel, initOffscreenCanvas, registerResizeHandler @@ -96,14 +95,14 @@ class HelloWorldStandardWorkerExample { setTimeout(async () => { promises = []; promises.push(workerTaskCom1.executeWorker({ - message: new WorkerTaskMessage() + message: WorkerTaskMessage.createEmpty() })); promises.push(workerTaskCom2.executeWorker({ - message: new WorkerTaskMessage() + message: WorkerTaskMessage.createEmpty() })); const results = await Promise.all(promises); - results.forEach((message: WorkerTaskMessageConfig) => { + results.forEach((message: WorkerTaskMessage) => { console.log('Received final command: ' + message.cmd); if (message.payloads) { const rawPayload = message.payloads[0] as RawPayload; diff --git a/packages/examples/src/helloWorld/HelloWorld.ts b/packages/examples/src/helloWorld/HelloWorld.ts index 478c60f..2384f2a 100644 --- a/packages/examples/src/helloWorld/HelloWorld.ts +++ b/packages/examples/src/helloWorld/HelloWorld.ts @@ -36,7 +36,7 @@ class HelloWorldModuleWorkerExample { // execute worker without init const t0 = performance.now(); const resultExec = await this.workerTaskDirector.enqueueForExecution(taskName, { - message: new WorkerTaskMessage(), + message: WorkerTaskMessage.createEmpty(), }); const wtm = WorkerTaskMessage.unpack(resultExec, false); diff --git a/packages/examples/src/helloWorld/HelloWorldWorkerTask.ts b/packages/examples/src/helloWorld/HelloWorldWorkerTask.ts index da274fa..bc218df 100644 --- a/packages/examples/src/helloWorld/HelloWorldWorkerTask.ts +++ b/packages/examples/src/helloWorld/HelloWorldWorkerTask.ts @@ -31,7 +31,7 @@ class HelloWorldWorkerTaskExample { const t0 = performance.now(); // once the init Promise is done enqueue the execution - const execMessage = new WorkerTaskMessage(); + const execMessage = WorkerTaskMessage.createEmpty(); const resultExec = await workerTask.executeWorker({ message: execMessage }); diff --git a/packages/examples/src/infinite/PotentiallyInfiniteExample.ts b/packages/examples/src/infinite/PotentiallyInfiniteExample.ts index 58f3547..b9d41eb 100644 --- a/packages/examples/src/infinite/PotentiallyInfiniteExample.ts +++ b/packages/examples/src/infinite/PotentiallyInfiniteExample.ts @@ -26,7 +26,6 @@ import { WorkerTaskDirector, DataPayload, WorkerTaskMessage, - WorkerTaskMessageConfig, WorkerTaskCommandResponse, createWorkerBlob, } from 'wtd-core'; @@ -96,11 +95,13 @@ class PotentiallyInfiniteExample { fov: 45 }; private controls: TrackballControls; - private workerTaskDirector: WorkerTaskDirector = new WorkerTaskDirector(); + private verbose = false; + private workerTaskDirector: WorkerTaskDirector = new WorkerTaskDirector({ + verbose: this.verbose + }); // configure all task that shall be usable on register to the WorkerTaskDirector taskSimpleBlobWorker = { - id: 0, name: 'simpleBlobWorker', use: true, workerType: 'module', @@ -113,7 +114,6 @@ class PotentiallyInfiniteExample { workerCount: 6 } as TaskDescription; taskInfiniteWorkerInternalGeometry = { - id: 1, name: 'InfiniteWorkerInternalGeometry', use: true, workerType: 'module', @@ -122,7 +122,6 @@ class PotentiallyInfiniteExample { workerCount: 10 } as TaskDescription; taskInfiniteWorkerExternalGeometry = { - id: 2, name: 'InfiniteWorkerExternalGeometry', use: true, workerType: 'module', @@ -131,7 +130,6 @@ class PotentiallyInfiniteExample { workerCount: 8 } as TaskDescription; taskObjLoader2Worker = { - id: 3, name: 'OBJLoader2WorkerModule', modelName: 'female02', use: true, @@ -146,7 +144,7 @@ class PotentiallyInfiniteExample { private materialStore = new MaterialStore(true); private tasksToUse: TaskDescription[] = []; private executions: Array> = []; - private objectsUsed = new Map(); + private objectsUsed = new Map(); private meshesAdded: string[] = []; private removeCount = 50; numberOfMeshesToKeep = 750; @@ -208,7 +206,9 @@ class PotentiallyInfiniteExample { } resetAppContext() { - this.workerTaskDirector = new WorkerTaskDirector(); + this.workerTaskDirector = new WorkerTaskDirector({ + verbose: this.verbose + }); this.tasksToUse = []; this.executions = []; @@ -298,8 +298,7 @@ class PotentiallyInfiniteExample { }, maxParallelExecutions: taskDescr.workerCount }); - const initMessage = new WorkerTaskMessage({ - id: taskDescr.id, + const initMessage = WorkerTaskMessage.createNew({ name: taskDescr.name }); awaiting.push(this.workerTaskDirector.initTaskType(taskDescr.name, { @@ -321,8 +320,7 @@ class PotentiallyInfiniteExample { maxParallelExecutions: taskDescr.workerCount }); - const initMessage = new WorkerTaskMessage({ - id: taskDescr.id, + const initMessage = WorkerTaskMessage.createNew({ name: taskDescr.name }); awaiting.push(this.workerTaskDirector.initTaskType(taskDescr.name, { @@ -346,8 +344,7 @@ class PotentiallyInfiniteExample { const torus = new TorusGeometry(25, 8, 16, 100); torus.name = 'torus'; - const initMessage = new WorkerTaskMessage({ - id: taskDescr.id, + const initMessage = WorkerTaskMessage.createNew({ name: taskDescr.name }); const meshPayload = new MeshPayload(); @@ -396,8 +393,7 @@ class PotentiallyInfiniteExample { this.materialStore.addMaterialsFromObject(materialCreator.materials, false); const buffer = results[results.length - 1] as string | ArrayBuffer; - const initMessage = new WorkerTaskMessage({ - id: 0, + const initMessage = WorkerTaskMessage.createNew({ name: 'OBJLoader2WorkerModule' }); const dataPayload = new DataPayload(); @@ -437,7 +433,6 @@ class PotentiallyInfiniteExample { } console.time('start'); - let globalCount = 0; const taskSelector = this.createTaskSelector(); for (let j = 0; j < this.loopCount && !this.abort; j++) { @@ -447,23 +442,16 @@ class PotentiallyInfiniteExample { const indexToUse = Math.floor(Math.random() * taskSelector.totalWorkers); const taskDescr = taskSelector.taskSelectorArray[indexToUse]; - const execMessage = new WorkerTaskMessage({ - id: globalCount - }); const dataPayload = new DataPayload(); dataPayload.message.params = { modelName: taskDescr.name }; - execMessage.addPayload(dataPayload); - const promise = this.workerTaskDirector.enqueueForExecution(taskDescr.name, { - message: execMessage, + message: WorkerTaskMessage.fromPayload(dataPayload), onComplete: data => this.processMessage(taskDescr, data), onIntermediateConfirm: data => this.processMessage(taskDescr, data) }); this.executions.push(promise); - - globalCount++; } await Promise.all(this.executions); this.executions = []; @@ -497,7 +485,7 @@ class PotentiallyInfiniteExample { * @param {object} payload Message received from worker * @private */ - private processMessage(taskDescr: TaskDescription, message: WorkerTaskMessageConfig | Error) { + private processMessage(taskDescr: TaskDescription, message: WorkerTaskMessage | Error) { let material: Material | Material[] | undefined; let meshPayload: MeshPayload; let materialsPayload: MaterialsPayload; @@ -510,7 +498,7 @@ class PotentiallyInfiniteExample { const wtm = WorkerTaskMessage.unpack(message, false); switch (wtm.cmd) { case WorkerTaskCommandResponse.INIT_COMPLETE: - console.log('Init Completed: ' + wtm.id); + console.log('Init Completed: ' + wtm.uuid); break; case WorkerTaskCommandResponse.EXECUTE_COMPLETE: @@ -550,7 +538,7 @@ class PotentiallyInfiniteExample { } mesh = new Mesh(meshPayload.message.bufferGeometry as BufferGeometry, material); } - this.addMesh(mesh, wtm.id ?? 0); + this.addMesh(mesh, wtm.uuid ?? 'unknown'); } else { if (wtm.cmd !== WorkerTaskCommandResponse.EXECUTE_COMPLETE) { @@ -563,7 +551,7 @@ class PotentiallyInfiniteExample { break; default: - console.error(`${wtm.id}: Received unknown command: ${wtm.cmd}`); + console.error(`${wtm.uuid}: Received unknown command: ${wtm.cmd}`); break; } } @@ -571,8 +559,8 @@ class PotentiallyInfiniteExample { /** * Add mesh at random position, but keep sub-meshes of an object together */ - private addMesh(mesh: Mesh, id: number) { - const storedPos = this.objectsUsed.get(id); + private addMesh(mesh: Mesh, uuid: string) { + const storedPos = this.objectsUsed.get(uuid); let pos; if (storedPos) { pos = storedPos.pos; @@ -582,10 +570,10 @@ class PotentiallyInfiniteExample { pos.applyAxisAngle(this.baseVectorX, 2 * Math.PI * Math.random()); pos.applyAxisAngle(this.baseVectorY, 2 * Math.PI * Math.random()); pos.applyAxisAngle(this.baseVectorZ, 2 * Math.PI * Math.random()); - this.objectsUsed.set(id, { name: mesh.name, pos: pos }); + this.objectsUsed.set(uuid, { name: mesh.name, pos: pos }); } mesh.position.set(pos.x, pos.y, pos.z); - mesh.name = id + '' + mesh.name; + mesh.name = uuid + '' + mesh.name; this.scene.add(mesh); this.meshesAdded.push(mesh.name); } @@ -638,12 +626,12 @@ class PotentiallyInfiniteExample { // Simplest way to define a worker, but can't be a module worker class SimpleBlobWorker { - init(message: WorkerTaskMessageConfig) { + init(message: WorkerTaskMessage) { message.cmd = 'initComplete'; self.postMessage(message); } - execute(message: WorkerTaskMessageConfig) { + execute(message: WorkerTaskMessage) { // burn some time for (let i = 0; i < 25000000; i++) { i++; @@ -667,7 +655,7 @@ class SimpleBlobWorker { // eslint-disable-next-line @typescript-eslint/no-explicit-any comRouting(message: MessageEvent) { - const wtmt = (message as MessageEvent).data as WorkerTaskMessageConfig; + const wtmt = (message as MessageEvent).data as WorkerTaskMessage; if (wtmt) { if (wtmt.cmd === 'init') { this.init(wtmt); diff --git a/packages/examples/src/threejs/Threejs.ts b/packages/examples/src/threejs/Threejs.ts index 370b6c1..0d100f9 100644 --- a/packages/examples/src/threejs/Threejs.ts +++ b/packages/examples/src/threejs/Threejs.ts @@ -19,8 +19,7 @@ import { DataPayload, WorkerTaskCommandResponse, WorkerTaskDirector, - WorkerTaskMessage, - WorkerTaskMessageConfig + WorkerTaskMessage } from 'wtd-core'; import { MaterialsPayload, @@ -62,10 +61,10 @@ class WorkerTaskDirectorExample { private controls: TrackballControls; private workerTaskDirector: WorkerTaskDirector = new WorkerTaskDirector({ defaultMaxParallelExecutions: 8, - verbose: true + verbose: false }); - private objectsUsed: Map = new Map(); + private objectsUsed: Map = new Map(); private tasksToUse: string[] = []; private materialStore = new MaterialStore(true); @@ -139,8 +138,7 @@ class WorkerTaskDirectorExample { private async initTasks() { console.time('Init tasks'); const awaiting: Array> = []; - const helloWorldInitMessage = new WorkerTaskMessage({ - id: 0, + const helloWorldInitMessage = WorkerTaskMessage.createNew({ name: 'HelloWorldThreeWorker' }); this.workerTaskDirector.registerTask({ @@ -157,11 +155,9 @@ class WorkerTaskDirectorExample { message: helloWorldInitMessage })); - const objLoaderInitMessage = new WorkerTaskMessage({ - id: 0, + const objLoaderInitMessage = WorkerTaskMessage.createNew({ name: 'OBJLoaderdWorker' }); - this.workerTaskDirector.registerTask({ taskName: objLoaderInitMessage.name!, workerConfig: { @@ -210,30 +206,23 @@ class WorkerTaskDirectorExample { if (this.tasksToUse.length === 0) throw new Error('No Tasks have been selected. Aborting...'); console.time('Execute tasks'); - let globalCount = 0; let taskToUseIndex = 0; const executions = []; for (let i = 0; i < 1024; i++) { const name = this.tasksToUse[taskToUseIndex]; - const execMessage = new WorkerTaskMessage({ - id: globalCount, - name: `${name}_${globalCount}` - }); - const voidPromise = this.workerTaskDirector.enqueueForExecution(name ?? 'unknown', { - message: execMessage, - onComplete: (m: WorkerTaskMessageConfig) => { + message: WorkerTaskMessage.createEmpty(), + onComplete: (m: WorkerTaskMessage) => { this.processMessage(m); }, - onIntermediateConfirm: (m: WorkerTaskMessageConfig) => { + onIntermediateConfirm: (m: WorkerTaskMessage) => { this.processMessage(m); } }); executions.push(voidPromise); - globalCount++; taskToUseIndex++; if (taskToUseIndex === this.tasksToUse.length) { taskToUseIndex = 0; @@ -250,29 +239,29 @@ class WorkerTaskDirectorExample { * @param {object} payload Message received from worker * @private */ - private processMessage(message: WorkerTaskMessageConfig) { + private processMessage(message: WorkerTaskMessage) { const wtm = WorkerTaskMessage.unpack(message, false); switch (wtm.cmd) { case WorkerTaskCommandResponse.INTERMEDIATE_CONFIRM: case WorkerTaskCommandResponse.EXECUTE_COMPLETE: if (wtm.payloads?.length === 1) { - this.buildMesh(wtm.id ?? 0, wtm.payloads[0] as MeshPayload); + this.buildMesh(wtm.uuid ?? 'unknown', wtm.payloads[0] as MeshPayload); } else if (wtm.payloads?.length === 2) { - this.buildMesh(wtm.id ?? 0, wtm.payloads[0] as MeshPayload, wtm.payloads[1] as MaterialsPayload); + this.buildMesh(wtm.uuid ?? 'unknown', wtm.payloads[0] as MeshPayload, wtm.payloads[1] as MaterialsPayload); } if (wtm.cmd === WorkerTaskCommandResponse.EXECUTE_COMPLETE) { - console.log(`execComplete: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + console.log(`execComplete: name: ${wtm.name} uuid: ${wtm.uuid} cmd: ${wtm.cmd} workerId: ${wtm.workerId}`); } break; default: - console.error(`${message.id}: Received unknown command: ${message.cmd}`); + console.error(`${wtm.uuid}: Received unknown command: ${wtm.cmd}`); break; } } - private buildMesh(id: number, meshPayload: MeshPayload, materialsPayload?: MaterialsPayload) { + private buildMesh(uuid: string, meshPayload: MeshPayload, materialsPayload?: MaterialsPayload) { let material; if (!materialsPayload) { const randArray = new Uint8Array(3); @@ -285,13 +274,13 @@ class WorkerTaskDirectorExample { } if (meshPayload.message.bufferGeometry) { const mesh = new Mesh(meshPayload.message.bufferGeometry as BufferGeometry, material); - this.addMesh(mesh, id); + this.addMesh(mesh, uuid); } } /** Add mesh at random position, but keep sub-meshes of an object together, therefore we need */ - private addMesh(mesh: Mesh, id: number) { - let pos = this.objectsUsed.get(id); + private addMesh(mesh: Mesh, uuid: string) { + let pos = this.objectsUsed.get(uuid); if (!pos) { // sphere positions const baseFactor = 750; @@ -299,10 +288,10 @@ class WorkerTaskDirectorExample { pos.applyAxisAngle(new Vector3(1, 0, 0), 2 * Math.PI * Math.random()); pos.applyAxisAngle(new Vector3(0, 1, 0), 2 * Math.PI * Math.random()); pos.applyAxisAngle(new Vector3(0, 0, 1), 2 * Math.PI * Math.random()); - this.objectsUsed.set(id, pos); + this.objectsUsed.set(uuid, pos); } mesh.position.set(pos.x, pos.y, pos.z); - mesh.name = id + '' + mesh.name; + mesh.name = uuid + '' + mesh.name; this.scene.add(mesh); } } diff --git a/packages/examples/src/transferables/TransferablesTestbed.ts b/packages/examples/src/transferables/TransferablesTestbed.ts index d258922..dc7193b 100644 --- a/packages/examples/src/transferables/TransferablesTestbed.ts +++ b/packages/examples/src/transferables/TransferablesTestbed.ts @@ -18,8 +18,7 @@ import { DataPayload, WorkerTaskCommandResponse, WorkerTaskDirector, - WorkerTaskMessage, - WorkerTaskMessageConfig + WorkerTaskMessage } from 'wtd-core'; import { MeshPayload, reconstructBuffer @@ -35,7 +34,6 @@ type CameraDefaults = { type ExampleTask = { execute: boolean; - id: number; name: string; sendGeometry: boolean; url: URL; @@ -83,7 +81,6 @@ class TransferablesTestbed { this.tasks.push({ execute: true, - id: 1, name: 'TransferableWorkerTest1', sendGeometry: false, url: new URL(import.meta.env.DEV ? '../worker/TransferableWorkerTest1.ts' : '../worker/generated/TransferableWorkerTest1-es.js', import.meta.url), @@ -91,7 +88,6 @@ class TransferablesTestbed { }); this.tasks.push({ execute: true, - id: 2, name: 'TransferableWorkerTest2', sendGeometry: false, url: new URL(import.meta.env.DEV ? '../worker/TransferableWorkerTest2.ts' : '../worker/generated/TransferableWorkerTest2-es.js', import.meta.url), @@ -99,7 +95,6 @@ class TransferablesTestbed { }); this.tasks.push({ execute: true, - id: 3, name: 'TransferableWorkerTest3', sendGeometry: true, url: new URL(import.meta.env.DEV ? '../worker/TransferableWorkerTest3.ts' : '../worker/generated/TransferableWorkerTest3-es.js', import.meta.url), @@ -107,7 +102,6 @@ class TransferablesTestbed { }); this.tasks.push({ execute: true, - id: 4, name: 'TransferableWorkerTest4', sendGeometry: false, url: new URL(import.meta.env.DEV ? '../worker/TransferableWorkerTest4.ts' : '../worker/generated/TransferableWorkerTest4-es.js', import.meta.url), @@ -212,8 +206,7 @@ class TransferablesTestbed { } }); - const initMessage = new WorkerTaskMessage({ - id: task.id, + const initMessage = WorkerTaskMessage.createNew({ name: task.name }); if (task.sendGeometry) { @@ -252,8 +245,7 @@ class TransferablesTestbed { } private async executeWorker(task: ExampleTask) { - const execMessage = new WorkerTaskMessage({ - id: task.id, + const execMessage = WorkerTaskMessage.createNew({ name: task.name }); @@ -273,11 +265,11 @@ class TransferablesTestbed { this.processMessage(result); } - private processMessage(message: WorkerTaskMessageConfig) { + private processMessage(message: WorkerTaskMessage) { let wtm; switch (message.cmd) { case WorkerTaskCommandResponse.EXECUTE_COMPLETE: - console.log(`TransferableTestbed#execComplete: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + console.log(`TransferableTestbed#execComplete: name: ${message.name} uuid: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); wtm = WorkerTaskMessage.unpack(message, false); if (wtm.payloads?.length === 1) { @@ -313,7 +305,7 @@ class TransferablesTestbed { break; default: - console.error(`${message.id}: Received unknown command: ${message.cmd}`); + console.error(`${message.uuid}: Received unknown command: ${message.cmd}`); break; } } diff --git a/packages/examples/src/worker/Com1Worker.ts b/packages/examples/src/worker/Com1Worker.ts index 0d3b322..9a25502 100644 --- a/packages/examples/src/worker/Com1Worker.ts +++ b/packages/examples/src/worker/Com1Worker.ts @@ -8,7 +8,6 @@ import { WorkerTaskCommandRequest, WorkerTaskCommandResponse, WorkerTaskMessage, - WorkerTaskMessageConfig, WorkerTaskWorker } from 'wtd-core'; import { getOffScreenCanvas, recalcAspectRatio, updateText } from './ComWorkerCommon.js'; @@ -20,59 +19,65 @@ export class Com1Worker implements WorkerTaskWorker, InterComWorker, OffscreenWo private offScreenCanvas?: HTMLCanvasElement; private text = 'none'; - initChannel(message: WorkerTaskMessageConfig): void { + initChannel(message: WorkerTaskMessage): void { // register the default com-routing function for inter-worker communication const payloadPort = message.payloads?.[0]; this.icph.registerPort('com2', payloadPort, message => comRouting(this, message)); - const initChannelComplete = new WorkerTaskMessage({ - cmd: WorkerTaskCommandResponse.INIT_CHANNEL_COMPLETE, - id: message.id, - workerId: message.workerId + const initChannelComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.INIT_CHANNEL_COMPLETE }); self.postMessage(initChannelComplete); } - initOffscreenCanvas(message: WorkerTaskMessageConfig): void { + initOffscreenCanvas(message: WorkerTaskMessage): void { const offscreenPayload = message.payloads?.[0] as OffscreenPayload; this.offScreenCanvas = getOffScreenCanvas(offscreenPayload); - const initOffscreenCanvasComplete = WorkerTaskMessage.createFromExisting(message, OffscreenWorkerCommandResponse.INIT_OFFSCREEN_CANVAS_COMPLETE); + const initOffscreenCanvasComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: OffscreenWorkerCommandResponse.INIT_OFFSCREEN_CANVAS_COMPLETE + }); self.postMessage(initOffscreenCanvasComplete); } - resize(message: WorkerTaskMessageConfig) { + resize(message: WorkerTaskMessage) { const offscreenPayload = message.payloads?.[0] as OffscreenPayload; recalcAspectRatio(this.offScreenCanvas!, offscreenPayload.message.width ?? 0, offscreenPayload.message.height ?? 1); this.updateText(false); } - init(message: WorkerTaskMessageConfig): void { + init(message: WorkerTaskMessage): void { this.text = 'Worker 1: init'; this.updateText(); - const initComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.INIT_COMPLETE); + const initComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.INIT_COMPLETE + }); initComplete.addPayload(new RawPayload({ hello: 'Com1Worker initComplete!' })); self.postMessage(initComplete); } - execute(message: WorkerTaskMessageConfig) { + execute(message: WorkerTaskMessage) { // send message with cmd 'interComIntermediate' to Com2Worker - const sendWorker2 = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandRequest.INTERCOM_INTERMEDIATE); + const sendWorker2 = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandRequest.INTERCOM_INTERMEDIATE + }); const payload = new RawPayload({ hello: 'Hi Worker 2!' }); sendWorker2.addPayload(payload); this.icph.postMessageOnPort('com2', sendWorker2); } - interComIntermediate(message: WorkerTaskMessageConfig): void { + interComIntermediate(message: WorkerTaskMessage): void { const rawPayload = message.payloads?.[0] as RawPayload; this.text = `Worker 1: Worker 2 said: ${rawPayload.message.raw.hello}`; this.updateText(); setTimeout(() => { // after receiving the message from Com2Worker, send interComIntermediateConfirm to worker 2 - const intermediateConfirm = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.INTERCOM_INTERMEDIATE_CONFIRM); + const intermediateConfirm = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.INTERCOM_INTERMEDIATE_CONFIRM + }); const payload = new RawPayload({ confirmed: 'Hi Worker 2. I confirm!' }); intermediateConfirm.addPayload(payload); @@ -80,13 +85,15 @@ export class Com1Worker implements WorkerTaskWorker, InterComWorker, OffscreenWo }, 2000); } - interComIntermediateConfirm(message: WorkerTaskMessageConfig): void { + interComIntermediateConfirm(message: WorkerTaskMessage): void { const rawPayload = message.payloads?.[0] as RawPayload; this.text = `Worker 1: Worker 2 confirmed: ${rawPayload.message.raw.confirmed}`; this.updateText(); // after receiving the interComIntermediateConfirm from Com2Worker, send execComplete to main - const execComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.EXECUTE_COMPLETE); + const execComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.EXECUTE_COMPLETE + }); const payload = new RawPayload({ finished: 'Hi Main. Worker 1 completed!' }); execComplete.addPayload(payload); self.postMessage(execComplete); diff --git a/packages/examples/src/worker/Com2Worker.ts b/packages/examples/src/worker/Com2Worker.ts index ef64858..55ae58f 100644 --- a/packages/examples/src/worker/Com2Worker.ts +++ b/packages/examples/src/worker/Com2Worker.ts @@ -8,7 +8,6 @@ import { WorkerTaskCommandRequest, WorkerTaskCommandResponse, WorkerTaskMessage, - WorkerTaskMessageConfig, WorkerTaskWorker } from 'wtd-core'; import { getOffScreenCanvas, recalcAspectRatio, updateText } from './ComWorkerCommon.js'; @@ -20,60 +19,65 @@ export class Com2Worker implements WorkerTaskWorker, InterComWorker, OffscreenWo private offScreenCanvas?: HTMLCanvasElement; private text = 'none'; - initChannel(message: WorkerTaskMessageConfig): void { + initChannel(message: WorkerTaskMessage): void { // register the default com-routing function for inter-worker communication const payloadPort = message.payloads?.[0]; this.icph.registerPort('com1', payloadPort, message => comRouting(this, message)); - const initChannelComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.INIT_CHANNEL_COMPLETE); + const initChannelComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.INIT_CHANNEL_COMPLETE + }); self.postMessage(initChannelComplete); } - initOffscreenCanvas(message: WorkerTaskMessageConfig): void { + initOffscreenCanvas(message: WorkerTaskMessage): void { const offscreenPayload = message.payloads?.[0] as OffscreenPayload; this.offScreenCanvas = getOffScreenCanvas(offscreenPayload); - const initOffscreenCanvasComplete = WorkerTaskMessage.createFromExisting(message, OffscreenWorkerCommandResponse.INIT_OFFSCREEN_CANVAS_COMPLETE); + const initOffscreenCanvasComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: OffscreenWorkerCommandResponse.INIT_OFFSCREEN_CANVAS_COMPLETE + }); self.postMessage(initOffscreenCanvasComplete); } - resize(message: WorkerTaskMessageConfig) { + resize(message: WorkerTaskMessage) { const offscreenPayload = message.payloads?.[0] as OffscreenPayload; recalcAspectRatio(this.offScreenCanvas!, offscreenPayload.message.width ?? 0, offscreenPayload.message.height ?? 1); this.updateText(false); } - init(message: WorkerTaskMessageConfig): void { + init(message: WorkerTaskMessage): void { this.text = 'Worker 2: init'; this.updateText(); - const initComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.INIT_COMPLETE); + const initComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.INIT_COMPLETE + }); initComplete.addPayload(new RawPayload({ hello: 'Com2Worker initComplete!' })); self.postMessage(initComplete); } - execute(message: WorkerTaskMessageConfig) { + execute(message: WorkerTaskMessage) { // send message with cmd 'interComIntermediate' to Com1Worker - const sendWorker1 = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandRequest.INTERCOM_INTERMEDIATE); + const sendWorker1 = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandRequest.INTERCOM_INTERMEDIATE + }); const payload = new RawPayload({ hello: 'Hi Worker 1!' }); sendWorker1.addPayload(payload); this.icph.postMessageOnPort('com1', sendWorker1); } - intermediate(message: WorkerTaskMessageConfig): void { - const payload = message.payloads?.[0] as RawPayload; - console.log(payload.message.raw); - } - - interComIntermediate(message: WorkerTaskMessageConfig): void { + interComIntermediate(message: WorkerTaskMessage): void { const rawPayload = message.payloads?.[0] as RawPayload; this.text = `Worker 2: Worker 1 said: ${rawPayload.message.raw.hello}`; this.updateText(); setTimeout(() => { // after receiving the message from Com1Worker, send interComIntermediateConfirm to worker 2 - const intermediateConfirm = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.INTERCOM_INTERMEDIATE_CONFIRM); + const intermediateConfirm = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.INTERCOM_INTERMEDIATE_CONFIRM + }); const payload = new RawPayload({ confirmed: 'Hi Worker 1. I confirm!' }); intermediateConfirm.addPayload(payload); @@ -81,13 +85,15 @@ export class Com2Worker implements WorkerTaskWorker, InterComWorker, OffscreenWo }, 2000); } - interComIntermediateConfirm(message: WorkerTaskMessageConfig): void { + interComIntermediateConfirm(message: WorkerTaskMessage): void { const rawPayload = message.payloads?.[0] as RawPayload; this.text = `Worker 2: Worker 1 confirmed: ${rawPayload.message.raw.confirmed}`; this.updateText(); // after receiving the interComIntermediateConfirm from Com1Worker, send execComplete to main - const execComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.EXECUTE_COMPLETE); + const execComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.EXECUTE_COMPLETE + }); const payload = new RawPayload({ finished: 'Hi Main. Worker 2 completed!' }); execComplete.addPayload(payload); self.postMessage(execComplete); diff --git a/packages/examples/src/worker/HelloWorldThreeWorker.ts b/packages/examples/src/worker/HelloWorldThreeWorker.ts index 482524a..8ba3c0f 100644 --- a/packages/examples/src/worker/HelloWorldThreeWorker.ts +++ b/packages/examples/src/worker/HelloWorldThreeWorker.ts @@ -3,7 +3,6 @@ import { comRouting, WorkerTaskCommandResponse, WorkerTaskMessage, - WorkerTaskMessageConfig, WorkerTaskWorker } from 'wtd-core'; import { @@ -12,18 +11,20 @@ import { export class HelloWorlThreedWorker implements WorkerTaskWorker { - init(message: WorkerTaskMessageConfig) { - console.log(`HelloWorldWorker#init: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + init(message: WorkerTaskMessage) { + console.log(`HelloWorldWorker#init: name: ${message.name} uuid: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); - const initComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.INIT_COMPLETE); + const initComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.INIT_COMPLETE + }); self.postMessage(initComplete); } - execute(message: WorkerTaskMessageConfig) { - console.log(`HelloWorldWorker#execute: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + execute(message: WorkerTaskMessage) { + console.log(`HelloWorldWorker#execute: name: ${message.name} uuid: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); const bufferGeometry = new SphereGeometry(40, 64, 64); - bufferGeometry.name = message.name ?? 'unknown' + message.id ?? 'unknown'; + bufferGeometry.name = message.name ?? 'unknown' + message.uuid ?? 'unknown'; const vertexArray = bufferGeometry.getAttribute('position').array; for (let i = 0; i < vertexArray.length; i++) { vertexArray[i] = vertexArray[i] * Math.random() * 0.48; @@ -32,7 +33,9 @@ export class HelloWorlThreedWorker implements WorkerTaskWorker { const meshPayload = new MeshPayload(); meshPayload.setBufferGeometry(bufferGeometry, 0); - const execComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.EXECUTE_COMPLETE); + const execComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.EXECUTE_COMPLETE + }); execComplete.addPayload(meshPayload); const transferables = WorkerTaskMessage.pack(execComplete.payloads, false); diff --git a/packages/examples/src/worker/HelloWorldWorker.ts b/packages/examples/src/worker/HelloWorldWorker.ts index 25ee066..1d1177b 100644 --- a/packages/examples/src/worker/HelloWorldWorker.ts +++ b/packages/examples/src/worker/HelloWorldWorker.ts @@ -3,18 +3,19 @@ import { DataPayload, WorkerTaskCommandResponse, WorkerTaskMessage, - WorkerTaskMessageConfig, WorkerTaskWorker } from 'wtd-core'; export class HelloWorldWorker implements WorkerTaskWorker { - init(message: WorkerTaskMessageConfig) { - const initComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.INIT_COMPLETE); + init(message: WorkerTaskMessage) { + const initComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.INIT_COMPLETE + }); self.postMessage(initComplete); } - execute(message: WorkerTaskMessageConfig) { + execute(message: WorkerTaskMessage) { // burn some time for (let i = 0; i < 25000000; i++) { i++; @@ -25,7 +26,9 @@ export class HelloWorldWorker implements WorkerTaskWorker { hello: 'say hello' }; - const execComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.EXECUTE_COMPLETE); + const execComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.EXECUTE_COMPLETE + }); execComplete.addPayload(dataPayload); // no need to pack as there aren't any buffers used diff --git a/packages/examples/src/worker/InfiniteWorkerExternalGeometry.ts b/packages/examples/src/worker/InfiniteWorkerExternalGeometry.ts index cdeb352..72ee8c2 100644 --- a/packages/examples/src/worker/InfiniteWorkerExternalGeometry.ts +++ b/packages/examples/src/worker/InfiniteWorkerExternalGeometry.ts @@ -4,7 +4,6 @@ import { import { WorkerTaskCommandResponse, WorkerTaskMessage, - WorkerTaskMessageConfig, WorkerTaskWorker, comRouting } from 'wtd-core'; @@ -16,17 +15,19 @@ class InfiniteWorkerExternalGeometry implements WorkerTaskWorker { private bufferGeometry?: BufferGeometry = undefined; - init(message: WorkerTaskMessageConfig) { + init(message: WorkerTaskMessage) { const wtm = WorkerTaskMessage.unpack(message, false); if (wtm.payloads && wtm.payloads?.length > 0) { this.bufferGeometry = (wtm.payloads[0] as MeshPayload).message.bufferGeometry as BufferGeometry; } - const initComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.INIT_COMPLETE); + const initComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.INIT_COMPLETE + }); self.postMessage(initComplete); } - execute(message: WorkerTaskMessageConfig) { + execute(message: WorkerTaskMessage) { if (!this.bufferGeometry) { self.postMessage(new Error('No initial payload available')); } else { @@ -34,7 +35,7 @@ class InfiniteWorkerExternalGeometry implements WorkerTaskWorker { const geometry = this.bufferGeometry.clone(); if (geometry) { - geometry.name = 'tmProto' + message.id; + geometry.name = 'tmProto' + message.uuid; const vertexArray = geometry.getAttribute('position').array; for (let i = 0; i < vertexArray.length; i++) { @@ -54,7 +55,9 @@ class InfiniteWorkerExternalGeometry implements WorkerTaskWorker { } }; - const execComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.EXECUTE_COMPLETE); + const execComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.EXECUTE_COMPLETE + }); execComplete.addPayload(meshPayload); const transferables = WorkerTaskMessage.pack(execComplete.payloads, false); diff --git a/packages/examples/src/worker/InfiniteWorkerInternalGeometry.ts b/packages/examples/src/worker/InfiniteWorkerInternalGeometry.ts index 9124e5e..0a9ec34 100644 --- a/packages/examples/src/worker/InfiniteWorkerInternalGeometry.ts +++ b/packages/examples/src/worker/InfiniteWorkerInternalGeometry.ts @@ -7,7 +7,6 @@ import { comRouting, WorkerTaskCommandResponse, WorkerTaskMessage, - WorkerTaskMessageConfig, WorkerTaskWorker } from 'wtd-core'; import { @@ -18,14 +17,16 @@ import { class InfiniteWorkerInternalGeometry implements WorkerTaskWorker { - init(message: WorkerTaskMessageConfig) { - const initComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.INIT_COMPLETE); + init(message: WorkerTaskMessage) { + const initComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.INIT_COMPLETE + }); self.postMessage(initComplete); } - execute(message: WorkerTaskMessageConfig) { + execute(message: WorkerTaskMessage) { const bufferGeometry = new TorusKnotGeometry(20, 3, 100, 64); - bufferGeometry.name = 'tmProto' + message.id; + bufferGeometry.name = 'tmProto' + message.uuid; const vertexBA = bufferGeometry.getAttribute('position'); const vertexArray = vertexBA.array; @@ -42,13 +43,15 @@ class InfiniteWorkerInternalGeometry implements WorkerTaskWorker { const material = new MeshPhongMaterial({ color: color }); const materialsPayload = new MaterialsPayload(); - MaterialUtils.addMaterial(materialsPayload.message.materials, 'randomColor' + message.id, material, false, false); + MaterialUtils.addMaterial(materialsPayload.message.materials, 'randomColor' + message.uuid, material, false, false); materialsPayload.cleanMaterials(); const meshPayload = new MeshPayload(); meshPayload.setBufferGeometry(bufferGeometry, 2); - const execComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.EXECUTE_COMPLETE); + const execComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.EXECUTE_COMPLETE + }); execComplete.addPayload(meshPayload); execComplete.addPayload(materialsPayload); diff --git a/packages/examples/src/worker/OBJLoaderWorker.ts b/packages/examples/src/worker/OBJLoaderWorker.ts index ae8aa24..94c6083 100644 --- a/packages/examples/src/worker/OBJLoaderWorker.ts +++ b/packages/examples/src/worker/OBJLoaderWorker.ts @@ -9,7 +9,6 @@ import { DataPayload, WorkerTaskCommandResponse, WorkerTaskMessage, - WorkerTaskMessageConfig, WorkerTaskWorker } from 'wtd-core'; import { @@ -24,11 +23,11 @@ class OBJLoaderWorker implements WorkerTaskWorker { objLoader: undefined as OBJLoader | undefined, materials: new Map() as Map, buffer: undefined as ArrayBufferLike | undefined, - objectId: 0 + objectId: 'unknown' }; - init(message: WorkerTaskMessageConfig) { - console.log(`OBJLoaderWorker#init: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + init(message: WorkerTaskMessage) { + console.log(`OBJLoaderWorker#init: name: ${message.name} uuid: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); const wtm = WorkerTaskMessage.unpack(message, false); if (wtm.payloads?.length === 2) { @@ -38,16 +37,18 @@ class OBJLoaderWorker implements WorkerTaskWorker { this.localData.buffer = dataPayload.message.buffers?.get('modelData'); this.localData.materials = materialsPayload.message.materials; - const initComplete = WorkerTaskMessage.createFromExisting(wtm, WorkerTaskCommandResponse.INIT_COMPLETE); + const initComplete = WorkerTaskMessage.createFromExisting(wtm, { + overrideCmd: WorkerTaskCommandResponse.INIT_COMPLETE + }); self.postMessage(initComplete); } } - execute(message: WorkerTaskMessageConfig) { - console.log(`OBJLoaderWorker#execute: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + execute(message: WorkerTaskMessage) { + console.log(`OBJLoaderWorker#execute: name: ${message.name} uuid: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); this.localData.objLoader = new OBJLoader(); - this.localData.objectId = message.id as number; + this.localData.objectId = message.uuid as string; const materials: AssociatedArrayType = {}; materials.create = (name: string) => { @@ -65,10 +66,12 @@ class OBJLoaderWorker implements WorkerTaskWorker { const meshes = this.localData.objLoader.parse(enc.decode(this.localData.buffer)); for (let mesh, i = 0; i < meshes.children.length; i++) { mesh = meshes.children[i] as Mesh; - mesh.name = mesh.name + message.id; + mesh.name = mesh.name + message.uuid; // signal intermediate feedback - const intermediate = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.INTERMEDIATE_CONFIRM); + const intermediate = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.INTERMEDIATE_CONFIRM + }); const meshPayload = new MeshPayload(); meshPayload.setMesh(mesh, 0); @@ -86,7 +89,9 @@ class OBJLoaderWorker implements WorkerTaskWorker { } // signal complete - const execComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.EXECUTE_COMPLETE); + const execComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.EXECUTE_COMPLETE + }); self.postMessage(execComplete); } diff --git a/packages/examples/src/worker/TransferableWorkerTest1.ts b/packages/examples/src/worker/TransferableWorkerTest1.ts index b327c1c..a10826c 100644 --- a/packages/examples/src/worker/TransferableWorkerTest1.ts +++ b/packages/examples/src/worker/TransferableWorkerTest1.ts @@ -3,21 +3,22 @@ import { DataPayload, WorkerTaskCommandResponse, WorkerTaskMessage, - WorkerTaskMessageConfig, WorkerTaskWorker } from 'wtd-core'; class TransferableWorkerTest1 implements WorkerTaskWorker { - init(message: WorkerTaskMessageConfig) { - console.log(`TransferableWorkerTest1#init: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + init(message: WorkerTaskMessage) { + console.log(`TransferableWorkerTest1#init: name: ${message.name} uuid: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); - const initComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.INIT_COMPLETE); + const initComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.INIT_COMPLETE + }); self.postMessage(initComplete); } - execute(message: WorkerTaskMessageConfig) { - console.log(`TransferableWorkerTest1#execute: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + execute(message: WorkerTaskMessage) { + console.log(`TransferableWorkerTest1#execute: name: ${message.name} uuid: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); const wtm = WorkerTaskMessage.unpack(message, false); @@ -26,7 +27,9 @@ class TransferableWorkerTest1 implements WorkerTaskWorker { data: new Uint32Array(32 * 1024 * 1024) }; - const execComplete = WorkerTaskMessage.createFromExisting(wtm, WorkerTaskCommandResponse.EXECUTE_COMPLETE); + const execComplete = WorkerTaskMessage.createFromExisting(wtm, { + overrideCmd: WorkerTaskCommandResponse.EXECUTE_COMPLETE + }); execComplete.addPayload(dataPayload); const transferables = WorkerTaskMessage.pack(execComplete.payloads, false); diff --git a/packages/examples/src/worker/TransferableWorkerTest2.ts b/packages/examples/src/worker/TransferableWorkerTest2.ts index d02313f..47c05ee 100644 --- a/packages/examples/src/worker/TransferableWorkerTest2.ts +++ b/packages/examples/src/worker/TransferableWorkerTest2.ts @@ -3,21 +3,22 @@ import { DataPayload, WorkerTaskCommandResponse, WorkerTaskMessage, - WorkerTaskMessageConfig, WorkerTaskWorker } from 'wtd-core'; class TransferableWorkerTest2 implements WorkerTaskWorker { - init(message: WorkerTaskMessageConfig) { - console.log(`TransferableWorkerTest2#init: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + init(message: WorkerTaskMessage) { + console.log(`TransferableWorkerTest2#init: name: ${message.name} uuid: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); - const initComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.INIT_COMPLETE); + const initComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: WorkerTaskCommandResponse.INIT_COMPLETE + }); self.postMessage(initComplete); } - execute(message: WorkerTaskMessageConfig) { - console.log(`TransferableWorkerTest2#execute: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + execute(message: WorkerTaskMessage) { + console.log(`TransferableWorkerTest2#execute: name: ${message.name} uuid: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); const wtm = WorkerTaskMessage.unpack(message, false); if (wtm.payloads?.length === 1) { @@ -26,7 +27,9 @@ class TransferableWorkerTest2 implements WorkerTaskWorker { const payloadOut = new DataPayload(); payloadOut.message.buffers?.set('data', new Uint32Array(32 * 1024 * 1024)); - const execComplete = WorkerTaskMessage.createFromExisting(wtm, WorkerTaskCommandResponse.EXECUTE_COMPLETE); + const execComplete = WorkerTaskMessage.createFromExisting(wtm, { + overrideCmd: WorkerTaskCommandResponse.EXECUTE_COMPLETE + }); execComplete.name = payload.message.params.name as string; execComplete.addPayload(payloadOut); diff --git a/packages/examples/src/worker/TransferableWorkerTest3.ts b/packages/examples/src/worker/TransferableWorkerTest3.ts index e850809..fc6f364 100644 --- a/packages/examples/src/worker/TransferableWorkerTest3.ts +++ b/packages/examples/src/worker/TransferableWorkerTest3.ts @@ -4,7 +4,6 @@ import { DataPayload, WorkerTaskCommandResponse, WorkerTaskMessage, - WorkerTaskMessageConfig, WorkerTaskWorker } from 'wtd-core'; import { @@ -18,20 +17,22 @@ class TransferableWorkerTest3 implements WorkerTaskWorker { initPayload: undefined as MeshPayload | undefined }; - init(message: WorkerTaskMessageConfig) { - console.log(`TransferableWorkerTest3#init: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + init(message: WorkerTaskMessage) { + console.log(`TransferableWorkerTest3#init: name: ${message.name} uuid: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); const wtm = WorkerTaskMessage.unpack(message, false); if (wtm.payloads && wtm.payloads?.length > 0) { this.context.initPayload = wtm.payloads[0] as MeshPayload; } - const initComplete = WorkerTaskMessage.createFromExisting(wtm, WorkerTaskCommandResponse.INIT_COMPLETE); + const initComplete = WorkerTaskMessage.createFromExisting(wtm, { + overrideCmd: WorkerTaskCommandResponse.INIT_COMPLETE + }); self.postMessage(initComplete); } - execute(message: WorkerTaskMessageConfig) { - console.log(`TransferableWorkerTest3#execute: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + execute(message: WorkerTaskMessage) { + console.log(`TransferableWorkerTest3#execute: name: ${message.name} uuid: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); if (this.context.initPayload) { const wtm = WorkerTaskMessage.unpack(message, false); @@ -46,7 +47,9 @@ class TransferableWorkerTest3 implements WorkerTaskWorker { packGeometryBuffers(false, bufferGeometry as BufferGeometry, dataPayload.message.buffers); } - const execComplete = WorkerTaskMessage.createFromExisting(wtm, WorkerTaskCommandResponse.EXECUTE_COMPLETE); + const execComplete = WorkerTaskMessage.createFromExisting(wtm, { + overrideCmd: WorkerTaskCommandResponse.EXECUTE_COMPLETE + }); execComplete.addPayload(dataPayload); const transferables = WorkerTaskMessage.pack(execComplete.payloads, false); diff --git a/packages/examples/src/worker/TransferableWorkerTest4.ts b/packages/examples/src/worker/TransferableWorkerTest4.ts index 94c1f64..09d0b7f 100644 --- a/packages/examples/src/worker/TransferableWorkerTest4.ts +++ b/packages/examples/src/worker/TransferableWorkerTest4.ts @@ -4,7 +4,6 @@ import { DataPayload, WorkerTaskCommandResponse, WorkerTaskMessage, - WorkerTaskMessageConfig, WorkerTaskWorker } from 'wtd-core'; import { @@ -13,14 +12,14 @@ import { class TransferableWorkerTest4 implements WorkerTaskWorker { - init(message: WorkerTaskMessageConfig) { - console.log(`TransferableWorkerTest4#init: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + init(message: WorkerTaskMessage) { + console.log(`TransferableWorkerTest4#init: name: ${message.name} uuid: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); message.cmd = WorkerTaskCommandResponse.INIT_COMPLETE; self.postMessage(message); } - execute(message: WorkerTaskMessageConfig) { - console.log(`TransferableWorkerTest4#execute: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + execute(message: WorkerTaskMessage) { + console.log(`TransferableWorkerTest4#execute: name: ${message.name} uuid: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); const wtm = WorkerTaskMessage.unpack(message, false); if (wtm.payloads?.length === 1) { @@ -31,7 +30,9 @@ class TransferableWorkerTest4 implements WorkerTaskWorker { const meshPayload = new MeshPayload(); meshPayload.setBufferGeometry(bufferGeometry, 0); - const execComplete = WorkerTaskMessage.createFromExisting(wtm, WorkerTaskCommandResponse.EXECUTE_COMPLETE); + const execComplete = WorkerTaskMessage.createFromExisting(wtm, { + overrideCmd: WorkerTaskCommandResponse.EXECUTE_COMPLETE + }); execComplete.addPayload(meshPayload); const transferables = WorkerTaskMessage.pack(execComplete.payloads, false); diff --git a/packages/wtd-core/package.json b/packages/wtd-core/package.json index 55dc283..e957d05 100644 --- a/packages/wtd-core/package.json +++ b/packages/wtd-core/package.json @@ -1,6 +1,6 @@ { "name": "wtd-core", - "version": "3.0.0-next.3", + "version": "3.0.0-next.4", "license": "MIT", "type": "module", "main": "./dist/index.js", diff --git a/packages/wtd-core/src/WorkerTask.ts b/packages/wtd-core/src/WorkerTask.ts index e598a63..c1e96e9 100644 --- a/packages/wtd-core/src/WorkerTask.ts +++ b/packages/wtd-core/src/WorkerTask.ts @@ -1,6 +1,3 @@ -import type { - WorkerTaskMessageConfig -} from './WorkerTaskMessage.js'; import { WorkerTaskMessage } from './WorkerTaskMessage.js'; @@ -36,8 +33,8 @@ export type WorkerIntermediateMessageDef = WorkerMessageDef & { export type WorkerExecutionDef = { message: WorkerTaskMessage; - onComplete?: (message: WorkerTaskMessageConfig) => void; - onIntermediateConfirm?: (message: WorkerTaskMessageConfig) => void; + onComplete?: (message: WorkerTaskMessage) => void; + onIntermediateConfirm?: (message: WorkerTaskMessage) => void; transferables?: Transferable[]; copyTransferables?: boolean; } @@ -52,7 +49,7 @@ export type WorkerTaskConfig = { type AwaitHandler = { name: string; - resolve: Array<(wtm: WorkerTaskMessageConfig) => void>; + resolve: Array<(wtm: WorkerTaskMessage) => void>; reject: (error: Error) => void; remove: boolean; log: boolean; @@ -70,7 +67,7 @@ export class WorkerTask { private worker?: Worker; private executing = false; private executionCounter = 0; - private awaitAnswers = new Map(); + private awaitAnswers = new Map(); constructor(config: WorkerTaskConfig) { this.taskName = config.taskName; @@ -118,13 +115,13 @@ export class WorkerTask { const delegate = (this.piggyBag === true) ? extractDelegate(this.worker) : undefined; this.worker.onmessage = (async (answer) => { // only process WorkerTaskMessage - const wtm = answer.data as WorkerTaskMessageConfig; + const wtm = answer.data as WorkerTaskMessage; if (wtm.cmd) { - const awaitHandlers = this.awaitAnswers.get(wtm.id ?? -1); + const awaitHandlers = this.awaitAnswers.get(wtm.uuid ?? 'unknown'); awaitHandlers?.forEach(handler => { if (handler.name === wtm.cmd) { if (handler.log === true) { - const completionMsg = `Received: ${wtm.cmd} (workerId: ${wtm.workerId ?? -1}) with id: ${wtm.id ?? -1}`; + const completionMsg = `Received: ${wtm.cmd} (workerName: ${wtm.name ?? 'unknown'}) with uuid: ${wtm.uuid}`; console.log(completionMsg); } for (const resolve of handler.resolve) { @@ -134,7 +131,7 @@ export class WorkerTask { this.markExecuting(false); } if (handler.remove === true) { - this.awaitAnswers.delete(wtm.id!); + this.awaitAnswers.delete(wtm.uuid!); } } }); @@ -149,7 +146,7 @@ export class WorkerTask { }); } - async initWorker(def: WorkerInitMessageDef): Promise { + async initWorker(def: WorkerInitMessageDef): Promise { return new Promise((resolve, reject) => { if (!this.worker) { reject(new Error('No worker is available. Aborting...')); @@ -161,11 +158,9 @@ export class WorkerTask { const message = def.message; message.cmd = WorkerTaskCommandRequest.INIT; - message.workerId = this.workerId; - message.id = this.executionCounter++; const transferablesToWorker = this.handleTransferables(def); - this.awaitAnswers.set(message.id, [{ + this.updateAwaitHandlers(message, [{ name: WorkerTaskCommandResponse.INIT_COMPLETE, resolve: [resolve], reject: reject, @@ -177,21 +172,20 @@ export class WorkerTask { }); } - async executeWorker(def: WorkerExecutionDef): Promise { + async executeWorker(def: WorkerExecutionDef): Promise { return new Promise((resolve, reject) => { if (!this.worker) { reject(new Error('No worker is available. Aborting...')); this.markExecuting(false); } else { this.markExecuting(true); + const message = def.message; message.cmd = WorkerTaskCommandRequest.EXECUTE; - message.workerId = this.workerId; - message.id = this.executionCounter++; const transferablesToWorker = this.handleTransferables(def); const awaitHandlers: AwaitHandler[] = []; - const resolveFuncs: Array<(message: WorkerTaskMessageConfig) => void> = []; + const resolveFuncs: Array<(message: WorkerTaskMessage) => void> = []; if (def.onComplete) { resolveFuncs.push(def.onComplete); } @@ -214,7 +208,7 @@ export class WorkerTask { log: this.verbose }); } - this.awaitAnswers.set(message.id, awaitHandlers); + this.updateAwaitHandlers(message, awaitHandlers); this.worker.postMessage(message, transferablesToWorker); } }); @@ -223,13 +217,14 @@ export class WorkerTask { /** * This is only possible if the worker is available. */ - sentMessage(def: WorkerIntermediateMessageDef): Promise { + sentMessage(def: WorkerIntermediateMessageDef): Promise { return new Promise((resolve, reject) => { if (this.checkWorker(reject)) { const message = def.message; - message.workerId = this.workerId; - message.id = this.executionCounter++; + if (message.cmd === 'unknown' || message.cmd.length === 0) { + throw new Error('No command provided. Aborting...'); + } const transferablesToWorker = this.handleTransferables(def); if (def.awaitAnswer === true) { @@ -237,7 +232,7 @@ export class WorkerTask { reject(new Error('No answer name provided. Aborting...')); return; } - this.awaitAnswers.set(message.id, [{ + this.updateAwaitHandlers(message, [{ name: def.answer, resolve: [resolve], reject: reject, @@ -246,10 +241,24 @@ export class WorkerTask { }]); } this.worker?.postMessage(message, transferablesToWorker); + + if (!def.awaitAnswer) { + resolve(WorkerTaskMessage.createEmpty()); + } } }); } + private updateAwaitHandlers(wtm: WorkerTaskMessage, awaitHandlers: AwaitHandler[]) { + wtm.workerId = this.workerId; + wtm.uuid = this.buildUuid(); + this.awaitAnswers.set(wtm.uuid, awaitHandlers); + } + + private buildUuid() { + return `${this.workerId}_${this.executionCounter++}_${Math.floor(Math.random() * 100000000)}`; + } + private handleTransferables(def: WorkerMessageDef) { let transferablesToWorker: Transferable[] = []; if (def.transferables) { diff --git a/packages/wtd-core/src/WorkerTaskDirector.ts b/packages/wtd-core/src/WorkerTaskDirector.ts index e44c6f5..417d8f8 100644 --- a/packages/wtd-core/src/WorkerTaskDirector.ts +++ b/packages/wtd-core/src/WorkerTaskDirector.ts @@ -1,5 +1,5 @@ -import type { - WorkerTaskMessageConfig +import { + WorkerTaskMessage } from './WorkerTaskMessage.js'; import type { WorkerExecutionDef, @@ -17,8 +17,8 @@ type WorkerTaskRuntimeDesc = { } type WorkerTaskDirectorConfig = { - defaultMaxParallelExecutions: number; - verbose: boolean; + defaultMaxParallelExecutions?: number; + verbose?: boolean; } /** @@ -26,7 +26,7 @@ type WorkerTaskDirectorConfig = { */ type WorkerExecutionPlan = WorkerExecutionDef & { promiseFunctions?: { - resolve: (message: WorkerTaskMessageConfig) => void, + resolve: (message: WorkerTaskMessage) => void, reject: (error?: Error) => void }; }; @@ -46,18 +46,14 @@ export class WorkerTaskDirector { static DEFAULT_MAX_PARALLEL_EXECUTIONS = 4; - private config: WorkerTaskDirectorConfig = { - defaultMaxParallelExecutions: WorkerTaskDirector.DEFAULT_MAX_PARALLEL_EXECUTIONS, - verbose: false - }; + private defaultMaxParallelExecutions: number; + private verbose = false; private taskTypes: Map; private workerExecutionPlans: Map; constructor(config?: WorkerTaskDirectorConfig) { - if (config) { - this.config.defaultMaxParallelExecutions = config.defaultMaxParallelExecutions; - this.config.verbose = config.verbose === true; - } + this.defaultMaxParallelExecutions = config?.defaultMaxParallelExecutions ?? WorkerTaskDirector.DEFAULT_MAX_PARALLEL_EXECUTIONS; + this.verbose = config?.verbose === true; this.taskTypes = new Map(); this.workerExecutionPlans = new Map(); } @@ -74,7 +70,7 @@ export class WorkerTaskDirector { const taskName = workerTaskDirectorDef.taskName; const allowedToRegister = !this.taskTypes.has(taskName); if (allowedToRegister) { - const maxParallelExecutions = workerTaskDirectorDef.maxParallelExecutions ?? this.config.defaultMaxParallelExecutions; + const maxParallelExecutions = workerTaskDirectorDef.maxParallelExecutions ?? this.defaultMaxParallelExecutions; const workerTaskRuntimeDesc: WorkerTaskRuntimeDesc = { workerTasks: new Map(), maxParallelExecutions: maxParallelExecutions @@ -85,7 +81,7 @@ export class WorkerTaskDirector { taskName, workerId: i, workerConfig: workerTaskDirectorDef.workerConfig, - verbose: this.config.verbose + verbose: this.verbose })); } } @@ -130,14 +126,14 @@ export class WorkerTaskDirector { * @param {WorkerExecutionDef} Defines all the information needed to execute the worker task. * @return {Promise} */ - async enqueueForExecution(taskTypeName: string, workerExecutionDef: WorkerExecutionDef): Promise { + async enqueueForExecution(taskTypeName: string, workerExecutionDef: WorkerExecutionDef): Promise { const plan = workerExecutionDef as WorkerExecutionPlan; const promise = new Promise((resolve, reject) => { plan.promiseFunctions = { resolve: resolve, reject: reject }; - }) as Promise; + }) as Promise; const planForType = this.workerExecutionPlans.get(taskTypeName); planForType?.push(plan); @@ -148,7 +144,7 @@ export class WorkerTaskDirector { private async depleteWorkerExecutionPlans(taskTypeName: string) { const planForType = this.workerExecutionPlans.get(taskTypeName); if (planForType?.length === 0) { - if (this.config.verbose) { + if (this.verbose) { console.log(`No more WorkerExecutionPlans in the queue for: ${taskTypeName}`); } return; diff --git a/packages/wtd-core/src/WorkerTaskMessage.ts b/packages/wtd-core/src/WorkerTaskMessage.ts index b624035..8648e75 100644 --- a/packages/wtd-core/src/WorkerTaskMessage.ts +++ b/packages/wtd-core/src/WorkerTaskMessage.ts @@ -3,7 +3,6 @@ import { WorkerTaskCommandRequest, WorkerTaskCommandResponse } from './WorkerTas export type WorkerTaskMessageConfig = { cmd?: WorkerTaskCommands; - id?: number; name?: string; workerId?: number; progress?: number; @@ -14,28 +13,19 @@ export type WorkerTaskCommands = WorkerTaskCommandRequest | WorkerTaskCommandRes export class WorkerTaskMessage { cmd: WorkerTaskCommands = 'unknown'; - id = 0; + uuid: string = 'unknown'; name = 'unnamed'; workerId = 0; progress = 0; payloads: Payload[] = []; - constructor(config?: WorkerTaskMessageConfig) { + private constructor(config?: WorkerTaskMessageConfig) { this.cmd = config?.cmd ?? this.cmd; - this.id = config?.id ?? this.id; this.name = config?.name ?? this.name; this.workerId = config?.workerId ?? this.workerId; this.progress = config?.progress ?? this.progress; } - static createEmpty() { - return new WorkerTaskMessage({}); - } - - setCommand(cmd: WorkerTaskCommands) { - this.cmd = cmd; - } - addPayload(payloads?: Payload[] | Payload) { if (!payloads) return; @@ -46,10 +36,25 @@ export class WorkerTaskMessage { } } - static createFromExisting(message: WorkerTaskMessageConfig, overrideCmd?: WorkerTaskCommands) { - const wtm = new WorkerTaskMessage(message); - if (overrideCmd) { - wtm.setCommand(overrideCmd); + static createNew(message: WorkerTaskMessageConfig) { + return new WorkerTaskMessage(message); + } + + static createEmpty() { + return WorkerTaskMessage.createNew({}); + } + + static createFromExisting(message: WorkerTaskMessage, options?: { + overrideCmd?: WorkerTaskCommands, + overrideUuid?: string + }) { + const wtm = WorkerTaskMessage.createNew(message); + wtm.uuid = message.uuid; + if (options?.overrideCmd) { + wtm.cmd = options.overrideCmd; + } + if (options?.overrideUuid) { + wtm.uuid = options.overrideUuid; } return wtm; } @@ -65,8 +70,10 @@ export class WorkerTaskMessage { return transferables; } - static unpack(rawMessage: WorkerTaskMessageConfig, cloneBuffers?: boolean) { - const instance = new WorkerTaskMessage(rawMessage); + static unpack(rawMessage: WorkerTaskMessage, cloneBuffers?: boolean) { + const instance = WorkerTaskMessage.createFromExisting(rawMessage, { + overrideUuid: rawMessage.uuid + }); if (rawMessage.payloads) { for (const payload of rawMessage.payloads) { @@ -78,10 +85,9 @@ export class WorkerTaskMessage { } static fromPayload(payloads: Payload | Payload[], cmd?: WorkerTaskCommands) { - const wtm = new WorkerTaskMessage({}); - if (cmd) { - wtm.setCommand(cmd); - } + const wtm = WorkerTaskMessage.createNew({ + cmd + }); wtm.addPayload(payloads); return wtm; } diff --git a/packages/wtd-core/src/WorkerTaskWorker.ts b/packages/wtd-core/src/WorkerTaskWorker.ts index f431cf9..9b75b89 100644 --- a/packages/wtd-core/src/WorkerTaskWorker.ts +++ b/packages/wtd-core/src/WorkerTaskWorker.ts @@ -1,6 +1,6 @@ import { Payload } from './Payload.js'; import { RawPayload } from './RawPayload.js'; -import { WorkerTaskMessageConfig } from './WorkerTaskMessage.js'; +import { WorkerTaskMessage } from './WorkerTaskMessage.js'; export enum WorkerTaskCommandRequest { INIT = 'init', @@ -23,29 +23,19 @@ export enum WorkerTaskCommandResponse { } export type WorkerTaskWorker = { - - init?(message: WorkerTaskMessageConfig): void; - - initChannel?(message: WorkerTaskMessageConfig): void; - - intermediate?(message: WorkerTaskMessageConfig): void; - - execute(message: WorkerTaskMessageConfig): void; + init?(message: WorkerTaskMessage): void; + initChannel?(message: WorkerTaskMessage): void; + intermediate?(message: WorkerTaskMessage): void; + execute(message: WorkerTaskMessage): void; } export type InterComWorker = { - - interComInit?(message: WorkerTaskMessageConfig): void; - - interComInitComplete?(message: WorkerTaskMessageConfig): void; - - interComIntermediate?(message: WorkerTaskMessageConfig): void; - - interComIntermediateConfirm?(message: WorkerTaskMessageConfig): void; - - interComExecute?(message: WorkerTaskMessageConfig): void; - - interComExecuteComplete?(message: WorkerTaskMessageConfig): void; + interComInit?(message: WorkerTaskMessage): void; + interComInitComplete?(message: WorkerTaskMessage): void; + interComIntermediate?(message: WorkerTaskMessage): void; + interComIntermediateConfirm?(message: WorkerTaskMessage): void; + interComExecute?(message: WorkerTaskMessage): void; + interComExecuteComplete?(message: WorkerTaskMessage): void; } export class InterComPortHandler { @@ -61,13 +51,13 @@ export class InterComPortHandler { port.onmessage = onmessage; } - postMessageOnPort(target: string, message: WorkerTaskMessageConfig, options?: StructuredSerializeOptions) { + postMessageOnPort(target: string, message: WorkerTaskMessage, options?: StructuredSerializeOptions) { this.ports.get(target)?.postMessage(message, options); } } export const comRouting = (workerImpl: WorkerTaskWorker | InterComWorker, message: MessageEvent, delegate?: (ev: MessageEvent) => unknown) => { - const wtmt = (message as MessageEvent).data as WorkerTaskMessageConfig; + const wtmt = (message as MessageEvent).data as WorkerTaskMessage; if (wtmt && wtmt.cmd) { // eslint-disable-next-line @typescript-eslint/no-explicit-any const obj = (workerImpl as any); diff --git a/packages/wtd-core/src/offscreen/OffscreenWorker.ts b/packages/wtd-core/src/offscreen/OffscreenWorker.ts index 3033dd7..f3a7921 100644 --- a/packages/wtd-core/src/offscreen/OffscreenWorker.ts +++ b/packages/wtd-core/src/offscreen/OffscreenWorker.ts @@ -1,4 +1,4 @@ -import { WorkerTaskMessageConfig } from '../WorkerTaskMessage.js'; +import { WorkerTaskMessage } from '../WorkerTaskMessage.js'; export enum OffscreenWorkerCommandRequest { INIT_OFFSCREEN_CANVAS = 'initOffscreenCanvas', @@ -15,12 +15,8 @@ export enum OffscreenWorkerCommandResponse { } export type OffscreenWorker = { - - initOffscreenCanvas(message: WorkerTaskMessageConfig): void; - - proxyStart?(message: WorkerTaskMessageConfig): void; - - proxyEvent?(message: WorkerTaskMessageConfig): void; - - resize?(message: WorkerTaskMessageConfig): void; + initOffscreenCanvas(message: WorkerTaskMessage): void; + proxyStart?(message: WorkerTaskMessage): void; + proxyEvent?(message: WorkerTaskMessage): void; + resize?(message: WorkerTaskMessage): void; } diff --git a/packages/wtd-three-ext/package.json b/packages/wtd-three-ext/package.json index d197be7..1cd6dbe 100644 --- a/packages/wtd-three-ext/package.json +++ b/packages/wtd-three-ext/package.json @@ -1,6 +1,6 @@ { "name": "wtd-three-ext", - "version": "3.0.0-next.3", + "version": "3.0.0-next.4", "license": "MIT", "type": "module", "main": "./dist/index.js", @@ -45,11 +45,11 @@ "npm": "9.8.1" }, "dependencies": { - "wtd-core": "~3.0.0-next.3", - "three": "~0.158.0" + "wtd-core": "~3.0.0-next.4", + "three": "~0.159.0" }, "devDependencies": { - "@types/three": "~0.158.1" + "@types/three": "~0.159.0" }, "peerDependencies": { "three": ">= 0.137.5 < 1"