nervur 0.7.0 → 0.7.2
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/admin.mjs +10 -5
- package/being.mjs +52 -25
- package/ground.mjs +6 -8
- package/package.json +1 -1
- package/program.mjs +10 -0
package/admin.mjs
CHANGED
|
@@ -4,7 +4,8 @@ const ADMIN = `({
|
|
|
4
4
|
memory: { 'aliases/*': { type: 'String', class: 'data' } },
|
|
5
5
|
interface: \`
|
|
6
6
|
input RefInput { address: String!, nextPkHash: String, rights: String }
|
|
7
|
-
type
|
|
7
|
+
type Resident { address: String!, alias: String, digest: String, active: Boolean! }
|
|
8
|
+
type Census { residents: [Resident!]!, stored: Int!, active: Int! }
|
|
8
9
|
type Query {
|
|
9
10
|
census: Census @rights(is: [SELF, MEMBER])
|
|
10
11
|
aliasOf(name: String!): String @rights(is: [SELF, MEMBER])
|
|
@@ -23,10 +24,14 @@ const ADMIN = `({
|
|
|
23
24
|
\`,
|
|
24
25
|
resolvers: {
|
|
25
26
|
Query: {
|
|
26
|
-
census: (_, __, { registry }) =>
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
census: (_, __, { registry }) => {
|
|
28
|
+
const residents = registry.residents();
|
|
29
|
+
return {
|
|
30
|
+
active: residents.filter((one) => one.active).length,
|
|
31
|
+
residents,
|
|
32
|
+
stored: residents.length,
|
|
33
|
+
};
|
|
34
|
+
},
|
|
30
35
|
aliasOf: (_, { name }, { modules }) => modules.memory.read('aliases/' + name),
|
|
31
36
|
attest: (_, { module }, { registry }) => registry.attest(module),
|
|
32
37
|
opened: (_, __, { modules }) => modules.memory.list('refs/').length > 0,
|
package/being.mjs
CHANGED
|
@@ -169,6 +169,9 @@ const Being = ({ voice, address, modules, registry, vouched, watch }) => {
|
|
|
169
169
|
}
|
|
170
170
|
const rights = self ? 'SELF' : (row?.rights ?? 'STRANGER');
|
|
171
171
|
if (op?.describe !== undefined) {
|
|
172
|
+
if (program !== undefined && !program.visible(rights)) {
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
172
175
|
return answer({
|
|
173
176
|
address,
|
|
174
177
|
digest: program?.digest,
|
|
@@ -254,6 +257,7 @@ const make = ({ memory, voice, address, program }) => {
|
|
|
254
257
|
const Registry = ({
|
|
255
258
|
memory,
|
|
256
259
|
adminMine,
|
|
260
|
+
address,
|
|
257
261
|
modules,
|
|
258
262
|
modulesFor,
|
|
259
263
|
announce,
|
|
@@ -263,22 +267,21 @@ const Registry = ({
|
|
|
263
267
|
watch,
|
|
264
268
|
}) => {
|
|
265
269
|
const live = new Map();
|
|
266
|
-
const activate = (
|
|
267
|
-
if (live.has(
|
|
268
|
-
return live.get(
|
|
270
|
+
const activate = (at) => {
|
|
271
|
+
if (live.has(at)) {
|
|
272
|
+
return live.get(at);
|
|
269
273
|
}
|
|
270
|
-
const held = adminMine.read(`identity/custody/${
|
|
274
|
+
const held = adminMine.read(`identity/custody/${at}`);
|
|
271
275
|
const voice = held === undefined ? undefined : Voice.revive(held);
|
|
272
276
|
if (voice === undefined) {
|
|
273
277
|
return undefined;
|
|
274
278
|
}
|
|
275
|
-
const door = Being({ voice, address, modules: modulesFor(voice), vouched, watch });
|
|
276
|
-
live.set(
|
|
279
|
+
const door = Being({ voice, address: at, modules: modulesFor(voice), vouched, watch });
|
|
280
|
+
live.set(at, door);
|
|
277
281
|
return door;
|
|
278
282
|
};
|
|
279
283
|
return Object.freeze({
|
|
280
284
|
activate,
|
|
281
|
-
active: () => live.size,
|
|
282
285
|
attest,
|
|
283
286
|
create: ({ program, refs = [], data = {}, bindings, config } = {}) => {
|
|
284
287
|
const written = program === undefined ? undefined : Program(program);
|
|
@@ -326,43 +329,67 @@ const Registry = ({
|
|
|
326
329
|
announce(address);
|
|
327
330
|
return address;
|
|
328
331
|
},
|
|
329
|
-
deactivate: (
|
|
330
|
-
upgrade: ({ address, program }) => {
|
|
331
|
-
const held = adminMine.read(`identity/custody/${address}`);
|
|
332
|
-
const voice = held === undefined ? undefined : Voice.revive(held);
|
|
332
|
+
deactivate: (at) => live.delete(at),
|
|
333
|
+
upgrade: ({ address: target, program }) => {
|
|
333
334
|
const written = program === undefined ? undefined : Program(program);
|
|
334
|
-
if (
|
|
335
|
+
if (written === undefined) {
|
|
335
336
|
return undefined;
|
|
336
337
|
}
|
|
337
338
|
const orphaned = memory
|
|
338
|
-
.list(
|
|
339
|
-
.filter((key) => memory.read(
|
|
339
|
+
.list(target, '')
|
|
340
|
+
.filter((key) => memory.read(target, key)?.value !== null)
|
|
340
341
|
.filter((key) => written.classOf(key) === undefined);
|
|
341
342
|
if (orphaned.length > 0) {
|
|
342
343
|
return undefined;
|
|
343
344
|
}
|
|
345
|
+
if (target === address) {
|
|
346
|
+
return adminMine.write('program', program) === undefined ? undefined : target;
|
|
347
|
+
}
|
|
348
|
+
const held = adminMine.read(`identity/custody/${target}`);
|
|
349
|
+
const voice = held === undefined ? undefined : Voice.revive(held);
|
|
350
|
+
if (voice === undefined) {
|
|
351
|
+
return undefined;
|
|
352
|
+
}
|
|
344
353
|
const claim = {
|
|
345
|
-
address,
|
|
354
|
+
address: target,
|
|
346
355
|
key: 'program',
|
|
347
356
|
value: program,
|
|
348
|
-
version: (memory.read(
|
|
357
|
+
version: (memory.read(target, 'program')?.version ?? 0) + 1,
|
|
349
358
|
};
|
|
350
359
|
if (memory.write({ ...claim, sig: voice.sign(Tools.canon(claim)) }) === undefined) {
|
|
351
360
|
return undefined;
|
|
352
361
|
}
|
|
353
|
-
live.delete(
|
|
354
|
-
return
|
|
362
|
+
live.delete(target);
|
|
363
|
+
return target;
|
|
355
364
|
},
|
|
356
|
-
destroy: (
|
|
357
|
-
if (adminMine.read(`identity/custody/${
|
|
365
|
+
destroy: (at) => {
|
|
366
|
+
if (adminMine.read(`identity/custody/${at}`) === undefined) {
|
|
358
367
|
return undefined;
|
|
359
368
|
}
|
|
360
|
-
adminMine.write(`identity/custody/${
|
|
361
|
-
live.delete(
|
|
362
|
-
forget(
|
|
363
|
-
return
|
|
369
|
+
adminMine.write(`identity/custody/${at}`, undefined);
|
|
370
|
+
live.delete(at);
|
|
371
|
+
forget(at);
|
|
372
|
+
return at;
|
|
373
|
+
},
|
|
374
|
+
residents: () => {
|
|
375
|
+
const aliasFor = new Map();
|
|
376
|
+
for (const key of adminMine.list('aliases/')) {
|
|
377
|
+
const named = adminMine.read(key);
|
|
378
|
+
if (typeof named === 'string') {
|
|
379
|
+
aliasFor.set(named, key.slice('aliases/'.length));
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return adminMine.list('identity/custody/').map((key) => {
|
|
383
|
+
const at = key.slice('identity/custody/'.length);
|
|
384
|
+
const digest = Program(memory.read(at, 'program')?.value)?.digest ?? null;
|
|
385
|
+
return {
|
|
386
|
+
address: at,
|
|
387
|
+
alias: aliasFor.get(at) ?? null,
|
|
388
|
+
active: live.has(at),
|
|
389
|
+
digest,
|
|
390
|
+
};
|
|
391
|
+
});
|
|
364
392
|
},
|
|
365
|
-
stored: () => adminMine.list('identity/custody/').length,
|
|
366
393
|
});
|
|
367
394
|
};
|
|
368
395
|
|
package/ground.mjs
CHANGED
|
@@ -147,6 +147,7 @@ const Ground = (modules = {}) => {
|
|
|
147
147
|
const registry = Registry({
|
|
148
148
|
memory,
|
|
149
149
|
adminMine,
|
|
150
|
+
address,
|
|
150
151
|
modules: adminModules,
|
|
151
152
|
modulesFor,
|
|
152
153
|
announce,
|
|
@@ -155,14 +156,11 @@ const Ground = (modules = {}) => {
|
|
|
155
156
|
attest,
|
|
156
157
|
watch,
|
|
157
158
|
});
|
|
158
|
-
const admin =
|
|
159
|
-
voice: adminVoice,
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
vouched,
|
|
164
|
-
watch,
|
|
165
|
-
});
|
|
159
|
+
const admin = (envelope, token) =>
|
|
160
|
+
Being({ voice: adminVoice, address, modules: adminModules, registry, vouched, watch })(
|
|
161
|
+
envelope,
|
|
162
|
+
token,
|
|
163
|
+
);
|
|
166
164
|
|
|
167
165
|
announce(address);
|
|
168
166
|
for (const key of adminMine.list('identity/custody/')) {
|
package/package.json
CHANGED
package/program.mjs
CHANGED
|
@@ -68,6 +68,16 @@ const Program = (source) => {
|
|
|
68
68
|
name: blueprint.name,
|
|
69
69
|
rights: blueprint.rights,
|
|
70
70
|
sdlFor: blueprint.sdlFor,
|
|
71
|
+
visible: (held) => {
|
|
72
|
+
const filtered = seenBy(held);
|
|
73
|
+
if (filtered === undefined) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
const rooted = [filtered.getQueryType(), filtered.getMutationType()].filter(
|
|
77
|
+
(one) => one !== undefined && one !== null,
|
|
78
|
+
);
|
|
79
|
+
return rooted.some((one) => Object.keys(one.getFields()).length > 0);
|
|
80
|
+
},
|
|
71
81
|
});
|
|
72
82
|
};
|
|
73
83
|
|