autopass 3.3.0 → 3.4.0
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.
- package/README.md +19 -2
- package/index.js +33 -20
- package/package.json +4 -3
- package/schema.js +31 -10
- package/spec/db/db.json +8 -8
- package/spec/db/index.js +50 -15
- package/spec/db/messages.js +146 -62
- package/spec/hyperdispatch/messages.js +101 -40
- package/spec/schema/index.js +101 -40
- package/spec/schema/schema.json +66 -24
- package/test.js +50 -8
package/spec/schema/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// This file is autogenerated by the hyperschema compiler
|
|
2
|
-
// Schema Version:
|
|
2
|
+
// Schema Version: 1
|
|
3
3
|
/* eslint-disable camelcase */
|
|
4
4
|
/* eslint-disable quotes */
|
|
5
5
|
/* eslint-disable space-before-function-paren */
|
|
6
6
|
|
|
7
7
|
const { c } = require('hyperschema/runtime')
|
|
8
8
|
|
|
9
|
-
const VERSION =
|
|
9
|
+
const VERSION = 1
|
|
10
10
|
|
|
11
11
|
// eslint-disable-next-line no-unused-vars
|
|
12
12
|
let version = VERSION
|
|
@@ -62,15 +62,26 @@ const encoding1 = {
|
|
|
62
62
|
const encoding2 = {
|
|
63
63
|
preencode(state, m) {
|
|
64
64
|
c.buffer.preencode(state, m.key)
|
|
65
|
+
state.end++ // max flag is 2 so always one byte
|
|
66
|
+
|
|
67
|
+
if (m.name) c.string.preencode(state, m.name)
|
|
65
68
|
},
|
|
66
69
|
encode(state, m) {
|
|
70
|
+
const flags = (m.name ? 1 : 0) | (m.readOnly ? 2 : 0)
|
|
71
|
+
|
|
67
72
|
c.buffer.encode(state, m.key)
|
|
73
|
+
c.uint.encode(state, flags)
|
|
74
|
+
|
|
75
|
+
if (m.name) c.string.encode(state, m.name)
|
|
68
76
|
},
|
|
69
77
|
decode(state) {
|
|
70
78
|
const r0 = c.buffer.decode(state)
|
|
79
|
+
const flags = c.uint.decode(state)
|
|
71
80
|
|
|
72
81
|
return {
|
|
73
|
-
key: r0
|
|
82
|
+
key: r0,
|
|
83
|
+
name: (flags & 1) !== 0 ? c.string.decode(state) : null,
|
|
84
|
+
readOnly: (flags & 2) !== 0
|
|
74
85
|
}
|
|
75
86
|
}
|
|
76
87
|
}
|
|
@@ -92,8 +103,78 @@ const encoding3 = {
|
|
|
92
103
|
}
|
|
93
104
|
}
|
|
94
105
|
|
|
95
|
-
// @autopass/
|
|
106
|
+
// @autopass/invitee
|
|
96
107
|
const encoding4 = {
|
|
108
|
+
preencode(state, m) {
|
|
109
|
+
c.fixed32.preencode(state, m.key)
|
|
110
|
+
state.end++ // max flag is 1 so always one byte
|
|
111
|
+
|
|
112
|
+
if (m.name) c.string.preencode(state, m.name)
|
|
113
|
+
},
|
|
114
|
+
encode(state, m) {
|
|
115
|
+
const flags = m.name ? 1 : 0
|
|
116
|
+
|
|
117
|
+
c.fixed32.encode(state, m.key)
|
|
118
|
+
c.uint.encode(state, flags)
|
|
119
|
+
|
|
120
|
+
if (m.name) c.string.encode(state, m.name)
|
|
121
|
+
},
|
|
122
|
+
decode(state) {
|
|
123
|
+
const r0 = c.fixed32.decode(state)
|
|
124
|
+
const flags = c.uint.decode(state)
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
key: r0,
|
|
128
|
+
name: (flags & 1) !== 0 ? c.string.decode(state) : null
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// @autopass/public-invite-metadata
|
|
134
|
+
const encoding5 = {
|
|
135
|
+
preencode(state, m) {
|
|
136
|
+
state.end++ // max flag is 1 so always one byte
|
|
137
|
+
},
|
|
138
|
+
encode(state, m) {
|
|
139
|
+
const flags = m.readOnly ? 1 : 0
|
|
140
|
+
|
|
141
|
+
c.uint.encode(state, flags)
|
|
142
|
+
},
|
|
143
|
+
decode(state) {
|
|
144
|
+
const flags = c.uint.decode(state)
|
|
145
|
+
|
|
146
|
+
return {
|
|
147
|
+
readOnly: (flags & 1) !== 0
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// @autopass/additional-invite-data
|
|
153
|
+
const encoding6 = {
|
|
154
|
+
preencode(state, m) {
|
|
155
|
+
c.buffer.preencode(state, m.data)
|
|
156
|
+
c.buffer.preencode(state, m.signature)
|
|
157
|
+
},
|
|
158
|
+
encode(state, m) {
|
|
159
|
+
c.buffer.encode(state, m.data)
|
|
160
|
+
c.buffer.encode(state, m.signature)
|
|
161
|
+
},
|
|
162
|
+
decode(state) {
|
|
163
|
+
const r0 = c.buffer.decode(state)
|
|
164
|
+
const r1 = c.buffer.decode(state)
|
|
165
|
+
|
|
166
|
+
return {
|
|
167
|
+
data: r0,
|
|
168
|
+
signature: r1
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// @autopass/invite.additional
|
|
174
|
+
const encoding7_5 = c.frame(encoding6)
|
|
175
|
+
|
|
176
|
+
// @autopass/invite
|
|
177
|
+
const encoding7 = {
|
|
97
178
|
preencode(state, m) {
|
|
98
179
|
c.buffer.preencode(state, m.id)
|
|
99
180
|
c.buffer.preencode(state, m.invite)
|
|
@@ -101,10 +182,10 @@ const encoding4 = {
|
|
|
101
182
|
c.int.preencode(state, m.expires)
|
|
102
183
|
state.end++ // max flag is 2 so always one byte
|
|
103
184
|
|
|
104
|
-
if (
|
|
185
|
+
if (m.additional) encoding7_5.preencode(state, m.additional)
|
|
105
186
|
},
|
|
106
187
|
encode(state, m) {
|
|
107
|
-
const flags = (
|
|
188
|
+
const flags = (m.readOnly ? 1 : 0) | (m.additional ? 2 : 0)
|
|
108
189
|
|
|
109
190
|
c.buffer.encode(state, m.id)
|
|
110
191
|
c.buffer.encode(state, m.invite)
|
|
@@ -112,28 +193,28 @@ const encoding4 = {
|
|
|
112
193
|
c.int.encode(state, m.expires)
|
|
113
194
|
c.uint.encode(state, flags)
|
|
114
195
|
|
|
115
|
-
if (
|
|
196
|
+
if (m.additional) encoding7_5.encode(state, m.additional)
|
|
116
197
|
},
|
|
117
198
|
decode(state) {
|
|
118
199
|
const r0 = c.buffer.decode(state)
|
|
119
200
|
const r1 = c.buffer.decode(state)
|
|
120
201
|
const r2 = c.buffer.decode(state)
|
|
121
202
|
const r3 = c.int.decode(state)
|
|
122
|
-
const flags =
|
|
203
|
+
const flags = c.uint.decode(state)
|
|
123
204
|
|
|
124
205
|
return {
|
|
125
206
|
id: r0,
|
|
126
207
|
invite: r1,
|
|
127
208
|
publicKey: r2,
|
|
128
209
|
expires: r3,
|
|
129
|
-
readOnly:
|
|
130
|
-
additional:
|
|
210
|
+
readOnly: (flags & 1) !== 0,
|
|
211
|
+
additional: (flags & 2) !== 0 ? encoding7_5.decode(state) : null
|
|
131
212
|
}
|
|
132
213
|
}
|
|
133
214
|
}
|
|
134
215
|
|
|
135
216
|
// @autopass/del-invite
|
|
136
|
-
const
|
|
217
|
+
const encoding8 = {
|
|
137
218
|
preencode(state, m) {
|
|
138
219
|
c.buffer.preencode(state, m.id)
|
|
139
220
|
},
|
|
@@ -150,31 +231,7 @@ const encoding5 = {
|
|
|
150
231
|
}
|
|
151
232
|
|
|
152
233
|
// @autopass/del-mirror
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
// @autopass/additional-invite-data
|
|
156
|
-
const encoding7 = {
|
|
157
|
-
preencode(state, m) {
|
|
158
|
-
c.buffer.preencode(state, m.data)
|
|
159
|
-
c.buffer.preencode(state, m.signature)
|
|
160
|
-
},
|
|
161
|
-
encode(state, m) {
|
|
162
|
-
c.buffer.encode(state, m.data)
|
|
163
|
-
c.buffer.encode(state, m.signature)
|
|
164
|
-
},
|
|
165
|
-
decode(state) {
|
|
166
|
-
const r0 = c.buffer.decode(state)
|
|
167
|
-
const r1 = c.buffer.decode(state)
|
|
168
|
-
|
|
169
|
-
return {
|
|
170
|
-
data: r0,
|
|
171
|
-
signature: r1
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// @autopass/invite.additional, deferred due to recusive use
|
|
177
|
-
const encoding4_5 = c.frame(encoding7)
|
|
234
|
+
const encoding9 = encoding1
|
|
178
235
|
|
|
179
236
|
function setVersion(v) {
|
|
180
237
|
version = v
|
|
@@ -207,14 +264,18 @@ function getEncoding(name) {
|
|
|
207
264
|
return encoding2
|
|
208
265
|
case '@autopass/delete':
|
|
209
266
|
return encoding3
|
|
210
|
-
case '@autopass/
|
|
267
|
+
case '@autopass/invitee':
|
|
211
268
|
return encoding4
|
|
212
|
-
case '@autopass/
|
|
269
|
+
case '@autopass/public-invite-metadata':
|
|
213
270
|
return encoding5
|
|
214
|
-
case '@autopass/del-mirror':
|
|
215
|
-
return encoding6
|
|
216
271
|
case '@autopass/additional-invite-data':
|
|
272
|
+
return encoding6
|
|
273
|
+
case '@autopass/invite':
|
|
217
274
|
return encoding7
|
|
275
|
+
case '@autopass/del-invite':
|
|
276
|
+
return encoding8
|
|
277
|
+
case '@autopass/del-mirror':
|
|
278
|
+
return encoding9
|
|
218
279
|
default:
|
|
219
280
|
throw new Error('Encoder not found ' + name)
|
|
220
281
|
}
|
package/spec/schema/schema.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version":
|
|
2
|
+
"version": 1,
|
|
3
3
|
"schema": [
|
|
4
4
|
{
|
|
5
5
|
"name": "records",
|
|
@@ -45,13 +45,23 @@
|
|
|
45
45
|
"name": "writer",
|
|
46
46
|
"namespace": "autopass",
|
|
47
47
|
"compact": false,
|
|
48
|
-
"flagsPosition":
|
|
48
|
+
"flagsPosition": 1,
|
|
49
49
|
"fields": [
|
|
50
50
|
{
|
|
51
51
|
"name": "key",
|
|
52
52
|
"required": true,
|
|
53
53
|
"type": "buffer",
|
|
54
54
|
"version": 1
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "name",
|
|
58
|
+
"type": "string",
|
|
59
|
+
"version": 1
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "readOnly",
|
|
63
|
+
"type": "bool",
|
|
64
|
+
"version": 1
|
|
55
65
|
}
|
|
56
66
|
]
|
|
57
67
|
},
|
|
@@ -69,6 +79,58 @@
|
|
|
69
79
|
}
|
|
70
80
|
]
|
|
71
81
|
},
|
|
82
|
+
{
|
|
83
|
+
"name": "invitee",
|
|
84
|
+
"namespace": "autopass",
|
|
85
|
+
"compact": false,
|
|
86
|
+
"flagsPosition": 1,
|
|
87
|
+
"fields": [
|
|
88
|
+
{
|
|
89
|
+
"name": "key",
|
|
90
|
+
"required": true,
|
|
91
|
+
"type": "fixed32",
|
|
92
|
+
"version": 1
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "name",
|
|
96
|
+
"type": "string",
|
|
97
|
+
"version": 1
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"name": "public-invite-metadata",
|
|
103
|
+
"namespace": "autopass",
|
|
104
|
+
"compact": false,
|
|
105
|
+
"flagsPosition": 0,
|
|
106
|
+
"fields": [
|
|
107
|
+
{
|
|
108
|
+
"name": "readOnly",
|
|
109
|
+
"type": "bool",
|
|
110
|
+
"version": 1
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"name": "additional-invite-data",
|
|
116
|
+
"namespace": "autopass",
|
|
117
|
+
"compact": false,
|
|
118
|
+
"flagsPosition": -1,
|
|
119
|
+
"fields": [
|
|
120
|
+
{
|
|
121
|
+
"name": "data",
|
|
122
|
+
"required": true,
|
|
123
|
+
"type": "buffer",
|
|
124
|
+
"version": 1
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"name": "signature",
|
|
128
|
+
"required": true,
|
|
129
|
+
"type": "buffer",
|
|
130
|
+
"version": 1
|
|
131
|
+
}
|
|
132
|
+
]
|
|
133
|
+
},
|
|
72
134
|
{
|
|
73
135
|
"name": "invite",
|
|
74
136
|
"namespace": "autopass",
|
|
@@ -103,13 +165,13 @@
|
|
|
103
165
|
"name": "readOnly",
|
|
104
166
|
"required": false,
|
|
105
167
|
"type": "bool",
|
|
106
|
-
"version":
|
|
168
|
+
"version": 1
|
|
107
169
|
},
|
|
108
170
|
{
|
|
109
171
|
"name": "additional",
|
|
110
172
|
"required": false,
|
|
111
173
|
"type": "@autopass/additional-invite-data",
|
|
112
|
-
"version":
|
|
174
|
+
"version": 1
|
|
113
175
|
}
|
|
114
176
|
]
|
|
115
177
|
},
|
|
@@ -140,26 +202,6 @@
|
|
|
140
202
|
"version": 1
|
|
141
203
|
}
|
|
142
204
|
]
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
"name": "additional-invite-data",
|
|
146
|
-
"namespace": "autopass",
|
|
147
|
-
"compact": false,
|
|
148
|
-
"flagsPosition": -1,
|
|
149
|
-
"fields": [
|
|
150
|
-
{
|
|
151
|
-
"name": "data",
|
|
152
|
-
"required": true,
|
|
153
|
-
"type": "buffer",
|
|
154
|
-
"version": 3
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
"name": "signature",
|
|
158
|
-
"required": true,
|
|
159
|
-
"type": "buffer",
|
|
160
|
-
"version": 3
|
|
161
|
-
}
|
|
162
|
-
]
|
|
163
205
|
}
|
|
164
206
|
]
|
|
165
207
|
}
|
package/test.js
CHANGED
|
@@ -44,9 +44,8 @@ test('invites', async function (t) {
|
|
|
44
44
|
await b.ready()
|
|
45
45
|
|
|
46
46
|
t.teardown(async () => await b.close())
|
|
47
|
-
b
|
|
48
|
-
|
|
49
|
-
})
|
|
47
|
+
await updateUntil(b, () => b.base.system.members === 2)
|
|
48
|
+
t.pass('b has two members')
|
|
50
49
|
})
|
|
51
50
|
|
|
52
51
|
test('invites', async function (t) {
|
|
@@ -76,9 +75,41 @@ test('invites', async function (t) {
|
|
|
76
75
|
await b.ready()
|
|
77
76
|
|
|
78
77
|
t.teardown(async () => await b.close())
|
|
79
|
-
b
|
|
80
|
-
|
|
78
|
+
await updateUntil(b, () => b.base.system.members === 2)
|
|
79
|
+
t.pass('b has two members')
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
test.solo('invite with name', async function (t) {
|
|
83
|
+
t.plan(3)
|
|
84
|
+
|
|
85
|
+
const tn = await testnet(10, t)
|
|
86
|
+
|
|
87
|
+
const a = await create(t, { bootstrap: tn.bootstrap })
|
|
88
|
+
t.teardown(async () => {
|
|
89
|
+
await a.close()
|
|
81
90
|
})
|
|
91
|
+
|
|
92
|
+
const updateListener = function () {
|
|
93
|
+
if (a.base.system.members === 2) {
|
|
94
|
+
t.pass('a has two members')
|
|
95
|
+
a.removeListener('update', updateListener) // Remove the listener in teardown
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
a.on('update', updateListener)
|
|
100
|
+
|
|
101
|
+
const inv = await a.createInvite()
|
|
102
|
+
|
|
103
|
+
const p = await pair(t, inv, { bootstrap: tn.bootstrap, name: 'maf' })
|
|
104
|
+
|
|
105
|
+
const b = await p.finished()
|
|
106
|
+
await b.ready()
|
|
107
|
+
|
|
108
|
+
t.teardown(async () => await b.close())
|
|
109
|
+
await updateUntil(b, () => b.base.system.members === 2)
|
|
110
|
+
t.pass('b has two members')
|
|
111
|
+
const arr = await b.listWriters().toArray()
|
|
112
|
+
t.is(arr[0].name, 'maf')
|
|
82
113
|
})
|
|
83
114
|
|
|
84
115
|
test('invite resets when createInvite type is different than previous', async function (t) {
|
|
@@ -143,9 +174,8 @@ test('blind encryption', async function (t) {
|
|
|
143
174
|
t.ok(encryptionKeyEncryptedBuffer)
|
|
144
175
|
|
|
145
176
|
t.teardown(async () => await b.close())
|
|
146
|
-
b
|
|
147
|
-
|
|
148
|
-
})
|
|
177
|
+
await updateUntil(b, () => b.base.system.members === 2)
|
|
178
|
+
if (b.base.system.members === 2) t.pass('b has two members')
|
|
149
179
|
})
|
|
150
180
|
|
|
151
181
|
test('suspend and resume', async function (t) {
|
|
@@ -207,3 +237,15 @@ async function pair(t, inv, opts) {
|
|
|
207
237
|
const a = Autopass.pair(new Corestore(dir), inv, opts)
|
|
208
238
|
return a
|
|
209
239
|
}
|
|
240
|
+
|
|
241
|
+
function updateUntil(b, fn) {
|
|
242
|
+
return new Promise((resolve) => {
|
|
243
|
+
if (fn()) return resolve()
|
|
244
|
+
const check = () => {
|
|
245
|
+
if (!fn()) return
|
|
246
|
+
b.off('update', check)
|
|
247
|
+
resolve()
|
|
248
|
+
}
|
|
249
|
+
b.on('update', check)
|
|
250
|
+
})
|
|
251
|
+
}
|