@kirill.konshin/utils 0.0.13 → 0.0.15
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/.ctirc +2 -1
- package/.turbo/turbo-build.log +28 -23
- package/.turbo/turbo-test.log +78 -25
- package/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/demo/{cache-demo-clean.ts → worker-demo.ts} +1 -1
- package/dist/bootstrap/controls.d.ts +5 -2
- package/dist/bootstrap/controls.d.ts.map +1 -1
- package/dist/bootstrap/controls.js +1 -0
- package/dist/bootstrap/controls.js.map +1 -1
- package/dist/bootstrap/controls.stories.d.ts +9 -0
- package/dist/bootstrap/controls.stories.d.ts.map +1 -0
- package/dist/bootstrap/error.js +1 -0
- package/dist/bootstrap/error.js.map +1 -1
- package/dist/bootstrap/error.stories.d.ts +8 -0
- package/dist/bootstrap/error.stories.d.ts.map +1 -0
- package/dist/bootstrap/field.stories.d.ts +8 -0
- package/dist/bootstrap/field.stories.d.ts.map +1 -0
- package/dist/bootstrap/globalLoading.stories.d.ts +7 -0
- package/dist/bootstrap/globalLoading.stories.d.ts.map +1 -0
- package/dist/bootstrap/index.js +2 -1
- package/dist/bootstrap/loading.stories.d.ts +9 -0
- package/dist/bootstrap/loading.stories.d.ts.map +1 -0
- package/dist/bootstrap/responsiveHelper.js +1 -0
- package/dist/bootstrap/responsiveHelper.js.map +1 -1
- package/dist/bootstrap/screen.stories.d.ts +14 -0
- package/dist/bootstrap/screen.stories.d.ts.map +1 -0
- package/dist/bootstrap/toaster.js +1 -0
- package/dist/bootstrap/toaster.js.map +1 -1
- package/dist/bootstrap/toaster.stories.d.ts +8 -0
- package/dist/bootstrap/toaster.stories.d.ts.map +1 -0
- package/dist/bootstrap/useModal.stories.d.ts +9 -0
- package/dist/bootstrap/useModal.stories.d.ts.map +1 -0
- package/dist/core/cache.d.ts +7 -8
- package/dist/core/cache.d.ts.map +1 -1
- package/dist/core/cache.js +7 -4
- package/dist/core/cache.js.map +1 -1
- package/dist/core/cache.test.d.ts +2 -0
- package/dist/core/cache.test.d.ts.map +1 -0
- package/dist/core/files.d.ts +3 -0
- package/dist/core/files.d.ts.map +1 -0
- package/dist/core/files.js +27 -0
- package/dist/core/files.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +14 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/ls.d.ts +6 -0
- package/dist/core/ls.d.ts.map +1 -0
- package/dist/core/ls.js +12 -0
- package/dist/core/ls.js.map +1 -0
- package/dist/core/worker.d.ts +23 -9
- package/dist/core/worker.d.ts.map +1 -1
- package/dist/core/worker.js +93 -90
- package/dist/core/worker.js.map +1 -1
- package/dist/core/worker.test.d.ts +2 -0
- package/dist/core/worker.test.d.ts.map +1 -0
- package/dist/core/workerUtils.d.ts +3 -0
- package/dist/core/workerUtils.d.ts.map +1 -0
- package/dist/core/workerUtils.js +31 -0
- package/dist/core/workerUtils.js.map +1 -0
- package/dist/core/wrpc.d.ts +45 -0
- package/dist/core/wrpc.d.ts.map +1 -0
- package/dist/core/wrpc.fixture.d.ts +29 -0
- package/dist/core/wrpc.fixture.d.ts.map +1 -0
- package/dist/core/wrpc.js +242 -0
- package/dist/core/wrpc.js.map +1 -0
- package/dist/core/wrpc.test.d.ts +1 -0
- package/dist/core/wrpc.test.d.ts.map +1 -0
- package/dist/mui/formControlFieldset.stories.d.ts +7 -0
- package/dist/mui/formControlFieldset.stories.d.ts.map +1 -0
- package/dist/next/appLink.js +1 -0
- package/dist/next/appLink.js.map +1 -1
- package/dist/next/noSSR.js +1 -0
- package/dist/next/noSSR.js.map +1 -1
- package/dist/next/useIsInner.js +1 -0
- package/dist/next/useIsInner.js.map +1 -1
- package/dist/react/form/client.js +1 -0
- package/dist/react/form/client.js.map +1 -1
- package/dist/react/form/form.d.ts +7 -6
- package/dist/react/form/form.d.ts.map +1 -1
- package/dist/react/form/form.js +14 -20
- package/dist/react/form/form.js.map +1 -1
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +8 -2
- package/dist/react/index.js.map +1 -1
- package/dist/react/keyboard.d.ts +11 -0
- package/dist/react/keyboard.d.ts.map +1 -0
- package/dist/react/keyboard.js +38 -0
- package/dist/react/keyboard.js.map +1 -0
- package/dist/react/useFetch.js +1 -0
- package/dist/react/useFetch.js.map +1 -1
- package/dist/tailwind/responsiveHelper.js +1 -0
- package/dist/tailwind/responsiveHelper.js.map +1 -1
- package/package.json +6 -2
- package/src/bootstrap/controls.stories.tsx +2 -2
- package/src/bootstrap/controls.tsx +3 -3
- package/src/bootstrap/error.stories.tsx +3 -3
- package/src/bootstrap/field.stories.tsx +2 -2
- package/src/bootstrap/globalLoading.stories.tsx +2 -2
- package/src/bootstrap/loading.stories.tsx +2 -2
- package/src/bootstrap/screen.stories.tsx +2 -2
- package/src/bootstrap/toaster.stories.tsx +2 -2
- package/src/bootstrap/useModal.stories.tsx +3 -3
- package/src/core/README.md +91 -0
- package/src/core/cache.ts +12 -12
- package/src/core/files.ts +24 -0
- package/src/core/index.ts +4 -0
- package/src/core/ls.ts +11 -0
- package/src/core/worker.test.ts +197 -0
- package/src/core/worker.ts +106 -93
- package/src/core/workerUtils.ts +32 -0
- package/src/core/wrpc.fixture.ts +72 -0
- package/src/core/wrpc.test.ts +225 -0
- package/src/core/wrpc.ts +359 -0
- package/src/mui/formControlFieldset.stories.tsx +1 -1
- package/src/react/form/form.tsx +53 -33
- package/src/react/index.ts +1 -0
- package/src/react/keyboard.tsx +49 -0
- package/src/tailwind/README.md +8 -0
- package/tsconfig.json +2 -1
- package/vite.config.ts +13 -4
- package/vite.exports.ts +3 -3
- package/demo/cache-demo.ts +0 -343
package/dist/core/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C,eAAO,MAAM,cAAc,SAAU,GAAG,QAAQ,GAAG,YAC0D,CAAC;AAE9G,eAAO,MAAM,KAAK,SAAU,GAAG,QAAQ,GAAG,YAAkB,CAAC;AAG7D,eAAO,MAAM,GAAG,eAAc,CAAC;AAE/B,wBAAgB,aAAa,CAAC,GAAG,GAAG,GAAG,EAAE,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,GAAG,EAAE,OAAO,UAAQ,gBAK/D,GAAG,SAgB1C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,GAAG,SAAS,GAAG,EAAE,EAAE,GAAG,EAAE,aAAa,SAAS,GAAG,EAAE,GAAG,GAAG,EAC1E,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,EACvC,EACI,GAAgD,EAChD,UAAU,EACV,OAAO,GACV,GAAE;IACC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,aAAa,CAAC;IACrC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC;IAC3D,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;CACnD;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C,eAAO,MAAM,cAAc,SAAU,GAAG,QAAQ,GAAG,YAC0D,CAAC;AAE9G,eAAO,MAAM,KAAK,SAAU,GAAG,QAAQ,GAAG,YAAkB,CAAC;AAG7D,eAAO,MAAM,GAAG,eAAc,CAAC;AAE/B,wBAAgB,aAAa,CAAC,GAAG,GAAG,GAAG,EAAE,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,GAAG,EAAE,OAAO,UAAQ,gBAK/D,GAAG,SAgB1C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,GAAG,SAAS,GAAG,EAAE,EAAE,GAAG,EAAE,aAAa,SAAS,GAAG,EAAE,GAAG,GAAG,EAC1E,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,EACvC,EACI,GAAgD,EAChD,UAAU,EACV,OAAO,GACV,GAAE;IACC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,aAAa,CAAC;IACrC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC;IAC3D,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;CACnD;cAyB2B,GAAG;;;;0BApBP,GAAG,GAAG,GAAG,EAAE;;EA2C3C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AACH,8BAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAE,SAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;IAC1D,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;IAK3C,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC;IAI5E,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC;IAI1D,MAAM,CAAC,GAAG,EAAE,GAAG;IAQf;;;OAGG;IACH,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;IAEtC,KAAK;IAML,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAIzB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;CAkBrD"}
|
package/dist/core/cache.js
CHANGED
|
@@ -54,7 +54,6 @@ function memo(fn, {
|
|
|
54
54
|
}
|
|
55
55
|
class TransformerMap extends Map {
|
|
56
56
|
constructor(name) {
|
|
57
|
-
console.warn("CREATE cache", name);
|
|
58
57
|
super();
|
|
59
58
|
this.name = name;
|
|
60
59
|
}
|
|
@@ -65,12 +64,16 @@ class TransformerMap extends Map {
|
|
|
65
64
|
return oldValue;
|
|
66
65
|
}
|
|
67
66
|
delete(key) {
|
|
68
|
-
const
|
|
69
|
-
|
|
67
|
+
const val = this.get(key);
|
|
68
|
+
const has = typeof val !== "undefined";
|
|
69
|
+
if (has) this.dispose(val, key);
|
|
70
70
|
super.delete(key);
|
|
71
71
|
return has;
|
|
72
72
|
}
|
|
73
|
-
|
|
73
|
+
/**
|
|
74
|
+
* Do something with the value and key before removing it from cache
|
|
75
|
+
* For example, close a file or a bitmap
|
|
76
|
+
*/
|
|
74
77
|
dispose(value, key) {
|
|
75
78
|
}
|
|
76
79
|
clear() {
|
package/dist/core/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sources":["../../src/core/cache.ts"],"sourcesContent":["import ManyKeysMap from 'many-keys-map';\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport const shallowCompare = (prev: any, next: any) =>\n Array.from(new Set([...Object.keys(prev), ...Object.keys(next)])).every((key) => prev[key] === next[key]);\n\nexport const equal = (prev: any, next: any) => prev === next;\n\nconst UNUSED = Symbol('UNUSED');\nexport const ANY = Symbol('*');\n\nexport function createTracker<Dep = any>(whenDifferent: (next: Dep, prev?: Dep) => any, shallow = false) {\n let lastDependency: Dep = UNUSED as any;\n\n const comparator = shallow ? shallowCompare : equal;\n\n return function tracker(dependency: Dep) {\n // console.log('Tracker', lastDependency, dependency);\n\n if (lastDependency !== UNUSED && comparator(lastDependency, dependency)) {\n // console.log('RETAINED cache', { lastDependency, dependency });\n return false;\n }\n\n // console.log('INVALIDATED cache', {lastDependency, dependency});\n\n const res = whenDifferent(dependency, lastDependency === UNUSED ? undefined : lastDependency) || true;\n\n lastDependency = dependency;\n\n return res;\n };\n}\n\n/**\n * https://github.com/futpib/deep-weak-map\n * https://github.com/fregante/many-keys-map\n * https://github.com/fregante/many-keys-weakmap\n * https://github.com/sindresorhus/memoize?tab=readme-ov-file#example-multiple-non-serializable-arguments\n *\n * ```ts\n * const memoized = memo(\n * (file, options, ...args) => { ... },\n * {\n * key: (file, options, ...args) => [file, JSON.stringify(options), ...args],\n * invalidate: (bitmap) => !bitmap.width,\n * dispose: (bitmap) => bitmap.close(),\n * }\n * );\n * ```\n */\nexport function memo<Key extends any[], Val, SerializedKey extends any[] = Key>(\n fn: (...args: Key) => MaybePromise<Val>,\n {\n key = (...k: Key) => k as never as SerializedKey,\n invalidate,\n dispose,\n }: {\n key?: (...key: Key) => SerializedKey;\n invalidate?: (prev: Val, ...key: SerializedKey) => boolean;\n dispose?: (prev: Val, ...key: SerializedKey) => void;\n } = {},\n) {\n const map = new ManyKeysMap<SerializedKey, Val>();\n\n const clear = (...condition: Key | any[]) => {\n if (!condition?.length) {\n map.forEach((value, serializedKey) => {\n dispose?.(value, ...serializedKey);\n });\n map.clear();\n return;\n }\n\n const keyToClear = key(...(condition as any));\n\n map.forEach((value, serializedKey) => {\n if (!serializedKey.every((kk, i) => keyToClear[i] === ANY || kk === keyToClear[i])) return;\n dispose?.(value, ...serializedKey);\n map.delete(serializedKey);\n });\n };\n\n const size = () => map.size;\n\n async function memoized(...args: Key) {\n const k = key(...args);\n\n const has = map.has(k);\n const old = map.get(k);\n\n if (has && !invalidate?.(old as never as Val, ...k)) {\n return { value: map.get(k), hit: true };\n }\n\n const value = await fn(...args);\n\n map.set(k, value);\n\n return { hit: false, value };\n }\n\n memoized.clear = clear;\n memoized.size = size;\n\n //TODO return mimic-function(memorized, fn);\n\n return memoized;\n}\n\n/**\n * Allows to memoize values by key and invalidate them based on the previous value.\n *\n * This makes possible to implement various one-off and subsequent transformations.\n *\n * 1. `write`:
|
|
1
|
+
{"version":3,"file":"cache.js","sources":["../../src/core/cache.ts"],"sourcesContent":["import ManyKeysMap from 'many-keys-map';\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport const shallowCompare = (prev: any, next: any) =>\n Array.from(new Set([...Object.keys(prev), ...Object.keys(next)])).every((key) => prev[key] === next[key]);\n\nexport const equal = (prev: any, next: any) => prev === next;\n\nconst UNUSED = Symbol('UNUSED');\nexport const ANY = Symbol('*');\n\nexport function createTracker<Dep = any>(whenDifferent: (next: Dep, prev?: Dep) => any, shallow = false) {\n let lastDependency: Dep = UNUSED as any;\n\n const comparator = shallow ? shallowCompare : equal;\n\n return function tracker(dependency: Dep) {\n // console.log('Tracker', lastDependency, dependency);\n\n if (lastDependency !== UNUSED && comparator(lastDependency, dependency)) {\n // console.log('RETAINED cache', { lastDependency, dependency });\n return false;\n }\n\n // console.log('INVALIDATED cache', {lastDependency, dependency});\n\n const res = whenDifferent(dependency, lastDependency === UNUSED ? undefined : lastDependency) || true;\n\n lastDependency = dependency;\n\n return res;\n };\n}\n\n/**\n * https://github.com/futpib/deep-weak-map\n * https://github.com/fregante/many-keys-map\n * https://github.com/fregante/many-keys-weakmap\n * https://github.com/sindresorhus/memoize?tab=readme-ov-file#example-multiple-non-serializable-arguments\n *\n * ```ts\n * const memoized = memo(\n * (file, options, ...args) => { ... },\n * {\n * key: (file, options, ...args) => [file, JSON.stringify(options), ...args],\n * invalidate: (bitmap) => !bitmap.width,\n * dispose: (bitmap) => bitmap.close(),\n * }\n * );\n * ```\n */\nexport function memo<Key extends any[], Val, SerializedKey extends any[] = Key>(\n fn: (...args: Key) => MaybePromise<Val>,\n {\n key = (...k: Key) => k as never as SerializedKey,\n invalidate,\n dispose,\n }: {\n key?: (...key: Key) => SerializedKey;\n invalidate?: (prev: Val, ...key: SerializedKey) => boolean;\n dispose?: (prev: Val, ...key: SerializedKey) => void;\n } = {},\n) {\n const map = new ManyKeysMap<SerializedKey, Val>();\n\n //TODO Extend ManyKeysMap\n const clear = (...condition: Key | any[]) => {\n if (!condition?.length) {\n map.forEach((value, serializedKey) => {\n dispose?.(value, ...serializedKey);\n });\n map.clear();\n return;\n }\n\n const keyToClear = key(...(condition as any));\n\n map.forEach((value, serializedKey) => {\n if (!serializedKey.every((kk, i) => keyToClear[i] === ANY || kk === keyToClear[i])) return;\n dispose?.(value, ...serializedKey);\n map.delete(serializedKey);\n });\n };\n\n const size = () => map.size;\n\n async function memoized(...args: Key) {\n const k = key(...args);\n\n const has = map.has(k);\n const old = map.get(k);\n\n if (has && !invalidate?.(old as never as Val, ...k)) {\n return { value: map.get(k), hit: true };\n }\n\n const value = await fn(...args);\n\n map.set(k, value);\n\n return { hit: false, value };\n }\n\n memoized.clear = clear;\n memoized.size = size;\n\n //TODO return mimic-function(memorized, fn);\n\n return memoized;\n}\n\n/**\n * Allows to memoize values by key and invalidate them based on the previous value.\n *\n * This makes possible to implement various one-off and subsequent transformations.\n *\n * 1. `write`: Transform value BEFORE writing to cache, called only once if cache IS NOT present or IS NOT valid\n * 2. `read`: Transform value AFTER it's read from cache, always called if cache IS valid, keep in mind this transform is applied on top of BEFORE\n *\n * Both should return same type or null.\n *\n * If `newValue` is null, old is returned, and no cache is set.\n *\n * ```ts\n * class InputCache extends TypedCache<string, ImageBitmap> {\n * dispose(bitmap: ImageBitmap, key: string) {\n * bitmap.close();\n * }\n * }\n *\n * const cache = new InputCache('input');\n *\n * // Cache provided OffscreenCanvas by name and create context once per canvas\n *\n * class CanvasCache extends TypedCache<string, OffscreenCanvas> {\n * protected write(key: string, canvas: OffscreenCanvas): OffscreenCanvas {\n * const canvas = newValue.getContext('2d');\n * canvas.ctx = canvas;\n * return canvas;\n * }\n * }\n *\n * // Transfer control to offscreen canvas and track removal of original\n * // When called again, always return null, because canvas is handed to worker, and never returned to main\n *\n * class CanvasCache extends TypedCache<HTMLCanvasElement, OffscreenCanvas> {\n *\n * protected write(canvas: HTMLCanvasElement): OffscreenCanvas {\n * let l;\n * canvas.addEventListener(\n * 'remove',\n * (l = () => {\n * console.log('Removing canvas from cache', key);\n * this.delete(canvas);\n * key.removeEventListener('remove', l);\n * }),\n * );\n * return canvas.transferControlToOffscreen();\n * }\n *\n * protected read() {\n * return null;\n * }\n * }\n *\n * // Create bitmap from file and check if was used, return null if used\n * // Since bitmaps are also cached in worker, used bitmaps are not sent\n *\n * class BitmapCache extends TypedCache<File, ImageBitmap, File> {\n * protected async write(file: File): Promise<ImageBitmap> {\n * return await createImageBitmap(file);\n * }\n *\n * protected read(bitmap: ImageBitmap): Promise<ImageBitmap> | ImageBitmap {\n * if (!bitmap.width) return null;\n * return bitmap;\n * }\n * }\n *\n * ```\n */\nexport abstract class TransformerMap<Key, Val = Key> extends Map<Key, Val> {\n constructor(protected readonly name: string) {\n // console.warn('CREATE cache', name);\n super();\n }\n\n protected write(key: Key, newValue?: Val, oldValue?: Val): MaybePromise<Val> {\n return newValue as Val;\n }\n\n protected read(oldValue: Val, key: Key): MaybePromise<Val> {\n return oldValue;\n }\n\n delete(key: Key) {\n const val = this.get(key);\n const has = typeof val !== 'undefined';\n if (has) this.dispose(val, key);\n super.delete(key);\n return has;\n }\n\n /**\n * Do something with the value and key before removing it from cache\n * For example, close a file or a bitmap\n */\n protected dispose(value: Val, key: Key) {}\n\n clear() {\n console.log('CLEAR cache', this.name);\n this.forEach(this.dispose);\n super.clear();\n }\n\n set(key: Key, value: Val): this {\n throw new Error('Use memo() method instead');\n }\n\n async memo(key: Key, newValue?: Val): Promise<Val> {\n const oldValue = this.get(key);\n\n if (!!oldValue && (!newValue || newValue === oldValue)) {\n // console.log('FROM cache', this.name, key, 'old value', oldValue);\n return this.read?.(oldValue, key);\n }\n\n if (this.has(key)) this.delete(key);\n\n const value = await this.write(key, newValue, oldValue);\n\n super.set(key, value);\n\n // console.log('INVALIDATED KEY cache', this.name, key, 'has', has, 'invalidate', invalidate, 'new value', value);\n\n return value;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.test.d.ts","sourceRoot":"","sources":["../../src/core/cache.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/core/files.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,4DAGxB,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAO,OAAO,CAAC,MAAM,CAgBpC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { saveAs } from "file-saver";
|
|
2
|
+
const downloadFile = async (filename, text, type = "application/json") => {
|
|
3
|
+
saveAs(new Blob([text], { type }), filename);
|
|
4
|
+
};
|
|
5
|
+
const openFile = () => new Promise((res, rej) => {
|
|
6
|
+
const input = document.createElement("input");
|
|
7
|
+
input.type = "file";
|
|
8
|
+
input.addEventListener("change", function readFile(e) {
|
|
9
|
+
input.removeEventListener("change", readFile);
|
|
10
|
+
const [file] = e.target.files;
|
|
11
|
+
if (!file) return;
|
|
12
|
+
const reader = new FileReader();
|
|
13
|
+
reader.onload = (e2) => {
|
|
14
|
+
var _a;
|
|
15
|
+
return res((_a = e2.target) == null ? void 0 : _a.result);
|
|
16
|
+
};
|
|
17
|
+
reader.onerror = rej;
|
|
18
|
+
reader.onabort = rej;
|
|
19
|
+
reader.readAsText(file);
|
|
20
|
+
});
|
|
21
|
+
input.click();
|
|
22
|
+
});
|
|
23
|
+
export {
|
|
24
|
+
downloadFile,
|
|
25
|
+
openFile
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sources":["../../src/core/files.ts"],"sourcesContent":["import { saveAs } from 'file-saver';\n\nexport const downloadFile = async (filename, text, type = 'application/json') => {\n //FIXME https://github.com/eligrey/FileSaver.js/issues/731\n saveAs(new Blob([text], { type }), filename);\n};\n\nexport const openFile = (): Promise<string> =>\n new Promise((res, rej) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.addEventListener('change', function readFile(e) {\n input.removeEventListener('change', readFile);\n // @ts-expect-error file is always there\n const [file] = e.target.files;\n if (!file) return;\n const reader = new FileReader();\n reader.onload = (e) => res(e.target?.result as string);\n reader.onerror = rej;\n reader.onabort = rej;\n reader.readAsText(file);\n });\n input.click();\n });\n"],"names":["e"],"mappings":";AAEO,MAAM,eAAe,OAAO,UAAU,MAAM,OAAO,uBAAuB;AAEtE,SAAA,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,KAAA,CAAM,GAAG,QAAQ;AAC/C;AAEO,MAAM,WAAW,MACpB,IAAI,QAAQ,CAAC,KAAK,QAAQ;AAChB,QAAA,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,OAAO;AACb,QAAM,iBAAiB,UAAU,SAAS,SAAS,GAAG;AAC5C,UAAA,oBAAoB,UAAU,QAAQ;AAE5C,UAAM,CAAC,IAAI,IAAI,EAAE,OAAO;AACxB,QAAI,CAAC,KAAM;AACL,UAAA,SAAS,IAAI,WAAW;AAC9B,WAAO,SAAS,CAACA,OAAAA;;AAAM,kBAAIA,QAAE,WAAFA,mBAAU,MAAgB;AAAA;AACrD,WAAO,UAAU;AACjB,WAAO,UAAU;AACjB,WAAO,WAAW,IAAI;AAAA,EAAA,CACzB;AACD,QAAM,MAAM;AAChB,CAAC;"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
export * from './cache';
|
|
2
2
|
export * from './errors';
|
|
3
|
+
export * from './files';
|
|
4
|
+
export * from './ls';
|
|
3
5
|
export * from './measure';
|
|
4
6
|
export * from './mutex';
|
|
5
7
|
export * from './worker';
|
|
8
|
+
export * from './workerUtils';
|
|
9
|
+
export * from './wrpc';
|
|
6
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,MAAM,CAAC;AACrB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC"}
|
package/dist/core/index.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { ANY, TransformerMap, createTracker, equal, memo, shallowCompare } from "./cache.js";
|
|
2
2
|
import { catchErrors } from "./errors.js";
|
|
3
|
+
import { downloadFile, openFile } from "./files.js";
|
|
4
|
+
import { getStorage } from "./ls.js";
|
|
3
5
|
import { colored, createMeasurer, uncolored } from "./measure.js";
|
|
4
6
|
import { Mutex } from "./mutex.js";
|
|
5
|
-
import { RespondersBase, WorkerDialog
|
|
7
|
+
import { RespondersBase, WorkerDialog } from "./worker.js";
|
|
8
|
+
import { getTransferrable, isTransferable } from "./workerUtils.js";
|
|
9
|
+
import { LogLevel, deriveController, rejectOnSignal, wrpc } from "./wrpc.js";
|
|
6
10
|
export {
|
|
7
11
|
ANY,
|
|
12
|
+
LogLevel,
|
|
8
13
|
Mutex,
|
|
9
14
|
RespondersBase,
|
|
10
15
|
TransformerMap,
|
|
@@ -13,10 +18,17 @@ export {
|
|
|
13
18
|
colored,
|
|
14
19
|
createMeasurer,
|
|
15
20
|
createTracker,
|
|
21
|
+
deriveController,
|
|
22
|
+
downloadFile,
|
|
16
23
|
equal,
|
|
24
|
+
getStorage,
|
|
25
|
+
getTransferrable,
|
|
17
26
|
isTransferable,
|
|
18
27
|
memo,
|
|
28
|
+
openFile,
|
|
29
|
+
rejectOnSignal,
|
|
19
30
|
shallowCompare,
|
|
20
|
-
uncolored
|
|
31
|
+
uncolored,
|
|
32
|
+
wrpc
|
|
21
33
|
};
|
|
22
34
|
//# sourceMappingURL=index.js.map
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../src/core/ls.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM;gBAKhB,MAAM;iBACL,MAAM,SAAS,GAAG;kBACjB,MAAM;EAG9B"}
|
package/dist/core/ls.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
function getStorage(pref) {
|
|
2
|
+
const prefix = (key) => `${pref}-${key}`;
|
|
3
|
+
const ls = typeof window !== "undefined" ? localStorage : null;
|
|
4
|
+
const read = (key) => JSON.parse((ls == null ? void 0 : ls.getItem(prefix(key))) || "null");
|
|
5
|
+
const write = (key, value) => ls == null ? void 0 : ls.setItem(prefix(key), JSON.stringify(value));
|
|
6
|
+
const remove = (key) => ls == null ? void 0 : ls.removeItem(prefix(key));
|
|
7
|
+
return { read, write, remove };
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
getStorage
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=ls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ls.js","sources":["../../src/core/ls.ts"],"sourcesContent":["export function getStorage(pref: string) {\n const prefix = (key) => `${pref}-${key}`;\n\n const ls = (typeof window !== 'undefined' ? localStorage : null) as Storage;\n\n const read = (key: string) => JSON.parse(ls?.getItem(prefix(key)) || 'null');\n const write = (key: string, value: any) => ls?.setItem(prefix(key), JSON.stringify(value));\n const remove = (key: string) => ls?.removeItem(prefix(key));\n\n return { read, write, remove };\n}\n"],"names":[],"mappings":"AAAO,SAAS,WAAW,MAAc;AACrC,QAAM,SAAS,CAAC,QAAQ,GAAG,IAAI,IAAI,GAAG;AAEtC,QAAM,KAAM,OAAO,WAAW,cAAc,eAAe;AAErD,QAAA,OAAO,CAAC,QAAgB,KAAK,OAAM,yBAAI,QAAQ,OAAO,GAAG,OAAM,MAAM;AAC3E,QAAM,QAAQ,CAAC,KAAa,UAAe,yBAAI,QAAQ,OAAO,GAAG,GAAG,KAAK,UAAU,KAAK;AACxF,QAAM,SAAS,CAAC,QAAgB,yBAAI,WAAW,OAAO,GAAG;AAElD,SAAA,EAAE,MAAM,OAAO,OAAO;AACjC;"}
|
package/dist/core/worker.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export declare function isTransferable(obj: any): boolean;
|
|
2
1
|
type WebWorker = Worker | (Window & typeof globalThis) | (WorkerGlobalScope & typeof globalThis);
|
|
3
2
|
type MethodReturn<R, M extends keyof R> = R[M] extends (...args: any[]) => any ? Partial<Awaited<ReturnType<R[M]>>> : never;
|
|
4
3
|
type MethodArg<R, M extends keyof R> = R[M] extends (arg: infer A, ...args: any[]) => any ? Partial<A> : never;
|
|
@@ -6,6 +5,7 @@ export type Ctx<R, K extends keyof R> = {
|
|
|
6
5
|
id: string;
|
|
7
6
|
parentId?: string;
|
|
8
7
|
message: K;
|
|
8
|
+
done: boolean;
|
|
9
9
|
};
|
|
10
10
|
type Data<R, M extends keyof R> = MethodReturn<R, M> | MethodArg<R, M> | Error;
|
|
11
11
|
type Event<R, M extends keyof R> = MessageEvent<{
|
|
@@ -17,9 +17,12 @@ export declare class WorkerDialog<R extends RespondersBase<any>> {
|
|
|
17
17
|
worker: WebWorker;
|
|
18
18
|
responders: R;
|
|
19
19
|
name: string;
|
|
20
|
+
debug: number;
|
|
20
21
|
readonly contexts: Set<Context<R, keyof R>>;
|
|
21
22
|
protected closed: boolean;
|
|
22
|
-
|
|
23
|
+
protected currentId: number;
|
|
24
|
+
constructor(worker: WebWorker, responders: R, name: string, debug?: number);
|
|
25
|
+
getID(): string;
|
|
23
26
|
close(): void;
|
|
24
27
|
withMessage<M extends keyof R>(message: M): RequestContext<R, M>;
|
|
25
28
|
}
|
|
@@ -37,8 +40,17 @@ declare abstract class Context<R, M extends keyof R> {
|
|
|
37
40
|
abstract withMessage<M2 extends keyof R>(message: M2, id?: string): Context<R, M2>;
|
|
38
41
|
close(reason?: string): void;
|
|
39
42
|
get info(): string;
|
|
40
|
-
|
|
41
|
-
|
|
43
|
+
get debugInfo(): {
|
|
44
|
+
id: string | undefined;
|
|
45
|
+
parentId: string | undefined;
|
|
46
|
+
message: M;
|
|
47
|
+
closed: boolean;
|
|
48
|
+
type: string;
|
|
49
|
+
listeners: number;
|
|
50
|
+
};
|
|
51
|
+
abstract type: 'request' | 'response' | string;
|
|
52
|
+
protected postMessage(data?: Data<R, M>, done?: boolean): Data<R, M> | undefined;
|
|
53
|
+
send(data?: Data<R, M>, done?: boolean): Data<R, M> | undefined;
|
|
42
54
|
/**
|
|
43
55
|
* Does not automatically close, assumes consumer will close
|
|
44
56
|
*
|
|
@@ -55,12 +67,13 @@ declare abstract class Context<R, M extends keyof R> {
|
|
|
55
67
|
* un(); // closes
|
|
56
68
|
* ```
|
|
57
69
|
*/
|
|
58
|
-
listen(callback: Listener<R, M
|
|
70
|
+
listen(callback: Listener<R, M>, done?: boolean): () => void;
|
|
59
71
|
}
|
|
60
72
|
declare class RequestContext<R, M extends keyof R> extends Context<R, M> {
|
|
73
|
+
type: string;
|
|
61
74
|
withMessage<M2 extends keyof R>(message: M2, id?: string): RequestContext<R, M2>;
|
|
62
|
-
send(data?: MethodArg<R, M
|
|
63
|
-
listen(callback: Listener<R, M, MethodReturn<R, M>, RequestContext<R, M
|
|
75
|
+
send(data?: MethodArg<R, M>, done?: boolean): MethodArg<R, M>;
|
|
76
|
+
listen(callback: Listener<R, M, MethodReturn<R, M>, RequestContext<R, M>>, done?: boolean): () => void;
|
|
64
77
|
/**
|
|
65
78
|
* Returns response
|
|
66
79
|
* If you need to work with ctx, use callback
|
|
@@ -76,9 +89,10 @@ declare class RequestContext<R, M extends keyof R> extends Context<R, M> {
|
|
|
76
89
|
protected expect(): Promise<MethodReturn<R, M>>;
|
|
77
90
|
}
|
|
78
91
|
declare class ResponseContext<R, M extends keyof R> extends Context<R, M> {
|
|
92
|
+
type: string;
|
|
79
93
|
withMessage<M2 extends keyof R>(message: M2, id?: string): ResponseContext<R, M2>;
|
|
80
|
-
listen(callback: Listener<R, M, MethodArg<R, M>, ResponseContext<R, M
|
|
81
|
-
send(data?: MethodReturn<R, M
|
|
94
|
+
listen(callback: Listener<R, M, MethodArg<R, M>, ResponseContext<R, M>>, done?: boolean): () => void;
|
|
95
|
+
send(data?: MethodReturn<R, M>, done?: boolean): MethodReturn<R, M>;
|
|
82
96
|
}
|
|
83
97
|
export {};
|
|
84
98
|
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/core/worker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/core/worker.ts"],"names":[],"mappings":"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"}
|
package/dist/core/worker.js
CHANGED
|
@@ -1,102 +1,84 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
3
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
-
|
|
5
|
-
return transferrable.some((t) => obj instanceof t) ? obj : null;
|
|
6
|
-
}
|
|
7
|
-
function getTransferrable(data = {}) {
|
|
8
|
-
if (!data) return [];
|
|
9
|
-
return Object.values(data).reduce((r, v) => {
|
|
10
|
-
return Array.isArray(v) ? [...r, ...v.map(isTransferable)] : [...r, isTransferable(v)];
|
|
11
|
-
}, []).filter(Boolean);
|
|
12
|
-
}
|
|
13
|
-
const transferrable = typeof window !== "undefined" ? [
|
|
14
|
-
ArrayBuffer,
|
|
15
|
-
MessagePort,
|
|
16
|
-
ReadableStream,
|
|
17
|
-
WritableStream,
|
|
18
|
-
TransformStream,
|
|
19
|
-
// WebTransportReceiveStream, // ReferenceError: WebTransportReceiveStream is not defined
|
|
20
|
-
// WebTransportSendStream, // ReferenceError: WebTransportReceiveStream is not defined
|
|
21
|
-
// AudioData, // TS2304: Cannot find name AudioData
|
|
22
|
-
ImageBitmap,
|
|
23
|
-
VideoFrame,
|
|
24
|
-
OffscreenCanvas,
|
|
25
|
-
RTCDataChannel,
|
|
26
|
-
MediaSourceHandle
|
|
27
|
-
// MIDIAccess, // ReferenceError: MIDIAccess is not defined
|
|
28
|
-
].filter(Boolean) : [];
|
|
4
|
+
import { getTransferrable } from "./workerUtils.js";
|
|
29
5
|
const ALL = "*";
|
|
30
|
-
|
|
31
|
-
function getID() {
|
|
32
|
-
return (++id).toString();
|
|
33
|
-
}
|
|
6
|
+
const RESPONDER = Symbol("responder");
|
|
34
7
|
function checkClosed(obj, label = "external") {
|
|
35
|
-
if (obj == null ? void 0 : obj.closed) throw new Error(`Context
|
|
8
|
+
if (obj == null ? void 0 : obj.closed) throw new Error(`Context ${obj.id} is closed (${label})`, { cause: obj });
|
|
36
9
|
}
|
|
37
10
|
function checkMessage(obj, message) {
|
|
38
11
|
if (!message) throw new Error("New context must have message", { cause: obj });
|
|
39
12
|
}
|
|
40
13
|
class WorkerDialog {
|
|
41
|
-
|
|
14
|
+
// IDs are intentionally not global
|
|
15
|
+
constructor(worker, responders, name, debug = 0) {
|
|
42
16
|
__publicField(this, "contexts", /* @__PURE__ */ new Set());
|
|
43
17
|
__publicField(this, "closed", false);
|
|
18
|
+
__publicField(this, "currentId", 0);
|
|
19
|
+
var _a, _b;
|
|
44
20
|
this.worker = worker;
|
|
45
21
|
this.responders = responders;
|
|
46
22
|
this.name = name;
|
|
23
|
+
this.debug = debug;
|
|
47
24
|
if (!this.worker) return;
|
|
48
25
|
for (const message in this.responders) {
|
|
49
|
-
if (
|
|
26
|
+
if (!((_b = (_a = this.responders) == null ? void 0 : _a[message]) == null ? void 0 : _b[RESPONDER])) continue;
|
|
50
27
|
const rootContext = new ResponseContext(this, message, ALL);
|
|
51
28
|
rootContext.listen(async (data, context, event) => {
|
|
52
29
|
const responseContext = context.withMessage(message, event.data.ctx.id);
|
|
53
|
-
|
|
54
|
-
rootContext
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
+
});
|
|
60
38
|
try {
|
|
61
|
-
responseContext.send(await this.responders[message](data, responseContext));
|
|
39
|
+
responseContext.send(await this.responders[message](data, responseContext), true);
|
|
62
40
|
responseContext.close("root.listener");
|
|
63
41
|
} catch (e) {
|
|
64
|
-
console.error(`Error in responder ${responseContext.info}`, { e });
|
|
65
|
-
responseContext.send(e);
|
|
42
|
+
if (this.debug) console.error(`Error in responder ${responseContext.info}`, { e });
|
|
43
|
+
responseContext.send(e, true);
|
|
66
44
|
}
|
|
67
|
-
});
|
|
45
|
+
}, true);
|
|
68
46
|
}
|
|
69
47
|
}
|
|
48
|
+
getID() {
|
|
49
|
+
return (++this.currentId).toString();
|
|
50
|
+
}
|
|
70
51
|
close() {
|
|
71
52
|
for (const context of this.contexts) context.close("root");
|
|
72
53
|
this.contexts.clear();
|
|
73
|
-
this.worker.onmessage = null;
|
|
74
54
|
}
|
|
75
55
|
withMessage(message) {
|
|
76
|
-
return new RequestContext(this, message, getID());
|
|
56
|
+
return new RequestContext(this, message, this.getID());
|
|
77
57
|
}
|
|
78
58
|
}
|
|
79
59
|
class RespondersBase {
|
|
80
60
|
create(message, responder) {
|
|
61
|
+
responder[RESPONDER] = true;
|
|
81
62
|
return responder;
|
|
82
63
|
}
|
|
83
64
|
}
|
|
84
65
|
class Context {
|
|
85
|
-
constructor(dialog, message,
|
|
66
|
+
constructor(dialog, message, id, parent = null) {
|
|
86
67
|
__publicField(this, "unsub", /* @__PURE__ */ new Set());
|
|
87
68
|
__publicField(this, "closed", false);
|
|
88
|
-
var _a;
|
|
89
69
|
this.dialog = dialog;
|
|
90
70
|
this.message = message;
|
|
91
|
-
this.id =
|
|
71
|
+
this.id = id;
|
|
92
72
|
this.parent = parent;
|
|
93
|
-
checkClosed(
|
|
94
|
-
checkClosed(
|
|
73
|
+
checkClosed(dialog, "newContext");
|
|
74
|
+
checkClosed(parent, "newContext");
|
|
95
75
|
checkMessage(this, message);
|
|
96
|
-
this.id =
|
|
76
|
+
this.id = id ?? (parent == null ? void 0 : parent.id);
|
|
97
77
|
if (!this.id) throw new Error("ID is required", { cause: this });
|
|
78
|
+
this.dialog.contexts.add(this);
|
|
98
79
|
}
|
|
99
80
|
close(reason = "external") {
|
|
81
|
+
if (this.dialog.debug >= 2) console.log("Closing", this.info, reason, this);
|
|
100
82
|
this.dialog.contexts.delete(this);
|
|
101
83
|
for (const unsub of this.unsub) unsub();
|
|
102
84
|
this.unsub.clear();
|
|
@@ -108,27 +90,35 @@ class Context {
|
|
|
108
90
|
}
|
|
109
91
|
get info() {
|
|
110
92
|
var _a;
|
|
111
|
-
return this.dialog.name
|
|
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
|
+
};
|
|
112
105
|
}
|
|
113
|
-
postMessage(data) {
|
|
106
|
+
postMessage(data, done = false) {
|
|
114
107
|
var _a;
|
|
115
108
|
checkClosed(this, "postMessage");
|
|
116
109
|
const transfer = getTransferrable(data);
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
},
|
|
126
|
-
transfer
|
|
127
|
-
);
|
|
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);
|
|
128
118
|
return data;
|
|
129
119
|
}
|
|
130
|
-
send(data) {
|
|
131
|
-
return this.postMessage(data);
|
|
120
|
+
send(data, done = false) {
|
|
121
|
+
return this.postMessage(data, done);
|
|
132
122
|
}
|
|
133
123
|
/**
|
|
134
124
|
* Does not automatically close, assumes consumer will close
|
|
@@ -146,26 +136,29 @@ class Context {
|
|
|
146
136
|
* un(); // closes
|
|
147
137
|
* ```
|
|
148
138
|
*/
|
|
149
|
-
listen(callback) {
|
|
139
|
+
listen(callback, done = false) {
|
|
150
140
|
checkClosed(this, "listen");
|
|
151
|
-
|
|
141
|
+
const controller = new AbortController();
|
|
152
142
|
this.dialog.worker.addEventListener(
|
|
153
143
|
"message",
|
|
154
|
-
|
|
144
|
+
async (event) => {
|
|
155
145
|
try {
|
|
156
146
|
const {
|
|
157
147
|
data: { ctx, data }
|
|
158
148
|
} = event;
|
|
159
|
-
if (!ctx || this.id !== ALL && this.id !== ctx.id || this.message !== ctx.message)
|
|
160
|
-
|
|
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);
|
|
161
152
|
await callback(data, this, event);
|
|
162
153
|
} catch (e) {
|
|
163
|
-
console.error(`Error in listener ${this.info}`, this, { event, e });
|
|
154
|
+
if (this.dialog.debug) console.error(`Error in listener ${this.info}`, this, { event, e });
|
|
164
155
|
}
|
|
165
|
-
}
|
|
156
|
+
},
|
|
157
|
+
{ signal: controller.signal }
|
|
166
158
|
);
|
|
167
159
|
const unsub = () => {
|
|
168
|
-
this.dialog.
|
|
160
|
+
if (this.dialog.debug >= 2) console.log("Stop listening", this.info, this);
|
|
161
|
+
controller.abort();
|
|
169
162
|
this.unsub.delete(unsub);
|
|
170
163
|
};
|
|
171
164
|
this.unsub.add(unsub);
|
|
@@ -173,14 +166,18 @@ class Context {
|
|
|
173
166
|
}
|
|
174
167
|
}
|
|
175
168
|
class RequestContext extends Context {
|
|
176
|
-
|
|
177
|
-
|
|
169
|
+
constructor() {
|
|
170
|
+
super(...arguments);
|
|
171
|
+
__publicField(this, "type", "request");
|
|
172
|
+
}
|
|
173
|
+
withMessage(message, id) {
|
|
174
|
+
return new RequestContext(this.dialog, message, id, this);
|
|
178
175
|
}
|
|
179
|
-
send(data) {
|
|
180
|
-
return super.send(data);
|
|
176
|
+
send(data, done = false) {
|
|
177
|
+
return super.send(data, done);
|
|
181
178
|
}
|
|
182
|
-
listen(callback) {
|
|
183
|
-
return super.listen(callback);
|
|
179
|
+
listen(callback, done = false) {
|
|
180
|
+
return super.listen(callback, done);
|
|
184
181
|
}
|
|
185
182
|
/**
|
|
186
183
|
* Returns response
|
|
@@ -194,12 +191,14 @@ class RequestContext extends Context {
|
|
|
194
191
|
* })
|
|
195
192
|
*/
|
|
196
193
|
async fetch(data, callback) {
|
|
194
|
+
checkClosed(this, "fetch");
|
|
197
195
|
const res = await Promise.all([
|
|
198
196
|
callback == null ? void 0 : callback(this),
|
|
199
197
|
this.expect(),
|
|
200
198
|
// will be closed in expect -> listener -> unsub
|
|
201
|
-
this.send(data)
|
|
199
|
+
this.send(data, true)
|
|
202
200
|
]);
|
|
201
|
+
if (this.dialog.debug >= 2) console.log("Fetch", this.info, this);
|
|
203
202
|
this.close("fetch");
|
|
204
203
|
return res[1];
|
|
205
204
|
}
|
|
@@ -210,28 +209,32 @@ class RequestContext extends Context {
|
|
|
210
209
|
try {
|
|
211
210
|
if (data instanceof Error) throw data;
|
|
212
211
|
responseListener();
|
|
212
|
+
if (this.dialog.debug >= 3) console.log("Expect", this.info, data, this);
|
|
213
213
|
resolve(data);
|
|
214
214
|
} catch (e) {
|
|
215
215
|
reject(e);
|
|
216
216
|
}
|
|
217
|
-
});
|
|
217
|
+
}, true);
|
|
218
218
|
});
|
|
219
219
|
}
|
|
220
220
|
}
|
|
221
221
|
class ResponseContext extends Context {
|
|
222
|
-
|
|
223
|
-
|
|
222
|
+
constructor() {
|
|
223
|
+
super(...arguments);
|
|
224
|
+
__publicField(this, "type", "response");
|
|
225
|
+
}
|
|
226
|
+
withMessage(message, id) {
|
|
227
|
+
return new ResponseContext(this.dialog, message, id, this);
|
|
224
228
|
}
|
|
225
|
-
listen(callback) {
|
|
226
|
-
return super.listen(callback);
|
|
229
|
+
listen(callback, done = false) {
|
|
230
|
+
return super.listen(callback, done);
|
|
227
231
|
}
|
|
228
|
-
send(data) {
|
|
229
|
-
return super.send(data);
|
|
232
|
+
send(data, done = false) {
|
|
233
|
+
return super.send(data, done);
|
|
230
234
|
}
|
|
231
235
|
}
|
|
232
236
|
export {
|
|
233
237
|
RespondersBase,
|
|
234
|
-
WorkerDialog
|
|
235
|
-
isTransferable
|
|
238
|
+
WorkerDialog
|
|
236
239
|
};
|
|
237
240
|
//# sourceMappingURL=worker.js.map
|