fix: multi-repo local dev (file:../ deps, package exports, missing deps)
This commit is contained in:
+161
@@ -0,0 +1,161 @@
|
||||
const { Extension } = require('./messages')
|
||||
|
||||
// const MAX_ACTIVE = 32
|
||||
const FLUSH_BATCH = 128
|
||||
const MAX_PASSIVE_BATCH = 2048
|
||||
const MAX_ACTIVE_BATCH = MAX_PASSIVE_BATCH + FLUSH_BATCH
|
||||
|
||||
class Batch {
|
||||
constructor(outgoing, from) {
|
||||
this.blocks = []
|
||||
this.start = 0
|
||||
this.end = 0
|
||||
this.outgoing = outgoing
|
||||
this.from = from
|
||||
}
|
||||
|
||||
push(seq) {
|
||||
const len = this.blocks.push(seq)
|
||||
if (len === 1 || seq < this.start) this.start = seq
|
||||
if (len === 1 || seq >= this.end) this.end = seq + 1
|
||||
if (len >= FLUSH_BATCH) {
|
||||
this.send()
|
||||
this.clear()
|
||||
}
|
||||
}
|
||||
|
||||
send() {
|
||||
if (!this.blocks.length) return
|
||||
this.outgoing.send(
|
||||
Extension.encode({
|
||||
cache: { blocks: this.blocks, start: this.start, end: this.end }
|
||||
}),
|
||||
this.from
|
||||
)
|
||||
}
|
||||
|
||||
clear() {
|
||||
this.start = this.end = 0
|
||||
this.blocks = []
|
||||
}
|
||||
}
|
||||
|
||||
class HyperbeeExtension {
|
||||
constructor(db) {
|
||||
this.encoding = null
|
||||
this.outgoing = null
|
||||
this.db = db
|
||||
this.active = 0
|
||||
}
|
||||
|
||||
get(version, key) {
|
||||
this.outgoing.broadcast(Extension.encode({ get: { version, key } }))
|
||||
}
|
||||
|
||||
iterator(snapshot) {
|
||||
if (snapshot.ended) return
|
||||
if (snapshot.limit === 0) return
|
||||
if (snapshot.limit === -1) snapshot.limit = 0
|
||||
this.outgoing.broadcast(Extension.encode({ iterator: snapshot }))
|
||||
}
|
||||
|
||||
onmessage(buf, from) {
|
||||
// TODO: handle max active extension messages
|
||||
// this.active++
|
||||
|
||||
const message = decode(buf)
|
||||
if (!message) return
|
||||
|
||||
if (message.cache) this.oncache(message.cache, from)
|
||||
if (message.get) this.onget(message.get, from)
|
||||
if (message.iterator) this.oniterator(message.iterator, from)
|
||||
}
|
||||
|
||||
oncache(message, from) {
|
||||
if (!message.blocks.length) return
|
||||
this.db.core.download(message)
|
||||
}
|
||||
|
||||
onget(message, from) {
|
||||
if (!message.version || message.version > this.db.version) return
|
||||
|
||||
const b = new Batch(this.outgoing, from)
|
||||
const db = this.db.checkout(message.version)
|
||||
|
||||
db.get(message.key, {
|
||||
extension: false,
|
||||
wait: false,
|
||||
update: false,
|
||||
onseq
|
||||
}).then(done, done)
|
||||
|
||||
function done() {
|
||||
db.close().catch(noop)
|
||||
b.send()
|
||||
}
|
||||
|
||||
function onseq(seq) {
|
||||
b.push(seq)
|
||||
}
|
||||
}
|
||||
|
||||
async oniterator(message, from) {
|
||||
if (!message.version || message.version > this.db.version) return
|
||||
|
||||
const b = new Batch(this.outgoing, from)
|
||||
const seqs = new Set()
|
||||
|
||||
let skip = message.checkpoint.length
|
||||
let work = 0
|
||||
|
||||
const db = this.db.checkout(message.version)
|
||||
const ite = db.createRangeIterator({
|
||||
...message,
|
||||
wait: false,
|
||||
extension: false,
|
||||
update: false,
|
||||
limit: message.limit === 0 ? -1 : message.limit,
|
||||
onseq(seq) {
|
||||
if (skip && skip--) return
|
||||
if (seqs.has(seq)) return
|
||||
work++
|
||||
seqs.add(seq)
|
||||
b.push(seq)
|
||||
}
|
||||
})
|
||||
|
||||
try {
|
||||
await ite.open()
|
||||
// eslint-disable-next-line no-unmodified-loop-condition
|
||||
while (work < MAX_ACTIVE_BATCH) {
|
||||
if (!(await ite.next())) break
|
||||
}
|
||||
} catch (_) {
|
||||
// do nothing
|
||||
} finally {
|
||||
ite.close().catch(noop)
|
||||
db.close().catch(noop)
|
||||
b.send()
|
||||
}
|
||||
}
|
||||
|
||||
static register(db) {
|
||||
const e = new this(db)
|
||||
e.outgoing = db.core.registerExtension('hyperbee', e)
|
||||
return e
|
||||
}
|
||||
}
|
||||
|
||||
HyperbeeExtension.BATCH_SIZE = MAX_PASSIVE_BATCH
|
||||
|
||||
module.exports = HyperbeeExtension
|
||||
|
||||
function decode(buf) {
|
||||
try {
|
||||
return Extension.decode(buf)
|
||||
} catch (err) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
function noop() {}
|
||||
+956
@@ -0,0 +1,956 @@
|
||||
// This file is auto generated by the protocol-buffers compiler
|
||||
|
||||
/* eslint-disable quotes */
|
||||
/* eslint-disable indent */
|
||||
/* eslint-disable no-redeclare */
|
||||
/* eslint-disable camelcase */
|
||||
/* eslint-disable no-var */
|
||||
|
||||
// Remember to `npm install --save protocol-buffers-encodings`
|
||||
var encodings = require('protocol-buffers-encodings')
|
||||
var b4a = require('b4a')
|
||||
var varint = encodings.varint
|
||||
var skip = encodings.skip
|
||||
|
||||
var YoloIndex = exports.YoloIndex = {
|
||||
buffer: true,
|
||||
encodingLength: null,
|
||||
encode: null,
|
||||
decode: null
|
||||
}
|
||||
|
||||
var Header = exports.Header = {
|
||||
buffer: true,
|
||||
encodingLength: null,
|
||||
encode: null,
|
||||
decode: null
|
||||
}
|
||||
|
||||
var Node = exports.Node = {
|
||||
buffer: true,
|
||||
encodingLength: null,
|
||||
encode: null,
|
||||
decode: null
|
||||
}
|
||||
|
||||
var Extension = exports.Extension = {
|
||||
buffer: true,
|
||||
encodingLength: null,
|
||||
encode: null,
|
||||
decode: null
|
||||
}
|
||||
|
||||
defineYoloIndex()
|
||||
defineHeader()
|
||||
defineNode()
|
||||
defineExtension()
|
||||
|
||||
function defineYoloIndex () {
|
||||
var Level = YoloIndex.Level = {
|
||||
buffer: true,
|
||||
encodingLength: null,
|
||||
encode: null,
|
||||
decode: null
|
||||
}
|
||||
|
||||
defineLevel()
|
||||
|
||||
function defineLevel () {
|
||||
Level.encodingLength = encodingLength
|
||||
Level.encode = encode
|
||||
Level.decode = decode
|
||||
|
||||
function encodingLength (obj) {
|
||||
var length = 0
|
||||
if (defined(obj.keys)) {
|
||||
var packedLen = 0
|
||||
for (var i = 0; i < obj.keys.length; i++) {
|
||||
if (!defined(obj.keys[i])) continue
|
||||
var len = encodings.varint.encodingLength(obj.keys[i])
|
||||
packedLen += len
|
||||
}
|
||||
if (packedLen) {
|
||||
length += 1 + packedLen + varint.encodingLength(packedLen)
|
||||
}
|
||||
}
|
||||
if (defined(obj.children)) {
|
||||
var packedLen = 0
|
||||
for (var i = 0; i < obj.children.length; i++) {
|
||||
if (!defined(obj.children[i])) continue
|
||||
var len = encodings.varint.encodingLength(obj.children[i])
|
||||
packedLen += len
|
||||
}
|
||||
if (packedLen) {
|
||||
length += 1 + packedLen + varint.encodingLength(packedLen)
|
||||
}
|
||||
}
|
||||
return length
|
||||
}
|
||||
|
||||
function encode (obj, buf, offset) {
|
||||
if (!offset) offset = 0
|
||||
if (!buf) buf = b4a.allocUnsafe(encodingLength(obj))
|
||||
var oldOffset = offset
|
||||
if (defined(obj.keys)) {
|
||||
var packedLen = 0
|
||||
for (var i = 0; i < obj.keys.length; i++) {
|
||||
if (!defined(obj.keys[i])) continue
|
||||
packedLen += encodings.varint.encodingLength(obj.keys[i])
|
||||
}
|
||||
if (packedLen) {
|
||||
buf[offset++] = 10
|
||||
varint.encode(packedLen, buf, offset)
|
||||
offset += varint.encode.bytes
|
||||
}
|
||||
for (var i = 0; i < obj.keys.length; i++) {
|
||||
if (!defined(obj.keys[i])) continue
|
||||
encodings.varint.encode(obj.keys[i], buf, offset)
|
||||
offset += encodings.varint.encode.bytes
|
||||
}
|
||||
}
|
||||
if (defined(obj.children)) {
|
||||
var packedLen = 0
|
||||
for (var i = 0; i < obj.children.length; i++) {
|
||||
if (!defined(obj.children[i])) continue
|
||||
packedLen += encodings.varint.encodingLength(obj.children[i])
|
||||
}
|
||||
if (packedLen) {
|
||||
buf[offset++] = 18
|
||||
varint.encode(packedLen, buf, offset)
|
||||
offset += varint.encode.bytes
|
||||
}
|
||||
for (var i = 0; i < obj.children.length; i++) {
|
||||
if (!defined(obj.children[i])) continue
|
||||
encodings.varint.encode(obj.children[i], buf, offset)
|
||||
offset += encodings.varint.encode.bytes
|
||||
}
|
||||
}
|
||||
encode.bytes = offset - oldOffset
|
||||
return buf
|
||||
}
|
||||
|
||||
function decode (buf, offset, end) {
|
||||
if (!offset) offset = 0
|
||||
if (!end) end = buf.length
|
||||
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid")
|
||||
var oldOffset = offset
|
||||
var obj = {
|
||||
keys: [],
|
||||
children: []
|
||||
}
|
||||
while (true) {
|
||||
if (end <= offset) {
|
||||
decode.bytes = offset - oldOffset
|
||||
return obj
|
||||
}
|
||||
var prefix = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
var tag = prefix >> 3
|
||||
switch (tag) {
|
||||
case 1:
|
||||
var packedEnd = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
packedEnd += offset
|
||||
while (offset < packedEnd) {
|
||||
obj.keys.push(encodings.varint.decode(buf, offset))
|
||||
offset += encodings.varint.decode.bytes
|
||||
}
|
||||
break
|
||||
case 2:
|
||||
var packedEnd = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
packedEnd += offset
|
||||
while (offset < packedEnd) {
|
||||
obj.children.push(encodings.varint.decode(buf, offset))
|
||||
offset += encodings.varint.decode.bytes
|
||||
}
|
||||
break
|
||||
default:
|
||||
offset = skip(prefix & 7, buf, offset)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
YoloIndex.encodingLength = encodingLength
|
||||
YoloIndex.encode = encode
|
||||
YoloIndex.decode = decode
|
||||
|
||||
function encodingLength (obj) {
|
||||
var length = 0
|
||||
if (defined(obj.levels)) {
|
||||
for (var i = 0; i < obj.levels.length; i++) {
|
||||
if (!defined(obj.levels[i])) continue
|
||||
var len = Level.encodingLength(obj.levels[i])
|
||||
length += varint.encodingLength(len)
|
||||
length += 1 + len
|
||||
}
|
||||
}
|
||||
return length
|
||||
}
|
||||
|
||||
function encode (obj, buf, offset) {
|
||||
if (!offset) offset = 0
|
||||
if (!buf) buf = b4a.allocUnsafe(encodingLength(obj))
|
||||
var oldOffset = offset
|
||||
if (defined(obj.levels)) {
|
||||
for (var i = 0; i < obj.levels.length; i++) {
|
||||
if (!defined(obj.levels[i])) continue
|
||||
buf[offset++] = 10
|
||||
varint.encode(Level.encodingLength(obj.levels[i]), buf, offset)
|
||||
offset += varint.encode.bytes
|
||||
Level.encode(obj.levels[i], buf, offset)
|
||||
offset += Level.encode.bytes
|
||||
}
|
||||
}
|
||||
encode.bytes = offset - oldOffset
|
||||
return buf
|
||||
}
|
||||
|
||||
function decode (buf, offset, end) {
|
||||
if (!offset) offset = 0
|
||||
if (!end) end = buf.length
|
||||
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid")
|
||||
var oldOffset = offset
|
||||
var obj = {
|
||||
levels: []
|
||||
}
|
||||
while (true) {
|
||||
if (end <= offset) {
|
||||
decode.bytes = offset - oldOffset
|
||||
return obj
|
||||
}
|
||||
var prefix = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
var tag = prefix >> 3
|
||||
switch (tag) {
|
||||
case 1:
|
||||
var len = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
obj.levels.push(Level.decode(buf, offset, offset + len))
|
||||
offset += Level.decode.bytes
|
||||
break
|
||||
default:
|
||||
offset = skip(prefix & 7, buf, offset)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function defineHeader () {
|
||||
var Metadata = Header.Metadata = {
|
||||
buffer: true,
|
||||
encodingLength: null,
|
||||
encode: null,
|
||||
decode: null
|
||||
}
|
||||
|
||||
defineMetadata()
|
||||
|
||||
function defineMetadata () {
|
||||
Metadata.encodingLength = encodingLength
|
||||
Metadata.encode = encode
|
||||
Metadata.decode = decode
|
||||
|
||||
function encodingLength (obj) {
|
||||
var length = 0
|
||||
if (defined(obj.contentFeed)) {
|
||||
var len = encodings.bytes.encodingLength(obj.contentFeed)
|
||||
length += 1 + len
|
||||
}
|
||||
if (defined(obj.userData)) {
|
||||
var len = encodings.bytes.encodingLength(obj.userData)
|
||||
length += 1 + len
|
||||
}
|
||||
return length
|
||||
}
|
||||
|
||||
function encode (obj, buf, offset) {
|
||||
if (!offset) offset = 0
|
||||
if (!buf) buf = b4a.allocUnsafe(encodingLength(obj))
|
||||
var oldOffset = offset
|
||||
if (defined(obj.contentFeed)) {
|
||||
buf[offset++] = 10
|
||||
encodings.bytes.encode(obj.contentFeed, buf, offset)
|
||||
offset += encodings.bytes.encode.bytes
|
||||
}
|
||||
if (defined(obj.userData)) {
|
||||
buf[offset++] = 18
|
||||
encodings.bytes.encode(obj.userData, buf, offset)
|
||||
offset += encodings.bytes.encode.bytes
|
||||
}
|
||||
encode.bytes = offset - oldOffset
|
||||
return buf
|
||||
}
|
||||
|
||||
function decode (buf, offset, end) {
|
||||
if (!offset) offset = 0
|
||||
if (!end) end = buf.length
|
||||
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid")
|
||||
var oldOffset = offset
|
||||
var obj = {
|
||||
contentFeed: null,
|
||||
userData: null
|
||||
}
|
||||
while (true) {
|
||||
if (end <= offset) {
|
||||
decode.bytes = offset - oldOffset
|
||||
return obj
|
||||
}
|
||||
var prefix = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
var tag = prefix >> 3
|
||||
switch (tag) {
|
||||
case 1:
|
||||
obj.contentFeed = encodings.bytes.decode(buf, offset)
|
||||
offset += encodings.bytes.decode.bytes
|
||||
break
|
||||
case 2:
|
||||
obj.userData = encodings.bytes.decode(buf, offset)
|
||||
offset += encodings.bytes.decode.bytes
|
||||
break
|
||||
default:
|
||||
offset = skip(prefix & 7, buf, offset)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Header.encodingLength = encodingLength
|
||||
Header.encode = encode
|
||||
Header.decode = decode
|
||||
|
||||
function encodingLength (obj) {
|
||||
var length = 0
|
||||
if (!defined(obj.protocol)) throw new Error("protocol is required")
|
||||
var len = encodings.string.encodingLength(obj.protocol)
|
||||
length += 1 + len
|
||||
if (defined(obj.metadata)) {
|
||||
var len = Metadata.encodingLength(obj.metadata)
|
||||
length += varint.encodingLength(len)
|
||||
length += 1 + len
|
||||
}
|
||||
return length
|
||||
}
|
||||
|
||||
function encode (obj, buf, offset) {
|
||||
if (!offset) offset = 0
|
||||
if (!buf) buf = b4a.allocUnsafe(encodingLength(obj))
|
||||
var oldOffset = offset
|
||||
if (!defined(obj.protocol)) throw new Error("protocol is required")
|
||||
buf[offset++] = 10
|
||||
encodings.string.encode(obj.protocol, buf, offset)
|
||||
offset += encodings.string.encode.bytes
|
||||
if (defined(obj.metadata)) {
|
||||
buf[offset++] = 18
|
||||
varint.encode(Metadata.encodingLength(obj.metadata), buf, offset)
|
||||
offset += varint.encode.bytes
|
||||
Metadata.encode(obj.metadata, buf, offset)
|
||||
offset += Metadata.encode.bytes
|
||||
}
|
||||
encode.bytes = offset - oldOffset
|
||||
return buf
|
||||
}
|
||||
|
||||
function decode (buf, offset, end) {
|
||||
if (!offset) offset = 0
|
||||
if (!end) end = buf.length
|
||||
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid")
|
||||
var oldOffset = offset
|
||||
var obj = {
|
||||
protocol: "",
|
||||
metadata: null
|
||||
}
|
||||
var found0 = false
|
||||
while (true) {
|
||||
if (end <= offset) {
|
||||
if (!found0) throw new Error("Decoded message is not valid")
|
||||
decode.bytes = offset - oldOffset
|
||||
return obj
|
||||
}
|
||||
var prefix = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
var tag = prefix >> 3
|
||||
switch (tag) {
|
||||
case 1:
|
||||
obj.protocol = encodings.string.decode(buf, offset)
|
||||
offset += encodings.string.decode.bytes
|
||||
found0 = true
|
||||
break
|
||||
case 2:
|
||||
var len = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
obj.metadata = Metadata.decode(buf, offset, offset + len)
|
||||
offset += Metadata.decode.bytes
|
||||
break
|
||||
default:
|
||||
offset = skip(prefix & 7, buf, offset)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function defineNode () {
|
||||
Node.encodingLength = encodingLength
|
||||
Node.encode = encode
|
||||
Node.decode = decode
|
||||
|
||||
function encodingLength (obj) {
|
||||
var length = 0
|
||||
if (!defined(obj.index)) throw new Error("index is required")
|
||||
var len = encodings.bytes.encodingLength(obj.index)
|
||||
length += 1 + len
|
||||
if (!defined(obj.key)) throw new Error("key is required")
|
||||
var len = encodings.bytes.encodingLength(obj.key)
|
||||
length += 1 + len
|
||||
if (defined(obj.value)) {
|
||||
var len = encodings.bytes.encodingLength(obj.value)
|
||||
length += 1 + len
|
||||
}
|
||||
return length
|
||||
}
|
||||
|
||||
function encode (obj, buf, offset) {
|
||||
if (!offset) offset = 0
|
||||
if (!buf) buf = b4a.allocUnsafe(encodingLength(obj))
|
||||
var oldOffset = offset
|
||||
if (!defined(obj.index)) throw new Error("index is required")
|
||||
buf[offset++] = 10
|
||||
encodings.bytes.encode(obj.index, buf, offset)
|
||||
offset += encodings.bytes.encode.bytes
|
||||
if (!defined(obj.key)) throw new Error("key is required")
|
||||
buf[offset++] = 18
|
||||
encodings.bytes.encode(obj.key, buf, offset)
|
||||
offset += encodings.bytes.encode.bytes
|
||||
if (defined(obj.value)) {
|
||||
buf[offset++] = 26
|
||||
encodings.bytes.encode(obj.value, buf, offset)
|
||||
offset += encodings.bytes.encode.bytes
|
||||
}
|
||||
encode.bytes = offset - oldOffset
|
||||
return buf
|
||||
}
|
||||
|
||||
function decode (buf, offset, end) {
|
||||
if (!offset) offset = 0
|
||||
if (!end) end = buf.length
|
||||
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid")
|
||||
var oldOffset = offset
|
||||
var obj = {
|
||||
index: null,
|
||||
key: null,
|
||||
value: null
|
||||
}
|
||||
var found0 = false
|
||||
var found1 = false
|
||||
while (true) {
|
||||
if (end <= offset) {
|
||||
if (!found0 || !found1) throw new Error("Decoded message is not valid")
|
||||
decode.bytes = offset - oldOffset
|
||||
return obj
|
||||
}
|
||||
var prefix = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
var tag = prefix >> 3
|
||||
switch (tag) {
|
||||
case 1:
|
||||
obj.index = encodings.bytes.decode(buf, offset)
|
||||
offset += encodings.bytes.decode.bytes
|
||||
found0 = true
|
||||
break
|
||||
case 2:
|
||||
obj.key = encodings.bytes.decode(buf, offset)
|
||||
offset += encodings.bytes.decode.bytes
|
||||
found1 = true
|
||||
break
|
||||
case 3:
|
||||
obj.value = encodings.bytes.decode(buf, offset)
|
||||
offset += encodings.bytes.decode.bytes
|
||||
break
|
||||
default:
|
||||
offset = skip(prefix & 7, buf, offset)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function defineExtension () {
|
||||
var Get = Extension.Get = {
|
||||
buffer: true,
|
||||
encodingLength: null,
|
||||
encode: null,
|
||||
decode: null
|
||||
}
|
||||
|
||||
var Iterator = Extension.Iterator = {
|
||||
buffer: true,
|
||||
encodingLength: null,
|
||||
encode: null,
|
||||
decode: null
|
||||
}
|
||||
|
||||
var Cache = Extension.Cache = {
|
||||
buffer: true,
|
||||
encodingLength: null,
|
||||
encode: null,
|
||||
decode: null
|
||||
}
|
||||
|
||||
defineGet()
|
||||
defineIterator()
|
||||
defineCache()
|
||||
|
||||
function defineGet () {
|
||||
Get.encodingLength = encodingLength
|
||||
Get.encode = encode
|
||||
Get.decode = decode
|
||||
|
||||
function encodingLength (obj) {
|
||||
var length = 0
|
||||
if (defined(obj.version)) {
|
||||
var len = encodings.varint.encodingLength(obj.version)
|
||||
length += 1 + len
|
||||
}
|
||||
if (defined(obj.key)) {
|
||||
var len = encodings.bytes.encodingLength(obj.key)
|
||||
length += 1 + len
|
||||
}
|
||||
return length
|
||||
}
|
||||
|
||||
function encode (obj, buf, offset) {
|
||||
if (!offset) offset = 0
|
||||
if (!buf) buf = b4a.allocUnsafe(encodingLength(obj))
|
||||
var oldOffset = offset
|
||||
if (defined(obj.version)) {
|
||||
buf[offset++] = 8
|
||||
encodings.varint.encode(obj.version, buf, offset)
|
||||
offset += encodings.varint.encode.bytes
|
||||
}
|
||||
if (defined(obj.key)) {
|
||||
buf[offset++] = 18
|
||||
encodings.bytes.encode(obj.key, buf, offset)
|
||||
offset += encodings.bytes.encode.bytes
|
||||
}
|
||||
encode.bytes = offset - oldOffset
|
||||
return buf
|
||||
}
|
||||
|
||||
function decode (buf, offset, end) {
|
||||
if (!offset) offset = 0
|
||||
if (!end) end = buf.length
|
||||
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid")
|
||||
var oldOffset = offset
|
||||
var obj = {
|
||||
version: 0,
|
||||
key: null
|
||||
}
|
||||
while (true) {
|
||||
if (end <= offset) {
|
||||
decode.bytes = offset - oldOffset
|
||||
return obj
|
||||
}
|
||||
var prefix = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
var tag = prefix >> 3
|
||||
switch (tag) {
|
||||
case 1:
|
||||
obj.version = encodings.varint.decode(buf, offset)
|
||||
offset += encodings.varint.decode.bytes
|
||||
break
|
||||
case 2:
|
||||
obj.key = encodings.bytes.decode(buf, offset)
|
||||
offset += encodings.bytes.decode.bytes
|
||||
break
|
||||
default:
|
||||
offset = skip(prefix & 7, buf, offset)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function defineIterator () {
|
||||
Iterator.encodingLength = encodingLength
|
||||
Iterator.encode = encode
|
||||
Iterator.decode = decode
|
||||
|
||||
function encodingLength (obj) {
|
||||
var length = 0
|
||||
if (defined(obj.version)) {
|
||||
var len = encodings.varint.encodingLength(obj.version)
|
||||
length += 1 + len
|
||||
}
|
||||
if (defined(obj.gte)) {
|
||||
var len = encodings.bytes.encodingLength(obj.gte)
|
||||
length += 1 + len
|
||||
}
|
||||
if (defined(obj.gt)) {
|
||||
var len = encodings.bytes.encodingLength(obj.gt)
|
||||
length += 1 + len
|
||||
}
|
||||
if (defined(obj.lte)) {
|
||||
var len = encodings.bytes.encodingLength(obj.lte)
|
||||
length += 1 + len
|
||||
}
|
||||
if (defined(obj.lt)) {
|
||||
var len = encodings.bytes.encodingLength(obj.lt)
|
||||
length += 1 + len
|
||||
}
|
||||
if (defined(obj.limit)) {
|
||||
var len = encodings.varint.encodingLength(obj.limit)
|
||||
length += 1 + len
|
||||
}
|
||||
if (defined(obj.reverse)) {
|
||||
var len = encodings.bool.encodingLength(obj.reverse)
|
||||
length += 1 + len
|
||||
}
|
||||
if (defined(obj.checkpoint)) {
|
||||
var packedLen = 0
|
||||
for (var i = 0; i < obj.checkpoint.length; i++) {
|
||||
if (!defined(obj.checkpoint[i])) continue
|
||||
var len = encodings.varint.encodingLength(obj.checkpoint[i])
|
||||
packedLen += len
|
||||
}
|
||||
if (packedLen) {
|
||||
length += 1 + packedLen + varint.encodingLength(packedLen)
|
||||
}
|
||||
}
|
||||
return length
|
||||
}
|
||||
|
||||
function encode (obj, buf, offset) {
|
||||
if (!offset) offset = 0
|
||||
if (!buf) buf = b4a.allocUnsafe(encodingLength(obj))
|
||||
var oldOffset = offset
|
||||
if (defined(obj.version)) {
|
||||
buf[offset++] = 8
|
||||
encodings.varint.encode(obj.version, buf, offset)
|
||||
offset += encodings.varint.encode.bytes
|
||||
}
|
||||
if (defined(obj.gte)) {
|
||||
buf[offset++] = 18
|
||||
encodings.bytes.encode(obj.gte, buf, offset)
|
||||
offset += encodings.bytes.encode.bytes
|
||||
}
|
||||
if (defined(obj.gt)) {
|
||||
buf[offset++] = 26
|
||||
encodings.bytes.encode(obj.gt, buf, offset)
|
||||
offset += encodings.bytes.encode.bytes
|
||||
}
|
||||
if (defined(obj.lte)) {
|
||||
buf[offset++] = 34
|
||||
encodings.bytes.encode(obj.lte, buf, offset)
|
||||
offset += encodings.bytes.encode.bytes
|
||||
}
|
||||
if (defined(obj.lt)) {
|
||||
buf[offset++] = 42
|
||||
encodings.bytes.encode(obj.lt, buf, offset)
|
||||
offset += encodings.bytes.encode.bytes
|
||||
}
|
||||
if (defined(obj.limit)) {
|
||||
buf[offset++] = 48
|
||||
encodings.varint.encode(obj.limit, buf, offset)
|
||||
offset += encodings.varint.encode.bytes
|
||||
}
|
||||
if (defined(obj.reverse)) {
|
||||
buf[offset++] = 56
|
||||
encodings.bool.encode(obj.reverse, buf, offset)
|
||||
offset += encodings.bool.encode.bytes
|
||||
}
|
||||
if (defined(obj.checkpoint)) {
|
||||
var packedLen = 0
|
||||
for (var i = 0; i < obj.checkpoint.length; i++) {
|
||||
if (!defined(obj.checkpoint[i])) continue
|
||||
packedLen += encodings.varint.encodingLength(obj.checkpoint[i])
|
||||
}
|
||||
if (packedLen) {
|
||||
buf[offset++] = 66
|
||||
varint.encode(packedLen, buf, offset)
|
||||
offset += varint.encode.bytes
|
||||
}
|
||||
for (var i = 0; i < obj.checkpoint.length; i++) {
|
||||
if (!defined(obj.checkpoint[i])) continue
|
||||
encodings.varint.encode(obj.checkpoint[i], buf, offset)
|
||||
offset += encodings.varint.encode.bytes
|
||||
}
|
||||
}
|
||||
encode.bytes = offset - oldOffset
|
||||
return buf
|
||||
}
|
||||
|
||||
function decode (buf, offset, end) {
|
||||
if (!offset) offset = 0
|
||||
if (!end) end = buf.length
|
||||
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid")
|
||||
var oldOffset = offset
|
||||
var obj = {
|
||||
version: 0,
|
||||
gte: null,
|
||||
gt: null,
|
||||
lte: null,
|
||||
lt: null,
|
||||
limit: 0,
|
||||
reverse: false,
|
||||
checkpoint: []
|
||||
}
|
||||
while (true) {
|
||||
if (end <= offset) {
|
||||
decode.bytes = offset - oldOffset
|
||||
return obj
|
||||
}
|
||||
var prefix = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
var tag = prefix >> 3
|
||||
switch (tag) {
|
||||
case 1:
|
||||
obj.version = encodings.varint.decode(buf, offset)
|
||||
offset += encodings.varint.decode.bytes
|
||||
break
|
||||
case 2:
|
||||
obj.gte = encodings.bytes.decode(buf, offset)
|
||||
offset += encodings.bytes.decode.bytes
|
||||
break
|
||||
case 3:
|
||||
obj.gt = encodings.bytes.decode(buf, offset)
|
||||
offset += encodings.bytes.decode.bytes
|
||||
break
|
||||
case 4:
|
||||
obj.lte = encodings.bytes.decode(buf, offset)
|
||||
offset += encodings.bytes.decode.bytes
|
||||
break
|
||||
case 5:
|
||||
obj.lt = encodings.bytes.decode(buf, offset)
|
||||
offset += encodings.bytes.decode.bytes
|
||||
break
|
||||
case 6:
|
||||
obj.limit = encodings.varint.decode(buf, offset)
|
||||
offset += encodings.varint.decode.bytes
|
||||
break
|
||||
case 7:
|
||||
obj.reverse = encodings.bool.decode(buf, offset)
|
||||
offset += encodings.bool.decode.bytes
|
||||
break
|
||||
case 8:
|
||||
var packedEnd = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
packedEnd += offset
|
||||
while (offset < packedEnd) {
|
||||
obj.checkpoint.push(encodings.varint.decode(buf, offset))
|
||||
offset += encodings.varint.decode.bytes
|
||||
}
|
||||
break
|
||||
default:
|
||||
offset = skip(prefix & 7, buf, offset)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function defineCache () {
|
||||
Cache.encodingLength = encodingLength
|
||||
Cache.encode = encode
|
||||
Cache.decode = decode
|
||||
|
||||
function encodingLength (obj) {
|
||||
var length = 0
|
||||
if (!defined(obj.start)) throw new Error("start is required")
|
||||
var len = encodings.varint.encodingLength(obj.start)
|
||||
length += 1 + len
|
||||
if (!defined(obj.end)) throw new Error("end is required")
|
||||
var len = encodings.varint.encodingLength(obj.end)
|
||||
length += 1 + len
|
||||
if (defined(obj.blocks)) {
|
||||
var packedLen = 0
|
||||
for (var i = 0; i < obj.blocks.length; i++) {
|
||||
if (!defined(obj.blocks[i])) continue
|
||||
var len = encodings.varint.encodingLength(obj.blocks[i])
|
||||
packedLen += len
|
||||
}
|
||||
if (packedLen) {
|
||||
length += 1 + packedLen + varint.encodingLength(packedLen)
|
||||
}
|
||||
}
|
||||
return length
|
||||
}
|
||||
|
||||
function encode (obj, buf, offset) {
|
||||
if (!offset) offset = 0
|
||||
if (!buf) buf = b4a.allocUnsafe(encodingLength(obj))
|
||||
var oldOffset = offset
|
||||
if (!defined(obj.start)) throw new Error("start is required")
|
||||
buf[offset++] = 8
|
||||
encodings.varint.encode(obj.start, buf, offset)
|
||||
offset += encodings.varint.encode.bytes
|
||||
if (!defined(obj.end)) throw new Error("end is required")
|
||||
buf[offset++] = 16
|
||||
encodings.varint.encode(obj.end, buf, offset)
|
||||
offset += encodings.varint.encode.bytes
|
||||
if (defined(obj.blocks)) {
|
||||
var packedLen = 0
|
||||
for (var i = 0; i < obj.blocks.length; i++) {
|
||||
if (!defined(obj.blocks[i])) continue
|
||||
packedLen += encodings.varint.encodingLength(obj.blocks[i])
|
||||
}
|
||||
if (packedLen) {
|
||||
buf[offset++] = 26
|
||||
varint.encode(packedLen, buf, offset)
|
||||
offset += varint.encode.bytes
|
||||
}
|
||||
for (var i = 0; i < obj.blocks.length; i++) {
|
||||
if (!defined(obj.blocks[i])) continue
|
||||
encodings.varint.encode(obj.blocks[i], buf, offset)
|
||||
offset += encodings.varint.encode.bytes
|
||||
}
|
||||
}
|
||||
encode.bytes = offset - oldOffset
|
||||
return buf
|
||||
}
|
||||
|
||||
function decode (buf, offset, end) {
|
||||
if (!offset) offset = 0
|
||||
if (!end) end = buf.length
|
||||
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid")
|
||||
var oldOffset = offset
|
||||
var obj = {
|
||||
start: 0,
|
||||
end: 0,
|
||||
blocks: []
|
||||
}
|
||||
var found0 = false
|
||||
var found1 = false
|
||||
while (true) {
|
||||
if (end <= offset) {
|
||||
if (!found0 || !found1) throw new Error("Decoded message is not valid")
|
||||
decode.bytes = offset - oldOffset
|
||||
return obj
|
||||
}
|
||||
var prefix = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
var tag = prefix >> 3
|
||||
switch (tag) {
|
||||
case 1:
|
||||
obj.start = encodings.varint.decode(buf, offset)
|
||||
offset += encodings.varint.decode.bytes
|
||||
found0 = true
|
||||
break
|
||||
case 2:
|
||||
obj.end = encodings.varint.decode(buf, offset)
|
||||
offset += encodings.varint.decode.bytes
|
||||
found1 = true
|
||||
break
|
||||
case 3:
|
||||
var packedEnd = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
packedEnd += offset
|
||||
while (offset < packedEnd) {
|
||||
obj.blocks.push(encodings.varint.decode(buf, offset))
|
||||
offset += encodings.varint.decode.bytes
|
||||
}
|
||||
break
|
||||
default:
|
||||
offset = skip(prefix & 7, buf, offset)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Extension.encodingLength = encodingLength
|
||||
Extension.encode = encode
|
||||
Extension.decode = decode
|
||||
|
||||
function encodingLength (obj) {
|
||||
var length = 0
|
||||
if (defined(obj.cache)) {
|
||||
var len = Cache.encodingLength(obj.cache)
|
||||
length += varint.encodingLength(len)
|
||||
length += 1 + len
|
||||
}
|
||||
if (defined(obj.get)) {
|
||||
var len = Get.encodingLength(obj.get)
|
||||
length += varint.encodingLength(len)
|
||||
length += 1 + len
|
||||
}
|
||||
if (defined(obj.iterator)) {
|
||||
var len = Iterator.encodingLength(obj.iterator)
|
||||
length += varint.encodingLength(len)
|
||||
length += 1 + len
|
||||
}
|
||||
return length
|
||||
}
|
||||
|
||||
function encode (obj, buf, offset) {
|
||||
if (!offset) offset = 0
|
||||
if (!buf) buf = b4a.allocUnsafe(encodingLength(obj))
|
||||
var oldOffset = offset
|
||||
if (defined(obj.cache)) {
|
||||
buf[offset++] = 10
|
||||
varint.encode(Cache.encodingLength(obj.cache), buf, offset)
|
||||
offset += varint.encode.bytes
|
||||
Cache.encode(obj.cache, buf, offset)
|
||||
offset += Cache.encode.bytes
|
||||
}
|
||||
if (defined(obj.get)) {
|
||||
buf[offset++] = 18
|
||||
varint.encode(Get.encodingLength(obj.get), buf, offset)
|
||||
offset += varint.encode.bytes
|
||||
Get.encode(obj.get, buf, offset)
|
||||
offset += Get.encode.bytes
|
||||
}
|
||||
if (defined(obj.iterator)) {
|
||||
buf[offset++] = 26
|
||||
varint.encode(Iterator.encodingLength(obj.iterator), buf, offset)
|
||||
offset += varint.encode.bytes
|
||||
Iterator.encode(obj.iterator, buf, offset)
|
||||
offset += Iterator.encode.bytes
|
||||
}
|
||||
encode.bytes = offset - oldOffset
|
||||
return buf
|
||||
}
|
||||
|
||||
function decode (buf, offset, end) {
|
||||
if (!offset) offset = 0
|
||||
if (!end) end = buf.length
|
||||
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid")
|
||||
var oldOffset = offset
|
||||
var obj = {
|
||||
cache: null,
|
||||
get: null,
|
||||
iterator: null
|
||||
}
|
||||
while (true) {
|
||||
if (end <= offset) {
|
||||
decode.bytes = offset - oldOffset
|
||||
return obj
|
||||
}
|
||||
var prefix = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
var tag = prefix >> 3
|
||||
switch (tag) {
|
||||
case 1:
|
||||
var len = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
obj.cache = Cache.decode(buf, offset, offset + len)
|
||||
offset += Cache.decode.bytes
|
||||
break
|
||||
case 2:
|
||||
var len = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
obj.get = Get.decode(buf, offset, offset + len)
|
||||
offset += Get.decode.bytes
|
||||
break
|
||||
case 3:
|
||||
var len = varint.decode(buf, offset)
|
||||
offset += varint.decode.bytes
|
||||
obj.iterator = Iterator.decode(buf, offset, offset + len)
|
||||
offset += Iterator.decode.bytes
|
||||
break
|
||||
default:
|
||||
offset = skip(prefix & 7, buf, offset)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function defined (val) {
|
||||
return val !== null && val !== undefined && (typeof val !== 'number' || !isNaN(val))
|
||||
}
|
||||
Reference in New Issue
Block a user