From 8d28395e777e5db3ebbc96ce137698531ddc4254 Mon Sep 17 00:00:00 2001 From: Daniel Lugo Date: Wed, 29 Jan 2020 17:22:30 -0400 Subject: [PATCH] storedreqs stream --- services/gunDB/contact-api/streams.js | 77 ++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/services/gunDB/contact-api/streams.js b/services/gunDB/contact-api/streams.js index ba7457a8..8bedcf3f 100644 --- a/services/gunDB/contact-api/streams.js +++ b/services/gunDB/contact-api/streams.js @@ -205,8 +205,83 @@ const onIncoming = cb => { } } +/** + * @typedef {import('./schema').StoredRequest} StoredRequest + * @typedef {(reqs: StoredRequest[]) => void} StoredRequestsListener + */ + +/** @type {Set} */ +const storedRequestsListeners = new Set() + +/** + * @type {StoredRequest[]} + */ +let encryptedStoredReqs = [] + +/** + * @type {StoredRequest[]} + */ +let currentStoredReqs = [] + +const getStoredReqs = () => currentStoredReqs + +const processStoredReqs = async () => { + const ereqs = encryptedStoredReqs + encryptedStoredReqs = [] + const mySecret = await Utils.mySecret() + const SEA = require('../Mediator').mySEA + const finalReqs = await Utils.asyncMap(ereqs, async er => { + /** @type {StoredRequest} */ + const r = { + handshakeAddress: await SEA.decrypt(er.handshakeAddress, mySecret), + recipientPub: await SEA.decrypt(er.recipientPub, mySecret), + sentReqID: await SEA.decrypt(er.sentReqID, mySecret), + timestamp: er.timestamp + } + + return r + }) + currentStoredReqs = finalReqs + storedRequestsListeners.forEach(l => l(currentStoredReqs)) +} + +let subbed = false + +/** + * + * @param {StoredRequestsListener} cb + */ +const onStoredReqs = cb => { + storedRequestsListeners.add(cb) + + if (!subbed) { + require('../Mediator') + .getUser() + .get(Key.STORED_REQS) + .open(d => { + if (typeof d === 'object' && d !== null) { + encryptedStoredReqs = /** @type {StoredRequest[]} */ (Object.values( + d + ).filter(i => Schema.isStoredRequest(i))) + } + + processStoredReqs() + }) + + subbed = true + } + + cb(currentStoredReqs) + + return () => { + storedRequestsListeners.delete(cb) + } +} + module.exports = { onAvatar, onDisplayName, - onIncoming + onIncoming, + onStoredReqs, + getStoredReqs }