Skip to content

Commit

Permalink
Make all APIs async, internally wait for rescanning (#29)
Browse files Browse the repository at this point in the history
  • Loading branch information
Powersource authored Apr 7, 2024
1 parent e40c7cf commit 15cfc74
Show file tree
Hide file tree
Showing 18 changed files with 684 additions and 484 deletions.
1,042 changes: 606 additions & 436 deletions lib/index.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion lib/msg-v4/validation.js
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ function validate(msg, tangle, sigkeys, msgID, rootID) {

try {
if (tangle.type === 'feed' && isMoot(msg)) return // nothing else to check
} catch (err) {
} catch (/** @type {any} */ err) {
return err
}

Expand Down
8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"atomic-file-rw": "~0.3.0",
"blake3": "~2.1.7",
"b4a": "~1.6.4",
"blake3": "~2.1.7",
"bs58": "~5.0.0",
"debug": "^4.3.0",
"is-buffer-zero": "^1.0.0",
Expand All @@ -39,24 +39,26 @@
"multicb": "~1.2.2",
"mutexify": "~1.4.0",
"obz": "~1.1.0",
"ppppp-keypair": "github:staltz/ppppp-keypair#61ef4420578f450dc2cc7b1efc1c5a691a871c74",
"polyraf": "^1.1.0",
"ppppp-keypair": "github:staltz/ppppp-keypair#61ef4420578f450dc2cc7b1efc1c5a691a871c74",
"promisify-4loc": "~1.0.0",
"promisify-tuple": "~1.2.0",
"pull-stream": "^3.7.0",
"push-stream": "~11.2.0",
"set.prototype.union": "~1.0.2"
},
"devDependencies": {
"@types/b4a": "^1.6.0",
"@types/pull-stream": "^3.6.7",
"c8": "^7.11.0",
"flumecodec": "~0.0.1",
"husky": "^4.3.0",
"ppppp-caps": "github:staltz/ppppp-caps#93fa810b9a40b78aef4872d4c2a8412cccb52929",
"prettier": "^2.6.2",
"pretty-quick": "^3.1.3",
"rimraf": "^4.4.0",
"secret-stack": "8.0.0",
"secret-handshake-ext": "0.0.10",
"secret-stack": "8.0.0",
"ssb-box": "^1.0.1",
"typescript": "^5.1.3"
},
Expand Down
30 changes: 21 additions & 9 deletions test/account-add.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@ test('account.add()', async (t) => {
subdomain: 'person',
})

assert.equal(peer.db.account.has({ account, keypair: keypair2 }), false)
assert.equal(
await p(peer.db.account.has)({ account, keypair: keypair2 }),
false
)

const consent = peer.db.account.consent({ account, keypair: keypair2 })

Expand Down Expand Up @@ -61,7 +64,10 @@ test('account.add()', async (t) => {
)
assert.equal(msg.sigkey, keypair1.public, 'msg.sigkey OLD KEY')

assert.equal(peer.db.account.has({ account, keypair: keypair2 }), true)
assert.equal(
await p(peer.db.account.has)({ account, keypair: keypair2 }),
true
)

await p(peer.close)()
})
Expand All @@ -79,7 +85,7 @@ test('account.add()', async (t) => {
keypair: keypair1,
subdomain: 'account',
})
const msg1 = peer1.db.get(id)
const msg1 = await p(peer1.db.get)(id)

const { msg: msg2 } = await p(peer1.db.account.add)({
account: id,
Expand All @@ -88,7 +94,10 @@ test('account.add()', async (t) => {
})
assert.equal(msg2.data.key.bytes, keypair2.public)

assert.equal(peer1.db.account.has({ account: id, keypair: keypair2 }), true)
assert.equal(
await p(peer1.db.account.has)({ account: id, keypair: keypair2 }),
true
)

await p(peer1.close)()
rimraf.sync(DIR)
Expand Down Expand Up @@ -151,7 +160,7 @@ test('account.add()', async (t) => {
keypair: keypair1,
subdomain: 'person',
})
const accountMsg0 = peer.db.get(account)
const accountMsg0 = await p(peer.db.get)(account)

// Consent is implicitly created because keypair2 has .private
const accountRec1 = await p(peer.db.account.add)({
Expand All @@ -166,10 +175,13 @@ test('account.add()', async (t) => {
keypair: keypair2,
})
assert.equal(postRec.msg.data.text, 'hello', 'post text correct')
const mootRec = peer.db.feed.findMoot(account, 'post')
const mootRec = await p(peer.db.feed.findMoot)(account, 'post')
assert.ok(mootRec, 'posts moot exists')

const recs = [...peer.db.records()]
const recs = []
for await (rec of peer.db.records()) {
recs.push(rec)
}
assert.equal(recs.length, 4, '4 records')
const [_accountRec0, _accountRec1, postsRoot, _post] = recs
assert.deepEqual(_accountRec0.msg, accountMsg0, 'accountMsg0')
Expand Down Expand Up @@ -224,7 +236,7 @@ test('account.add()', async (t) => {
keypair: keypair1,
subdomain: 'person',
})
const accountMsg0 = peer.db.get(account)
const accountMsg0 = await p(peer.db.get)(account)

const consent = peer.db.account.consent({ account, keypair: keypair2 })

Expand All @@ -241,7 +253,7 @@ test('account.add()', async (t) => {
data: { text: 'potato' },
keypair: keypair2,
})
const postMootRec = peer.db.feed.findMoot(account, 'post')
const postMootRec = await p(peer.db.feed.findMoot)(account, 'post')

const delRec = await p(peer.db.account.del)({
account,
Expand Down
6 changes: 3 additions & 3 deletions test/account-create.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ test('account.create() ', async (t) => {
_nonce: 'MYNONCE',
})
assert.ok(account, 'accountRec0 exists')
const msg = peer.db.get(account)
const msg = await p(peer.db.get)(account)
assert.deepEqual(
msg.data,
{
Expand Down Expand Up @@ -60,7 +60,7 @@ test('account.create() ', async (t) => {
subdomain: 'person',
})
assert.ok(account, 'account created')
const msg = peer.db.get(account)
const msg = await p(peer.db.get)(account)
assert.equal(msg.data.key.bytes, keypair.public, 'msg.data')
assert.equal(msg.metadata.account, 'self', 'msg.metadata.account')
assert.equal(msg.metadata.accountTips, null, 'msg.metadata.accountTips')
Expand Down Expand Up @@ -129,7 +129,7 @@ test('account.create() ', async (t) => {
subdomain,
})
assert.ok(account, 'account created')
const msg = peer.db.get(account)
const msg = await p(peer.db.get)(account)
assert.equal(msg.data.key.bytes, keypair.public, 'msg.data')
assert.equal(msg.metadata.account, 'self', 'msg.metadata.account')
assert.equal(msg.metadata.accountTips, null, 'msg.metadata.accountTips')
Expand Down
4 changes: 2 additions & 2 deletions test/add.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ test('add()', async (t) => {
{
const ids = []
const texts = []
for (const rec of peer.db.records()) {
for await (const rec of peer.db.records()) {
if (rec.msg.metadata.domain === 'something') {
ids.push(rec.id)
texts.push(rec.msg.data?.text)
Expand All @@ -122,7 +122,7 @@ test('add()', async (t) => {
{
const ids = []
const texts = []
for (const rec of peer.db.records()) {
for await (const rec of peer.db.records()) {
if (rec.msg.metadata.domain === 'something') {
ids.push(rec.id)
texts.push(rec.msg.data?.text)
Expand Down
6 changes: 3 additions & 3 deletions test/del.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ test('del()', async (t) => {

{
const texts = []
for (const msg of peer.db.msgs()) {
for await (const msg of peer.db.msgs()) {
if (msg.data && msg.metadata.account?.length > 4) {
texts.push(msg.data.text)
}
Expand All @@ -60,7 +60,7 @@ test('del()', async (t) => {

{
const texts = []
for (const msg of peer.db.msgs()) {
for await (const msg of peer.db.msgs()) {
if (msg.data && msg.metadata.account?.length > 4) {
texts.push(msg.data.text)
}
Expand All @@ -76,7 +76,7 @@ test('del()', async (t) => {

{
const texts = []
for (const msg of peer.db.msgs()) {
for await (const msg of peer.db.msgs()) {
if (msg.data && msg.metadata.account?.length > 4) {
texts.push(msg.data.text)
}
Expand Down
6 changes: 3 additions & 3 deletions test/erase.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ test('erase()', async (t) => {
const SAVED_UPON_ERASE = '{"text":"m*"}'.length - 'null'.length

const before = []
for (const msg of peer.db.msgs()) {
for await (const msg of peer.db.msgs()) {
if (msg.data && msg.metadata.account?.length > 4) {
before.push(msg.data.text)
}
Expand All @@ -59,7 +59,7 @@ test('erase()', async (t) => {
await p(peer.db.erase)(msgIDs[2])

const after = []
for (const msg of peer.db.msgs()) {
for await (const msg of peer.db.msgs()) {
if (msg.data && msg.metadata.account?.length > 4) {
after.push(msg.data.text)
}
Expand All @@ -68,7 +68,7 @@ test('erase()', async (t) => {
assert.deepEqual(after, ['m0', 'm1', 'm3', 'm4'], '4 msgs after the erase')

const after2 = []
for (const msg of peer.db.msgs()) {
for await (const msg of peer.db.msgs()) {
for (const tangleID in msg.metadata.tangles) {
after2.push(msg.metadata.tangles[tangleID].depth)
}
Expand Down
2 changes: 1 addition & 1 deletion test/feed-find-moot.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ test('feed.findMoot()', async (t) => {

await p(peer.db.add)(moot, mootID)

const mootRec = peer.db.feed.findMoot(id, 'post')
const mootRec = await p(peer.db.feed.findMoot)(id, 'post')
assert.equal(mootRec.id, mootID, 'feed.findMoot() returns moot ID')

await p(peer.close)(true)
Expand Down
2 changes: 1 addition & 1 deletion test/feed-publish.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ test('feed.publish()', async (t) => {
assert.equal(typeof recEncrypted.msg.data, 'string')
assert.ok(recEncrypted.msg.data.endsWith('.box'), '.box')

const msgDecrypted = peer.db.get(recEncrypted.id)
const msgDecrypted = await p(peer.db.get)(recEncrypted.id)
assert.equal(msgDecrypted.data.text, 'I am chewing food')
})

Expand Down
2 changes: 1 addition & 1 deletion test/get.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ test('get()', async (t) => {
})
const msgID1 = MsgV4.getMsgID(rec1.msg)

const msg = peer.db.get(msgID1)
const msg = await p(peer.db.get)(msgID1)
assert.ok(msg, 'msg exists')
assert.equal(msg.data.text, 'I am 1st post')

Expand Down
20 changes: 10 additions & 10 deletions test/getTangle.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,12 +103,12 @@ test('getTangle()', async (t) => {
reply3LoText = reply3B.localeCompare(reply3C) < 0 ? 'reply 3B' : 'reply 3C'
reply3HiText = reply3B.localeCompare(reply3C) < 0 ? 'reply 3C' : 'reply 3B'

tangle = peer.db.getTangle(rootPost)
tangle = await p(peer.db.getTangle)(rootPost)
}

await t.test('getTangle unknown ID returns null', (t) => {
await t.test('getTangle unknown ID returns null', async (t) => {
assert.equal(
peer.db.getTangle('Lq6xwbdvGVmSsY3oYRugpZ3DY8chX9SLhRhjJKyZHQn'),
await p(peer.db.getTangle)('Lq6xwbdvGVmSsY3oYRugpZ3DY8chX9SLhRhjJKyZHQn'),
null
)
})
Expand Down Expand Up @@ -280,9 +280,9 @@ test('getTangle()', async (t) => {
assert.deepEqual(actual4, expected4)
})

await t.test('Tangle.slice', (t) => {
await t.test('Tangle.slice', async (t) => {
{
const msgs = tangle.slice()
const msgs = await tangle.slice()
const texts = msgs.map((msg) => msg.data?.text)
assert.deepEqual(texts, [
'root',
Expand All @@ -295,13 +295,13 @@ test('getTangle()', async (t) => {
}

{
const msgs = tangle.slice([], [reply2])
const msgs = await tangle.slice([], [reply2])
const texts = msgs.map((msg) => msg.data?.text)
assert.deepEqual(texts, ['root', reply1LoText, reply1HiText, 'reply 2'])
}

{
const msgs = tangle.slice([reply2], [])
const msgs = await tangle.slice([reply2], [])
const texts = msgs.map((msg) => msg.data?.text)
assert.deepEqual(texts, [
undefined, // root
Expand All @@ -313,7 +313,7 @@ test('getTangle()', async (t) => {
}

{
const msgs = tangle.slice([reply2], [reply2])
const msgs = await tangle.slice([reply2], [reply2])
const texts = msgs.map((msg) => msg.data?.text)
assert.deepEqual(texts, [
undefined, // root
Expand All @@ -323,7 +323,7 @@ test('getTangle()', async (t) => {
}

{
const msgs = tangle.slice([reply2], [reply2, reply3Lo])
const msgs = await tangle.slice([reply2], [reply2, reply3Lo])
const texts = msgs.map((msg) => msg.data?.text)
assert.deepEqual(texts, [
undefined, // root
Expand All @@ -343,7 +343,7 @@ test('getTangle()', async (t) => {
await p(peer.db.erase)(msgID)
}

const tangle2 = peer.db.getTangle(rootPost)
const tangle2 = await p(peer.db.getTangle)(rootPost)
const sorted = tangle2.topoSort()

assert.deepEqual(sorted, [rootPost, reply3Lo, reply3Hi])
Expand Down
6 changes: 4 additions & 2 deletions test/ghosts.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const p = require('node:util').promisify
const rimraf = require('rimraf')
const Keypair = require('ppppp-keypair')
const { createPeer } = require('./util')
const MsgV4 = require('../lib/msg-v4')

const DIR = path.join(os.tmpdir(), 'ppppp-db-ghosts')
rimraf.sync(DIR)
Expand All @@ -28,7 +29,7 @@ test('ghosts.add, ghosts.get, ghosts.getMinDepth', async (t) => {
})
msgIDs.push(rec.id)
}
const tangleID = peer.db.feed.findMoot(account, 'post')?.id
const tangleID = (await p(peer.db.feed.findMoot)(account, 'post'))?.id

const ghosts0 = peer.db.ghosts.get(tangleID)
assert.deepEqual(ghosts0, [], 'no ghosts so far')
Expand Down Expand Up @@ -71,7 +72,8 @@ test('ghosts.add queues very-concurrent calls', async (t) => {
})
msgIDs.push(rec.id)
}
const tangleID = peer.db.feed.findMoot(account, 'post')?.id
const moot = MsgV4.createMoot(account, 'post', keypair)
const tangleID = MsgV4.getMsgID(moot)

const ghosts0 = peer.db.ghosts.get(tangleID)
assert.deepEqual(ghosts0, [], 'no ghosts so far')
Expand Down
2 changes: 1 addition & 1 deletion test/msgs-iterator.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ test('msgs() iterator', async (t) => {

const posts = []
const abouts = []
for (const msg of peer.db.msgs()) {
for await (const msg of peer.db.msgs()) {
if (!msg.data) continue
if (msg.metadata.domain === 'post') posts.push(msg.data.text)
else if (msg.metadata.domain === 'about') abouts.push(msg.data.name)
Expand Down
2 changes: 1 addition & 1 deletion test/re-open.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ test('publish some msgs, close, re-open', async (t) => {
await peer2.db.loaded()

const texts = []
for (const msg of peer2.db.msgs()) {
for await (const msg of peer2.db.msgs()) {
if (!msg.data || !(msg.metadata.account?.length > 4)) continue
texts.push(msg.data.text)
}
Expand Down
2 changes: 1 addition & 1 deletion test/records-iterator.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ test('records() iterator', async (t) => {
}

let count = 0
for (const rec of peer.db.records()) {
for await (const rec of peer.db.records()) {
if (!rec.msg.data) continue
if (rec.msg.metadata.account === 'self') continue
assert.ok(rec.received, 'received')
Expand Down
Loading

0 comments on commit 15cfc74

Please sign in to comment.