diff --git a/packages/api/src/proc/jslDatastoreProcess.js b/packages/api/src/proc/jslDatastoreProcess.js index 3b3b112e..38d49238 100644 --- a/packages/api/src/proc/jslDatastoreProcess.js +++ b/packages/api/src/proc/jslDatastoreProcess.js @@ -8,7 +8,7 @@ function handlePing() { lastPing = new Date().getTime(); } -function handleOpen({file }) { +function handleOpen({ file }) { handlePing(); datastore = new JsonLinesDatastore(file); } @@ -19,15 +19,16 @@ async function handleRead({ msgid, offset, limit }) { process.send({ msgtype: 'response', msgid, rows }); } -function handleNotifyChanged() { - datastore.notifyChanged(); +async function handleNotify({ msgid }) { + await datastore.notifyChanged(); + process.send({ msgtype: 'notify', msgid }); } const messageHandlers = { open: handleOpen, read: handleRead, ping: handlePing, - notifyChanged: handleNotifyChanged, + notify: handleNotify, }; async function handleMessage({ msgtype, ...other }) { diff --git a/packages/api/src/utility/DatastoreProxy.js b/packages/api/src/utility/DatastoreProxy.js index 437b3153..1b4bcbec 100644 --- a/packages/api/src/utility/DatastoreProxy.js +++ b/packages/api/src/utility/DatastoreProxy.js @@ -9,9 +9,9 @@ class DatastoreProxy { this.requests = {}; this.handle_response = this.handle_response.bind(this); this.handle_ping = this.handle_ping.bind(this); + this.notifyChangedCallback = null; } - // handle_response({ msgid, rows }) { handle_response({ msgid, rows }) { const [resolve, reject] = this.requests[msgid]; resolve(rows); @@ -20,6 +20,11 @@ class DatastoreProxy { handle_ping() {} + handle_notify({ msgid }) { + const [resolve, reject] = this.requests[msgid]; + resolve(); + delete this.requests[msgid]; + } async ensureSubprocess() { if (!this.subprocess) { @@ -49,7 +54,22 @@ class DatastoreProxy { return promise; } - async notifyChanged() {} + async notifyChangedCore() { + const msgid = uuidv1(); + const promise = new Promise((resolve, reject) => { + this.requests[msgid] = [resolve, reject]; + this.subprocess.send({ msgtype: 'notify', msgid }); + }); + return promise; + } + + async notifyChanged(callback) { + this.notifyChangedCallback = callback; + await this.notifyChangedCore(); + const call = this.notifyChangedCallback; + this.notifyChangedCallback = null; + if (call) call(); + } } module.exports = DatastoreProxy;