autobee 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,341 @@
1
+ const path = require('path')
2
+
3
+ module.exports = function buildAutobaseSchema(schema, DIR) {
4
+ const autobase = schema.namespace('autobase-compat')
5
+
6
+ autobase.require(path.join(DIR, 'legacy.js'))
7
+
8
+ autobase.register({
9
+ name: 'checkout',
10
+ compact: true,
11
+ fields: [
12
+ {
13
+ name: 'key',
14
+ type: 'fixed32',
15
+ required: true
16
+ },
17
+ {
18
+ name: 'length',
19
+ type: 'uint',
20
+ required: true
21
+ }
22
+ ]
23
+ })
24
+
25
+ autobase.register({
26
+ name: 'clock',
27
+ array: true,
28
+ compact: true,
29
+ type: '@autobase-compat/checkout'
30
+ })
31
+
32
+ autobase.register({
33
+ name: 'index-checkpoint',
34
+ compact: true,
35
+ fields: [
36
+ {
37
+ name: 'signature',
38
+ type: 'fixed64',
39
+ required: true
40
+ },
41
+ {
42
+ name: 'length',
43
+ type: 'uint',
44
+ required: true
45
+ }
46
+ ]
47
+ })
48
+
49
+ autobase.register({
50
+ name: 'boot-record-v0',
51
+ external: 'BootRecordV0'
52
+ })
53
+
54
+ autobase.register({
55
+ name: 'boot-record-raw',
56
+ fields: [
57
+ {
58
+ name: 'key',
59
+ type: 'fixed32',
60
+ required: true
61
+ },
62
+ {
63
+ name: 'systemLength',
64
+ type: 'uint',
65
+ required: true
66
+ },
67
+ {
68
+ name: 'indexersUpdated',
69
+ type: 'bool',
70
+ required: false
71
+ },
72
+ {
73
+ name: 'fastForwarding',
74
+ type: 'bool',
75
+ required: false
76
+ },
77
+ {
78
+ name: 'recoveries',
79
+ type: 'uint',
80
+ required: false
81
+ }
82
+ ]
83
+ })
84
+
85
+ autobase.register({
86
+ name: 'boot-record',
87
+ versions: [
88
+ {
89
+ version: 0,
90
+ type: '@autobase-compat/boot-record-v0'
91
+ },
92
+ {
93
+ version: 3,
94
+ type: '@autobase-compat/boot-record-raw'
95
+ }
96
+ ]
97
+ })
98
+
99
+ autobase.register({
100
+ name: 'checkpointer',
101
+ compact: true,
102
+ fields: [
103
+ {
104
+ name: 'checkpointer',
105
+ type: 'uint',
106
+ required: false
107
+ },
108
+ {
109
+ name: 'checkpoint',
110
+ type: '@autobase-compat/index-checkpoint',
111
+ required: false
112
+ }
113
+ ]
114
+ })
115
+
116
+ autobase.register({
117
+ name: 'checkpoint',
118
+ compact: false,
119
+ fields: [
120
+ {
121
+ name: 'system',
122
+ type: '@autobase-compat/checkpointer',
123
+ required: false
124
+ },
125
+ {
126
+ name: 'encryption',
127
+ type: '@autobase-compat/checkpointer',
128
+ required: false
129
+ },
130
+ {
131
+ name: 'user',
132
+ type: '@autobase-compat/checkpointer',
133
+ array: true,
134
+ required: false
135
+ }
136
+ ]
137
+ })
138
+
139
+ autobase.register({
140
+ name: 'digest',
141
+ compact: false,
142
+ fields: [
143
+ {
144
+ name: 'pointer',
145
+ type: 'uint',
146
+ required: false
147
+ },
148
+ {
149
+ name: 'key',
150
+ type: 'fixed32',
151
+ required: false
152
+ }
153
+ ]
154
+ })
155
+
156
+ autobase.register({
157
+ name: 'node',
158
+ compact: true,
159
+ fields: [
160
+ {
161
+ name: 'heads',
162
+ type: '@autobase-compat/clock',
163
+ required: true
164
+ },
165
+ {
166
+ name: 'batch',
167
+ type: 'uint',
168
+ required: true
169
+ },
170
+ {
171
+ name: 'value',
172
+ type: 'buffer',
173
+ required: true
174
+ }
175
+ ]
176
+ })
177
+
178
+ autobase.register({
179
+ name: 'user-view-trace',
180
+ compact: true,
181
+ fields: [
182
+ {
183
+ name: 'view',
184
+ type: 'uint',
185
+ required: true
186
+ },
187
+ {
188
+ name: 'blocks',
189
+ type: 'uint',
190
+ array: true,
191
+ required: true
192
+ }
193
+ ]
194
+ })
195
+
196
+ autobase.register({
197
+ name: 'trace',
198
+ compact: false,
199
+ fields: [
200
+ {
201
+ name: 'system',
202
+ type: 'uint',
203
+ array: true,
204
+ required: true
205
+ },
206
+ {
207
+ name: 'encryption',
208
+ type: 'uint',
209
+ array: true,
210
+ required: true
211
+ },
212
+ {
213
+ name: 'user',
214
+ type: '@autobase-compat/user-view-trace',
215
+ array: true,
216
+ required: true
217
+ }
218
+ ]
219
+ })
220
+
221
+ autobase.register({
222
+ name: 'oplog-message-v0',
223
+ external: 'OplogMessageV0'
224
+ })
225
+
226
+ autobase.register({
227
+ name: 'oplog-message-v1',
228
+ external: 'OplogMessageV1'
229
+ })
230
+
231
+ autobase.register({
232
+ name: 'oplog-message-v2',
233
+ compact: false,
234
+ fields: [
235
+ {
236
+ name: 'node',
237
+ type: '@autobase-compat/node',
238
+ required: true
239
+ },
240
+ {
241
+ name: 'checkpoint',
242
+ type: '@autobase-compat/checkpoint',
243
+ required: false
244
+ },
245
+ {
246
+ name: 'digest',
247
+ type: '@autobase-compat/digest',
248
+ required: false
249
+ },
250
+ {
251
+ name: 'optimistic',
252
+ type: 'bool',
253
+ required: false
254
+ },
255
+ {
256
+ name: 'trace',
257
+ type: '@autobase-compat/trace',
258
+ required: false
259
+ }
260
+ ]
261
+ })
262
+
263
+ autobase.register({
264
+ name: 'info-v1',
265
+ fields: [
266
+ {
267
+ name: 'members',
268
+ type: 'uint',
269
+ required: true
270
+ },
271
+ {
272
+ name: 'pendingIndexers',
273
+ type: 'fixed32',
274
+ array: true,
275
+ required: true
276
+ },
277
+ {
278
+ name: 'indexers',
279
+ type: '@autobase-compat/clock',
280
+ required: true
281
+ },
282
+ {
283
+ name: 'heads',
284
+ type: '@autobase-compat/clock',
285
+ required: true
286
+ },
287
+ {
288
+ name: 'views',
289
+ type: '@autobase-compat/clock',
290
+ required: true
291
+ }
292
+ ]
293
+ })
294
+
295
+ autobase.register({
296
+ name: 'info-v2',
297
+ fields: [
298
+ {
299
+ name: 'members',
300
+ type: 'uint',
301
+ required: true
302
+ },
303
+ {
304
+ name: 'pendingIndexers',
305
+ type: 'fixed32',
306
+ array: true,
307
+ required: true
308
+ },
309
+ {
310
+ name: 'indexers',
311
+ type: '@autobase-compat/clock',
312
+ required: true
313
+ },
314
+ {
315
+ name: 'heads',
316
+ type: '@autobase-compat/clock',
317
+ required: true
318
+ },
319
+ {
320
+ name: 'views',
321
+ type: '@autobase-compat/clock',
322
+ required: true
323
+ },
324
+ {
325
+ name: 'encryptionLength',
326
+ type: 'uint',
327
+ required: true
328
+ },
329
+ {
330
+ name: 'entropy',
331
+ type: 'fixed32',
332
+ required: false
333
+ }
334
+ ]
335
+ })
336
+
337
+ autobase.register({
338
+ name: 'member',
339
+ external: 'SystemWriterV0'
340
+ })
341
+ }
@@ -0,0 +1,317 @@
1
+ const c = require('compact-encoding')
2
+
3
+ const Checkout = {
4
+ preencode(state, m) {
5
+ c.fixed32.preencode(state, m.key)
6
+ c.uint.preencode(state, m.length)
7
+ },
8
+ encode(state, m) {
9
+ c.fixed32.encode(state, m.key)
10
+ c.uint.encode(state, m.length)
11
+ },
12
+ decode(state) {
13
+ return {
14
+ key: c.fixed32.decode(state),
15
+ length: c.uint.decode(state)
16
+ }
17
+ }
18
+ }
19
+
20
+ const Clock = c.array(Checkout)
21
+
22
+ const IndexCheckpoint = {
23
+ preencode(state, m) {
24
+ c.fixed64.preencode(state, m.signature)
25
+ c.uint.preencode(state, m.length)
26
+ },
27
+ encode(state, m) {
28
+ c.fixed64.encode(state, m.signature)
29
+ c.uint.encode(state, m.length)
30
+ },
31
+ decode(state) {
32
+ return {
33
+ signature: c.fixed64.decode(state),
34
+ length: c.uint.decode(state)
35
+ }
36
+ }
37
+ }
38
+
39
+ const BootRecordV0 = {
40
+ preencode() {
41
+ throw new Error('version 0 records cannot be encoded')
42
+ },
43
+ encode() {
44
+ throw new Error('version 0 records cannot be encoded')
45
+ },
46
+ decode(state) {
47
+ const indexed = Checkout.decode(state)
48
+ const heads = Clock.decode(state)
49
+
50
+ // one cause initial recover is not ff recovery
51
+ return {
52
+ version: 0,
53
+ key: indexed.key,
54
+ systemLength: indexed.length,
55
+ indexersUpdated: false,
56
+ fastForwarding: false,
57
+ recoveries: 1,
58
+ migrating: false,
59
+ heads
60
+ }
61
+ }
62
+ }
63
+
64
+ const Checkpointer = {
65
+ preencode(state, idx) {
66
+ c.uint.preencode(state, idx.checkpointer)
67
+ if (idx.checkpoint !== null) IndexCheckpoint.preencode(state, idx.checkpoint)
68
+ },
69
+ encode(state, idx) {
70
+ c.uint.encode(state, idx.checkpointer)
71
+ if (idx.checkpoint !== null) IndexCheckpoint.encode(state, idx.checkpoint)
72
+ },
73
+ decode(state) {
74
+ const checkpointer = c.uint.decode(state)
75
+ const checkpoint = checkpointer ? null : IndexCheckpoint.decode(state)
76
+
77
+ return {
78
+ checkpointer,
79
+ checkpoint
80
+ }
81
+ }
82
+ }
83
+
84
+ const CheckpointerArray = c.array(Checkpointer)
85
+
86
+ const Indexer = {
87
+ preencode(state, m) {
88
+ c.uint.preencode(state, m.signature)
89
+ c.fixed32.preencode(state, m.namespace)
90
+ c.fixed32.preencode(state, m.publicKey)
91
+ },
92
+ encode(state, m) {
93
+ c.uint.encode(state, m.signature)
94
+ c.fixed32.encode(state, m.namespace)
95
+ c.fixed32.encode(state, m.publicKey)
96
+ },
97
+ decode(state) {
98
+ return {
99
+ signature: c.uint.decode(state),
100
+ namespace: c.fixed32.decode(state),
101
+ publicKey: c.fixed32.decode(state)
102
+ }
103
+ }
104
+ }
105
+
106
+ const Indexers = c.array(Indexer)
107
+
108
+ const DigestV0 = {
109
+ preencode(state, m) {
110
+ c.uint.preencode(state, m.pointer)
111
+ if (m.pointer === 0) {
112
+ Indexers.preencode(state, m.indexers)
113
+ }
114
+ },
115
+ encode(state, m) {
116
+ c.uint.encode(state, m.pointer)
117
+ if (m.pointer === 0) {
118
+ Indexers.encode(state, m.indexers)
119
+ }
120
+ },
121
+ decode(state) {
122
+ const pointer = c.uint.decode(state)
123
+ return {
124
+ pointer,
125
+ indexers: pointer === 0 ? Indexers.decode(state) : null
126
+ }
127
+ }
128
+ }
129
+
130
+ const Digest = {
131
+ preencode(state, m) {
132
+ c.uint.preencode(state, m.pointer)
133
+ if (m.pointer === 0) {
134
+ c.fixed32.preencode(state, m.key)
135
+ }
136
+ },
137
+ encode(state, m) {
138
+ c.uint.encode(state, m.pointer)
139
+ if (m.pointer === 0) {
140
+ c.fixed32.encode(state, m.key)
141
+ }
142
+ },
143
+ decode(state) {
144
+ const pointer = c.uint.decode(state)
145
+ return {
146
+ pointer,
147
+ key: pointer === 0 ? c.fixed32.decode(state) : null
148
+ }
149
+ }
150
+ }
151
+
152
+ const Node = {
153
+ preencode(state, m) {
154
+ Clock.preencode(state, m.heads)
155
+ c.uint.preencode(state, m.batch)
156
+ c.buffer.preencode(state, m.value)
157
+ },
158
+ encode(state, m) {
159
+ Clock.encode(state, m.heads)
160
+ c.uint.encode(state, m.batch)
161
+ c.buffer.encode(state, m.value)
162
+ },
163
+ decode(state, m) {
164
+ return {
165
+ heads: Clock.decode(state),
166
+ batch: c.uint.decode(state),
167
+ value: c.buffer.decode(state)
168
+ }
169
+ }
170
+ }
171
+
172
+ const Additional = {
173
+ preencode(state, m) {
174
+ c.uint.preencode(state, m.pointer)
175
+ if (m.pointer === 0) {
176
+ AdditionalData.preencode(state, m.data)
177
+ }
178
+ },
179
+ encode(state, m) {
180
+ c.uint.encode(state, m.pointer)
181
+ if (m.pointer === 0) {
182
+ AdditionalData.encode(state, m.data)
183
+ }
184
+ },
185
+ decode(state) {
186
+ const pointer = c.uint.decode(state)
187
+ return {
188
+ pointer,
189
+ data: pointer === 0 ? AdditionalData.decode(state) : null
190
+ }
191
+ }
192
+ }
193
+
194
+ const AdditionalData = {
195
+ preencode(state, m) {
196
+ c.uint.preencode(state, 0)
197
+ },
198
+ encode(state, m) {
199
+ c.uint.encode(state, 0) // empty for now, for the future
200
+ },
201
+ decode(state) {
202
+ const flags = c.uint.decode(state)
203
+ return {
204
+ encryptionId: flags & 1 ? c.fixed32.decode(state) : null, // to help validate the encryption key used
205
+ abi: flags & 2 ? c.uint.decode(state) : 0
206
+ }
207
+ }
208
+ }
209
+
210
+ const OplogMessageV1 = {
211
+ preencode(state, m) {
212
+ throw new Error('Encoding not supported')
213
+ },
214
+ encode(state, m) {
215
+ throw new Error('Encoding not supported')
216
+ },
217
+ decode(state) {
218
+ const maxSupportedVersion = c.uint.decode(state)
219
+
220
+ const flags = c.uint.decode(state)
221
+
222
+ const isCheckpointer = (flags & 1) !== 0
223
+
224
+ const chk = isCheckpointer ? CheckpointerArray.decode(state) : null
225
+ const digest = isCheckpointer ? Digest.decode(state) : null
226
+
227
+ const node = Node.decode(state)
228
+
229
+ return {
230
+ version: 1,
231
+ maxSupportedVersion,
232
+ digest,
233
+ checkpoint: chk ? { system: chk[0], encryption: null, user: chk.slice(1) } : null,
234
+ optimistic: (flags & 2) !== 0,
235
+ node
236
+ }
237
+ }
238
+ }
239
+
240
+ const OplogMessageV0 = {
241
+ preencode(state, m) {
242
+ throw new Error('Encoding not supported')
243
+ },
244
+ encode(state, m) {
245
+ throw new Error('Encoding not supported')
246
+ },
247
+ decode(state) {
248
+ const flags = c.uint.decode(state)
249
+
250
+ const isCheckpointer = (flags & 1) !== 0
251
+
252
+ if (isCheckpointer) DigestV0.decode(state)
253
+ const chk = isCheckpointer ? CheckpointerArray.decode(state) : null
254
+ const node = Node.decode(state)
255
+ Additional.decode(state)
256
+ const maxSupportedVersion = state.start < state.end ? c.uint.decode(state) : 0
257
+
258
+ return {
259
+ version: 0,
260
+ maxSupportedVersion,
261
+ digest: null,
262
+ checkpoint: chk ? { system: chk[0], encryption: null, user: chk.slice(1) } : null,
263
+ optimistic: null,
264
+ node
265
+ }
266
+ }
267
+ }
268
+
269
+ const SystemWriterV0 = {
270
+ preencode(state, m) {
271
+ throw new Error('Encoding not supported')
272
+ },
273
+ encode(state, m) {
274
+ throw new Error('Encoding not supported')
275
+ },
276
+ decode(state) {
277
+ const flags = c.uint.decode(state)
278
+
279
+ return {
280
+ version: 0,
281
+ isIndexer: flags & 1,
282
+ isRemoved: flags & 2,
283
+ length: c.uint.decode(state)
284
+ }
285
+ }
286
+ }
287
+
288
+ function infoLegacyMap(info) {
289
+ return {
290
+ version: info.version,
291
+ members: info.members,
292
+ pendingIndexers: info.pendingIndexers,
293
+ indexers: info.indexers,
294
+ heads: info.heads,
295
+ views: info.views,
296
+ encryptionLength: 0,
297
+ entropy: null
298
+ }
299
+ }
300
+
301
+ function memberLegacyMap(m) {
302
+ return {
303
+ version: 0,
304
+ isRemoved: m.isRemoved,
305
+ weight: m.isIndexer ? 2 : 1,
306
+ length: m.length
307
+ }
308
+ }
309
+
310
+ module.exports = {
311
+ BootRecordV0,
312
+ OplogMessageV0,
313
+ OplogMessageV1,
314
+ SystemWriterV0,
315
+ infoLegacyMap,
316
+ memberLegacyMap
317
+ }