Skip to content

Commit 8cdd67f

Browse files
committed
Fixed not enumerating documents with keys starting with \xff
1 parent 63cde00 commit 8cdd67f

File tree

1 file changed

+42
-7
lines changed

1 file changed

+42
-7
lines changed

lib/adapter.js

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,41 @@ const UUID_KEY = '_local_uuid';
4747

4848
const MD5_PREFIX = 'md5-';
4949

50+
const nullBuffer = Buffer.alloc(1);
51+
const ffBuffer = Buffer.from([0xff]);
52+
const startOfKeyspace = Symbol('start of keyspace');
53+
const endOfKeyspace = Symbol('end of keyspace');
54+
55+
/**
56+
* A custom encoder is needed due to https://github.com/josephg/node-foundationdb/issues/78
57+
* @type {import('foundationdb/dist/lib/transformer.js').Transformer<
58+
* import('./types.js').Id | typeof startOfKeyspace | typeof endOfKeyspace,
59+
* import('./types.js').Id
60+
* >}
61+
*/
62+
const idEncoder = {
63+
pack(id) {
64+
if (id === startOfKeyspace) {
65+
return nullBuffer;
66+
}
67+
68+
if (id === endOfKeyspace) {
69+
return ffBuffer;
70+
}
71+
72+
const idBuffer = Buffer.from(id, 'binary');
73+
74+
return Buffer.concat([nullBuffer, idBuffer]);
75+
},
76+
unpack(idBuffer) {
77+
if (idBuffer[0] !== 0 && idBuffer.length > 1) {
78+
throw new Error('Invalid ID');
79+
}
80+
81+
return /** @type {import('./types.js').Id} */(idBuffer.subarray(1).toString('binary'));
82+
}
83+
};
84+
5085
/**
5186
* @type {import('foundationdb/dist/lib/transformer.js').Transformer<number, number>}
5287
*/
@@ -125,11 +160,11 @@ export default function FoundationdbAdapter(api, { db, name, revs_limit: revLimi
125160

126161
const stores = {
127162
/* eslint-disable max-len */
128-
docStore: /** @type {fdb.Subspace<import('./types.js').Id, import('./types.js').Id, import('./types.js').Metadata, import('./types.js').Metadata>} */(
129-
/** @type {unknown} */(subspace.at(fdb.tuple.pack(DOC_STORE), undefined, fdb.encoders.json))
163+
docStore: /** @type {fdb.Subspace<import('./types.js').Id | typeof startOfKeyspace | typeof endOfKeyspace, import('./types.js').Id, import('./types.js').Metadata, import('./types.js').Metadata>} */(
164+
subspace.at(fdb.tuple.pack(DOC_STORE), idEncoder, fdb.encoders.json)
130165
),
131166
bySeqStore: /** @type {fdb.Subspace<number, number, import('./types.js').Doc, import('./types.js').Doc>} */(
132-
/** @type {unknown} */(subspace.at(fdb.tuple.pack(BY_SEQ_STORE), seqEncoder, fdb.encoders.json))
167+
subspace.at(fdb.tuple.pack(BY_SEQ_STORE), seqEncoder, fdb.encoders.json)
133168
),
134169
attachmentStore: /** @type {fdb.Subspace<import('./types.js').Digest, import('./types.js').Digest, import('./types.js').AttachmentRef, import('./types.js').AttachmentRef>} */(
135170
/** @type {unknown} */(subspace.at(fdb.tuple.pack(ATTACHMENT_STORE), undefined, fdb.encoders.json))
@@ -640,15 +675,15 @@ export default function FoundationdbAdapter(api, { db, name, revs_limit: revLimi
640675
// eslint-disable-next-line no-nested-ternary
641676
const start = gte !== undefined
642677
? (!inclusiveEnd && reverse ? ks.firstGreaterThan(gte) : gte)
643-
: '';
678+
: startOfKeyspace;
644679
// eslint-disable-next-line no-nested-ternary
645680
const end = lte !== undefined
646681
? (!inclusiveEnd && !reverse ? lte : ks.firstGreaterThan(lte))
647-
: '\xff'; // TODO: make sure that ID-s starting with 0xff are also included
682+
: endOfKeyspace;
648683

649684
const it = tn.at(stores.docStore).getRange(
650-
/** @type {any} */(start),
651-
/** @type {any} */(end),
685+
start,
686+
end,
652687
reverse ? { reverse: true } : undefined
653688
);
654689

0 commit comments

Comments
 (0)