Skip to content

Commit 983fc7a

Browse files
committed
chore(loader-utils): Use processOnWorker
1 parent d5c81f2 commit 983fc7a

File tree

2 files changed

+25
-132
lines changed

2 files changed

+25
-132
lines changed

modules/loader-utils/src/lib/worker-loader-utils/create-loader-worker.ts

Lines changed: 20 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* eslint-disable no-restricted-globals */
2-
2+
import {createWorker} from '@loaders.gl/worker-utils'
33
import {WorkerBody} from '@loaders.gl/worker-utils';
44
// import {validateLoaderVersion} from './validate-loader-version';
55

@@ -10,79 +10,33 @@ let requestId = 0;
1010
* @param loader
1111
*/
1212
export function createLoaderWorker(loader: any) {
13-
// Check that we are actually in a worker thread
14-
if (typeof self === 'undefined') {
15-
return;
16-
}
17-
18-
WorkerBody.onmessage = async (type, payload) => {
19-
switch (type) {
20-
case 'process':
21-
try {
22-
// validateLoaderVersion(loader, data.source.split('@')[1]);
23-
24-
const {input, options = {}} = payload;
25-
26-
const result = await parseData({
27-
loader,
28-
arrayBuffer: input,
29-
options,
30-
context: {
31-
parse: parseOnMainThread
32-
}
33-
});
34-
WorkerBody.postMessage('done', {result});
35-
} catch (error) {
36-
const message = error instanceof Error ? error.message : '';
37-
WorkerBody.postMessage('error', {error: message});
38-
}
39-
break;
40-
default:
41-
}
42-
};
43-
}
44-
45-
function parseOnMainThread(arrayBuffer, options = {}) {
46-
return new Promise((resolve, reject) => {
47-
const id = requestId++;
48-
49-
/**
50-
*/
51-
const onMessage = (type, payload) => {
52-
if (payload.id !== id) {
53-
// not ours
54-
return;
13+
createWorker(parseOnWorker)
14+
async function parseOnWorker(input: any, options: {[key: string]: any}, processOnMainThread): Promise<any> {
15+
// validateLoaderVersion(loader, data.source.split('@')[1]);
16+
17+
const result = await parseData({
18+
loader,
19+
arrayBuffer: input,
20+
options,
21+
context: {
22+
parse: processOnMainThread
5523
}
24+
});
5625

57-
switch (type) {
58-
case 'done':
59-
WorkerBody.removeEventListener(onMessage);
60-
resolve(payload.result);
61-
break;
62-
63-
case 'error':
64-
WorkerBody.removeEventListener(onMessage);
65-
reject(payload.error);
66-
break;
67-
68-
default:
69-
// ignore
70-
}
71-
};
72-
73-
WorkerBody.addEventListener(onMessage);
74-
75-
// Ask the main thread to decode data
76-
const payload = {id, input: arrayBuffer, options};
77-
WorkerBody.postMessage('process', payload);
78-
});
26+
return result;
27+
}
7928
}
8029

8130
// TODO - Support byteOffset and byteLength (enabling parsing of embedded binaries without copies)
8231
// TODO - Why not support async loader.parse* funcs here?
8332
// TODO - Why not reuse a common function instead of reimplementing loader.parse* selection logic? Keeping loader small?
8433
// TODO - Lack of appropriate parser functions can be detected when we create worker, no need to wait until parse
85-
async function parseData({loader, arrayBuffer, options, context}) {
34+
async function parseData({
35+
loader,
36+
arrayBuffer,
37+
options,
38+
context
39+
}) {
8640
let data;
8741
let parser;
8842
if (loader.parseSync || loader.parse) {
Lines changed: 5 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import type {WorkerJob, WorkerMessageType, WorkerMessagePayload} from '@loaders.gl/worker-utils';
22
import type {Loader, LoaderOptions, LoaderContext} from '../../types';
3-
import {WorkerFarm, getWorkerURL} from '@loaders.gl/worker-utils';
3+
import {canProcessOnWorker, processOnWorker} from '@loaders.gl/worker-utils';
4+
import parseToNodeImage from '@loaders.gl/images/lib/parsers/parse-to-node-image';
45

56
/**
67
* Determines if a loader can parse with worker
78
* @param loader
89
* @param options
910
*/
1011
export function canParseWithWorker(loader: Loader, options?: LoaderOptions) {
11-
if (!WorkerFarm.isSupported()) {
12+
if (canProcessOnWorker(loader, options)) {
1213
return false;
1314
}
1415

@@ -23,69 +24,7 @@ export async function parseWithWorker(
2324
loader: Loader,
2425
data,
2526
options?: LoaderOptions,
26-
context?: LoaderContext,
27-
parseOnMainThread?: Function
27+
context?: LoaderContext
2828
) {
29-
const name = loader.id; // TODO
30-
const url = getWorkerURL(loader, options);
31-
32-
const workerFarm = WorkerFarm.getWorkerFarm(options);
33-
const workerPool = workerFarm.getWorkerPool({name, url});
34-
35-
// options.log object contains functions which cannot be transferred
36-
// TODO - decide how to handle logging on workers
37-
options = JSON.parse(JSON.stringify(options));
38-
39-
const job = await workerPool.startJob(
40-
'process-on-worker',
41-
onMessage.bind(null, parseOnMainThread)
42-
);
43-
44-
job.postMessage('process', {
45-
// @ts-ignore
46-
input: data,
47-
options
48-
});
49-
50-
const result = await job.result;
51-
return await result.result;
52-
}
53-
54-
/**
55-
* Handle worker's responses to the main thread
56-
* @param job
57-
* @param type
58-
* @param payload
59-
*/
60-
async function onMessage(
61-
parseOnMainThread,
62-
job: WorkerJob,
63-
type: WorkerMessageType,
64-
payload: WorkerMessagePayload
65-
) {
66-
switch (type) {
67-
case 'done':
68-
job.done(payload);
69-
break;
70-
71-
case 'error':
72-
job.error(payload.error);
73-
break;
74-
75-
case 'process':
76-
// Worker is asking for main thread to parseO
77-
const {id, input, options} = payload;
78-
try {
79-
const result = await parseOnMainThread(input, options);
80-
job.postMessage('done', {id, result});
81-
} catch (error) {
82-
const message = error instanceof Error ? error.message : 'unknown error';
83-
job.postMessage('error', {id, error: message});
84-
}
85-
break;
86-
87-
default:
88-
// eslint-disable-next-line
89-
console.warn(`parse-with-worker unknown message ${type}`);
90-
}
29+
processOnWorker(loader, data, options, parseOnMainThread);
9130
}

0 commit comments

Comments
 (0)