Skip to content

Commit

Permalink
loader-utils: Move Worker utils from core (#842)
Browse files Browse the repository at this point in the history
  • Loading branch information
ibgreen committed Jul 6, 2020
1 parent 72af35d commit 4e619ef
Show file tree
Hide file tree
Showing 35 changed files with 328 additions and 141 deletions.
8 changes: 0 additions & 8 deletions modules/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,8 @@
"esnext": "dist/es6/index.js",
"sideEffects": false,
"browser": {
"./src/node/utils/to-array-buffer.node.js": false,
"./src/node/utils/to-buffer.node.js": false,
"./src/node/write-file.node.js": false,
"./src/node/read-file-sync.node.js": false,
"./dist/es5/node/utils/to-array-buffer.node.js": false,
"./dist/esm/node/utils/to-array-buffer.node.js": false,
"./dist/es6/node/utils/to-array-buffer.node.js": false,
"./dist/es5/node/utils/to-buffer.node.js": false,
"./dist/esm/node/utils/to-buffer.node.js": false,
"./dist/es6/node/utils/to-buffer.node.js": false,
"./dist/es5/node/write-file.node.js": false,
"./dist/esm/node/write-file.node.js": false,
"./dist/es6/node/write-file.node.js": false,
Expand Down
7 changes: 0 additions & 7 deletions modules/core/src/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,6 @@ export {
isWritableStream
} from './javascript-utils/is-type';

export {toArrayBuffer} from './javascript-utils/binary-utils';

// ITERATOR UTILS
export {makeIterator} from './iterator-utils/make-iterator/make-iterator';
export {
Expand All @@ -50,11 +48,6 @@ export {setPathPrefix, getPathPrefix, resolvePath} from '@loaders.gl/loader-util
export {RequestScheduler as RequestScheduler} from '@loaders.gl/loader-utils';
export {forEach, concatenateChunksAsync} from '@loaders.gl/loader-utils';

// EXPERIMENTAL
export {default as _WorkerThread} from './worker-utils/worker-thread';
export {default as _WorkerFarm} from './worker-utils/worker-farm';
export {default as _WorkerPool} from './worker-utils/worker-pool';

export {default as _fetchProgress} from './lib/progress/fetch-progress';

// FOR TESTING
Expand Down
6 changes: 0 additions & 6 deletions modules/core/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ export {
isWritableStream
} from './javascript-utils/is-type';

export {toArrayBuffer} from './javascript-utils/binary-utils';

// ITERATOR UTILS
export {makeIterator} from './iterator-utils/make-iterator/make-iterator';

Expand All @@ -51,10 +49,6 @@ export {RequestScheduler} from '@loaders.gl/loader-utils';
export {forEach, concatenateChunksAsync} from '@loaders.gl/loader-utils';

// EXPERIMENTAL
export {default as _WorkerThread} from './worker-utils/worker-thread';
export {default as _WorkerFarm} from './worker-utils/worker-farm';
export {default as _WorkerPool} from './worker-utils/worker-pool';

export {default as _fetchProgress} from './lib/progress/fetch-progress';

// FOR TESTING
Expand Down
4 changes: 1 addition & 3 deletions modules/core/src/lib/loader-utils/parse-with-worker.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import WorkerFarm from '../../worker-utils/worker-farm';
import {toArrayBuffer} from '../../javascript-utils/binary-utils';
import {getTransferList} from '@loaders.gl/loader-utils';
import {_WorkerFarm as WorkerFarm, toArrayBuffer, getTransferList} from '@loaders.gl/loader-utils';
import {parse} from '../api/parse';

// __VERSION__ is injected by babel-plugin-version-inline
Expand Down
2 changes: 1 addition & 1 deletion modules/core/src/node/read-file-sync.node.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* global Buffer */
import fs from 'fs';
import {toArrayBuffer} from './utils/to-array-buffer.node';
import {toArrayBuffer} from '@loaders.gl/loader-utils';

const DEFAULT_OPTIONS = {
dataType: 'arraybuffer',
Expand Down
2 changes: 1 addition & 1 deletion modules/core/src/node/write-file.node.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import fs from 'fs';
import {promisify} from 'util';
import toBuffer from './utils/to-buffer.node';
import {toBuffer} from '@loaders.gl/loader-utils';

export function writeFile(filePath, arrayBufferOrString, options) {
return promisify(fs.writeFile)(`${filePath}`, toBuffer(arrayBufferOrString), {flag: 'w'});
Expand Down
7 changes: 1 addition & 6 deletions modules/core/test/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import './javascript-utils/text-encoder.spec';
import './javascript-utils/binary-utils.spec';
import './javascript-utils/is-type.spec';
import './javascript-utils/text-encoder.spec';

import './lib/utils/mime-type-utils.spec';
import './lib/utils/resource-utils.spec';
Expand All @@ -16,7 +15,3 @@ import './lib/parse.spec';
import './lib/load.spec';
import './lib/parse-in-batches.spec';
import './lib/load-in-batches.spec';

// TODO - The worker-utils specs test loading, not just worker farm
// so we run them after util tests, until loading has been split out
import './worker-utils';
1 change: 0 additions & 1 deletion modules/core/test/worker-utils/index.js

This file was deleted.

8 changes: 8 additions & 0 deletions modules/loader-utils/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@
"README.md"
],
"browser": {
"./src/node/to-array-buffer.node.js": false,
"./dist/es5/node/to-array-buffer.node.js": false,
"./dist/esm/node/to-array-buffer.node.js": false,
"./dist/es6/node/to-array-buffer.node.js": false,
"./src/node/to-buffer.node.js": false,
"./dist/es5/node/to-buffer.node.js": false,
"./dist/esm/node/to-buffer.node.js": false,
"./dist/es6/node/to-buffer.node.js": false,
"./src/lib/library-utils/require-utils.node.js": false,
"./dist/es5/lib/library-utils/require-utils.node.js": false,
"./dist/esm/lib/library-utils/require-utils.node.js": false,
Expand Down
16 changes: 10 additions & 6 deletions modules/loader-utils/src/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
// LOADERS.GL-SPECIFIC TYPES
export {LoaderObject, WriterObject, LoaderContext, DataType, SyncDataType, BatchableDataType,
IFileSystem, IRandomAccessReadFileSystem} from './types';

export {default as createWorker} from './lib/create-worker';
// LOADERS.GL-SPECIFIC WORKER UTILS
export {default as createWorker} from './lib/worker-loader-utils/create-worker';
export {validateLoaderVersion} from './lib/worker-loader-utils/validate-loader-version';

// GENERAL UTILS
export {default as assert} from './lib/env-utils/assert';
Expand All @@ -15,19 +18,20 @@ export {
document
} from './lib/env-utils/globals';

// LOADER UTILS
export {validateLoaderVersion} from './lib/validate-loader-version';
// WORKER UTILS
export {default as _WorkerFarm} from './lib/worker-utils/worker-farm';
export {default as _WorkerPool} from './lib/worker-utils/worker-pool';
export {default as _WorkerThread} from './lib/worker-utils/worker-thread';
export {getTransferList} from './lib/worker-utils/get-transfer-list';

// LIBRARY UTILS
export {getLibraryUrl, loadLibrary} from './lib/library-utils/library-utils';

// WORKER UTILS
export {getTransferList} from './lib/worker-utils/get-transfer-list';

// PARSER UTILS
export {parseJSON} from './lib/parser-utils/parse-json';

// MEMORY COPY UTILS
export {toArrayBuffer, toBuffer} from './lib/binary-utils/binary-utils';
export {
padTo4Bytes,
copyToArray,
Expand Down
18 changes: 11 additions & 7 deletions modules/loader-utils/src/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
export {default as createWorker} from './lib/create-worker';

// GENERAL UTILS
export {default as assert} from './lib/env-utils/assert';
export {
Expand All @@ -12,19 +10,25 @@ export {
document
} from './lib/env-utils/globals';

// LOADER UTILS
export {validateLoaderVersion} from './lib/validate-loader-version';

// LIBRARY UTILS
export {getLibraryUrl, loadLibrary} from './lib/library-utils/library-utils';
// WORKER LOADER UTILS
export {default as createWorker} from './lib/worker-loader-utils/create-worker';
export {validateLoaderVersion} from './lib/worker-loader-utils/validate-loader-version';

// WORKER UTILS
export {getTransferList} from './lib/worker-utils/get-transfer-list';
export {default as _WorkerFarm} from './lib/worker-utils/worker-farm';
export {default as _WorkerPool} from './lib/worker-utils/worker-pool';
export {default as _WorkerThread} from './lib/worker-utils/worker-thread';

// LIBRARY UTILS
export {getLibraryUrl, loadLibrary} from './lib/library-utils/library-utils';

// PARSER UTILS
export {parseJSON} from './lib/parser-utils/parse-json';

// MEMORY COPY UTILS
export {toArrayBuffer, toBuffer} from './lib/binary-utils/binary-utils';

export {
padTo4Bytes,
copyToArray,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
// TODO better data type
export function toArrayBuffer(data: any): ArrayBuffer;
export function toBuffer(data: any): Buffer;
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* global TextEncoder */
import {assert} from '@loaders.gl/loader-utils';
import {toArrayBuffer as bufferToArrayBuffer} from '../node/utils/to-array-buffer.node';
import assert from '../env-utils/assert';
import {toArrayBuffer as bufferToArrayBuffer} from '../node/to-array-buffer.node';
import {toBuffer as toNodeBuffer} from '../node/to-buffer.node';

export function toArrayBuffer(data) {
if (bufferToArrayBuffer) {
Expand All @@ -26,15 +27,6 @@ export function toArrayBuffer(data) {
return assert(false);
}

// export function blobToArrayBuffer(blob) {
// return new Promise((resolve, reject) => {
// let arrayBuffer;
// const fileReader = new FileReader();
// fileReader.onload = event => {
// arrayBuffer = event.target.result;
// };
// fileReader.onloadend = event => resolve(arrayBuffer);
// fileReader.onerror = reject;
// fileReader.readAsArrayBuffer(blob);
// });
// }
export function toBuffer(data) {
return toNodeBuffer ? toNodeBuffer(data) : data;
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {assert} from '@loaders.gl/loader-utils';
import assert from '../env-utils/assert';

// Convert (copy) ArrayBuffer to Buffer
export default function toBuffer(binaryData) {
export function toBuffer(binaryData) {
if (ArrayBuffer.isView(binaryData)) {
binaryData = binaryData.buffer;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

/**
* Set up a WebWorkerGlobalScope to talk with the main thread
* @param loader
*/
export default function createWorker(loader: any);
130 changes: 130 additions & 0 deletions modules/loader-utils/src/lib/worker-loader-utils/create-worker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
/* eslint-disable no-restricted-globals */
/* global TextDecoder, self */

import {getTransferList} from '../worker-utils/get-transfer-list';
import {validateLoaderVersion} from './validate-loader-version';

export default function createWorker(loader) {
// TODO - explain when this happens? Just a sanity check? Throw an error or log a warning?
if (typeof self === 'undefined') {
return;
}

let requestId = 0;
const parse = (arraybuffer, options = {}, url) =>
new Promise((resolve, reject) => {
const id = requestId++;

const onMessage = ({data}) => {
if (!data || data.id !== id) {
// not ours
return;
}
switch (data.type) {
case 'parse-done':
self.removeEventListener('message', onMessage);
resolve(data.result);
break;

case 'parse-error':
self.removeEventListener('message', onMessage);
reject(data.message);
break;

default:
// ignore
}
};
self.addEventListener('message', onMessage);
// Ask the main thread to decode data
// @ts-ignore self is WorkerGlobalScope
self.postMessage({type: 'parse', id, arraybuffer, options, url}, [arraybuffer]);
});

self.onmessage = async evt => {
const {data} = evt;

try {
if (!isKnownMessage(data, loader.name)) {
return;
}

validateLoaderVersion(loader, data.source.split('@')[1]);

const {arraybuffer, byteOffset = 0, byteLength = 0, options = {}} = data;

const result = await parseData({
loader,
arraybuffer,
byteOffset,
byteLength,
options,
context: {parse}
});
const transferList = getTransferList(result);
// @ts-ignore self is WorkerGlobalScope
self.postMessage({type: 'done', result}, transferList);
} catch (error) {
// @ts-ignore self is WorkerGlobalScope
self.postMessage({type: 'error', message: error.message});
}
};
}

// TODO - Support byteOffset and byteLength (enabling parsing of embedded binaries without copies)
// TODO - Why not support async loader.parse* funcs here?
// TODO - Why not reuse a common function instead of reimplementing loader.parse* selection logic? Keeping loader small?
// TODO - Lack of appropriate parser functions can be detected when we create worker, no need to wait until parse
async function parseData({loader, arraybuffer, byteOffset, byteLength, options, context}) {
let data;
let parser;
if (loader.parseSync || loader.parse) {
data = arraybuffer;
parser = loader.parseSync || loader.parse;
} else if (loader.parseTextSync) {
const textDecoder = new TextDecoder();
data = textDecoder.decode(arraybuffer);
parser = loader.parseTextSync;
} else {
throw new Error(`Could not load data with ${loader.name} loader`);
}

// TODO - proper merge in of loader options...
options = {
...options,
modules: (loader && loader.options && loader.options.modules) || {},
worker: false
};

return await parser(data, {...options}, context, loader);
}

// Filter out noise messages sent to workers
function isKnownMessage(data, name) {
return data && data.type === 'parse' && data.source && data.source.startsWith('loaders.gl');
}

/*
function checkMessage(evt, name) {
switch (evt.data && evt.data.source) {
// Ignore known noise event from react-dev-tools bridge, webpack build progress etc...
case 'react-devtools-bridge':
case 'react-devtools-content-script':
case 'react-devtools-detector':
return false;
default:
// fall through
}
switch (evt.data && evt.data.type) {
case 'webpackProgress':
case 'webpackOk':
return false;
default:
// Enable to debug messages
// const message = `${name.toLowerCase()}-worker: ignoring unknown message`;
// console.log(message, evt.data, evt); // eslint-disable-line
return false;
}
}
*/
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/**
*
* @param loader
* @param coreVersion
* @returns `true` if the two versions are compatible
*/
export function validateLoaderVersion(loader, coreVersion?: string): boolean;
Loading

0 comments on commit 4e619ef

Please sign in to comment.