mirror of https://codeberg.org/pzp/pzp-db.git
Return null instead of throwing on property errs
This commit is contained in:
parent
eefe93820d
commit
4d75552ff1
15
lib/index.js
15
lib/index.js
|
@ -131,7 +131,7 @@ class DBTangle extends MsgV4.Tangle {
|
||||||
* *Erasables* are msgs that precede `msgsIDs` and can be erased without
|
* *Erasables* are msgs that precede `msgsIDs` and can be erased without
|
||||||
* losing a validation path toward the root.
|
* losing a validation path toward the root.
|
||||||
* @param {Array<MsgID>} msgIDs
|
* @param {Array<MsgID>} msgIDs
|
||||||
* @returns {{ deletables: Set<MsgID>, erasables: Set<MsgID> }}
|
* @returns {{ deletables: Set<MsgID>, erasables: Set<MsgID> } | null}
|
||||||
*/
|
*/
|
||||||
getDeletablesAndErasables(...msgIDs) {
|
getDeletablesAndErasables(...msgIDs) {
|
||||||
// Determine erasables
|
// Determine erasables
|
||||||
|
@ -139,6 +139,7 @@ class DBTangle extends MsgV4.Tangle {
|
||||||
const minimum = this.getMinimumAmong(msgIDs)
|
const minimum = this.getMinimumAmong(msgIDs)
|
||||||
for (const msgID of minimum) {
|
for (const msgID of minimum) {
|
||||||
const trail = this.shortestPathToRoot(msgID)
|
const trail = this.shortestPathToRoot(msgID)
|
||||||
|
if (!trail) return null
|
||||||
for (const id of trail) {
|
for (const id of trail) {
|
||||||
erasables.add(id)
|
erasables.add(id)
|
||||||
}
|
}
|
||||||
|
@ -174,6 +175,7 @@ class DBTangle extends MsgV4.Tangle {
|
||||||
const trail = new Set()
|
const trail = new Set()
|
||||||
for (const msgID of minSetTight) {
|
for (const msgID of minSetTight) {
|
||||||
const path = this.shortestPathToRoot(msgID)
|
const path = this.shortestPathToRoot(msgID)
|
||||||
|
if (!path) return cb(Error("Couldn't get shortest path to root when slicing dbtangle"))
|
||||||
for (const msgID of path) {
|
for (const msgID of path) {
|
||||||
trail.add(msgID)
|
trail.add(msgID)
|
||||||
}
|
}
|
||||||
|
@ -529,16 +531,17 @@ function initDB(peer, config) {
|
||||||
rec.msg.metadata.accountTips,
|
rec.msg.metadata.accountTips,
|
||||||
(err, sigkeys) => {
|
(err, sigkeys) => {
|
||||||
if (err) return cb(err)
|
if (err) return cb(err)
|
||||||
|
// TODO: how is sigkeys able to be undefined here? typechecker why are you weird?
|
||||||
|
if (!sigkeys) return cb(Error("Sigkeys missing somehow"))
|
||||||
// Don't accept ghosts to come back, unless they are trail msgs
|
// Don't accept ghosts to come back, unless they are trail msgs
|
||||||
if (!!rec.msg.data && ghosts.read(tangleID).has(rec.id)) {
|
if (!!rec.msg.data && ghosts.read(tangleID).has(rec.id)) {
|
||||||
return cb(Error('Refusing a ghost msg to come back'))
|
return cb(Error('Refusing a ghost msg to come back'))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
|
||||||
(err = MsgV4.validate(rec.msg, tangle, sigkeys, rec.id, tangleID))
|
const valErr = MsgV4.validate(rec.msg, tangle, sigkeys, rec.id, tangleID)
|
||||||
) {
|
if (valErr) {
|
||||||
return cb(Error('Invalid msg', { cause: err }))
|
return cb(Error('Invalid msg', { cause: valErr }))
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param {CB<void>} cb */
|
/** @param {CB<void>} cb */
|
||||||
|
|
|
@ -222,11 +222,12 @@ class Tangle {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns {'feed' | 'account' | 'weave'}
|
* @returns {'feed' | 'account' | 'weave' | null}
|
||||||
*/
|
*/
|
||||||
get type() {
|
get type() {
|
||||||
if (!this.#rootMsg) {
|
if (!this.#rootMsg) {
|
||||||
throw new Error(`Tangle "${this.#rootID}" is missing root message`)
|
console.trace(new Error(`Tangle "${this.#rootID}" is missing root message`))
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
if (this.#isFeed()) return 'feed'
|
if (this.#isFeed()) return 'feed'
|
||||||
if (this.#rootMsg.metadata.account === 'self') return 'account'
|
if (this.#rootMsg.metadata.account === 'self') return 'account'
|
||||||
|
@ -235,7 +236,8 @@ class Tangle {
|
||||||
|
|
||||||
get root() {
|
get root() {
|
||||||
if (!this.#rootMsg) {
|
if (!this.#rootMsg) {
|
||||||
throw new Error(`Tangle "${this.#rootID}" is missing root message`)
|
console.trace(new Error(`Tangle "${this.#rootID}" is missing root message`))
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
return this.#rootMsg
|
return this.#rootMsg
|
||||||
}
|
}
|
||||||
|
@ -256,7 +258,8 @@ class Tangle {
|
||||||
if (!prev) break
|
if (!prev) break
|
||||||
if (prev === lastPrev) {
|
if (prev === lastPrev) {
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
throw new Error(`Tangle "${this.#rootID}" has a cycle or lacking a trail to root`)
|
console.trace(new Error(`Tangle "${this.#rootID}" has a cycle or lacking a trail to root`))
|
||||||
|
return null
|
||||||
} else {
|
} else {
|
||||||
lastPrev = prev
|
lastPrev = prev
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,6 +107,8 @@ function validateSigkeyAndAccount(msg, tangle, sigkeys) {
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
return `invalid msg: accountTips "${msg.metadata.accountTips}" should have been null in an account tangle\n` + JSON.stringify(msg)
|
return `invalid msg: accountTips "${msg.metadata.accountTips}" should have been null in an account tangle\n` + JSON.stringify(msg)
|
||||||
}
|
}
|
||||||
|
} else if (tangle.type === null) {
|
||||||
|
return "Cannot validate tangle of unknown type"
|
||||||
}
|
}
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
|
@ -199,6 +201,8 @@ function validateTangle(msg, tangle, tangleID) {
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
return `invalid msg: account "${msg.metadata.account}" should have been feed account "${account}"\n` + JSON.stringify(msg)
|
return `invalid msg: account "${msg.metadata.account}" should have been feed account "${account}"\n` + JSON.stringify(msg)
|
||||||
}
|
}
|
||||||
|
} else if (tangle.type === null) {
|
||||||
|
return "Unknown tangle type"
|
||||||
}
|
}
|
||||||
let lastPrev = null
|
let lastPrev = null
|
||||||
let minDiff = Infinity
|
let minDiff = Infinity
|
||||||
|
@ -342,11 +346,8 @@ function validate(msg, tangle, sigkeys, msgID, rootID) {
|
||||||
if ((err = validateSigkey(msg))) return err
|
if ((err = validateSigkey(msg))) return err
|
||||||
if ((err = validateData(msg))) return err
|
if ((err = validateData(msg))) return err
|
||||||
|
|
||||||
try {
|
if (tangle.type === 'feed' && isMoot(msg)) return // nothing else to check
|
||||||
if (tangle.type === 'feed' && isMoot(msg)) return // nothing else to check
|
if (tangle.type === null) return "Missing tangle type when validating msg"
|
||||||
} catch (/** @type {any} */ err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((err = validateDataSizeHash(msg))) return err
|
if ((err = validateDataSizeHash(msg))) return err
|
||||||
if ((err = validateDomain(msg.metadata.domain))) return err
|
if ((err = validateDomain(msg.metadata.domain))) return err
|
||||||
|
@ -357,6 +358,7 @@ function validate(msg, tangle, sigkeys, msgID, rootID) {
|
||||||
if ((err = validateTangle(msg, tangle, rootID))) return err
|
if ((err = validateTangle(msg, tangle, rootID))) return err
|
||||||
}
|
}
|
||||||
if ((err = validateSignature(msg))) return err
|
if ((err = validateSignature(msg))) return err
|
||||||
|
return undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
Loading…
Reference in New Issue