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 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 Census { stored: Int!, active: Int! }
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
- active: registry.active(),
28
- stored: registry.stored(),
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 = (address) => {
267
- if (live.has(address)) {
268
- return live.get(address);
270
+ const activate = (at) => {
271
+ if (live.has(at)) {
272
+ return live.get(at);
269
273
  }
270
- const held = adminMine.read(`identity/custody/${address}`);
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(address, door);
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: (address) => live.delete(address),
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 (voice === undefined || written === undefined) {
335
+ if (written === undefined) {
335
336
  return undefined;
336
337
  }
337
338
  const orphaned = memory
338
- .list(address, '')
339
- .filter((key) => memory.read(address, key)?.value !== null)
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(address, 'program')?.version ?? 0) + 1,
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(address);
354
- return address;
362
+ live.delete(target);
363
+ return target;
355
364
  },
356
- destroy: (address) => {
357
- if (adminMine.read(`identity/custody/${address}`) === undefined) {
365
+ destroy: (at) => {
366
+ if (adminMine.read(`identity/custody/${at}`) === undefined) {
358
367
  return undefined;
359
368
  }
360
- adminMine.write(`identity/custody/${address}`, undefined);
361
- live.delete(address);
362
- forget(address);
363
- return address;
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 = Being({
159
- voice: adminVoice,
160
- address,
161
- modules: adminModules,
162
- registry,
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nervur",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "A distributed system of sovereign beings — one door, one question: by whose authority.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Razvan Gherghina",
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