worker-lib 1.0.0 → 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.
@@ -1,21 +1,21 @@
1
- declare 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
+ 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,125 @@
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: {} };
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,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -0,0 +1 @@
1
+ {"root":["../src/index.ts"],"version":"5.7.3"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
package/package.json CHANGED
@@ -1,20 +1,31 @@
1
1
  {
2
2
  "name": "worker-lib",
3
- "version": "1.0.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 -b"
12
+ "build": "tsc && tsc --project ./tsconfig.esm.json && cpy esm dist"
8
13
  },
9
14
  "devDependencies": {
10
- "typescript": "^4.3.5"
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": ["Next.js","react","TypeScript","web-worker"],
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 DELETED
@@ -1,90 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.initWorker = exports.createWorker = void 0;
13
- const init = (worker) => {
14
- return new Promise((resolve) => {
15
- worker.addEventListener("message", () => {
16
- resolve(worker);
17
- }, { once: true });
18
- });
19
- };
20
- const exec = (worker, name, ...value) => {
21
- return new Promise((resolve, reject) => {
22
- worker.addEventListener("message", (result) => {
23
- switch (result.data.type) {
24
- case "result":
25
- resolve(result.data.payload);
26
- break;
27
- case "error":
28
- reject(result.data.payload);
29
- break;
30
- }
31
- }, { once: true });
32
- worker.postMessage({ type: name, value });
33
- });
34
- };
35
- /**
36
- * createWorker
37
- *
38
- * @template T
39
- * @param {() => Worker} builder
40
- * @param {number} [limit=0]
41
- * @return {*}
42
- */
43
- const createWorker = (builder, limit = 0) => {
44
- let workers = 0;
45
- const unuses = [];
46
- const jobs = [];
47
- return (name, ...value) => {
48
- return new Promise((resolve, reject) => __awaiter(void 0, void 0, void 0, function* () {
49
- jobs.push({ resolve, reject, name, value });
50
- let worker = unuses.pop();
51
- if (limit === 0 || workers < limit) {
52
- worker = yield init(builder());
53
- workers++;
54
- }
55
- if (worker) {
56
- while (jobs.length) {
57
- const { resolve, reject, name, value } = jobs.shift();
58
- yield exec(worker, name, ...value).then(v => resolve(v)).catch(e => reject(e));
59
- }
60
- unuses.push(worker);
61
- }
62
- }));
63
- };
64
- };
65
- exports.createWorker = createWorker;
66
- /**
67
- *
68
- *
69
- * @template T
70
- * @param {T} WorkerProc
71
- * @return {*}
72
- */
73
- const initWorker = (WorkerProc) => {
74
- const worker = self;
75
- worker.addEventListener("message", (e) => {
76
- const proc = WorkerProc[e.data.type];
77
- if (proc) {
78
- try {
79
- worker.postMessage({ type: "result", payload: proc(...e.data.value) });
80
- }
81
- catch (e) {
82
- worker.postMessage({ type: "error", payload: String(e) });
83
- }
84
- }
85
- });
86
- worker.postMessage(undefined);
87
- return WorkerProc;
88
- };
89
- exports.initWorker = initWorker;
90
- //# sourceMappingURL=index.js.map
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 };\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 worker.addEventListener(\n \"message\",\n (result) => {\n switch (result.data.type) {\n case \"result\":\n resolve(result.data.payload);\n break;\n case \"error\":\n reject(result.data.payload)\n break;\n }\n },\n { once: true }\n );\n worker.postMessage({ type: name, value });\n });\n};\n\n /**\n * createWorker\n *\n * @template T\n * @param {() => Worker} builder\n * @param {number} [limit=0]\n * @return {*} \n */\n export 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>(\n name: K,\n ...value: Parameters<T[K]>\n ): 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).then(v => resolve(v)).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 */\n export const initWorker = <T extends WorkerType>(\n WorkerProc: T\n) => {\n const worker = self as unknown as Worker;\n worker.addEventListener(\"message\", (e: MessageEvent) => {\n const proc = WorkerProc[e.data.type as keyof T];\n if (proc) {\n try {\n worker.postMessage({ type: \"result\", payload: proc(...e.data.value) });\n } catch (e) {\n worker.postMessage({ type: \"error\", payload: String(e) });\n }\n }\n });\n worker.postMessage(undefined);\n return WorkerProc;\n};\n"]}