mirror of https://codeberg.org/pzp/pzp-sync.git
better secret-stack plugin shape
This commit is contained in:
parent
0ae7704994
commit
782b435a98
|
@ -4,6 +4,7 @@ pnpm-lock.yaml
|
|||
package-lock.json
|
||||
coverage
|
||||
*~
|
||||
lib/*.d.ts
|
||||
|
||||
# For misc scripts and experiments:
|
||||
/gitignored
|
||||
|
|
157
lib/index.js
157
lib/index.js
|
@ -51,94 +51,93 @@ function assertSHSEExists(peer) {
|
|||
if (!peer.shse) throw new Error('sync requires secret-handshake-ext')
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
name: 'sync',
|
||||
manifest: {
|
||||
connect: 'duplex',
|
||||
initiate: 'sync',
|
||||
},
|
||||
permissions: {
|
||||
anonymous: {
|
||||
allow: ['connect'],
|
||||
},
|
||||
},
|
||||
/**
|
||||
* @param {Emitter & {
|
||||
* db: PPPPPDB | null,
|
||||
* dict: PPPPPDict | null,
|
||||
* set: PPPPPSet | null,
|
||||
* goals: PPPPPGoals | null,
|
||||
* shse: SHSE | null
|
||||
* }} peer
|
||||
* @param {unknown} config
|
||||
*/
|
||||
function initSync(peer, config) {
|
||||
assertDBExists(peer)
|
||||
assertGoalsExists(peer)
|
||||
assertSHSEExists(peer)
|
||||
const debug = makeDebug(`ppppp:sync`)
|
||||
const algo = new Algorithm(peer)
|
||||
|
||||
const streams = /** @type {Array<SyncStream>} */ ([])
|
||||
|
||||
/**
|
||||
* @param {Emitter & {
|
||||
* db: PPPPPDB | null,
|
||||
* dict: PPPPPDict | null,
|
||||
* set: PPPPPSet | null,
|
||||
* goals: PPPPPGoals | null,
|
||||
* shse: SHSE | null
|
||||
* }} peer
|
||||
* @param {unknown} config
|
||||
* @param {string} remoteId
|
||||
* @param {boolean} iamClient
|
||||
*/
|
||||
init(peer, config) {
|
||||
assertDBExists(peer)
|
||||
assertGoalsExists(peer)
|
||||
function createStream(remoteId, iamClient) {
|
||||
assertSHSEExists(peer)
|
||||
const debug = makeDebug(`ppppp:sync`)
|
||||
const algo = new Algorithm(peer)
|
||||
assertGoalsExists(peer)
|
||||
// prettier-ignore
|
||||
debug('Opening a stream with remote %s %s', iamClient ? 'server' : 'client', remoteId)
|
||||
const stream = new SyncStream(peer.shse.pubkey, debug, peer.goals, algo)
|
||||
streams.push(stream)
|
||||
return stream
|
||||
}
|
||||
|
||||
const streams = /** @type {Array<SyncStream>} */ ([])
|
||||
/**
|
||||
* @param {{ shse: SHSE, sync: { connect: GetDuplex } }} rpc
|
||||
* @param {boolean} iamClient
|
||||
*/
|
||||
function onSyncRPCConnect(rpc, iamClient) {
|
||||
assertSHSEExists(peer)
|
||||
if (rpc.shse.pubkey === peer.shse.pubkey) return // connecting to myself
|
||||
if (!iamClient) return
|
||||
const local = toPull.duplex(createStream(rpc.shse.pubkey, true))
|
||||
|
||||
/**
|
||||
* @param {string} remoteId
|
||||
* @param {boolean} iamClient
|
||||
*/
|
||||
function createStream(remoteId, iamClient) {
|
||||
assertSHSEExists(peer)
|
||||
assertGoalsExists(peer)
|
||||
// prettier-ignore
|
||||
debug('Opening a stream with remote %s %s', iamClient ? 'server' : 'client', remoteId)
|
||||
const stream = new SyncStream(peer.shse.pubkey, debug, peer.goals, algo)
|
||||
streams.push(stream)
|
||||
return stream
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {{ shse: SHSE, sync: { connect: GetDuplex } }} rpc
|
||||
* @param {boolean} iamClient
|
||||
*/
|
||||
function onSyncRPCConnect(rpc, iamClient) {
|
||||
assertSHSEExists(peer)
|
||||
if (rpc.shse.pubkey === peer.shse.pubkey) return // connecting to myself
|
||||
if (!iamClient) return
|
||||
const local = toPull.duplex(createStream(rpc.shse.pubkey, true))
|
||||
|
||||
let abort = /** @type {CallableFunction | null} */ (null)
|
||||
const remote = rpc.sync.connect((networkError) => {
|
||||
if (networkError && getSeverity(networkError) >= 3) {
|
||||
if (isMuxrpcMissingError(networkError, 'sync', 'connect')) {
|
||||
debug('peer %s does not support sync', rpc.shse.pubkey)
|
||||
// } else if (isReconnectedError(networkError)) { // TODO: bring back
|
||||
// Do nothing, this is a harmless error
|
||||
} else {
|
||||
console.error(`rpc.sync.connect exception:`, networkError)
|
||||
}
|
||||
abort?.(true, () => {})
|
||||
let abort = /** @type {CallableFunction | null} */ (null)
|
||||
const remote = rpc.sync.connect((networkError) => {
|
||||
if (networkError && getSeverity(networkError) >= 3) {
|
||||
if (isMuxrpcMissingError(networkError, 'sync', 'connect')) {
|
||||
debug('peer %s does not support sync', rpc.shse.pubkey)
|
||||
// } else if (isReconnectedError(networkError)) { // TODO: bring back
|
||||
// Do nothing, this is a harmless error
|
||||
} else {
|
||||
console.error(`rpc.sync.connect exception:`, networkError)
|
||||
}
|
||||
})
|
||||
abort = pull(local, remote, local)
|
||||
}
|
||||
peer.on('rpc:connect', onSyncRPCConnect)
|
||||
|
||||
/**
|
||||
* @this {{shse: {pubkey: string}}}
|
||||
*/
|
||||
function connect() {
|
||||
return toPull.duplex(createStream(this.shse.pubkey, false))
|
||||
}
|
||||
|
||||
function start() {
|
||||
for (const stream of streams) {
|
||||
stream.initiate()
|
||||
abort?.(true, () => {})
|
||||
}
|
||||
}
|
||||
})
|
||||
abort = pull(local, remote, local)
|
||||
}
|
||||
peer.on('rpc:connect', onSyncRPCConnect)
|
||||
|
||||
return {
|
||||
connect,
|
||||
start,
|
||||
/**
|
||||
* @this {{shse: {pubkey: string}}}
|
||||
*/
|
||||
function connect() {
|
||||
return toPull.duplex(createStream(this.shse.pubkey, false))
|
||||
}
|
||||
|
||||
function start() {
|
||||
for (const stream of streams) {
|
||||
stream.initiate()
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
connect,
|
||||
start,
|
||||
}
|
||||
}
|
||||
|
||||
exports.name = 'sync'
|
||||
exports.manifest = {
|
||||
connect: 'duplex',
|
||||
initiate: 'sync',
|
||||
}
|
||||
exports.init = initSync
|
||||
exports.permissions = {
|
||||
anonymous: {
|
||||
allow: ['connect'],
|
||||
},
|
||||
}
|
||||
|
|
|
@ -11,8 +11,7 @@
|
|||
},
|
||||
"main": "index.js",
|
||||
"files": [
|
||||
"*.js",
|
||||
"lib/*.js"
|
||||
"lib/**"
|
||||
],
|
||||
"exports": {
|
||||
".": {
|
||||
|
|
Loading…
Reference in New Issue