Flush puts from last instance
This commit is contained in:
parent
72e68d8462
commit
f43748c96c
4 changed files with 69 additions and 5 deletions
7
.vscode/settings.json
vendored
7
.vscode/settings.json
vendored
|
|
@ -5,16 +5,15 @@
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
"cSpell.words": [
|
"cSpell.words": [
|
||||||
"Epub",
|
"acked",
|
||||||
"falsey",
|
|
||||||
"endregion",
|
"endregion",
|
||||||
"epriv",
|
"epriv",
|
||||||
"Epub",
|
"Epub",
|
||||||
|
"falsey",
|
||||||
"GUNRPC",
|
"GUNRPC",
|
||||||
"ISEA",
|
"ISEA",
|
||||||
"PUBKEY",
|
"PUBKEY",
|
||||||
"Reqs",
|
"Reqs",
|
||||||
"uuidv",
|
"uuidv"
|
||||||
"epriv"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,13 @@
|
||||||
/// <reference path="GunT.ts" />
|
/// <reference path="GunT.ts" />
|
||||||
const RealGun = require('gun')
|
const RealGun = require('gun')
|
||||||
const uuid = require('uuid/v1')
|
const uuid = require('uuid/v1')
|
||||||
|
const mapValues = require('lodash/mapValues')
|
||||||
const { fork } = require('child_process')
|
const { fork } = require('child_process')
|
||||||
|
|
||||||
const logger = require('../../config/log')
|
const logger = require('../../config/log')
|
||||||
|
|
||||||
|
const { mergePuts } = require('./misc')
|
||||||
|
|
||||||
const gunUUID = () => {
|
const gunUUID = () => {
|
||||||
const RG = /** @type {any} */ (RealGun)
|
const RG = /** @type {any} */ (RealGun)
|
||||||
if (typeof RG.text === 'object' && typeof RG.text.random === 'function') {
|
if (typeof RG.text === 'object' && typeof RG.text.random === 'function') {
|
||||||
|
|
@ -103,6 +106,21 @@ const handleMsg = msg => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (msg.type === 'multiPut') {
|
||||||
|
const { ack, ids, path } = msg
|
||||||
|
|
||||||
|
const pendingPutsForPath = pendingPuts[path] || (pendingPuts[path] = [])
|
||||||
|
|
||||||
|
const ackedPuts = pendingPutsForPath.filter(pp => ids.includes(pp.id))
|
||||||
|
|
||||||
|
pendingPuts[path] = pendingPuts[path].filter(pp => !ids.includes(pp.id))
|
||||||
|
|
||||||
|
ackedPuts.forEach(pp => {
|
||||||
|
if (pp.cb) {
|
||||||
|
pp.cb(ack)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @type {ReturnType<typeof fork>} */
|
/** @type {ReturnType<typeof fork>} */
|
||||||
|
|
@ -168,7 +186,28 @@ const autoAuth = () => {
|
||||||
return auth(lastAlias, lastPass)
|
return auth(lastAlias, lastPass)
|
||||||
}
|
}
|
||||||
|
|
||||||
const flushPendingPuts = () => {}
|
const flushPendingPuts = () => {
|
||||||
|
const ids = mapValues(pendingPuts, pendingPutsForPath =>
|
||||||
|
pendingPutsForPath.map(pp => pp.id)
|
||||||
|
)
|
||||||
|
const writes = mapValues(pendingPuts, pendingPutsForPath =>
|
||||||
|
pendingPutsForPath.map(pp => pp.data)
|
||||||
|
)
|
||||||
|
const finalWrites = mapValues(writes, writesForPath =>
|
||||||
|
mergePuts(writesForPath)
|
||||||
|
)
|
||||||
|
const messages = Object.entries(ids).map(([path, ids]) => {
|
||||||
|
/** @type {Smith.SmithMsgMultiPut} */
|
||||||
|
const msg = {
|
||||||
|
data: finalWrites[path],
|
||||||
|
ids,
|
||||||
|
path,
|
||||||
|
type: 'multiPut'
|
||||||
|
}
|
||||||
|
return msg
|
||||||
|
})
|
||||||
|
currentGun.send(messages)
|
||||||
|
}
|
||||||
|
|
||||||
const forge = () => {
|
const forge = () => {
|
||||||
if (currentGun) {
|
if (currentGun) {
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,7 @@ namespace Smith {
|
||||||
export interface GunMsgMultiPut {
|
export interface GunMsgMultiPut {
|
||||||
ack: GunT.Ack
|
ack: GunT.Ack
|
||||||
ids: string[]
|
ids: string[]
|
||||||
|
path: string
|
||||||
type: 'multiPut'
|
type: 'multiPut'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -189,6 +189,31 @@ const handleMsg = msg => {
|
||||||
sendMsg(reply)
|
sendMsg(reply)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
if (msg.type === 'multiPut') {
|
||||||
|
const [root, ...keys] = msg.path.split('>')
|
||||||
|
|
||||||
|
/** @type {GunT.GUNNode} */
|
||||||
|
let node =
|
||||||
|
{
|
||||||
|
$root: gun,
|
||||||
|
$user: user
|
||||||
|
}[root] || gun.user(root)
|
||||||
|
|
||||||
|
for (const key of keys) {
|
||||||
|
node = node.get(key)
|
||||||
|
}
|
||||||
|
node.put(msg.data, ack => {
|
||||||
|
/** @type {Smith.GunMsgMultiPut} */
|
||||||
|
const reply = {
|
||||||
|
ack: {
|
||||||
|
err: ack.err
|
||||||
|
},
|
||||||
|
ids: msg.ids,
|
||||||
|
type: 'multiPut'
|
||||||
|
}
|
||||||
|
sendMsg(reply)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
process.on('message', handleMsg)
|
process.on('message', handleMsg)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue