From 8e6203b29a6d3d3fd2b3db74b559e15aaa0bb3d3 Mon Sep 17 00:00:00 2001 From: Eddie Antonio Santos Date: Mon, 1 Oct 2018 15:10:23 -0600 Subject: [PATCH] It works but there's an uncaught exception? --- index.js | 54 +++++++++++++++++++++++++++++++++++++++++++++++++----- lmlayer.js | 18 ++++++++++++++++++ test.js | 3 ++- 3 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 lmlayer.js diff --git a/index.js b/index.js index 7f6f21a909..9f73d559ad 100644 --- a/index.js +++ b/index.js @@ -1,10 +1,54 @@ +const {Worker} = require('webworker-threads'); + exports.LMLayer = class LMLayer { + constructor() { + this._worker = new Worker('lmlayer.js'); + this._worker.onmessage = this._onmessage.bind(this); + this._promises = new Map(); + this._currentToken = 0; + } + /** - * + * Sends a context, transform, and token to the LMLayer. */ - async predictWithContext({_transform, _context, _token}) { - return [ - { insert: 'Derek', deleteLeft: 1, deleteRight: 0 }, - ]; + predictWithContext({transform, context, _token}) { + let token = this._currentToken++; + + let promise = new Promise((resolve, reject) => { + if (this._promises.has(token)) { + reject(`Existing request with token ${token}`); + } + + this._worker.postMessage({ + kind: 'predict', + token, + transform, + context + }); + + this._promises.set(token, resolve); + }); + + return promise; + } + + /** + * Handles the wrapped worker's onmessage events. + */ + _onmessage(event) { + const {kind, token} = event.data; + + let accept = this._promises.get(token); + + if (!accept) { + throw new Error(`No promise associated with token: ${token}`); + } + + if (kind === 'suggestions') { + accept(event.data); + this._promises.delete(token); + } else { + throw new Error(`Unknown message kind: ${kind}`); + } } }; diff --git a/lmlayer.js b/lmlayer.js new file mode 100644 index 0000000000..cfc26d242a --- /dev/null +++ b/lmlayer.js @@ -0,0 +1,18 @@ +/** + * Prototype LMLayer. + */ + +self.onmessage = function (event) { + const {kind, token} = event.data; + if (kind === 'predict') { + postMessage({ + kind: 'suggestions', + token, + suggestions: [ + { insert: 'Derek', deleteLeft: 1, deleteRight: 0 }, + ] + }); + } else { + throw new Error('invalid message'); + } +}; diff --git a/test.js b/test.js index e345fb4431..c051c0096e 100644 --- a/test.js +++ b/test.js @@ -6,10 +6,11 @@ test('Can provide context to LMLayer', async t => { t.plan(1); - let suggestions = await lm.predictWithContext({ + let message = await lm.predictWithContext({ transform: { insert: 'D', deleteLeft: 0, deleteRight: 0 }, context: { left: '' } }); + let {suggestions} = message; t.deepEqual(suggestions, [ { insert: 'Derek', deleteLeft: 1, deleteRight: 0 }