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.
@@ -1,12 +1,12 @@
1
1
  // This file is autogenerated by the hyperschema compiler
2
- // Schema Version: 3
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 = 3
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/invite
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 (version >= 3 && m.additional) encoding4_5.preencode(state, m.additional)
185
+ if (m.additional) encoding7_5.preencode(state, m.additional)
105
186
  },
106
187
  encode(state, m) {
107
- const flags = (version >= 2 && m.readOnly ? 1 : 0) | (version >= 3 && m.additional ? 2 : 0)
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 (version >= 3 && m.additional) encoding4_5.encode(state, m.additional)
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 = state.start < state.end ? c.uint.decode(state) : 0
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: version >= 2 && (flags & 1) !== 0,
130
- additional: version >= 3 && (flags & 2) !== 0 ? encoding4_5.decode(state) : null
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 encoding5 = {
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 encoding6 = encoding1
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/invite':
267
+ case '@autopass/invitee':
211
268
  return encoding4
212
- case '@autopass/del-invite':
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
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": 3,
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": -1,
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": 2
168
+ "version": 1
107
169
  },
108
170
  {
109
171
  "name": "additional",
110
172
  "required": false,
111
173
  "type": "@autopass/additional-invite-data",
112
- "version": 3
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.on('update', function () {
48
- if (b.base.system.members === 2) t.pass('b has two members')
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.on('update', function () {
80
- if (b.base.system.members === 2) t.pass('b has two members')
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.on('update', function () {
147
- if (b.base.system.members === 2) t.pass('b has two members')
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
+ }