worker-lib 1.0.1 → 1.0.2
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/dist/{index.d.ts → cjs/index.d.ts} +21 -21
- package/dist/{index.js → cjs/index.js} +124 -133
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/index.d.ts +21 -0
- package/dist/esm/index.js +120 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/esm/package.json +3 -0
- package/package.json +16 -5
- package/dist/index.js.map +0 -1
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
[key: string]: (...args: any) => any;
|
|
3
|
-
};
|
|
4
|
-
/**
|
|
5
|
-
* createWorker
|
|
6
|
-
*
|
|
7
|
-
* @template T
|
|
8
|
-
* @param {() => Worker} builder
|
|
9
|
-
* @param {number} [limit=0]
|
|
10
|
-
* @return {*}
|
|
11
|
-
*/
|
|
12
|
-
export declare const createWorker: <T extends WorkerType>(builder: () => Worker, limit?: number) => <K extends keyof T>(name: K, ...value: Parameters<T[K]>) => Promise<ReturnType<T[K]>>;
|
|
13
|
-
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* @template T
|
|
17
|
-
* @param {T} WorkerProc
|
|
18
|
-
* @return {*}
|
|
19
|
-
*/
|
|
20
|
-
export declare const initWorker: <T extends WorkerType>(WorkerProc: T) => T;
|
|
21
|
-
export {};
|
|
1
|
+
type WorkerType = {
|
|
2
|
+
[key: string]: (...args: any) => any;
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* createWorker
|
|
6
|
+
*
|
|
7
|
+
* @template T
|
|
8
|
+
* @param {() => Worker} builder
|
|
9
|
+
* @param {number} [limit=0]
|
|
10
|
+
* @return {*}
|
|
11
|
+
*/
|
|
12
|
+
export declare const createWorker: <T extends WorkerType>(builder: () => Worker, limit?: number) => <K extends keyof T>(name: K, ...value: Parameters<T[K]>) => Promise<ReturnType<T[K]>>;
|
|
13
|
+
/**
|
|
14
|
+
*
|
|
15
|
+
*
|
|
16
|
+
* @template T
|
|
17
|
+
* @param {T} WorkerProc
|
|
18
|
+
* @return {*}
|
|
19
|
+
*/
|
|
20
|
+
export declare const initWorker: <T extends WorkerType>(WorkerProc: T) => T;
|
|
21
|
+
export {};
|
|
@@ -1,134 +1,125 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const
|
|
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
|
-
});
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
}, { once: true });
|
|
127
|
-
worker.postMessage({
|
|
128
|
-
type: "callback",
|
|
129
|
-
payload: { id, index, value: params },
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
};
|
|
133
|
-
const WorkerValue = { id: 0, promises: {} };
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initWorker = exports.createWorker = void 0;
|
|
4
|
+
const init = (worker) => {
|
|
5
|
+
return new Promise((resolve) => {
|
|
6
|
+
worker.addEventListener("message", () => {
|
|
7
|
+
resolve(worker);
|
|
8
|
+
}, { once: true });
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
const exec = (worker, name, ...value) => {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
const p = async (result) => {
|
|
14
|
+
const { data } = result;
|
|
15
|
+
switch (data.type) {
|
|
16
|
+
case "callback":
|
|
17
|
+
const r = value[data.payload.index](data.payload.value);
|
|
18
|
+
worker.postMessage({
|
|
19
|
+
type: "callback_result",
|
|
20
|
+
payload: { id: data.payload.id, result: await r },
|
|
21
|
+
});
|
|
22
|
+
break;
|
|
23
|
+
case "result":
|
|
24
|
+
worker.removeEventListener("message", p);
|
|
25
|
+
resolve(data.payload);
|
|
26
|
+
break;
|
|
27
|
+
case "error":
|
|
28
|
+
worker.removeEventListener("message", p);
|
|
29
|
+
reject(data.payload);
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
worker.addEventListener("message", p);
|
|
34
|
+
worker.postMessage({
|
|
35
|
+
type: "function",
|
|
36
|
+
payload: {
|
|
37
|
+
name,
|
|
38
|
+
value: value.map((v) => !(typeof v === "function") && v),
|
|
39
|
+
callback: value.map((v) => typeof v === "function"),
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* createWorker
|
|
46
|
+
*
|
|
47
|
+
* @template T
|
|
48
|
+
* @param {() => Worker} builder
|
|
49
|
+
* @param {number} [limit=0]
|
|
50
|
+
* @return {*}
|
|
51
|
+
*/
|
|
52
|
+
const createWorker = (builder, limit = 0) => {
|
|
53
|
+
let workers = 0;
|
|
54
|
+
const unuses = [];
|
|
55
|
+
const jobs = [];
|
|
56
|
+
return (name, ...value) => {
|
|
57
|
+
return new Promise(async (resolve, reject) => {
|
|
58
|
+
jobs.push({ resolve, reject, name, value });
|
|
59
|
+
let worker = unuses.pop();
|
|
60
|
+
if (limit === 0 || workers < limit) {
|
|
61
|
+
worker = await init(builder());
|
|
62
|
+
workers++;
|
|
63
|
+
}
|
|
64
|
+
if (worker) {
|
|
65
|
+
while (jobs.length) {
|
|
66
|
+
const { resolve, reject, name, value } = jobs.shift();
|
|
67
|
+
await exec(worker, name, ...value)
|
|
68
|
+
.then((v) => resolve(v))
|
|
69
|
+
.catch((e) => reject(e));
|
|
70
|
+
}
|
|
71
|
+
unuses.push(worker);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
exports.createWorker = createWorker;
|
|
77
|
+
/**
|
|
78
|
+
*
|
|
79
|
+
*
|
|
80
|
+
* @template T
|
|
81
|
+
* @param {T} WorkerProc
|
|
82
|
+
* @return {*}
|
|
83
|
+
*/
|
|
84
|
+
const initWorker = (WorkerProc) => {
|
|
85
|
+
const worker = self;
|
|
86
|
+
worker.addEventListener("message", async (e) => {
|
|
87
|
+
const data = e.data;
|
|
88
|
+
if (data.type === "function") {
|
|
89
|
+
const { name, value, callback, } = data.payload;
|
|
90
|
+
const proc = WorkerProc[name];
|
|
91
|
+
if (proc) {
|
|
92
|
+
try {
|
|
93
|
+
const params = value.map((v, index) => callback[index] ? (...params) => callbackProc(worker, index, params) : v);
|
|
94
|
+
worker.postMessage({
|
|
95
|
+
type: "result",
|
|
96
|
+
payload: await proc(...params),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
worker.postMessage({ type: "error", payload: String(e) });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
worker.postMessage(undefined);
|
|
106
|
+
return WorkerProc;
|
|
107
|
+
};
|
|
108
|
+
exports.initWorker = initWorker;
|
|
109
|
+
const callbackProc = (worker, index, params) => {
|
|
110
|
+
const id = WorkerValue.id++;
|
|
111
|
+
return new Promise((resolve) => {
|
|
112
|
+
worker.addEventListener("message", (e) => {
|
|
113
|
+
const data = e.data;
|
|
114
|
+
if (data.type === "callback_result" && data.payload.id === id) {
|
|
115
|
+
resolve(data.payload.result);
|
|
116
|
+
}
|
|
117
|
+
}, { once: true });
|
|
118
|
+
worker.postMessage({
|
|
119
|
+
type: "callback",
|
|
120
|
+
payload: { id, index, value: params },
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
const WorkerValue = { id: 0, promises: {} };
|
|
134
125
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["type WorkerType = { [key: string]: (...args: any) => any };\ntype WorkerRecvEvent<T> =\n | {\n type: \"function\";\n payload: { name: keyof T; callback: boolean[]; value: unknown[] };\n }\n | { type: \"callback_result\"; payload: { id: number; result: unknown } };\ntype WorkerSendEvent<T extends WorkerType> =\n | {\n type: \"callback\";\n payload: { id: number; result: unknown; index: number; value: T };\n }\n | {\n type: \"result\";\n payload: ReturnType<T[keyof T]>;\n }\n | {\n type: \"error\";\n payload: unknown;\n };\n\nconst init = (worker: Worker): Promise<Worker> => {\n return new Promise((resolve) => {\n worker.addEventListener(\n \"message\",\n () => {\n resolve(worker);\n },\n { once: true }\n );\n });\n};\nconst exec = <T extends WorkerType>(\n worker: Worker,\n name: keyof T,\n ...value: Parameters<T[keyof T]>\n): Promise<ReturnType<T[keyof T]>> => {\n return new Promise((resolve, reject) => {\n const p = async (result: MessageEvent<WorkerSendEvent<T>>) => {\n const { data } = result;\n switch (data.type) {\n case \"callback\":\n const r = value[data.payload.index](data.payload.value);\n worker.postMessage({\n type: \"callback_result\",\n payload: { id: data.payload.id, result: await r },\n });\n break;\n case \"result\":\n worker.removeEventListener(\"message\", p);\n resolve(data.payload);\n break;\n case \"error\":\n worker.removeEventListener(\"message\", p);\n reject(data.payload);\n break;\n }\n };\n worker.addEventListener(\"message\", p);\n worker.postMessage({\n type: \"function\",\n payload: {\n name,\n value: value.map((v: unknown) => !(typeof v === \"function\") && v),\n callback: value.map((v: unknown) => typeof v === \"function\"),\n },\n } as WorkerRecvEvent<T>);\n });\n};\n\n/**\n * createWorker\n *\n * @template T\n * @param {() => Worker} builder\n * @param {number} [limit=0]\n * @return {*}\n */\nexport const createWorker = <T extends WorkerType>(builder: () => Worker, limit = 0) => {\n let workers = 0;\n const unuses: Worker[] = [];\n const jobs: any = [];\n return <K extends keyof T>(name: K, ...value: Parameters<T[K]>): Promise<ReturnType<T[K]>> => {\n return new Promise(async (resolve, reject) => {\n jobs.push({ resolve, reject, name, value });\n let worker = unuses.pop();\n if (limit === 0 || workers < limit) {\n worker = await init(builder());\n workers++;\n }\n if (worker) {\n while (jobs.length) {\n const { resolve, reject, name, value } = jobs.shift();\n await exec(worker, name, ...value)\n .then((v) => resolve(v))\n .catch((e) => reject(e));\n }\n unuses.push(worker);\n }\n });\n };\n};\n/**\n *\n *\n * @template T\n * @param {T} WorkerProc\n * @return {*}\n */\nexport const initWorker = <T extends WorkerType>(WorkerProc: T) => {\n const worker = self as unknown as Worker;\n worker.addEventListener(\"message\", async (e: MessageEvent) => {\n const data = e.data as WorkerRecvEvent<T>;\n if (data.type === \"function\") {\n const {\n name,\n value,\n callback,\n }: {\n name: keyof T;\n value: unknown[];\n callback: boolean[];\n } = data.payload;\n const proc = WorkerProc[name];\n if (proc) {\n try {\n const params = value.map((v, index) =>\n callback[index] ? (...params: unknown[]) => callbackProc<T>(worker, index, params) : v\n );\n worker.postMessage({\n type: \"result\",\n payload: await proc(...params),\n });\n } catch (e) {\n worker.postMessage({ type: \"error\", payload: String(e) });\n }\n }\n }\n });\n worker.postMessage(undefined);\n return WorkerProc;\n};\n\nconst callbackProc = <T>(worker: Worker, index: number, params: unknown[]) => {\n const id = WorkerValue.id++;\n return new Promise((resolve) => {\n worker.addEventListener(\n \"message\",\n (e: MessageEvent) => {\n const data = e.data as WorkerRecvEvent<T>;\n if (data.type === \"callback_result\" && data.payload.id === id) {\n resolve(data.payload.result);\n }\n },\n { once: true }\n );\n worker.postMessage({\n type: \"callback\",\n payload: { id, index, value: params },\n });\n });\n};\n\nconst WorkerValue = { id: 0, promises: {} } as {\n id: number;\n promises: { [key: number]: Promise<unknown> };\n};\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
type WorkerType = {
|
|
2
|
+
[key: string]: (...args: any) => any;
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* createWorker
|
|
6
|
+
*
|
|
7
|
+
* @template T
|
|
8
|
+
* @param {() => Worker} builder
|
|
9
|
+
* @param {number} [limit=0]
|
|
10
|
+
* @return {*}
|
|
11
|
+
*/
|
|
12
|
+
export declare const createWorker: <T extends WorkerType>(builder: () => Worker, limit?: number) => <K extends keyof T>(name: K, ...value: Parameters<T[K]>) => Promise<ReturnType<T[K]>>;
|
|
13
|
+
/**
|
|
14
|
+
*
|
|
15
|
+
*
|
|
16
|
+
* @template T
|
|
17
|
+
* @param {T} WorkerProc
|
|
18
|
+
* @return {*}
|
|
19
|
+
*/
|
|
20
|
+
export declare const initWorker: <T extends WorkerType>(WorkerProc: T) => T;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
const init = (worker) => {
|
|
2
|
+
return new Promise((resolve) => {
|
|
3
|
+
worker.addEventListener("message", () => {
|
|
4
|
+
resolve(worker);
|
|
5
|
+
}, { once: true });
|
|
6
|
+
});
|
|
7
|
+
};
|
|
8
|
+
const exec = (worker, name, ...value) => {
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
const p = async (result) => {
|
|
11
|
+
const { data } = result;
|
|
12
|
+
switch (data.type) {
|
|
13
|
+
case "callback":
|
|
14
|
+
const r = value[data.payload.index](data.payload.value);
|
|
15
|
+
worker.postMessage({
|
|
16
|
+
type: "callback_result",
|
|
17
|
+
payload: { id: data.payload.id, result: await r },
|
|
18
|
+
});
|
|
19
|
+
break;
|
|
20
|
+
case "result":
|
|
21
|
+
worker.removeEventListener("message", p);
|
|
22
|
+
resolve(data.payload);
|
|
23
|
+
break;
|
|
24
|
+
case "error":
|
|
25
|
+
worker.removeEventListener("message", p);
|
|
26
|
+
reject(data.payload);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
worker.addEventListener("message", p);
|
|
31
|
+
worker.postMessage({
|
|
32
|
+
type: "function",
|
|
33
|
+
payload: {
|
|
34
|
+
name,
|
|
35
|
+
value: value.map((v) => !(typeof v === "function") && v),
|
|
36
|
+
callback: value.map((v) => typeof v === "function"),
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* createWorker
|
|
43
|
+
*
|
|
44
|
+
* @template T
|
|
45
|
+
* @param {() => Worker} builder
|
|
46
|
+
* @param {number} [limit=0]
|
|
47
|
+
* @return {*}
|
|
48
|
+
*/
|
|
49
|
+
export const createWorker = (builder, limit = 0) => {
|
|
50
|
+
let workers = 0;
|
|
51
|
+
const unuses = [];
|
|
52
|
+
const jobs = [];
|
|
53
|
+
return (name, ...value) => {
|
|
54
|
+
return new Promise(async (resolve, reject) => {
|
|
55
|
+
jobs.push({ resolve, reject, name, value });
|
|
56
|
+
let worker = unuses.pop();
|
|
57
|
+
if (limit === 0 || workers < limit) {
|
|
58
|
+
worker = await init(builder());
|
|
59
|
+
workers++;
|
|
60
|
+
}
|
|
61
|
+
if (worker) {
|
|
62
|
+
while (jobs.length) {
|
|
63
|
+
const { resolve, reject, name, value } = jobs.shift();
|
|
64
|
+
await exec(worker, name, ...value)
|
|
65
|
+
.then((v) => resolve(v))
|
|
66
|
+
.catch((e) => reject(e));
|
|
67
|
+
}
|
|
68
|
+
unuses.push(worker);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
*
|
|
75
|
+
*
|
|
76
|
+
* @template T
|
|
77
|
+
* @param {T} WorkerProc
|
|
78
|
+
* @return {*}
|
|
79
|
+
*/
|
|
80
|
+
export const initWorker = (WorkerProc) => {
|
|
81
|
+
const worker = self;
|
|
82
|
+
worker.addEventListener("message", async (e) => {
|
|
83
|
+
const data = e.data;
|
|
84
|
+
if (data.type === "function") {
|
|
85
|
+
const { name, value, callback, } = data.payload;
|
|
86
|
+
const proc = WorkerProc[name];
|
|
87
|
+
if (proc) {
|
|
88
|
+
try {
|
|
89
|
+
const params = value.map((v, index) => callback[index] ? (...params) => callbackProc(worker, index, params) : v);
|
|
90
|
+
worker.postMessage({
|
|
91
|
+
type: "result",
|
|
92
|
+
payload: await proc(...params),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
worker.postMessage({ type: "error", payload: String(e) });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
worker.postMessage(undefined);
|
|
102
|
+
return WorkerProc;
|
|
103
|
+
};
|
|
104
|
+
const callbackProc = (worker, index, params) => {
|
|
105
|
+
const id = WorkerValue.id++;
|
|
106
|
+
return new Promise((resolve) => {
|
|
107
|
+
worker.addEventListener("message", (e) => {
|
|
108
|
+
const data = e.data;
|
|
109
|
+
if (data.type === "callback_result" && data.payload.id === id) {
|
|
110
|
+
resolve(data.payload.result);
|
|
111
|
+
}
|
|
112
|
+
}, { once: true });
|
|
113
|
+
worker.postMessage({
|
|
114
|
+
type: "callback",
|
|
115
|
+
payload: { id, index, value: params },
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
const WorkerValue = { id: 0, promises: {} };
|
|
120
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["type WorkerType = { [key: string]: (...args: any) => any };\ntype WorkerRecvEvent<T> =\n | {\n type: \"function\";\n payload: { name: keyof T; callback: boolean[]; value: unknown[] };\n }\n | { type: \"callback_result\"; payload: { id: number; result: unknown } };\ntype WorkerSendEvent<T extends WorkerType> =\n | {\n type: \"callback\";\n payload: { id: number; result: unknown; index: number; value: T };\n }\n | {\n type: \"result\";\n payload: ReturnType<T[keyof T]>;\n }\n | {\n type: \"error\";\n payload: unknown;\n };\n\nconst init = (worker: Worker): Promise<Worker> => {\n return new Promise((resolve) => {\n worker.addEventListener(\n \"message\",\n () => {\n resolve(worker);\n },\n { once: true }\n );\n });\n};\nconst exec = <T extends WorkerType>(\n worker: Worker,\n name: keyof T,\n ...value: Parameters<T[keyof T]>\n): Promise<ReturnType<T[keyof T]>> => {\n return new Promise((resolve, reject) => {\n const p = async (result: MessageEvent<WorkerSendEvent<T>>) => {\n const { data } = result;\n switch (data.type) {\n case \"callback\":\n const r = value[data.payload.index](data.payload.value);\n worker.postMessage({\n type: \"callback_result\",\n payload: { id: data.payload.id, result: await r },\n });\n break;\n case \"result\":\n worker.removeEventListener(\"message\", p);\n resolve(data.payload);\n break;\n case \"error\":\n worker.removeEventListener(\"message\", p);\n reject(data.payload);\n break;\n }\n };\n worker.addEventListener(\"message\", p);\n worker.postMessage({\n type: \"function\",\n payload: {\n name,\n value: value.map((v: unknown) => !(typeof v === \"function\") && v),\n callback: value.map((v: unknown) => typeof v === \"function\"),\n },\n } as WorkerRecvEvent<T>);\n });\n};\n\n/**\n * createWorker\n *\n * @template T\n * @param {() => Worker} builder\n * @param {number} [limit=0]\n * @return {*}\n */\nexport const createWorker = <T extends WorkerType>(builder: () => Worker, limit = 0) => {\n let workers = 0;\n const unuses: Worker[] = [];\n const jobs: any = [];\n return <K extends keyof T>(name: K, ...value: Parameters<T[K]>): Promise<ReturnType<T[K]>> => {\n return new Promise(async (resolve, reject) => {\n jobs.push({ resolve, reject, name, value });\n let worker = unuses.pop();\n if (limit === 0 || workers < limit) {\n worker = await init(builder());\n workers++;\n }\n if (worker) {\n while (jobs.length) {\n const { resolve, reject, name, value } = jobs.shift();\n await exec(worker, name, ...value)\n .then((v) => resolve(v))\n .catch((e) => reject(e));\n }\n unuses.push(worker);\n }\n });\n };\n};\n/**\n *\n *\n * @template T\n * @param {T} WorkerProc\n * @return {*}\n */\nexport const initWorker = <T extends WorkerType>(WorkerProc: T) => {\n const worker = self as unknown as Worker;\n worker.addEventListener(\"message\", async (e: MessageEvent) => {\n const data = e.data as WorkerRecvEvent<T>;\n if (data.type === \"function\") {\n const {\n name,\n value,\n callback,\n }: {\n name: keyof T;\n value: unknown[];\n callback: boolean[];\n } = data.payload;\n const proc = WorkerProc[name];\n if (proc) {\n try {\n const params = value.map((v, index) =>\n callback[index] ? (...params: unknown[]) => callbackProc<T>(worker, index, params) : v\n );\n worker.postMessage({\n type: \"result\",\n payload: await proc(...params),\n });\n } catch (e) {\n worker.postMessage({ type: \"error\", payload: String(e) });\n }\n }\n }\n });\n worker.postMessage(undefined);\n return WorkerProc;\n};\n\nconst callbackProc = <T>(worker: Worker, index: number, params: unknown[]) => {\n const id = WorkerValue.id++;\n return new Promise((resolve) => {\n worker.addEventListener(\n \"message\",\n (e: MessageEvent) => {\n const data = e.data as WorkerRecvEvent<T>;\n if (data.type === \"callback_result\" && data.payload.id === id) {\n resolve(data.payload.result);\n }\n },\n { once: true }\n );\n worker.postMessage({\n type: \"callback\",\n payload: { id, index, value: params },\n });\n });\n};\n\nconst WorkerValue = { id: 0, promises: {} } as {\n id: number;\n promises: { [key: number]: Promise<unknown> };\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["../src/index.ts"],"version":"5.7.3"}
|
package/esm/package.json
ADDED
package/package.json
CHANGED
|
@@ -1,20 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "worker-lib",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"main": "dist/index.js",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"main": "./dist/cjs/index.js",
|
|
5
|
+
"types": "./dist/cjs/index.d.ts",
|
|
6
|
+
"exports": {
|
|
7
|
+
"require": "./dist/cjs/index.js",
|
|
8
|
+
"import": "./dist/esm/index.js"
|
|
9
|
+
},
|
|
5
10
|
"license": "MIT",
|
|
6
11
|
"scripts": {
|
|
7
|
-
"build": "tsc
|
|
12
|
+
"build": "tsc && tsc --project ./tsconfig.esm.json && cpy esm dist"
|
|
8
13
|
},
|
|
9
14
|
"devDependencies": {
|
|
10
|
-
"
|
|
15
|
+
"cpy-cli": "5.0.0",
|
|
16
|
+
"typescript": "^5.7.3"
|
|
11
17
|
},
|
|
12
18
|
"description": "Library for easy use of web-worker",
|
|
13
19
|
"repository": {
|
|
14
20
|
"type": "git",
|
|
15
21
|
"url": "git+https://github.com/SoraKumo001/worker-lib.git"
|
|
16
22
|
},
|
|
17
|
-
"keywords": [
|
|
23
|
+
"keywords": [
|
|
24
|
+
"Next.js",
|
|
25
|
+
"react",
|
|
26
|
+
"TypeScript",
|
|
27
|
+
"web-worker"
|
|
28
|
+
],
|
|
18
29
|
"author": "SoraKumo",
|
|
19
30
|
"bugs": {
|
|
20
31
|
"url": "https://github.com/SoraKumo001/worker-lib/issues"
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["type WorkerType = { [key: string]: (...args: any) => any };\ntype WorkerRecvEvent<T> =\n | {\n type: \"function\";\n payload: { name: keyof T; callback: boolean[]; value: unknown[] };\n }\n | { type: \"callback_result\"; payload: { id: number; result: unknown } };\ntype WorkerSendEvent<T extends WorkerType> =\n | {\n type: \"callback\";\n payload: { id: number; result: unknown; index: number; value: T };\n }\n | {\n type: \"result\";\n payload: ReturnType<T[keyof T]>;\n }\n | {\n type: \"error\";\n payload: unknown;\n };\n\nconst init = (worker: Worker): Promise<Worker> => {\n return new Promise((resolve) => {\n worker.addEventListener(\n \"message\",\n () => {\n resolve(worker);\n },\n { once: true }\n );\n });\n};\nconst exec = <T extends WorkerType>(\n worker: Worker,\n name: keyof T,\n ...value: Parameters<T[keyof T]>\n): Promise<ReturnType<T[keyof T]>> => {\n return new Promise((resolve, reject) => {\n const p = async (result: MessageEvent<WorkerSendEvent<T>>) => {\n const { data } = result;\n switch (data.type) {\n case \"callback\":\n const r = value[data.payload.index](data.payload.value);\n worker.postMessage({\n type: \"callback_result\",\n payload: { id: data.payload.id, result: await r },\n });\n break;\n case \"result\":\n worker.removeEventListener(\"message\", p);\n resolve(data.payload);\n break;\n case \"error\":\n worker.removeEventListener(\"message\", p);\n reject(data.payload);\n break;\n }\n };\n worker.addEventListener(\"message\", p);\n worker.postMessage({\n type: \"function\",\n payload: {\n name,\n value: value.map((v: unknown) => !(typeof v === \"function\") && v),\n callback: value.map((v: unknown) => typeof v === \"function\"),\n },\n } as WorkerRecvEvent<T>);\n });\n};\n\n/**\n * createWorker\n *\n * @template T\n * @param {() => Worker} builder\n * @param {number} [limit=0]\n * @return {*}\n */\nexport const createWorker = <T extends WorkerType>(builder: () => Worker, limit = 0) => {\n let workers = 0;\n const unuses: Worker[] = [];\n const jobs: any = [];\n return <K extends keyof T>(name: K, ...value: Parameters<T[K]>): Promise<ReturnType<T[K]>> => {\n return new Promise(async (resolve, reject) => {\n jobs.push({ resolve, reject, name, value });\n let worker = unuses.pop();\n if (limit === 0 || workers < limit) {\n worker = await init(builder());\n workers++;\n }\n if (worker) {\n while (jobs.length) {\n const { resolve, reject, name, value } = jobs.shift();\n await exec(worker, name, ...value)\n .then((v) => resolve(v))\n .catch((e) => reject(e));\n }\n unuses.push(worker);\n }\n });\n };\n};\n/**\n *\n *\n * @template T\n * @param {T} WorkerProc\n * @return {*}\n */\nexport const initWorker = <T extends WorkerType>(WorkerProc: T) => {\n const worker = self as unknown as Worker;\n worker.addEventListener(\"message\", async (e: MessageEvent) => {\n const data = e.data as WorkerRecvEvent<T>;\n if (data.type === \"function\") {\n const {\n name,\n value,\n callback,\n }: {\n name: keyof T;\n value: unknown[];\n callback: boolean[];\n } = data.payload;\n const proc = WorkerProc[name];\n if (proc) {\n try {\n const params = value.map((v, index) =>\n callback[index] ? (...params: unknown[]) => callbackProc<T>(worker, index, params) : v\n );\n worker.postMessage({\n type: \"result\",\n payload: await proc(...params),\n });\n } catch (e) {\n worker.postMessage({ type: \"error\", payload: String(e) });\n }\n }\n }\n });\n worker.postMessage(undefined);\n return WorkerProc;\n};\n\nconst callbackProc = <T>(worker: Worker, index: number, params: unknown[]) => {\n const id = WorkerValue.id++;\n return new Promise((resolve) => {\n worker.addEventListener(\n \"message\",\n (e: MessageEvent) => {\n const data = e.data as WorkerRecvEvent<T>;\n if (data.type === \"callback_result\" && data.payload.id === id) {\n resolve(data.payload.result);\n }\n },\n { once: true }\n );\n worker.postMessage({\n type: \"callback\",\n payload: { id, index, value: params },\n });\n });\n};\n\nconst WorkerValue = { id: 0, promises: {} } as {\n id: number;\n promises: { [key: number]: Promise<unknown> };\n};\n"]}
|