katanakit-js 2.2.1 → 2.12.9
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 +72 -437
- package/dist/adapters/astro/astro.service.d.ts +103 -15
- package/dist/adapters/astro/astro.service.d.ts.map +1 -1
- package/dist/adapters/astro/astro.service.js +145 -75
- package/dist/adapters/astro/astro.service.js.map +1 -1
- package/dist/adapters/astro/index.d.ts +1 -1
- package/dist/adapters/astro/index.d.ts.map +1 -1
- package/dist/adapters/astro/index.js +1 -1
- package/dist/adapters/astro/index.js.map +1 -1
- package/dist/adapters/astro/rss.service.d.ts +85 -105
- package/dist/adapters/astro/rss.service.d.ts.map +1 -1
- package/dist/adapters/astro/rss.service.js +172 -168
- package/dist/adapters/astro/rss.service.js.map +1 -1
- package/dist/adapters/astro/seo.service.d.ts +10 -0
- package/dist/adapters/astro/seo.service.d.ts.map +1 -0
- package/dist/adapters/astro/seo.service.js +3 -0
- package/dist/adapters/astro/seo.service.js.map +1 -0
- package/dist/adapters/express/app.d.ts +30 -1
- package/dist/adapters/express/app.d.ts.map +1 -1
- package/dist/adapters/express/app.js +31 -3
- package/dist/adapters/express/app.js.map +1 -1
- package/dist/adapters/express/index.d.ts +2 -2
- package/dist/adapters/express/index.d.ts.map +1 -1
- package/dist/adapters/express/index.js +2 -2
- package/dist/adapters/express/index.js.map +1 -1
- package/dist/adapters/express/main.js +2 -2
- package/dist/adapters/express/main.js.map +1 -1
- package/dist/adapters/express/products.controller.d.ts +67 -8
- package/dist/adapters/express/products.controller.d.ts.map +1 -1
- package/dist/adapters/express/products.controller.js +105 -49
- package/dist/adapters/express/products.controller.js.map +1 -1
- package/dist/adapters/express/server.d.ts +37 -13
- package/dist/adapters/express/server.d.ts.map +1 -1
- package/dist/adapters/express/server.js +118 -53
- package/dist/adapters/express/server.js.map +1 -1
- package/dist/adapters/nuxt/nuxt.service.d.ts +8 -6
- package/dist/adapters/nuxt/nuxt.service.d.ts.map +1 -1
- package/dist/adapters/nuxt/nuxt.service.js +34 -10
- package/dist/adapters/nuxt/nuxt.service.js.map +1 -1
- package/dist/adapters/vue/vue.service.d.ts +5 -2
- package/dist/adapters/vue/vue.service.d.ts.map +1 -1
- package/dist/adapters/vue/vue.service.js +41 -7
- package/dist/adapters/vue/vue.service.js.map +1 -1
- package/dist/config/index.d.ts +2 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/seo-meta.types.d.ts +177 -0
- package/dist/config/seo-meta.types.d.ts.map +1 -0
- package/dist/config/seo-meta.types.js +11 -0
- package/dist/config/seo-meta.types.js.map +1 -0
- package/dist/config/seo.service.d.ts +41 -58
- package/dist/config/seo.service.d.ts.map +1 -1
- package/dist/config/seo.service.js +468 -136
- package/dist/config/seo.service.js.map +1 -1
- package/dist/config/site.config.d.ts +10 -50
- package/dist/config/site.config.d.ts.map +1 -1
- package/dist/config/site.config.js +8 -36
- package/dist/config/site.config.js.map +1 -1
- package/dist/core/index.d.ts +1 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/services/dates.service.d.ts +149 -22
- package/dist/core/services/dates.service.d.ts.map +1 -1
- package/dist/core/services/dates.service.js +201 -54
- package/dist/core/services/dates.service.js.map +1 -1
- package/dist/core/services/error.service.d.ts +32 -20
- package/dist/core/services/error.service.d.ts.map +1 -1
- package/dist/core/services/error.service.js +44 -32
- package/dist/core/services/error.service.js.map +1 -1
- package/dist/core/services/formatter.service.d.ts +245 -35
- package/dist/core/services/formatter.service.d.ts.map +1 -1
- package/dist/core/services/formatter.service.js +281 -57
- package/dist/core/services/formatter.service.js.map +1 -1
- package/dist/core/services/generator.service.d.ts +115 -26
- package/dist/core/services/generator.service.d.ts.map +1 -1
- package/dist/core/services/generator.service.js +191 -56
- package/dist/core/services/generator.service.js.map +1 -1
- package/dist/core/services/geometry.service.d.ts +369 -39
- package/dist/core/services/geometry.service.d.ts.map +1 -1
- package/dist/core/services/geometry.service.js +424 -66
- package/dist/core/services/geometry.service.js.map +1 -1
- package/dist/core/services/http.service.d.ts +244 -21
- package/dist/core/services/http.service.d.ts.map +1 -1
- package/dist/core/services/http.service.js +419 -98
- package/dist/core/services/http.service.js.map +1 -1
- package/dist/core/services/logger.service.d.ts +95 -29
- package/dist/core/services/logger.service.d.ts.map +1 -1
- package/dist/core/services/logger.service.js +167 -41
- package/dist/core/services/logger.service.js.map +1 -1
- package/dist/core/services/reactive.service.d.ts +146 -19
- package/dist/core/services/reactive.service.d.ts.map +1 -1
- package/dist/core/services/reactive.service.js +278 -137
- package/dist/core/services/reactive.service.js.map +1 -1
- package/dist/core/services/timing.service.d.ts +142 -20
- package/dist/core/services/timing.service.d.ts.map +1 -1
- package/dist/core/services/timing.service.js +324 -185
- package/dist/core/services/timing.service.js.map +1 -1
- package/dist/core/services/utils.service.d.ts +228 -43
- package/dist/core/services/utils.service.d.ts.map +1 -1
- package/dist/core/services/utils.service.js +305 -125
- package/dist/core/services/utils.service.js.map +1 -1
- package/dist/infrastructure/dom/dom.service.d.ts +307 -44
- package/dist/infrastructure/dom/dom.service.d.ts.map +1 -1
- package/dist/infrastructure/dom/dom.service.js +408 -129
- package/dist/infrastructure/dom/dom.service.js.map +1 -1
- package/dist/infrastructure/index.d.ts +0 -3
- package/dist/infrastructure/index.d.ts.map +1 -1
- package/dist/infrastructure/index.js +0 -3
- package/dist/infrastructure/index.js.map +1 -1
- package/dist/infrastructure/observer/observer.service.d.ts +124 -31
- package/dist/infrastructure/observer/observer.service.d.ts.map +1 -1
- package/dist/infrastructure/observer/observer.service.js +227 -131
- package/dist/infrastructure/observer/observer.service.js.map +1 -1
- package/dist/infrastructure/sensors/sensors.service.d.ts +154 -22
- package/dist/infrastructure/sensors/sensors.service.d.ts.map +1 -1
- package/dist/infrastructure/sensors/sensors.service.js +264 -112
- package/dist/infrastructure/sensors/sensors.service.js.map +1 -1
- package/dist/infrastructure/storage/storage.service.d.ts +123 -45
- package/dist/infrastructure/storage/storage.service.d.ts.map +1 -1
- package/dist/infrastructure/storage/storage.service.js +236 -66
- package/dist/infrastructure/storage/storage.service.js.map +1 -1
- package/dist/infrastructure/theme/theme.service.d.ts +93 -29
- package/dist/infrastructure/theme/theme.service.d.ts.map +1 -1
- package/dist/infrastructure/theme/theme.service.js +198 -96
- package/dist/infrastructure/theme/theme.service.js.map +1 -1
- package/dist/infrastructure/viewport/viewport.service.d.ts +233 -35
- package/dist/infrastructure/viewport/viewport.service.d.ts.map +1 -1
- package/dist/infrastructure/viewport/viewport.service.js +358 -139
- package/dist/infrastructure/viewport/viewport.service.js.map +1 -1
- package/dist/infrastructure/worker/worker.service.d.ts +84 -38
- package/dist/infrastructure/worker/worker.service.d.ts.map +1 -1
- package/dist/infrastructure/worker/worker.service.js +234 -133
- package/dist/infrastructure/worker/worker.service.js.map +1 -1
- package/dist/prisma/index.d.ts +2 -0
- package/dist/prisma/index.d.ts.map +1 -0
- package/dist/prisma/index.js +2 -0
- package/dist/prisma/index.js.map +1 -0
- package/dist/prisma/schema.json +11 -33
- package/dist/prisma/use-prisma.d.ts +68 -0
- package/dist/prisma/use-prisma.d.ts.map +1 -0
- package/dist/prisma/use-prisma.js +82 -0
- package/dist/prisma/use-prisma.js.map +1 -0
- package/dist/types/index.d.ts +20 -12
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +124 -125
- package/CHANGELOG.md +0 -101
|
@@ -1,42 +1,88 @@
|
|
|
1
1
|
import type { WorkerFunc } from "../../types/index.js";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* Runs a pure function in a one-shot Worker and destroys it afterwards.
|
|
4
|
+
* Falls back to running on the main thread when Workers are unavailable (SSR).
|
|
5
|
+
* Async worker functions are awaited (Promise resolved before postMessage).
|
|
6
|
+
*
|
|
7
|
+
* @typeParam TInput - Input data type.
|
|
8
|
+
* @typeParam TOutput - Output data type.
|
|
9
|
+
* @param workerFunc - The pure function to execute off the main thread.
|
|
10
|
+
* @param data - The input data passed to the function.
|
|
11
|
+
* @returns A Promise resolving to the function's output.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const doubled = await useRun((n: number) => n * 2, 21);
|
|
16
|
+
* console.log(doubled); // 42
|
|
17
|
+
* ```
|
|
5
18
|
*/
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
19
|
+
export declare function useRun<TInput, TOutput>(workerFunc: WorkerFunc<TInput, TOutput>, data: TInput): Promise<TOutput>;
|
|
20
|
+
/**
|
|
21
|
+
* Creates a reusable Worker pool under a unique key. If a pool with the same
|
|
22
|
+
* key already exists, it is terminated first.
|
|
23
|
+
*
|
|
24
|
+
* @typeParam TInput - Input data type.
|
|
25
|
+
* @typeParam TOutput - Output data type.
|
|
26
|
+
* @param key - A unique identifier for this pool.
|
|
27
|
+
* @param workerFunc - The pure function the pool will execute.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* useCreatePool("heavy", (n: number) => n ** 2);
|
|
32
|
+
* const result = await useRunPool("heavy", 9); // 81
|
|
33
|
+
* useTerminate("heavy");
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function useCreatePool<TInput, TOutput>(key: string, workerFunc: WorkerFunc<TInput, TOutput>): void;
|
|
37
|
+
/**
|
|
38
|
+
* Runs a task on an existing Worker pool. Tasks are correlated by `__taskId`
|
|
39
|
+
* so concurrent tasks do not stomp each other's handlers.
|
|
40
|
+
*
|
|
41
|
+
* @typeParam TInput - Input data type.
|
|
42
|
+
* @typeParam TOutput - Output data type.
|
|
43
|
+
* @param key - The pool key created via {@link useCreatePool}.
|
|
44
|
+
* @param data - The input data to pass to the pool's function.
|
|
45
|
+
* @returns A Promise resolving to the function's output.
|
|
46
|
+
* @throws {Error} If the pool does not exist.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* useCreatePool("math", (n: number) => n * 10);
|
|
51
|
+
* const result = await useRunPool("math", 5); // 50
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare function useRunPool<TInput, TOutput>(key: string, data: TInput): Promise<TOutput>;
|
|
55
|
+
/**
|
|
56
|
+
* Terminates a specific Worker pool and rejects any in-flight tasks.
|
|
57
|
+
*
|
|
58
|
+
* @param key - The pool key to terminate.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* useTerminate("heavy");
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function useTerminate(key: string): void;
|
|
66
|
+
/**
|
|
67
|
+
* Terminates all active Worker pools and rejects any in-flight tasks.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```ts
|
|
71
|
+
* useTerminateAll();
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare function useTerminateAll(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Checks whether a Worker pool with the given key exists.
|
|
77
|
+
*
|
|
78
|
+
* @param key - The pool key to check.
|
|
79
|
+
* @returns `true` if the pool is registered.
|
|
80
|
+
*/
|
|
81
|
+
export declare function useHasWorker(key: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Returns a list of all active Worker pool keys.
|
|
84
|
+
*
|
|
85
|
+
* @returns An array of pool key strings.
|
|
86
|
+
*/
|
|
87
|
+
export declare function useWorkerKeys(): string[];
|
|
42
88
|
//# sourceMappingURL=worker.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.service.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/worker/worker.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"worker.service.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/worker/worker.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,sBAAsB,CAAC;AA0BxE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,MAAM,CAAC,MAAM,EAAE,OAAO,EAC3C,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,CAAC,CA0DlB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAC5C,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,IAAI,CAwCN;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4CvF;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAiB9C;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC"}
|
|
@@ -1,151 +1,252 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Module-level state
|
|
3
|
+
// ============================================================
|
|
4
|
+
/** Registry of reusable Worker pools keyed by string. */
|
|
5
|
+
const pools = new Map();
|
|
6
|
+
// ============================================================
|
|
7
|
+
// Internal helpers
|
|
8
|
+
// ============================================================
|
|
1
9
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
10
|
+
* Checks whether the Web Worker API is available.
|
|
11
|
+
*
|
|
12
|
+
* @returns `true` if `Worker` is available in the current environment.
|
|
4
13
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
function isWorkerSupported() {
|
|
15
|
+
return typeof window !== "undefined" && "Worker" in window;
|
|
16
|
+
}
|
|
17
|
+
// ============================================================
|
|
18
|
+
// Public API
|
|
19
|
+
// ============================================================
|
|
20
|
+
/**
|
|
21
|
+
* Runs a pure function in a one-shot Worker and destroys it afterwards.
|
|
22
|
+
* Falls back to running on the main thread when Workers are unavailable (SSR).
|
|
23
|
+
* Async worker functions are awaited (Promise resolved before postMessage).
|
|
24
|
+
*
|
|
25
|
+
* @typeParam TInput - Input data type.
|
|
26
|
+
* @typeParam TOutput - Output data type.
|
|
27
|
+
* @param workerFunc - The pure function to execute off the main thread.
|
|
28
|
+
* @param data - The input data passed to the function.
|
|
29
|
+
* @returns A Promise resolving to the function's output.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const doubled = await useRun((n: number) => n * 2, 21);
|
|
34
|
+
* console.log(doubled); // 42
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export async function useRun(workerFunc, data) {
|
|
38
|
+
if (!isWorkerSupported()) {
|
|
39
|
+
return Promise.resolve(workerFunc(data));
|
|
17
40
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
let worker;
|
|
43
|
+
let workerUrl;
|
|
44
|
+
const cleanup = () => {
|
|
45
|
+
if (worker) {
|
|
46
|
+
worker.terminate();
|
|
47
|
+
worker = undefined;
|
|
48
|
+
}
|
|
49
|
+
if (workerUrl) {
|
|
50
|
+
URL.revokeObjectURL(workerUrl);
|
|
51
|
+
workerUrl = undefined;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
try {
|
|
55
|
+
const funcString = workerFunc.toString();
|
|
56
|
+
const blob = new Blob([
|
|
57
|
+
`self.onmessage = (e) => {
|
|
58
|
+
Promise.resolve((${funcString})(e.data))
|
|
59
|
+
.then((payload) => self.postMessage({ ok: true, payload }))
|
|
60
|
+
.catch((err) => self.postMessage({ ok: false, error: String(err && err.message ? err.message : err) }));
|
|
61
|
+
}`,
|
|
62
|
+
], { type: "application/javascript" });
|
|
63
|
+
workerUrl = URL.createObjectURL(blob);
|
|
64
|
+
worker = new Worker(workerUrl);
|
|
65
|
+
worker.onmessage = (event) => {
|
|
66
|
+
cleanup();
|
|
67
|
+
if (event.data?.ok === false) {
|
|
68
|
+
reject(new Error(event.data.error ?? "Worker function failed"));
|
|
69
|
+
return;
|
|
37
70
|
}
|
|
71
|
+
resolve(event.data?.payload);
|
|
38
72
|
};
|
|
39
|
-
|
|
40
|
-
const funcString = workerFunc.toString();
|
|
41
|
-
const blob = new Blob([`self.onmessage = (e) => self.postMessage((${funcString})(e.data))`], {
|
|
42
|
-
type: "application/javascript",
|
|
43
|
-
});
|
|
44
|
-
workerUrl = URL.createObjectURL(blob);
|
|
45
|
-
worker = new Worker(workerUrl);
|
|
46
|
-
worker.onmessage = (event) => {
|
|
47
|
-
cleanup();
|
|
48
|
-
resolve(event.data);
|
|
49
|
-
};
|
|
50
|
-
worker.onerror = (error) => {
|
|
51
|
-
cleanup();
|
|
52
|
-
reject(new Error(`Worker error: ${error.message}`));
|
|
53
|
-
};
|
|
54
|
-
worker.onmessageerror = () => {
|
|
55
|
-
cleanup();
|
|
56
|
-
reject(new Error("Worker returned a non-cloneable value."));
|
|
57
|
-
};
|
|
58
|
-
worker.postMessage(data);
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
73
|
+
worker.onerror = (error) => {
|
|
61
74
|
cleanup();
|
|
62
|
-
reject(error);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
this.useTerminate(key);
|
|
75
|
+
reject(new Error(`Worker error: ${error.message}`));
|
|
76
|
+
};
|
|
77
|
+
worker.onmessageerror = () => {
|
|
78
|
+
cleanup();
|
|
79
|
+
reject(new Error("Worker returned a non-cloneable value."));
|
|
80
|
+
};
|
|
81
|
+
worker.postMessage(data);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
cleanup();
|
|
85
|
+
reject(error);
|
|
74
86
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Creates a reusable Worker pool under a unique key. If a pool with the same
|
|
91
|
+
* key already exists, it is terminated first.
|
|
92
|
+
*
|
|
93
|
+
* @typeParam TInput - Input data type.
|
|
94
|
+
* @typeParam TOutput - Output data type.
|
|
95
|
+
* @param key - A unique identifier for this pool.
|
|
96
|
+
* @param workerFunc - The pure function the pool will execute.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* useCreatePool("heavy", (n: number) => n ** 2);
|
|
101
|
+
* const result = await useRunPool("heavy", 9); // 81
|
|
102
|
+
* useTerminate("heavy");
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export function useCreatePool(key, workerFunc) {
|
|
106
|
+
if (!isWorkerSupported()) {
|
|
107
|
+
pools.set(key, {
|
|
108
|
+
worker: null,
|
|
109
|
+
workerUrl: "",
|
|
84
110
|
func: workerFunc,
|
|
111
|
+
pending: new Map(),
|
|
85
112
|
});
|
|
86
|
-
return
|
|
113
|
+
return;
|
|
87
114
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
+
if (pools.has(key)) {
|
|
116
|
+
useTerminate(key);
|
|
117
|
+
}
|
|
118
|
+
const funcString = workerFunc.toString();
|
|
119
|
+
const blob = new Blob([
|
|
120
|
+
`self.onmessage = (e) => {
|
|
121
|
+
const taskId = e.data.__taskId;
|
|
122
|
+
Promise.resolve((${funcString})(e.data.payload))
|
|
123
|
+
.then((payload) => self.postMessage({ __taskId: taskId, ok: true, payload }))
|
|
124
|
+
.catch((err) => self.postMessage({
|
|
125
|
+
__taskId: taskId,
|
|
126
|
+
ok: false,
|
|
127
|
+
error: String(err && err.message ? err.message : err),
|
|
128
|
+
}));
|
|
129
|
+
}`,
|
|
130
|
+
], { type: "application/javascript" });
|
|
131
|
+
const workerUrl = URL.createObjectURL(blob);
|
|
132
|
+
const worker = new Worker(workerUrl);
|
|
133
|
+
pools.set(key, {
|
|
134
|
+
worker,
|
|
135
|
+
workerUrl,
|
|
136
|
+
func: workerFunc,
|
|
137
|
+
pending: new Map(),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Runs a task on an existing Worker pool. Tasks are correlated by `__taskId`
|
|
142
|
+
* so concurrent tasks do not stomp each other's handlers.
|
|
143
|
+
*
|
|
144
|
+
* @typeParam TInput - Input data type.
|
|
145
|
+
* @typeParam TOutput - Output data type.
|
|
146
|
+
* @param key - The pool key created via {@link useCreatePool}.
|
|
147
|
+
* @param data - The input data to pass to the pool's function.
|
|
148
|
+
* @returns A Promise resolving to the function's output.
|
|
149
|
+
* @throws {Error} If the pool does not exist.
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```ts
|
|
153
|
+
* useCreatePool("math", (n: number) => n * 10);
|
|
154
|
+
* const result = await useRunPool("math", 5); // 50
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
export function useRunPool(key, data) {
|
|
158
|
+
const entry = pools.get(key);
|
|
159
|
+
if (!entry) {
|
|
160
|
+
return Promise.reject(new Error(`Worker pool "${key}" not found`));
|
|
161
|
+
}
|
|
162
|
+
if (!isWorkerSupported()) {
|
|
163
|
+
return Promise.resolve(entry.func(data));
|
|
164
|
+
}
|
|
165
|
+
const taskId = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
166
|
+
return new Promise((resolve, reject) => {
|
|
167
|
+
const onMessage = (event) => {
|
|
168
|
+
if (event.data?.__taskId !== taskId)
|
|
169
|
+
return;
|
|
170
|
+
cleanup();
|
|
171
|
+
if (event.data.ok === false) {
|
|
172
|
+
reject(new Error(event.data.error ?? "Worker function failed"));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
resolve(event.data.payload);
|
|
176
|
+
};
|
|
177
|
+
const onError = (error) => {
|
|
178
|
+
cleanup();
|
|
179
|
+
reject(new Error(`Worker error: ${error.message}`));
|
|
180
|
+
};
|
|
181
|
+
const cleanup = () => {
|
|
182
|
+
entry.worker.removeEventListener("message", onMessage);
|
|
183
|
+
entry.worker.removeEventListener("error", onError);
|
|
184
|
+
entry.pending.delete(taskId);
|
|
185
|
+
};
|
|
186
|
+
entry.pending.set(taskId, {
|
|
187
|
+
reject: (reason) => reject(reason),
|
|
188
|
+
cleanup,
|
|
115
189
|
});
|
|
190
|
+
entry.worker.addEventListener("message", onMessage);
|
|
191
|
+
entry.worker.addEventListener("error", onError);
|
|
192
|
+
entry.worker.postMessage({ __taskId: taskId, payload: data });
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Terminates a specific Worker pool and rejects any in-flight tasks.
|
|
197
|
+
*
|
|
198
|
+
* @param key - The pool key to terminate.
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* ```ts
|
|
202
|
+
* useTerminate("heavy");
|
|
203
|
+
* ```
|
|
204
|
+
*/
|
|
205
|
+
export function useTerminate(key) {
|
|
206
|
+
const entry = pools.get(key);
|
|
207
|
+
if (!entry)
|
|
208
|
+
return;
|
|
209
|
+
for (const pending of entry.pending.values()) {
|
|
210
|
+
pending.cleanup();
|
|
211
|
+
pending.reject(new Error(`Worker pool "${key}" was terminated`));
|
|
116
212
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
*/
|
|
120
|
-
useTerminate(key) {
|
|
121
|
-
const entry = this.pools.get(key);
|
|
122
|
-
if (!entry)
|
|
123
|
-
return this;
|
|
213
|
+
entry.pending.clear();
|
|
214
|
+
if (isWorkerSupported() && entry.worker) {
|
|
124
215
|
entry.worker.terminate();
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
return this;
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Terminates all active pools.
|
|
131
|
-
*/
|
|
132
|
-
useTerminateAll() {
|
|
133
|
-
for (const key of this.pools.keys()) {
|
|
134
|
-
this.useTerminate(key);
|
|
216
|
+
if (entry.workerUrl) {
|
|
217
|
+
URL.revokeObjectURL(entry.workerUrl);
|
|
135
218
|
}
|
|
136
|
-
return this;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Checks whether a pool exists.
|
|
140
|
-
*/
|
|
141
|
-
useHasWorker(key) {
|
|
142
|
-
return this.pools.has(key);
|
|
143
219
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
220
|
+
pools.delete(key);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Terminates all active Worker pools and rejects any in-flight tasks.
|
|
224
|
+
*
|
|
225
|
+
* @example
|
|
226
|
+
* ```ts
|
|
227
|
+
* useTerminateAll();
|
|
228
|
+
* ```
|
|
229
|
+
*/
|
|
230
|
+
export function useTerminateAll() {
|
|
231
|
+
for (const key of pools.keys()) {
|
|
232
|
+
useTerminate(key);
|
|
149
233
|
}
|
|
150
234
|
}
|
|
235
|
+
/**
|
|
236
|
+
* Checks whether a Worker pool with the given key exists.
|
|
237
|
+
*
|
|
238
|
+
* @param key - The pool key to check.
|
|
239
|
+
* @returns `true` if the pool is registered.
|
|
240
|
+
*/
|
|
241
|
+
export function useHasWorker(key) {
|
|
242
|
+
return pools.has(key);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Returns a list of all active Worker pool keys.
|
|
246
|
+
*
|
|
247
|
+
* @returns An array of pool key strings.
|
|
248
|
+
*/
|
|
249
|
+
export function useWorkerKeys() {
|
|
250
|
+
return Array.from(pools.keys());
|
|
251
|
+
}
|
|
151
252
|
//# sourceMappingURL=worker.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.service.js","sourceRoot":"","sources":["../../../src/infrastructure/worker/worker.service.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"worker.service.js","sourceRoot":"","sources":["../../../src/infrastructure/worker/worker.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prisma/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prisma/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|