better secret-stack plugin shape

This commit is contained in:
Andre Staltz 2023-12-13 15:14:36 +02:00
parent 0ae7704994
commit 782b435a98
No known key found for this signature in database
GPG Key ID: 9EDE23EA7E8A4890
3 changed files with 80 additions and 81 deletions

1
.gitignore vendored
View File

@ -4,6 +4,7 @@ pnpm-lock.yaml
package-lock.json
coverage
*~
lib/*.d.ts
# For misc scripts and experiments:
/gitignored

View File

@ -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'],
},
}

View File

@ -11,8 +11,7 @@
},
"main": "index.js",
"files": [
"*.js",
"lib/*.js"
"lib/**"
],
"exports": {
".": {