@kirill.konshin/utils 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/bootstrap/index.d.ts +1 -12
- package/dist/bootstrap/index.d.ts.map +1 -1
- package/dist/bootstrap/index.js +2 -35
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +2 -0
- package/dist/core/index.d.ts +1 -9
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -35
- package/dist/electron/index.d.ts +1 -2
- package/dist/electron/index.d.ts.map +1 -1
- package/dist/electron/index.js +2 -9
- package/dist/electron-builder/index.d.ts +1 -2
- package/dist/electron-builder/index.d.ts.map +1 -1
- package/dist/electron-builder/index.js +2 -7
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/mui/index.d.ts +1 -4
- package/dist/mui/index.d.ts.map +1 -1
- package/dist/mui/index.js +2 -11
- package/dist/next/index.d.ts +1 -5
- package/dist/next/index.d.ts.map +1 -1
- package/dist/next/index.js +2 -15
- package/dist/node/index.d.ts +2 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +2 -0
- package/dist/react/index.d.ts +1 -5
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +2 -26
- package/dist/react-native/index.d.ts +1 -3
- package/dist/react-native/index.d.ts.map +1 -1
- package/dist/react-native/index.js +2 -9
- package/dist/tailwind/index.d.ts +1 -2
- package/dist/tailwind/index.d.ts.map +1 -1
- package/dist/tailwind/index.js +2 -7
- package/dist/worker/index.d.ts +2 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +2 -0
- package/package.json +51 -99
- package/.ctirc +0 -11
- package/.storybook/main.ts +0 -21
- package/.storybook/preview.ts +0 -17
- package/.turbo/turbo-build.log +0 -72
- package/.turbo/turbo-test.log +0 -171
- package/CHANGELOG.md +0 -116
- package/builders/.swcrc +0 -18
- package/builders/build.config.ts +0 -11
- package/builders/bun.build.js +0 -23
- package/builders/package.json +0 -209
- package/builders/perf.mjs +0 -63
- package/builders/rollup.config.mjs +0 -50
- package/builders/rslib.config.ts +0 -26
- package/builders/tsconfig.json +0 -21
- package/builders/tsup.config.ts +0 -20
- package/builders/turbo.json +0 -24
- package/builders/vite.config.ts +0 -37
- package/demo/worker-demo.ts +0 -73
- package/dist/bootstrap/adaptiveContainer.d.ts +0 -4
- package/dist/bootstrap/adaptiveContainer.d.ts.map +0 -1
- package/dist/bootstrap/adaptiveContainer.js +0 -11
- package/dist/bootstrap/adaptiveContainer.js.map +0 -1
- package/dist/bootstrap/controls.d.ts +0 -38
- package/dist/bootstrap/controls.d.ts.map +0 -1
- package/dist/bootstrap/controls.js +0 -78
- package/dist/bootstrap/controls.js.map +0 -1
- package/dist/bootstrap/controls.stories.d.ts +0 -9
- package/dist/bootstrap/controls.stories.d.ts.map +0 -1
- package/dist/bootstrap/error.d.ts +0 -9
- package/dist/bootstrap/error.d.ts.map +0 -1
- package/dist/bootstrap/error.js +0 -27
- package/dist/bootstrap/error.js.map +0 -1
- package/dist/bootstrap/error.stories.d.ts +0 -8
- package/dist/bootstrap/error.stories.d.ts.map +0 -1
- package/dist/bootstrap/field.d.ts +0 -11
- package/dist/bootstrap/field.d.ts.map +0 -1
- package/dist/bootstrap/field.js +0 -29
- package/dist/bootstrap/field.js.map +0 -1
- package/dist/bootstrap/field.stories.d.ts +0 -8
- package/dist/bootstrap/field.stories.d.ts.map +0 -1
- package/dist/bootstrap/footer.d.ts +0 -10
- package/dist/bootstrap/footer.d.ts.map +0 -1
- package/dist/bootstrap/footer.js +0 -45
- package/dist/bootstrap/footer.js.map +0 -1
- package/dist/bootstrap/globalLoading.d.ts +0 -6
- package/dist/bootstrap/globalLoading.d.ts.map +0 -1
- package/dist/bootstrap/globalLoading.js +0 -10
- package/dist/bootstrap/globalLoading.js.map +0 -1
- package/dist/bootstrap/globalLoading.stories.d.ts +0 -7
- package/dist/bootstrap/globalLoading.stories.d.ts.map +0 -1
- package/dist/bootstrap/index.js.map +0 -1
- package/dist/bootstrap/loading.d.ts +0 -10
- package/dist/bootstrap/loading.d.ts.map +0 -1
- package/dist/bootstrap/loading.js +0 -19
- package/dist/bootstrap/loading.js.map +0 -1
- package/dist/bootstrap/loading.stories.d.ts +0 -9
- package/dist/bootstrap/loading.stories.d.ts.map +0 -1
- package/dist/bootstrap/responsiveHelper.d.ts +0 -8
- package/dist/bootstrap/responsiveHelper.d.ts.map +0 -1
- package/dist/bootstrap/responsiveHelper.js +0 -46
- package/dist/bootstrap/responsiveHelper.js.map +0 -1
- package/dist/bootstrap/screen.d.ts +0 -22
- package/dist/bootstrap/screen.d.ts.map +0 -1
- package/dist/bootstrap/screen.js +0 -80
- package/dist/bootstrap/screen.js.map +0 -1
- package/dist/bootstrap/screen.stories.d.ts +0 -14
- package/dist/bootstrap/screen.stories.d.ts.map +0 -1
- package/dist/bootstrap/toaster.d.ts +0 -11
- package/dist/bootstrap/toaster.d.ts.map +0 -1
- package/dist/bootstrap/toaster.js +0 -34
- package/dist/bootstrap/toaster.js.map +0 -1
- package/dist/bootstrap/toaster.stories.d.ts +0 -8
- package/dist/bootstrap/toaster.stories.d.ts.map +0 -1
- package/dist/bootstrap/useModal.d.ts +0 -23
- package/dist/bootstrap/useModal.d.ts.map +0 -1
- package/dist/bootstrap/useModal.js +0 -50
- package/dist/bootstrap/useModal.js.map +0 -1
- package/dist/bootstrap/useModal.stories.d.ts +0 -9
- package/dist/bootstrap/useModal.stories.d.ts.map +0 -1
- package/dist/bootstrap/useWrappedForm.d.ts +0 -14
- package/dist/bootstrap/useWrappedForm.d.ts.map +0 -1
- package/dist/bootstrap/useWrappedForm.js +0 -32
- package/dist/bootstrap/useWrappedForm.js.map +0 -1
- package/dist/core/cache.d.ts +0 -120
- package/dist/core/cache.d.ts.map +0 -1
- package/dist/core/cache.js +0 -107
- package/dist/core/cache.js.map +0 -1
- package/dist/core/cache.test.d.ts +0 -2
- package/dist/core/cache.test.d.ts.map +0 -1
- package/dist/core/errors.d.ts +0 -2
- package/dist/core/errors.d.ts.map +0 -1
- package/dist/core/errors.js +0 -15
- package/dist/core/errors.js.map +0 -1
- package/dist/core/files.d.ts +0 -4
- package/dist/core/files.d.ts.map +0 -1
- package/dist/core/files.js +0 -31
- package/dist/core/files.js.map +0 -1
- package/dist/core/index.js.map +0 -1
- package/dist/core/ls.d.ts +0 -6
- package/dist/core/ls.d.ts.map +0 -1
- package/dist/core/ls.js +0 -12
- package/dist/core/ls.js.map +0 -1
- package/dist/core/measure.d.ts +0 -35
- package/dist/core/measure.d.ts.map +0 -1
- package/dist/core/measure.js +0 -60
- package/dist/core/measure.js.map +0 -1
- package/dist/core/mutex.d.ts +0 -6
- package/dist/core/mutex.d.ts.map +0 -1
- package/dist/core/mutex.js +0 -26
- package/dist/core/mutex.js.map +0 -1
- package/dist/core/worker.d.ts +0 -98
- package/dist/core/worker.d.ts.map +0 -1
- package/dist/core/worker.js +0 -240
- package/dist/core/worker.js.map +0 -1
- package/dist/core/worker.test.d.ts +0 -2
- package/dist/core/worker.test.d.ts.map +0 -1
- package/dist/core/workerUtils.d.ts +0 -3
- package/dist/core/workerUtils.d.ts.map +0 -1
- package/dist/core/workerUtils.js +0 -31
- package/dist/core/workerUtils.js.map +0 -1
- package/dist/core/wrpc.d.ts +0 -45
- package/dist/core/wrpc.d.ts.map +0 -1
- package/dist/core/wrpc.fixture.d.ts +0 -26
- package/dist/core/wrpc.fixture.d.ts.map +0 -1
- package/dist/core/wrpc.js +0 -242
- package/dist/core/wrpc.js.map +0 -1
- package/dist/core/wrpc.test.d.ts +0 -1
- package/dist/core/wrpc.test.d.ts.map +0 -1
- package/dist/electron/createWindow.d.ts +0 -23
- package/dist/electron/createWindow.d.ts.map +0 -1
- package/dist/electron/createWindow.js +0 -160
- package/dist/electron/createWindow.js.map +0 -1
- package/dist/electron/index.js.map +0 -1
- package/dist/electron/updater.d.ts +0 -2
- package/dist/electron/updater.d.ts.map +0 -1
- package/dist/electron/updater.js +0 -47
- package/dist/electron/updater.js.map +0 -1
- package/dist/electron-builder/builder.d.ts +0 -8
- package/dist/electron-builder/builder.d.ts.map +0 -1
- package/dist/electron-builder/builder.js +0 -130
- package/dist/electron-builder/builder.js.map +0 -1
- package/dist/electron-builder/images.d.ts +0 -7
- package/dist/electron-builder/images.d.ts.map +0 -1
- package/dist/electron-builder/images.js +0 -25
- package/dist/electron-builder/images.js.map +0 -1
- package/dist/electron-builder/index.js.map +0 -1
- package/dist/mui/formControlFieldset.d.ts +0 -5
- package/dist/mui/formControlFieldset.d.ts.map +0 -1
- package/dist/mui/formControlFieldset.js +0 -28
- package/dist/mui/formControlFieldset.js.map +0 -1
- package/dist/mui/formControlFieldset.stories.d.ts +0 -7
- package/dist/mui/formControlFieldset.stories.d.ts.map +0 -1
- package/dist/mui/formLabelLegend.d.ts +0 -4
- package/dist/mui/formLabelLegend.d.ts.map +0 -1
- package/dist/mui/formLabelLegend.js +0 -12
- package/dist/mui/formLabelLegend.js.map +0 -1
- package/dist/mui/genericControl.d.ts +0 -7
- package/dist/mui/genericControl.d.ts.map +0 -1
- package/dist/mui/genericControl.js +0 -21
- package/dist/mui/genericControl.js.map +0 -1
- package/dist/mui/index.js.map +0 -1
- package/dist/mui/readOnly.d.ts +0 -6
- package/dist/mui/readOnly.d.ts.map +0 -1
- package/dist/mui/readOnly.js +0 -7
- package/dist/mui/readOnly.js.map +0 -1
- package/dist/next/appLink.d.ts +0 -8
- package/dist/next/appLink.d.ts.map +0 -1
- package/dist/next/appLink.js +0 -34
- package/dist/next/appLink.js.map +0 -1
- package/dist/next/index.js.map +0 -1
- package/dist/next/measure.d.ts +0 -15
- package/dist/next/measure.d.ts.map +0 -1
- package/dist/next/measure.js +0 -9
- package/dist/next/measure.js.map +0 -1
- package/dist/next/noSSR.d.ts +0 -29
- package/dist/next/noSSR.d.ts.map +0 -1
- package/dist/next/noSSR.js +0 -13
- package/dist/next/noSSR.js.map +0 -1
- package/dist/next/redirect.d.ts +0 -6
- package/dist/next/redirect.d.ts.map +0 -1
- package/dist/next/useIsInner.d.ts +0 -3
- package/dist/next/useIsInner.d.ts.map +0 -1
- package/dist/next/useIsInner.js +0 -15
- package/dist/next/useIsInner.js.map +0 -1
- package/dist/react/apiCall.d.ts +0 -6
- package/dist/react/apiCall.d.ts.map +0 -1
- package/dist/react/apiCall.js +0 -24
- package/dist/react/apiCall.js.map +0 -1
- package/dist/react/form/client.d.ts +0 -7
- package/dist/react/form/client.d.ts.map +0 -1
- package/dist/react/form/client.js +0 -46
- package/dist/react/form/client.js.map +0 -1
- package/dist/react/form/form.d.ts +0 -59
- package/dist/react/form/form.d.ts.map +0 -1
- package/dist/react/form/form.js +0 -89
- package/dist/react/form/form.js.map +0 -1
- package/dist/react/form/index.d.ts +0 -3
- package/dist/react/form/index.d.ts.map +0 -1
- package/dist/react/index.js.map +0 -1
- package/dist/react/keyboard.d.ts +0 -10
- package/dist/react/keyboard.d.ts.map +0 -1
- package/dist/react/keyboard.js +0 -38
- package/dist/react/keyboard.js.map +0 -1
- package/dist/react/useFetch.d.ts +0 -2
- package/dist/react/useFetch.d.ts.map +0 -1
- package/dist/react/useFetch.js +0 -20
- package/dist/react/useFetch.js.map +0 -1
- package/dist/react/useFetcher.d.ts +0 -10
- package/dist/react/useFetcher.d.ts.map +0 -1
- package/dist/react/useFetcher.js +0 -43
- package/dist/react/useFetcher.js.map +0 -1
- package/dist/react-native/index.js.map +0 -1
- package/dist/react-native/share.d.ts +0 -9
- package/dist/react-native/share.d.ts.map +0 -1
- package/dist/react-native/share.js +0 -23
- package/dist/react-native/share.js.map +0 -1
- package/dist/react-native/update.d.ts +0 -3
- package/dist/react-native/update.d.ts.map +0 -1
- package/dist/react-native/update.js +0 -40
- package/dist/react-native/update.js.map +0 -1
- package/dist/react-native/useAppState.d.ts +0 -2
- package/dist/react-native/useAppState.d.ts.map +0 -1
- package/dist/react-native/useAppState.js +0 -18
- package/dist/react-native/useAppState.js.map +0 -1
- package/dist/tailwind/fullpage.d.ts +0 -3
- package/dist/tailwind/fullpage.d.ts.map +0 -1
- package/dist/tailwind/fullpage.js +0 -14
- package/dist/tailwind/fullpage.js.map +0 -1
- package/dist/tailwind/index.js.map +0 -1
- package/dist/tailwind/responsiveHelper.d.ts +0 -3
- package/dist/tailwind/responsiveHelper.d.ts.map +0 -1
- package/dist/tailwind/responsiveHelper.js +0 -16
- package/dist/tailwind/responsiveHelper.js.map +0 -1
- package/src/bootstrap/adaptiveContainer.tsx +0 -12
- package/src/bootstrap/controls.stories.tsx +0 -62
- package/src/bootstrap/controls.tsx +0 -119
- package/src/bootstrap/error.stories.tsx +0 -34
- package/src/bootstrap/error.tsx +0 -37
- package/src/bootstrap/field.stories.tsx +0 -42
- package/src/bootstrap/field.tsx +0 -37
- package/src/bootstrap/footer.tsx +0 -61
- package/src/bootstrap/globalLoading.stories.tsx +0 -25
- package/src/bootstrap/globalLoading.tsx +0 -19
- package/src/bootstrap/index.ts +0 -12
- package/src/bootstrap/loading.stories.tsx +0 -35
- package/src/bootstrap/loading.tsx +0 -24
- package/src/bootstrap/main.scss +0 -86
- package/src/bootstrap/responsiveHelper.tsx +0 -55
- package/src/bootstrap/screen.stories.tsx +0 -160
- package/src/bootstrap/screen.tsx +0 -146
- package/src/bootstrap/toaster.stories.tsx +0 -32
- package/src/bootstrap/toaster.tsx +0 -40
- package/src/bootstrap/useModal.stories.tsx +0 -51
- package/src/bootstrap/useModal.tsx +0 -93
- package/src/bootstrap/useWrappedForm.ts +0 -42
- package/src/core/README.md +0 -91
- package/src/core/cache.test.ts +0 -121
- package/src/core/cache.ts +0 -246
- package/src/core/errors.ts +0 -17
- package/src/core/files.ts +0 -29
- package/src/core/index.ts +0 -9
- package/src/core/ls.ts +0 -15
- package/src/core/measure.ts +0 -109
- package/src/core/mutex.ts +0 -22
- package/src/core/worker.test.ts +0 -197
- package/src/core/worker.ts +0 -347
- package/src/core/workerUtils.ts +0 -32
- package/src/core/wrpc.fixture.ts +0 -106
- package/src/core/wrpc.test.ts +0 -225
- package/src/core/wrpc.ts +0 -377
- package/src/electron/README.md +0 -13
- package/src/electron/createWindow.ts +0 -234
- package/src/electron/index.ts +0 -2
- package/src/electron/updater.ts +0 -54
- package/src/electron-builder/builder.ts +0 -150
- package/src/electron-builder/images.ts +0 -33
- package/src/electron-builder/index.ts +0 -2
- package/src/mui/README.md +0 -3
- package/src/mui/formControlFieldset.stories.tsx +0 -71
- package/src/mui/formControlFieldset.tsx +0 -26
- package/src/mui/formLabelLegend.tsx +0 -11
- package/src/mui/genericControl.tsx +0 -20
- package/src/mui/index.ts +0 -4
- package/src/mui/readOnly.tsx +0 -6
- package/src/next/appLink.tsx +0 -40
- package/src/next/index.ts +0 -5
- package/src/next/measure.ts +0 -24
- package/src/next/noSSR.tsx +0 -36
- package/src/next/redirect.tsx +0 -13
- package/src/next/useIsInner.ts +0 -13
- package/src/react/apiCall.ts +0 -25
- package/src/react/form/client.tsx +0 -73
- package/src/react/form/form.tsx +0 -178
- package/src/react/form/index.ts +0 -2
- package/src/react/index.ts +0 -5
- package/src/react/keyboard.tsx +0 -54
- package/src/react/useFetch.ts +0 -29
- package/src/react/useFetcher.ts +0 -54
- package/src/react-native/index.ts +0 -3
- package/src/react-native/share.ts +0 -31
- package/src/react-native/update.tsx +0 -40
- package/src/react-native/useAppState.ts +0 -18
- package/src/tailwind/README.md +0 -8
- package/src/tailwind/fullpage.tsx +0 -11
- package/src/tailwind/index.ts +0 -2
- package/src/tailwind/responsiveHelper.tsx +0 -16
- package/src-todo/auth0.tsx +0 -177
- package/tsconfig.json +0 -23
- package/turbo.json +0 -10
- package/vite.config.ts +0 -56
- package/vite.exports.ts +0 -121
package/dist/core/worker.js
DELETED
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
-
import { getTransferrable } from "./workerUtils.js";
|
|
5
|
-
const ALL = "*";
|
|
6
|
-
const RESPONDER = Symbol("responder");
|
|
7
|
-
function checkClosed(obj, label = "external") {
|
|
8
|
-
if (obj == null ? void 0 : obj.closed) throw new Error(`Context ${obj.id} is closed (${label})`, { cause: obj });
|
|
9
|
-
}
|
|
10
|
-
function checkMessage(obj, message) {
|
|
11
|
-
if (!message) throw new Error("New context must have message", { cause: obj });
|
|
12
|
-
}
|
|
13
|
-
class WorkerDialog {
|
|
14
|
-
// IDs are intentionally not global
|
|
15
|
-
constructor(worker, responders, name, debug = 0) {
|
|
16
|
-
__publicField(this, "contexts", /* @__PURE__ */ new Set());
|
|
17
|
-
__publicField(this, "closed", false);
|
|
18
|
-
__publicField(this, "currentId", 0);
|
|
19
|
-
var _a, _b;
|
|
20
|
-
this.worker = worker;
|
|
21
|
-
this.responders = responders;
|
|
22
|
-
this.name = name;
|
|
23
|
-
this.debug = debug;
|
|
24
|
-
if (!this.worker) return;
|
|
25
|
-
for (const message in this.responders) {
|
|
26
|
-
if (!((_b = (_a = this.responders) == null ? void 0 : _a[message]) == null ? void 0 : _b[RESPONDER])) continue;
|
|
27
|
-
const rootContext = new ResponseContext(this, message, ALL);
|
|
28
|
-
rootContext.listen(async (data, context, event) => {
|
|
29
|
-
const responseContext = context.withMessage(message, event.data.ctx.id);
|
|
30
|
-
if (this.debug)
|
|
31
|
-
console.log("Root Listener", rootContext.info, {
|
|
32
|
-
rootContext: context,
|
|
33
|
-
data,
|
|
34
|
-
responseContext,
|
|
35
|
-
event,
|
|
36
|
-
responder: this.responders[message]
|
|
37
|
-
});
|
|
38
|
-
try {
|
|
39
|
-
responseContext.send(await this.responders[message](data, responseContext), true);
|
|
40
|
-
responseContext.close("root.listener");
|
|
41
|
-
} catch (e) {
|
|
42
|
-
if (this.debug) console.error(`Error in responder ${responseContext.info}`, { e });
|
|
43
|
-
responseContext.send(e, true);
|
|
44
|
-
}
|
|
45
|
-
}, true);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
getID() {
|
|
49
|
-
return (++this.currentId).toString();
|
|
50
|
-
}
|
|
51
|
-
close() {
|
|
52
|
-
for (const context of this.contexts) context.close("root");
|
|
53
|
-
this.contexts.clear();
|
|
54
|
-
}
|
|
55
|
-
withMessage(message) {
|
|
56
|
-
return new RequestContext(this, message, this.getID());
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
class RespondersBase {
|
|
60
|
-
create(message, responder) {
|
|
61
|
-
responder[RESPONDER] = true;
|
|
62
|
-
return responder;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
class Context {
|
|
66
|
-
constructor(dialog, message, id, parent = null) {
|
|
67
|
-
__publicField(this, "unsub", /* @__PURE__ */ new Set());
|
|
68
|
-
__publicField(this, "closed", false);
|
|
69
|
-
this.dialog = dialog;
|
|
70
|
-
this.message = message;
|
|
71
|
-
this.id = id;
|
|
72
|
-
this.parent = parent;
|
|
73
|
-
checkClosed(dialog, "newContext");
|
|
74
|
-
checkClosed(parent, "newContext");
|
|
75
|
-
checkMessage(this, message);
|
|
76
|
-
this.id = id ?? (parent == null ? void 0 : parent.id);
|
|
77
|
-
if (!this.id) throw new Error("ID is required", { cause: this });
|
|
78
|
-
this.dialog.contexts.add(this);
|
|
79
|
-
}
|
|
80
|
-
close(reason = "external") {
|
|
81
|
-
if (this.dialog.debug >= 2) console.log("Closing", this.info, reason, this);
|
|
82
|
-
this.dialog.contexts.delete(this);
|
|
83
|
-
for (const unsub of this.unsub) unsub();
|
|
84
|
-
this.unsub.clear();
|
|
85
|
-
this.dialog.contexts.forEach((context) => {
|
|
86
|
-
var _a;
|
|
87
|
-
if (((_a = context.parent) == null ? void 0 : _a.id) === this.id) context.close("parent");
|
|
88
|
-
});
|
|
89
|
-
this.closed = true;
|
|
90
|
-
}
|
|
91
|
-
get info() {
|
|
92
|
-
var _a;
|
|
93
|
-
return `${this.dialog.name}:${((_a = this.parent) == null ? void 0 : _a.id) ?? ALL}/${this.id}:${this.message.toString()}[${this.closed ? "closed" : "open"},${this.type}]`;
|
|
94
|
-
}
|
|
95
|
-
get debugInfo() {
|
|
96
|
-
var _a;
|
|
97
|
-
return {
|
|
98
|
-
id: this.id,
|
|
99
|
-
parentId: (_a = this.parent) == null ? void 0 : _a.id,
|
|
100
|
-
message: this.message,
|
|
101
|
-
closed: this.closed,
|
|
102
|
-
type: this.type,
|
|
103
|
-
listeners: this.unsub.size
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
postMessage(data, done = false) {
|
|
107
|
-
var _a;
|
|
108
|
-
checkClosed(this, "postMessage");
|
|
109
|
-
const transfer = getTransferrable(data);
|
|
110
|
-
const ctx = {
|
|
111
|
-
done,
|
|
112
|
-
id: this.id,
|
|
113
|
-
parentId: (_a = this.parent) == null ? void 0 : _a.id,
|
|
114
|
-
message: this.message
|
|
115
|
-
};
|
|
116
|
-
if (this.dialog.debug >= 3) console.log("postMessage", this.info, { ctx, data, transfer }, this);
|
|
117
|
-
this.dialog.worker.postMessage({ data, ctx }, transfer);
|
|
118
|
-
return data;
|
|
119
|
-
}
|
|
120
|
-
send(data, done = false) {
|
|
121
|
-
return this.postMessage(data, done);
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Does not automatically close, assumes consumer will close
|
|
125
|
-
*
|
|
126
|
-
* ```ts
|
|
127
|
-
* dialog.request('x').fetch((c) => {
|
|
128
|
-
* c.response('x').listen(() => { ... }); // listens to "x", will be closed by upper level fetch
|
|
129
|
-
* c.request('x').fetcH(y, (c) => { ... }); // closes
|
|
130
|
-
* }) // closes
|
|
131
|
-
*
|
|
132
|
-
* const un = dialog.context('x').listen((e) => { ... }); // listens to 'x'
|
|
133
|
-
* un(); // closes
|
|
134
|
-
*
|
|
135
|
-
* const un = dialog.context('x').listen((e) => { ... }); // listens to 'x'
|
|
136
|
-
* un(); // closes
|
|
137
|
-
* ```
|
|
138
|
-
*/
|
|
139
|
-
listen(callback, done = false) {
|
|
140
|
-
checkClosed(this, "listen");
|
|
141
|
-
const controller = new AbortController();
|
|
142
|
-
this.dialog.worker.addEventListener(
|
|
143
|
-
"message",
|
|
144
|
-
async (event) => {
|
|
145
|
-
try {
|
|
146
|
-
const {
|
|
147
|
-
data: { ctx, data }
|
|
148
|
-
} = event;
|
|
149
|
-
if (!ctx || this.id !== ALL && this.id !== ctx.id || this.message !== ctx.message || done && !ctx.done)
|
|
150
|
-
return;
|
|
151
|
-
if (this.dialog.debug) console.log("Listener event", this.info, event, this);
|
|
152
|
-
await callback(data, this, event);
|
|
153
|
-
} catch (e) {
|
|
154
|
-
if (this.dialog.debug) console.error(`Error in listener ${this.info}`, this, { event, e });
|
|
155
|
-
}
|
|
156
|
-
},
|
|
157
|
-
{ signal: controller.signal }
|
|
158
|
-
);
|
|
159
|
-
const unsub = () => {
|
|
160
|
-
if (this.dialog.debug >= 2) console.log("Stop listening", this.info, this);
|
|
161
|
-
controller.abort();
|
|
162
|
-
this.unsub.delete(unsub);
|
|
163
|
-
};
|
|
164
|
-
this.unsub.add(unsub);
|
|
165
|
-
return unsub;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
class RequestContext extends Context {
|
|
169
|
-
constructor() {
|
|
170
|
-
super(...arguments);
|
|
171
|
-
__publicField(this, "type", "request");
|
|
172
|
-
}
|
|
173
|
-
withMessage(message, id) {
|
|
174
|
-
return new RequestContext(this.dialog, message, id, this);
|
|
175
|
-
}
|
|
176
|
-
send(data, done = false) {
|
|
177
|
-
return super.send(data, done);
|
|
178
|
-
}
|
|
179
|
-
listen(callback, done = false) {
|
|
180
|
-
return super.listen(callback, done);
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Returns response
|
|
184
|
-
* If you need to work with ctx, use callback
|
|
185
|
-
* Closed automatically on response
|
|
186
|
-
*
|
|
187
|
-
* dialog.fetch('x', (c) => {
|
|
188
|
-
* c.listen(() => { ... }); // will be closed by upper level fetch
|
|
189
|
-
* c.fetcH(y, (c) => { ... }); // closes c
|
|
190
|
-
* c.context().fetcH(y, (c) => { ... }); // closes sub, not closes c, will be closed by upper level fetch
|
|
191
|
-
* })
|
|
192
|
-
*/
|
|
193
|
-
async fetch(data, callback) {
|
|
194
|
-
checkClosed(this, "fetch");
|
|
195
|
-
const res = await Promise.all([
|
|
196
|
-
callback == null ? void 0 : callback(this),
|
|
197
|
-
this.expect(),
|
|
198
|
-
// will be closed in expect -> listener -> unsub
|
|
199
|
-
this.send(data, true)
|
|
200
|
-
]);
|
|
201
|
-
if (this.dialog.debug >= 2) console.log("Fetch", this.info, this);
|
|
202
|
-
this.close("fetch");
|
|
203
|
-
return res[1];
|
|
204
|
-
}
|
|
205
|
-
async expect() {
|
|
206
|
-
checkClosed(this, "expect");
|
|
207
|
-
return new Promise((resolve, reject) => {
|
|
208
|
-
const responseListener = this.listen(async (data) => {
|
|
209
|
-
try {
|
|
210
|
-
if (data instanceof Error) throw data;
|
|
211
|
-
responseListener();
|
|
212
|
-
if (this.dialog.debug >= 3) console.log("Expect", this.info, data, this);
|
|
213
|
-
resolve(data);
|
|
214
|
-
} catch (e) {
|
|
215
|
-
reject(e);
|
|
216
|
-
}
|
|
217
|
-
}, true);
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
class ResponseContext extends Context {
|
|
222
|
-
constructor() {
|
|
223
|
-
super(...arguments);
|
|
224
|
-
__publicField(this, "type", "response");
|
|
225
|
-
}
|
|
226
|
-
withMessage(message, id) {
|
|
227
|
-
return new ResponseContext(this.dialog, message, id, this);
|
|
228
|
-
}
|
|
229
|
-
listen(callback, done = false) {
|
|
230
|
-
return super.listen(callback, done);
|
|
231
|
-
}
|
|
232
|
-
send(data, done = false) {
|
|
233
|
-
return super.send(data, done);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
export {
|
|
237
|
-
RespondersBase,
|
|
238
|
-
WorkerDialog
|
|
239
|
-
};
|
|
240
|
-
//# sourceMappingURL=worker.js.map
|
package/dist/core/worker.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sources":["../../src/core/worker.ts"],"sourcesContent":["import { getTransferrable } from './workerUtils';\n\n// Types\n\ntype WebWorker = Worker | (Window & typeof globalThis) | (WorkerGlobalScope & typeof globalThis);\n\ntype MethodReturn<R, M extends keyof R> = R[M] extends (...args: any[]) => any\n ? Partial<Awaited<ReturnType<R[M]>>>\n : never;\n\ntype MethodArg<R, M extends keyof R> = R[M] extends (arg: infer A, ...args: any[]) => any ? Partial<A> : never;\n\nexport type Ctx<R, K extends keyof R> = {\n id: string;\n parentId?: string;\n message: K;\n done: boolean;\n};\n\ntype Data<R, M extends keyof R> = MethodReturn<R, M> | MethodArg<R, M> | Error;\n\ntype Event<R, M extends keyof R> = MessageEvent<{ data: Data<R, M>; ctx: Ctx<R, M> }>;\n\ntype Listener<R, M extends keyof R, D extends Data<R, M> = Data<R, M>, S extends Context<R, M> = Context<R, M>> = (\n data: D,\n self: S,\n event: Event<R, M>,\n) => void | Promise<void>;\n\n// Constants\n\nconst ALL = '*';\n\nconst RESPONDER = Symbol('responder');\n\nfunction checkClosed(obj: any, label: string = 'external') {\n if (obj?.closed) throw new Error(`Context ${obj.id} is closed (${label})`, { cause: obj });\n}\n\nfunction checkMessage(obj: any, message: any) {\n if (!message) throw new Error('New context must have message', { cause: obj });\n}\n\n// Classes\n\nexport class WorkerDialog<R extends RespondersBase<any>> {\n readonly contexts: Set<Context<R, keyof R>> = new Set();\n protected closed = false;\n protected currentId = 0; // IDs are intentionally not global\n\n constructor(\n public worker: WebWorker,\n public responders: R,\n public name: string,\n public debug: number = 0, // 0 - none, 1 - general messages, 2 - sub/unsub, 3 - transport TODO Object?\n ) {\n if (!this.worker) return; // Next.js SSR\n\n for (const message in this.responders) {\n if (!this.responders?.[message]?.[RESPONDER]) continue;\n\n // root context with id=all\n const rootContext = new ResponseContext<R, typeof message>(this, message, ALL);\n\n //TODO: unsub(); ? Probably not needed, root must be always listening until closed by WorkerDialog\n rootContext.listen(async (data, context, event) => {\n // create sub context with ID\n const responseContext = context.withMessage(message, event.data.ctx.id);\n\n /* v8 ignore start */\n if (this.debug)\n console.log('Root Listener', rootContext.info, {\n rootContext: context,\n data,\n responseContext,\n event,\n responder: this.responders[message],\n });\n /* v8 ignore stop */\n\n try {\n responseContext.send(await (this.responders[message] as any)(data, responseContext), true);\n responseContext.close('root.listener');\n } catch (e) {\n /* v8 ignore next */\n if (this.debug) console.error(`Error in responder ${responseContext.info}`, { e });\n responseContext.send(e, true);\n }\n }, true);\n }\n }\n\n getID(): string {\n return (++this.currentId).toString();\n }\n\n close(): void {\n for (const context of this.contexts) context.close('root');\n this.contexts.clear();\n }\n\n withMessage<M extends keyof R>(message: M): RequestContext<R, M> {\n return new RequestContext<R, M>(this, message, this.getID()); // always new context\n }\n}\n\nexport class RespondersBase<R> {\n create<M extends keyof R, F extends (input: any, context: ResponseContext<R, M>) => any>(\n message: M,\n responder: F,\n ): F {\n responder[RESPONDER] = true;\n return responder as any;\n }\n}\n\n// can only be used to create actual contexts, carries the context data\nabstract class Context<R, M extends keyof R> {\n protected readonly unsub: Set<() => void> = new Set();\n protected closed = false;\n\n constructor(\n protected readonly dialog: WorkerDialog<any>,\n public message: M,\n public id: string | undefined,\n public parent: Context<R, keyof R> | undefined | null = null,\n ) {\n checkClosed(dialog, 'newContext');\n checkClosed(parent, 'newContext');\n checkMessage(this, message);\n this.id = id ?? parent?.id;\n if (!this.id) throw new Error('ID is required', { cause: this });\n this.dialog.contexts.add(this);\n }\n\n abstract withMessage<M2 extends keyof R>(message: M2, id?: string): Context<R, M2>;\n\n close(reason: string = 'external'): void {\n /* v8 ignore next */\n if (this.dialog.debug >= 2) console.log('Closing', this.info, reason, this);\n\n this.dialog.contexts.delete(this);\n\n // Unsubscribe from all listeners\n for (const unsub of this.unsub) unsub();\n this.unsub.clear();\n\n // Remove all child contexts\n this.dialog.contexts.forEach((context) => {\n if (context.parent?.id === this.id) context.close('parent');\n });\n\n this.closed = true;\n }\n\n get info() {\n return `${this.dialog.name}:${this.parent?.id ?? ALL}/${this.id}:${this.message.toString()}[${this.closed ? 'closed' : 'open'},${this.type}]`;\n }\n\n get debugInfo(): {\n id?: string;\n parentId?: string;\n message: string | number | symbol;\n closed: boolean;\n type: string;\n listeners: number;\n } {\n return {\n id: this.id,\n parentId: this.parent?.id,\n message: this.message,\n closed: this.closed,\n type: this.type,\n listeners: this.unsub.size,\n };\n }\n\n abstract type: 'request' | 'response' | string;\n\n protected postMessage(data?: Data<R, M>, done = false): Data<R, M> | undefined {\n checkClosed(this, 'postMessage');\n\n const transfer = getTransferrable(data);\n\n const ctx = {\n done,\n id: this.id,\n parentId: this.parent?.id,\n message: this.message,\n };\n\n /* v8 ignore next */\n if (this.dialog.debug >= 3) console.log('postMessage', this.info, { ctx, data, transfer }, this);\n\n this.dialog.worker.postMessage({ data, ctx }, transfer);\n\n return data;\n }\n\n send(data?: Data<R, M>, done = false): Data<R, M> | undefined {\n return this.postMessage(data, done);\n }\n\n /**\n * Does not automatically close, assumes consumer will close\n *\n * ```ts\n * dialog.request('x').fetch((c) => {\n * c.response('x').listen(() => { ... }); // listens to \"x\", will be closed by upper level fetch\n * c.request('x').fetcH(y, (c) => { ... }); // closes\n * }) // closes\n *\n * const un = dialog.context('x').listen((e) => { ... }); // listens to 'x'\n * un(); // closes\n *\n * const un = dialog.context('x').listen((e) => { ... }); // listens to 'x'\n * un(); // closes\n * ```\n */\n listen(callback: Listener<R, M>, done = false): () => void {\n checkClosed(this, 'listen');\n\n const controller = new AbortController();\n\n this.dialog.worker.addEventListener(\n 'message',\n async (event: Event<R, M>) => {\n try {\n const {\n data: { ctx, data },\n } = event;\n\n if (\n !ctx ||\n (this.id !== ALL && this.id !== ctx.id) ||\n this.message !== ctx.message ||\n (done && !ctx.done)\n )\n return; // unknown message from devtools etc., or different context\n\n /* v8 ignore next */\n if (this.dialog.debug) console.log('Listener event', this.info, event, this);\n\n await callback(data, this, event); // Requests can come here, but they're typed in responders\n } catch (e) {\n /* v8 ignore next */\n if (this.dialog.debug) console.error(`Error in listener ${this.info}`, this, { event, e });\n //TODO Respond with error?\n }\n },\n { signal: controller.signal },\n );\n\n const unsub = () => {\n /* v8 ignore next */\n if (this.dialog.debug >= 2) console.log('Stop listening', this.info, this);\n controller.abort();\n this.unsub.delete(unsub);\n };\n\n this.unsub.add(unsub);\n\n return unsub;\n }\n}\n\nclass RequestContext<R, M extends keyof R> extends Context<R, M> {\n type = 'request';\n\n withMessage<M2 extends keyof R>(message: M2, id?: string): RequestContext<R, M2> {\n return new RequestContext<R, M2>(this.dialog, message, id, this);\n }\n\n send(data?: MethodArg<R, M>, done = false): MethodArg<R, M> {\n return super.send(data, done) as any;\n }\n\n listen(callback: Listener<R, M, MethodReturn<R, M>, RequestContext<R, M>>, done = false): () => void {\n return super.listen(callback, done);\n }\n\n /**\n * Returns response\n * If you need to work with ctx, use callback\n * Closed automatically on response\n *\n * dialog.fetch('x', (c) => {\n * c.listen(() => { ... }); // will be closed by upper level fetch\n * c.fetcH(y, (c) => { ... }); // closes c\n * c.context().fetcH(y, (c) => { ... }); // closes sub, not closes c, will be closed by upper level fetch\n * })\n */\n async fetch(\n data?: MethodArg<R, M>,\n callback?: (context: RequestContext<R, M>) => void,\n ): Promise<MethodReturn<R, M>> {\n checkClosed(this, 'fetch');\n\n const res = await Promise.all([\n callback?.(this),\n this.expect(), // will be closed in expect -> listener -> unsub\n this.send(data, true),\n ]);\n\n /* v8 ignore next */\n if (this.dialog.debug >= 2) console.log('Fetch', this.info, this);\n\n this.close('fetch');\n\n return res[1];\n }\n\n protected async expect(): Promise<MethodReturn<R, M>> {\n checkClosed(this, 'expect');\n\n //FIXME Manual promise type\n return new Promise((resolve, reject) => {\n const responseListener = this.listen(async (data) => {\n try {\n if ((data as any) instanceof Error) throw data;\n responseListener();\n /* v8 ignore next */\n if (this.dialog.debug >= 3) console.log('Expect', this.info, data, this);\n resolve(data as any);\n } catch (e) {\n reject(e);\n }\n }, true);\n });\n }\n}\n\nclass ResponseContext<R, M extends keyof R> extends Context<R, M> {\n type = 'response';\n\n withMessage<M2 extends keyof R>(message: M2, id?: string): ResponseContext<R, M2> {\n return new ResponseContext<R, M2>(this.dialog, message, id, this);\n }\n\n listen(callback: Listener<R, M, MethodArg<R, M>, ResponseContext<R, M>>, done = false): () => void {\n return super.listen(callback, done);\n }\n\n send(data?: MethodReturn<R, M>, done = false): MethodReturn<R, M> {\n return super.send(data, done) as any;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker.test.d.ts","sourceRoot":"","sources":["../../src/core/worker.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workerUtils.d.ts","sourceRoot":"","sources":["../../src/core/workerUtils.ts"],"names":[],"mappings":"AAoBA,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAEhD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,GAAQ,GAAG,YAAY,EAAE,CAO/D"}
|
package/dist/core/workerUtils.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
const g = globalThis;
|
|
2
|
-
const transferrable = [
|
|
3
|
-
g.ArrayBuffer,
|
|
4
|
-
g.MessagePort,
|
|
5
|
-
g.ReadableStream,
|
|
6
|
-
g.WritableStream,
|
|
7
|
-
g.TransformStream,
|
|
8
|
-
// WebTransportReceiveStream, // ReferenceError: WebTransportReceiveStream is not defined
|
|
9
|
-
// WebTransportSendStream, // ReferenceError: WebTransportReceiveStream is not defined
|
|
10
|
-
// AudioData, // TS2304: Cannot find name AudioData
|
|
11
|
-
g.ImageBitmap,
|
|
12
|
-
g.VideoFrame,
|
|
13
|
-
g.OffscreenCanvas,
|
|
14
|
-
g.RTCDataChannel,
|
|
15
|
-
g.MediaSourceHandle
|
|
16
|
-
// MIDIAccess, // ReferenceError: MIDIAccess is not defined
|
|
17
|
-
].filter(Boolean);
|
|
18
|
-
function isTransferable(obj) {
|
|
19
|
-
return transferrable.some((t) => obj instanceof t) ? obj : null;
|
|
20
|
-
}
|
|
21
|
-
function getTransferrable(data = {}) {
|
|
22
|
-
if (!data) return [];
|
|
23
|
-
return Object.values(data).reduce((r, v) => {
|
|
24
|
-
return Array.isArray(v) ? [...r, ...v.map(isTransferable)] : [...r, isTransferable(v)];
|
|
25
|
-
}, []).filter(Boolean);
|
|
26
|
-
}
|
|
27
|
-
export {
|
|
28
|
-
getTransferrable,
|
|
29
|
-
isTransferable
|
|
30
|
-
};
|
|
31
|
-
//# sourceMappingURL=workerUtils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workerUtils.js","sources":["../../src/core/workerUtils.ts"],"sourcesContent":["const g = globalThis;\n\n// @see https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Transferable_objects\nconst transferrable = [\n g.ArrayBuffer,\n g.MessagePort,\n g.ReadableStream,\n g.WritableStream,\n g.TransformStream,\n // WebTransportReceiveStream, // ReferenceError: WebTransportReceiveStream is not defined\n // WebTransportSendStream, // ReferenceError: WebTransportReceiveStream is not defined\n // AudioData, // TS2304: Cannot find name AudioData\n g.ImageBitmap,\n g.VideoFrame,\n g.OffscreenCanvas,\n g.RTCDataChannel,\n g.MediaSourceHandle,\n // MIDIAccess, // ReferenceError: MIDIAccess is not defined\n].filter(Boolean);\n\nexport function isTransferable(obj: any): boolean {\n return transferrable.some((t) => obj instanceof t) ? obj : null;\n}\n\nexport function getTransferrable(data: any = {}): Transferable[] {\n if (!data) return [];\n return Object.values<any>(data)\n .reduce((r, v) => {\n return Array.isArray(v) ? [...r, ...v.map(isTransferable)] : [...r, isTransferable(v)];\n }, [])\n .filter(Boolean);\n}\n"],"names":[],"mappings":"AAAA,MAAM,IAAI;AAGV,MAAM,gBAAgB;AAAA,EAClB,EAAE;AAAA,EACF,EAAE;AAAA,EACF,EAAE;AAAA,EACF,EAAE;AAAA,EACF,EAAE;AAAA;AAAA;AAAA;AAAA,EAIF,EAAE;AAAA,EACF,EAAE;AAAA,EACF,EAAE;AAAA,EACF,EAAE;AAAA,EACF,EAAE;AAAA;AAEN,EAAE,OAAO,OAAO;AAET,SAAS,eAAe,KAAmB;AAC9C,SAAO,cAAc,KAAK,CAAC,MAAM,eAAe,CAAC,IAAI,MAAM;AAC/D;AAEgB,SAAA,iBAAiB,OAAY,IAAoB;AACzD,MAAA,CAAC,KAAM,QAAO,CAAC;AACnB,SAAO,OAAO,OAAY,IAAI,EACzB,OAAO,CAAC,GAAG,MAAM;AACd,WAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC,CAAC;AAAA,EAAA,GACtF,CAAE,CAAA,EACJ,OAAO,OAAO;AACvB;"}
|
package/dist/core/wrpc.d.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
export type Responders = {
|
|
2
|
-
[key: string]: (arg?: any) => Generator<any> | AsyncGenerator<any> | Promise<any> | any;
|
|
3
|
-
};
|
|
4
|
-
export type Context = {
|
|
5
|
-
message: string;
|
|
6
|
-
id: string;
|
|
7
|
-
signalName?: string;
|
|
8
|
-
done?: boolean;
|
|
9
|
-
abort?: string;
|
|
10
|
-
error?: boolean;
|
|
11
|
-
ack?: boolean;
|
|
12
|
-
promise?: boolean;
|
|
13
|
-
};
|
|
14
|
-
export type Event = MessageEvent<{
|
|
15
|
-
ctx: Context;
|
|
16
|
-
payload: any | Error;
|
|
17
|
-
}>;
|
|
18
|
-
export type WorkerLike = {
|
|
19
|
-
postMessage: (payload: any, transferable: any[]) => void;
|
|
20
|
-
addEventListener: (event: string, listener: (e: any) => void, options?: {
|
|
21
|
-
signal?: AbortSignal;
|
|
22
|
-
once?: boolean;
|
|
23
|
-
}) => void;
|
|
24
|
-
removeEventListener: (event: string, listener: (e: any) => void) => void;
|
|
25
|
-
} & any;
|
|
26
|
-
export declare enum LogLevel {
|
|
27
|
-
disabled = 0,
|
|
28
|
-
error = 1,
|
|
29
|
-
lifecycle = 2,
|
|
30
|
-
detail = 3,
|
|
31
|
-
transport = 4
|
|
32
|
-
}
|
|
33
|
-
export declare function deriveController(signal?: AbortSignal): [AbortController, AbortSignal];
|
|
34
|
-
export declare function rejectOnSignal(promise: Promise<any>, signal: AbortSignal): Promise<Event['data']>;
|
|
35
|
-
export declare function wrpc({ debug, name, }?: {
|
|
36
|
-
debug?: LogLevel;
|
|
37
|
-
name?: string;
|
|
38
|
-
}): {
|
|
39
|
-
createResponder: <T extends Responders>(worker: WorkerLike, responders: T) => {
|
|
40
|
-
responders: T;
|
|
41
|
-
stop: () => void;
|
|
42
|
-
};
|
|
43
|
-
createCaller: <T extends Responders>(worker: WorkerLike, responders: T) => T;
|
|
44
|
-
};
|
|
45
|
-
//# sourceMappingURL=wrpc.d.ts.map
|
package/dist/core/wrpc.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wrpc.d.ts","sourceRoot":"","sources":["../../src/core/wrpc.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;CAAE,CAAC;AAErH,MAAM,MAAM,OAAO,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,GAAG,GAAG,KAAK,CAAA;CAAE,CAAC,CAAC;AAEzE,MAAM,MAAM,UAAU,GAAG;IACrB,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IACzD,gBAAgB,EAAE,CACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,EAC1B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,IAAI,CAAC;IACV,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;CAC5E,GAAG,GAAG,CAAC;AAER,oBAAY,QAAQ;IAChB,QAAQ,IAAI;IACZ,KAAK,IAAI;IACT,SAAS,IAAI;IACb,MAAM,IAAI;IACV,SAAS,IAAI;CAChB;AAID,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC,CAGrF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAOjG;AAID,wBAAgB,IAAI,CAAC,EACjB,KAAyB,EACzB,IAAiE,GACpE,GAAE;IACC,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACZ,GAAG;IACL,eAAe,EAAE,CAAC,CAAC,SAAS,UAAU,EAClC,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,CAAC,KACZ;QACD,UAAU,EAAE,CAAC,CAAC;QACd,IAAI,EAAE,MAAM,IAAI,CAAC;KACpB,CAAC;IACF,YAAY,EAAE,CAAC,CAAC,SAAS,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;CAChF,CAkTA"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export declare const responder: {
|
|
2
|
-
responders: {
|
|
3
|
-
test: ({ buf, signal }?: {
|
|
4
|
-
signal?: AbortSignal;
|
|
5
|
-
buf?: ArrayBuffer;
|
|
6
|
-
}) => Generator<{
|
|
7
|
-
progress: number;
|
|
8
|
-
aborted?: boolean;
|
|
9
|
-
}, string, unknown>;
|
|
10
|
-
returnYield: () => Generator<1 | 3 | 2, any, unknown>;
|
|
11
|
-
bidirectional: (prefix?: any) => Generator<string, string, number>;
|
|
12
|
-
error: () => AsyncGenerator<never, never, unknown>;
|
|
13
|
-
promise: () => Promise<{
|
|
14
|
-
test: string;
|
|
15
|
-
}>;
|
|
16
|
-
promiseError: () => Promise<never>;
|
|
17
|
-
setTimeout: ({ timeout }?: {
|
|
18
|
-
timeout?: number;
|
|
19
|
-
}) => Promise<unknown>;
|
|
20
|
-
setInterval: ({ timeout }?: {
|
|
21
|
-
timeout?: number;
|
|
22
|
-
}) => AsyncGenerator<any, never, unknown>;
|
|
23
|
-
};
|
|
24
|
-
stop: () => void;
|
|
25
|
-
};
|
|
26
|
-
//# sourceMappingURL=wrpc.fixture.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wrpc.fixture.d.ts","sourceRoot":"","sources":["../../src/core/wrpc.fixture.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,EAAE;IACpB,UAAU,EAAE;QAGR,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,WAAW,CAAC;YAAC,GAAG,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,SAAS,CAC9E;YACI,QAAQ,EAAE,MAAM,CAAC;YACjB,OAAO,CAAC,EAAE,OAAO,CAAC;SACrB,EACD,MAAM,EACN,OAAO,CACV,CAAC;QAEF,WAAW,EAAE,MAAM,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACtD,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEnE,KAAK,EAAE,MAAM,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,EAAE,MAAM,OAAO,CAAC;YACnB,IAAI,EAAE,MAAM,CAAC;SAChB,CAAC,CAAC;QACH,YAAY,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACrE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;KAC5F,CAAC;IACF,IAAI,EAAE,MAAM,IAAI,CAAC;CAkDnB,CAAC"}
|
package/dist/core/wrpc.js
DELETED
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
import { getTransferrable } from "./workerUtils.js";
|
|
2
|
-
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
3
|
-
LogLevel2[LogLevel2["disabled"] = 0] = "disabled";
|
|
4
|
-
LogLevel2[LogLevel2["error"] = 1] = "error";
|
|
5
|
-
LogLevel2[LogLevel2["lifecycle"] = 2] = "lifecycle";
|
|
6
|
-
LogLevel2[LogLevel2["detail"] = 3] = "detail";
|
|
7
|
-
LogLevel2[LogLevel2["transport"] = 4] = "transport";
|
|
8
|
-
return LogLevel2;
|
|
9
|
-
})(LogLevel || {});
|
|
10
|
-
function deriveController(signal) {
|
|
11
|
-
const controller = new AbortController();
|
|
12
|
-
return [controller, AbortSignal.any([controller.signal, signal].filter(Boolean))];
|
|
13
|
-
}
|
|
14
|
-
function rejectOnSignal(promise, signal) {
|
|
15
|
-
return Promise.race([
|
|
16
|
-
promise,
|
|
17
|
-
new Promise((resolve, reject) => {
|
|
18
|
-
signal.addEventListener("abort", () => reject("RaceAborted:" + signal.reason), { once: true, signal });
|
|
19
|
-
})
|
|
20
|
-
]);
|
|
21
|
-
}
|
|
22
|
-
function wrpc({
|
|
23
|
-
debug = 0,
|
|
24
|
-
name = globalThis.importScripts ? "RESPONDER" : "CALLER"
|
|
25
|
-
} = {}) {
|
|
26
|
-
function logger(type) {
|
|
27
|
-
return (level, ctx, ...args) => {
|
|
28
|
-
if (!debug || debug < level) return;
|
|
29
|
-
const { id, message, ...restCtx } = ctx || {};
|
|
30
|
-
console[type](name, message || "*", id || "*", ...args, restCtx);
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
const log = logger("log");
|
|
34
|
-
const logWarn = logger("warn");
|
|
35
|
-
const logError = logger("error");
|
|
36
|
-
function send(worker, ctx, payload) {
|
|
37
|
-
log(4, ctx, "SEND", payload, typeof payload);
|
|
38
|
-
worker.postMessage({ ctx, payload }, getTransferrable(payload));
|
|
39
|
-
}
|
|
40
|
-
function listen(worker, context, listener, signal, once = false) {
|
|
41
|
-
signal.addEventListener(
|
|
42
|
-
"abort",
|
|
43
|
-
() => logWarn(3, context, "LISTEN SIGNAL ABORT", signal.reason),
|
|
44
|
-
{
|
|
45
|
-
signal,
|
|
46
|
-
once: true
|
|
47
|
-
}
|
|
48
|
-
);
|
|
49
|
-
worker.addEventListener(
|
|
50
|
-
"message",
|
|
51
|
-
({ data }) => {
|
|
52
|
-
var _a, _b;
|
|
53
|
-
log(4, context, "LISTEN EVENT", data);
|
|
54
|
-
if (!context || ((_a = data == null ? void 0 : data.ctx) == null ? void 0 : _a.message) === context.message && ((_b = data.ctx) == null ? void 0 : _b.id) === context.id) listener(data);
|
|
55
|
-
},
|
|
56
|
-
{ signal, once }
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
function waitFor(worker, ctx, condition = (data) => true, signal) {
|
|
60
|
-
const [waitController, waitSignal] = deriveController(signal);
|
|
61
|
-
return new Promise(
|
|
62
|
-
(res) => listen(
|
|
63
|
-
worker,
|
|
64
|
-
ctx,
|
|
65
|
-
(data) => {
|
|
66
|
-
if (!condition(data)) return;
|
|
67
|
-
waitController.abort("WaitFinished");
|
|
68
|
-
res(data);
|
|
69
|
-
},
|
|
70
|
-
waitSignal
|
|
71
|
-
)
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
function createResponder(worker, responders) {
|
|
75
|
-
const mainController = new AbortController();
|
|
76
|
-
worker.addEventListener("messageerror", (e) => logError(1, null, "MESSAGE ERROR", e), {
|
|
77
|
-
signal: mainController.signal
|
|
78
|
-
});
|
|
79
|
-
listen(
|
|
80
|
-
worker,
|
|
81
|
-
null,
|
|
82
|
-
async ({ ctx, payload = {} }) => {
|
|
83
|
-
if (!ctx || !ctx.message || !ctx.id || ctx.abort || ctx.ack) return;
|
|
84
|
-
try {
|
|
85
|
-
const responder = responders[ctx.message];
|
|
86
|
-
if (!responder) throw new Error("Unknown responder", { cause: ctx });
|
|
87
|
-
const [subController, subSignal] = deriveController(mainController.signal);
|
|
88
|
-
if (ctx.signalName) payload[ctx.signalName] = subSignal;
|
|
89
|
-
const iterator = responder(payload);
|
|
90
|
-
log(2, ctx, "START", iterator);
|
|
91
|
-
if (!iterator[Symbol.asyncIterator] && !iterator[Symbol.iterator]) {
|
|
92
|
-
send(worker, { ...ctx, promise: true }, await rejectOnSignal(iterator, subSignal));
|
|
93
|
-
log(3, ctx, "PROMISE RESOLVED");
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
try {
|
|
97
|
-
listen(
|
|
98
|
-
worker,
|
|
99
|
-
ctx,
|
|
100
|
-
(data) => {
|
|
101
|
-
if (!data.ctx.abort) return;
|
|
102
|
-
subController.abort(data.ctx.abort);
|
|
103
|
-
logWarn(2, ctx, "GOT ABORT");
|
|
104
|
-
},
|
|
105
|
-
subSignal
|
|
106
|
-
);
|
|
107
|
-
let res;
|
|
108
|
-
let nextPayload = payload;
|
|
109
|
-
do {
|
|
110
|
-
res = await rejectOnSignal(iterator.next(nextPayload), subSignal);
|
|
111
|
-
send(worker, { ...ctx, done: res.done }, res.value);
|
|
112
|
-
if (res.done) {
|
|
113
|
-
subController.abort("Done");
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
const nextData = await rejectOnSignal(
|
|
117
|
-
waitFor(worker, ctx, (data) => !!data.ctx.ack, subSignal),
|
|
118
|
-
subSignal
|
|
119
|
-
);
|
|
120
|
-
nextPayload = nextData.payload;
|
|
121
|
-
log(3, ctx, "LOOP ACK");
|
|
122
|
-
} while (!res.done && !subSignal.aborted);
|
|
123
|
-
} catch (e) {
|
|
124
|
-
if (!subSignal.aborted && !e.message.includes("RaceAborted")) {
|
|
125
|
-
logError(1, ctx, "LOOP ERROR", e);
|
|
126
|
-
send(worker, { ...ctx, error: true, done: true }, e);
|
|
127
|
-
}
|
|
128
|
-
} finally {
|
|
129
|
-
log(3, ctx, "LOOP DONE");
|
|
130
|
-
}
|
|
131
|
-
} catch (e) {
|
|
132
|
-
logError(1, ctx, "ERROR", e);
|
|
133
|
-
send(worker, { ...ctx, error: true, done: true }, e);
|
|
134
|
-
} finally {
|
|
135
|
-
log(3, ctx, "DONE");
|
|
136
|
-
}
|
|
137
|
-
},
|
|
138
|
-
mainController.signal
|
|
139
|
-
);
|
|
140
|
-
function stop() {
|
|
141
|
-
mainController.abort("Stop");
|
|
142
|
-
}
|
|
143
|
-
return { responders, stop };
|
|
144
|
-
}
|
|
145
|
-
function createCaller(worker, responders) {
|
|
146
|
-
worker.addEventListener("messageerror", (e) => logError(1, null, "MESSAGE ERROR", e));
|
|
147
|
-
return new Proxy(responders, {
|
|
148
|
-
get(target, prop, receiver) {
|
|
149
|
-
function gen(payload) {
|
|
150
|
-
const ctx = { message: prop.toString(), id: crypto.randomUUID() };
|
|
151
|
-
let signal = null;
|
|
152
|
-
if (payload && Object.is(payload, Object(payload))) {
|
|
153
|
-
for (const [key, value] of Object.entries(payload)) {
|
|
154
|
-
if (value instanceof AbortSignal) {
|
|
155
|
-
log(3, ctx, "FOUND SIGNAL", key);
|
|
156
|
-
ctx.signalName = key;
|
|
157
|
-
signal = value;
|
|
158
|
-
payload[key] = null;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
const [mainController, mainSignal] = deriveController(signal);
|
|
163
|
-
const cancel = (notify, reason = "") => {
|
|
164
|
-
if (mainController.signal.aborted) return;
|
|
165
|
-
logWarn(2, ctx, "CANCEL", reason, notify);
|
|
166
|
-
if (reason) mainController.abort(reason);
|
|
167
|
-
if (notify) send(worker, { ...ctx, abort: reason });
|
|
168
|
-
};
|
|
169
|
-
const [promiseController, promiseSignal] = deriveController(mainSignal);
|
|
170
|
-
const promise = waitFor(
|
|
171
|
-
worker,
|
|
172
|
-
ctx,
|
|
173
|
-
(data) => !!data.ctx.promise || !!data.ctx.error,
|
|
174
|
-
promiseSignal
|
|
175
|
-
).then(({ ctx: ctx2, payload: payload2 }) => {
|
|
176
|
-
if (ctx2.error) {
|
|
177
|
-
logError(1, ctx2, "PROMISE ERROR", payload2);
|
|
178
|
-
throw payload2;
|
|
179
|
-
}
|
|
180
|
-
log(2, ctx2, "PROMISE RESOLVED", payload2);
|
|
181
|
-
return payload2;
|
|
182
|
-
});
|
|
183
|
-
async function* generator() {
|
|
184
|
-
let done = false;
|
|
185
|
-
try {
|
|
186
|
-
mainSignal.addEventListener("abort", () => cancel(true, mainSignal.reason), {
|
|
187
|
-
once: true,
|
|
188
|
-
signal: mainSignal
|
|
189
|
-
});
|
|
190
|
-
log(3, ctx, "GENERATOR START");
|
|
191
|
-
promiseController.abort("GeneratorUsed");
|
|
192
|
-
do {
|
|
193
|
-
const data = await rejectOnSignal(
|
|
194
|
-
waitFor(worker, ctx, void 0, mainSignal),
|
|
195
|
-
mainSignal
|
|
196
|
-
);
|
|
197
|
-
const { ctx: ctxIn, payload: value } = data;
|
|
198
|
-
log(2, ctx, "EVENT", mainSignal.aborted, ctxIn, value);
|
|
199
|
-
if (ctxIn.promise) {
|
|
200
|
-
logError(1, ctx, "ERROR", "Unexpected promise in generator", data);
|
|
201
|
-
throw new Error("Unexpected promise in generator", { cause: data });
|
|
202
|
-
}
|
|
203
|
-
if (ctxIn.error) {
|
|
204
|
-
logError(1, ctx, "ERROR", data);
|
|
205
|
-
cancel(false, "Error");
|
|
206
|
-
throw value;
|
|
207
|
-
}
|
|
208
|
-
if (ctxIn.done) {
|
|
209
|
-
done = true;
|
|
210
|
-
return value;
|
|
211
|
-
} else {
|
|
212
|
-
const nextPayload = yield value;
|
|
213
|
-
if (!mainSignal.aborted) send(worker, { ...ctx, ack: true }, nextPayload);
|
|
214
|
-
}
|
|
215
|
-
} while (!mainSignal.aborted);
|
|
216
|
-
} finally {
|
|
217
|
-
log(3, ctx, "DONE");
|
|
218
|
-
cancel(true, mainSignal.aborted ? mainSignal.reason : done ? "Done" : "Break");
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
const iterator = generator();
|
|
222
|
-
send(worker, ctx, payload);
|
|
223
|
-
iterator["then"] = promise.then.bind(promise);
|
|
224
|
-
iterator["catch"] = promise.catch.bind(promise);
|
|
225
|
-
iterator["finally"] = promise.finally.bind(promise);
|
|
226
|
-
return iterator;
|
|
227
|
-
}
|
|
228
|
-
Object.defineProperty(gen, "name", { value: prop.toString() });
|
|
229
|
-
target[prop] = gen;
|
|
230
|
-
return gen;
|
|
231
|
-
}
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
return { createResponder, createCaller };
|
|
235
|
-
}
|
|
236
|
-
export {
|
|
237
|
-
LogLevel,
|
|
238
|
-
deriveController,
|
|
239
|
-
rejectOnSignal,
|
|
240
|
-
wrpc
|
|
241
|
-
};
|
|
242
|
-
//# sourceMappingURL=wrpc.js.map
|