@haverstack/core 0.42.0 → 0.44.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 +6 -9
- package/dist/access.d.ts +36 -34
- package/dist/access.d.ts.map +1 -1
- package/dist/access.js +51 -100
- package/dist/access.js.map +1 -1
- package/dist/adapter/combine.d.ts.map +1 -1
- package/dist/adapter/combine.js +14 -7
- package/dist/adapter/combine.js.map +1 -1
- package/dist/adapter/copy.d.ts +27 -0
- package/dist/adapter/copy.d.ts.map +1 -0
- package/dist/adapter/copy.js +105 -0
- package/dist/adapter/copy.js.map +1 -0
- package/dist/adapter/index.d.ts +9 -4
- package/dist/adapter/index.d.ts.map +1 -1
- package/dist/adapter/index.js +6 -3
- package/dist/adapter/index.js.map +1 -1
- package/dist/adapter/reach.d.ts +14 -0
- package/dist/adapter/reach.d.ts.map +1 -0
- package/dist/adapter/reach.js +31 -0
- package/dist/adapter/reach.js.map +1 -0
- package/dist/adapter/seed.d.ts +13 -0
- package/dist/adapter/seed.d.ts.map +1 -0
- package/dist/adapter/seed.js +26 -0
- package/dist/adapter/seed.js.map +1 -0
- package/dist/associations/identity.d.ts +18 -42
- package/dist/associations/identity.d.ts.map +1 -1
- package/dist/associations/identity.js +60 -84
- package/dist/associations/identity.js.map +1 -1
- package/dist/associations/validation.d.ts +1 -8
- package/dist/associations/validation.d.ts.map +1 -1
- package/dist/associations/validation.js +3 -30
- package/dist/associations/validation.js.map +1 -1
- package/dist/collection.d.ts +7 -11
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +24 -34
- package/dist/collection.js.map +1 -1
- package/dist/content-match.d.ts +2 -2
- package/dist/content-match.js +2 -2
- package/dist/errors.d.ts +41 -12
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +56 -15
- package/dist/errors.js.map +1 -1
- package/dist/grants.d.ts +18 -6
- package/dist/grants.d.ts.map +1 -1
- package/dist/grants.js +48 -37
- package/dist/grants.js.map +1 -1
- package/dist/hash.d.ts +8 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +14 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +29 -5
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +69 -44
- package/dist/install.js.map +1 -1
- package/dist/lazy.d.ts +13 -0
- package/dist/lazy.d.ts.map +1 -0
- package/dist/lazy.js +27 -0
- package/dist/lazy.js.map +1 -0
- package/dist/merge.d.ts +1 -1
- package/dist/merge.js +1 -1
- package/dist/query-validation.d.ts +41 -28
- package/dist/query-validation.d.ts.map +1 -1
- package/dist/query-validation.js +85 -71
- package/dist/query-validation.js.map +1 -1
- package/dist/record-changes.d.ts +12 -36
- package/dist/record-changes.d.ts.map +1 -1
- package/dist/record-changes.js +9 -98
- package/dist/record-changes.js.map +1 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2 -5
- package/dist/schema.js.map +1 -1
- package/dist/scoped-stack/authority-snapshot.d.ts +37 -0
- package/dist/scoped-stack/authority-snapshot.d.ts.map +1 -0
- package/dist/scoped-stack/authority-snapshot.js +49 -0
- package/dist/scoped-stack/authority-snapshot.js.map +1 -0
- package/dist/scoped-stack/authority.d.ts +69 -51
- package/dist/scoped-stack/authority.d.ts.map +1 -1
- package/dist/scoped-stack/authority.js +189 -153
- package/dist/scoped-stack/authority.js.map +1 -1
- package/dist/scoped-stack/family-policy.d.ts +59 -0
- package/dist/scoped-stack/family-policy.d.ts.map +1 -0
- package/dist/scoped-stack/family-policy.js +68 -0
- package/dist/scoped-stack/family-policy.js.map +1 -0
- package/dist/scoped-stack/scoped-stack.d.ts +73 -86
- package/dist/scoped-stack/scoped-stack.d.ts.map +1 -1
- package/dist/scoped-stack/scoped-stack.js +279 -337
- package/dist/scoped-stack/scoped-stack.js.map +1 -1
- package/dist/scoped-stack/subscription.d.ts +14 -33
- package/dist/scoped-stack/subscription.d.ts.map +1 -1
- package/dist/scoped-stack/subscription.js +16 -57
- package/dist/scoped-stack/subscription.js.map +1 -1
- package/dist/stack/arguments.d.ts +27 -0
- package/dist/stack/arguments.d.ts.map +1 -0
- package/dist/stack/arguments.js +53 -0
- package/dist/stack/arguments.js.map +1 -0
- package/dist/stack/attachments.d.ts +1 -1
- package/dist/stack/attachments.js +1 -1
- package/dist/stack/changes.d.ts +4 -10
- package/dist/stack/changes.d.ts.map +1 -1
- package/dist/stack/changes.js +8 -8
- package/dist/stack/changes.js.map +1 -1
- package/dist/stack/client.d.ts +34 -58
- package/dist/stack/client.d.ts.map +1 -1
- package/dist/stack/field-rules.d.ts +27 -0
- package/dist/stack/field-rules.d.ts.map +1 -0
- package/dist/stack/field-rules.js +50 -0
- package/dist/stack/field-rules.js.map +1 -0
- package/dist/stack/install-app.d.ts +2 -2
- package/dist/stack/install-app.d.ts.map +1 -1
- package/dist/stack/install-app.js +16 -14
- package/dist/stack/install-app.js.map +1 -1
- package/dist/stack/integrity.d.ts +9 -53
- package/dist/stack/integrity.d.ts.map +1 -1
- package/dist/stack/integrity.js +47 -107
- package/dist/stack/integrity.js.map +1 -1
- package/dist/stack/limits.d.ts +1 -1
- package/dist/stack/limits.js +1 -1
- package/dist/stack/reads.d.ts +9 -5
- package/dist/stack/reads.d.ts.map +1 -1
- package/dist/stack/reads.js +24 -4
- package/dist/stack/reads.js.map +1 -1
- package/dist/stack/stack.d.ts +84 -79
- package/dist/stack/stack.d.ts.map +1 -1
- package/dist/stack/stack.js +236 -306
- package/dist/stack/stack.js.map +1 -1
- package/dist/stack/system-types.d.ts.map +1 -1
- package/dist/stack/system-types.js +1 -3
- package/dist/stack/system-types.js.map +1 -1
- package/dist/stack/type-grants.d.ts.map +1 -1
- package/dist/stack/type-grants.js +9 -6
- package/dist/stack/type-grants.js.map +1 -1
- package/dist/stack/write-expectation.d.ts +13 -12
- package/dist/stack/write-expectation.d.ts.map +1 -1
- package/dist/stack/write-expectation.js.map +1 -1
- package/dist/stack/write-gate.d.ts +23 -0
- package/dist/stack/write-gate.d.ts.map +1 -0
- package/dist/stack/write-gate.js +17 -0
- package/dist/stack/write-gate.js.map +1 -0
- package/dist/testing.d.ts +37 -24
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +176 -153
- package/dist/testing.js.map +1 -1
- package/dist/types/adapter.d.ts +115 -43
- package/dist/types/adapter.d.ts.map +1 -1
- package/dist/types/associations.d.ts +1 -17
- package/dist/types/associations.d.ts.map +1 -1
- package/dist/types/associations.js +1 -8
- package/dist/types/associations.js.map +1 -1
- package/dist/types/capabilities.d.ts +8 -8
- package/dist/types/capabilities.d.ts.map +1 -1
- package/dist/types/events.d.ts +3 -8
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/query.d.ts +4 -4
- package/dist/types/system.d.ts +2 -8
- package/dist/types/system.d.ts.map +1 -1
- package/dist/types/system.js.map +1 -1
- package/dist/validate.d.ts +2 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +2 -1
- package/dist/validate.js.map +1 -1
- package/dist/wire/body.d.ts +32 -9
- package/dist/wire/body.d.ts.map +1 -1
- package/dist/wire/body.js +69 -8
- package/dist/wire/body.js.map +1 -1
- package/dist/wire/index.d.ts +4 -4
- package/dist/wire/index.d.ts.map +1 -1
- package/dist/wire/index.js +3 -3
- package/dist/wire/index.js.map +1 -1
- package/dist/wire/record.d.ts +1 -8
- package/dist/wire/record.d.ts.map +1 -1
- package/dist/wire/record.js +0 -48
- package/dist/wire/record.js.map +1 -1
- package/dist/wire/request.d.ts +18 -18
- package/dist/wire/request.d.ts.map +1 -1
- package/dist/wire/request.js +41 -36
- package/dist/wire/request.js.map +1 -1
- package/package.json +1 -1
- package/dist/stack/identity-bindings.d.ts +0 -13
- package/dist/stack/identity-bindings.d.ts.map +0 -1
- package/dist/stack/identity-bindings.js +0 -36
- package/dist/stack/identity-bindings.js.map +0 -1
package/dist/record-changes.js
CHANGED
|
@@ -3,65 +3,19 @@
|
|
|
3
3
|
* -------------------------------------------------------
|
|
4
4
|
* Two jobs that share one question — what does this Record actually say?
|
|
5
5
|
*
|
|
6
|
-
* The
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* The write helpers answer it against a proposed write: whether a patch
|
|
7
|
+
* moved content, and whether the ops a write reports bump its version.
|
|
8
|
+
* The projections answer it against a reader: a soft-deleted Record is its
|
|
9
|
+
* tombstone, and a journal entry names the ACL it moved only to a reader
|
|
10
|
+
* who could have moved it.
|
|
11
11
|
*
|
|
12
12
|
* See docs/spec/events.md § The event shape and docs/spec/versioning.md
|
|
13
13
|
* § The tombstone is literal.
|
|
14
14
|
*/
|
|
15
|
-
import {
|
|
16
|
-
import { associationDelta, isAuthorityAssociation } from './associations/identity.js';
|
|
17
|
-
import { RECORD_CHANGE_SET_KEYS } from './types/index.js';
|
|
18
|
-
/**
|
|
19
|
-
* A change set has to name at least one aspect. Refused rather than read
|
|
20
|
-
* as a no-op: it addresses nothing, so there is nothing it could have
|
|
21
|
-
* failed to satisfy, and every way of producing one is a caller bug —
|
|
22
|
-
* typically a conditional that built an empty object.
|
|
23
|
-
* See docs/spec/data-model.md § Mutations.
|
|
24
|
-
*/
|
|
25
|
-
export function assertNonEmptyChangeSet(changes) {
|
|
26
|
-
// Presence, not truthiness: `unlisted: false` and `parentId: null` are
|
|
27
|
-
// aspects this call names.
|
|
28
|
-
if (RECORD_CHANGE_SET_KEYS.some((key) => changes[key] !== undefined))
|
|
29
|
-
return;
|
|
30
|
-
throw new StackBadRequestError('A change set names at least one of: ' + RECORD_CHANGE_SET_KEYS.join(', ') + '.');
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Which aspects a change set actually moves, against the record as it
|
|
34
|
-
* stands. A key naming the value a record already holds contributes
|
|
35
|
-
* nothing. `merged` is the content the patch produces, computed once by the
|
|
36
|
-
* caller that had to validate it anyway.
|
|
37
|
-
*/
|
|
38
|
-
export function changeSetOps(existing, changes, merged) {
|
|
39
|
-
const ops = [];
|
|
40
|
-
if (merged !== undefined && !contentEqual(existing.content, merged))
|
|
41
|
-
ops.push('patch');
|
|
42
|
-
if (changes.parentId !== undefined && changes.parentId !== (existing.parentId ?? null)) {
|
|
43
|
-
ops.push('reparent');
|
|
44
|
-
}
|
|
45
|
-
if (changes.permissions &&
|
|
46
|
-
associationDelta(existing.permissions ?? [], changes.permissions).length > 0) {
|
|
47
|
-
ops.push('reshare');
|
|
48
|
-
}
|
|
49
|
-
if (changes.associations) {
|
|
50
|
-
const delta = associationDelta(existing.associations ?? [], changes.associations);
|
|
51
|
-
if (delta.some((c) => c.op !== 'remove'))
|
|
52
|
-
ops.push('associate');
|
|
53
|
-
if (delta.some((c) => c.op === 'remove'))
|
|
54
|
-
ops.push('dissociate');
|
|
55
|
-
}
|
|
56
|
-
if (changes.unlisted !== undefined && Boolean(existing.unlistedAt) !== changes.unlisted) {
|
|
57
|
-
ops.push(changes.unlisted ? 'unlist' : 'list');
|
|
58
|
-
}
|
|
59
|
-
return ops;
|
|
60
|
-
}
|
|
15
|
+
import { isAuthorityAssociation } from './associations/identity.js';
|
|
61
16
|
/**
|
|
62
17
|
* The ops whose prior state the journal already carries in full, so a
|
|
63
|
-
* snapshot would preserve nothing a restore could not otherwise reach.
|
|
64
|
-
* change set naming only these is a no-bump write.
|
|
18
|
+
* snapshot would preserve nothing a restore could not otherwise reach.
|
|
65
19
|
* See docs/spec/versioning.md § Version history.
|
|
66
20
|
*/
|
|
67
21
|
const NO_BUMP_OPS = new Set([
|
|
@@ -73,62 +27,19 @@ const NO_BUMP_OPS = new Set([
|
|
|
73
27
|
'list',
|
|
74
28
|
]);
|
|
75
29
|
/**
|
|
76
|
-
* Whether a
|
|
30
|
+
* Whether a write's ops advance `version`/`updatedAt` at all. After the
|
|
77
31
|
* no-bump set above, this is `patch` and the whole-record verbs.
|
|
78
32
|
*/
|
|
79
33
|
export function bumpsVersion(ops) {
|
|
80
34
|
return ops.some((op) => !NO_BUMP_OPS.has(op));
|
|
81
35
|
}
|
|
82
|
-
/**
|
|
83
|
-
* The keys that guard nothing, because none of them moves `version` — a
|
|
84
|
-
* precondition on it would fence a write that the number it names cannot
|
|
85
|
-
* describe. See docs/spec/versioning.md § Optimistic concurrency.
|
|
86
|
-
*/
|
|
87
|
-
const NO_PRECONDITION_KEYS = new Set([
|
|
88
|
-
'associations',
|
|
89
|
-
'permissions',
|
|
90
|
-
'parentId',
|
|
91
|
-
'unlisted',
|
|
92
|
-
]);
|
|
93
|
-
/**
|
|
94
|
-
* Whether `ifVersion` applies to a change set. A set naming only keys from
|
|
95
|
-
* the no-precondition list above carries none; any other aspect named
|
|
96
|
-
* restores the guard over the whole call. Read off the keys the caller
|
|
97
|
-
* wrote rather than the ops the set turns out to move, so a stale caller is
|
|
98
|
-
* told its version is stale whatever its patch says.
|
|
99
|
-
*/
|
|
100
|
-
export function takesIfVersion(changes) {
|
|
101
|
-
return RECORD_CHANGE_SET_KEYS.some((key) => !NO_PRECONDITION_KEYS.has(key) && changes[key] !== undefined);
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* The change set narrowed to the aspects that actually moved. An adapter is
|
|
105
|
-
* handed this rather than what the caller wrote, so restating an aspect
|
|
106
|
-
* cannot rewrite it: `unlisted: true` on an already-unlisted record would
|
|
107
|
-
* otherwise drag `unlistedAt` forward with no op reporting it. Every key an
|
|
108
|
-
* adapter receives is one it must write.
|
|
109
|
-
*/
|
|
110
|
-
export function effectiveChanges(changes, ops) {
|
|
111
|
-
const effective = {};
|
|
112
|
-
if (ops.includes('patch'))
|
|
113
|
-
effective.contentPatch = changes.contentPatch;
|
|
114
|
-
if (ops.includes('reparent'))
|
|
115
|
-
effective.parentId = changes.parentId;
|
|
116
|
-
if (ops.includes('reshare'))
|
|
117
|
-
effective.permissions = changes.permissions;
|
|
118
|
-
if (ops.includes('associate') || ops.includes('dissociate')) {
|
|
119
|
-
effective.associations = changes.associations;
|
|
120
|
-
}
|
|
121
|
-
if (ops.includes('unlist') || ops.includes('list'))
|
|
122
|
-
effective.unlisted = changes.unlisted;
|
|
123
|
-
return effective;
|
|
124
|
-
}
|
|
125
36
|
/**
|
|
126
37
|
* Whether a merge patch produced the content already held, compared by
|
|
127
38
|
* serialization: a patch preserves the order of every key it does not name.
|
|
128
39
|
* A pure reordering is the one false "change", costing an empty version
|
|
129
40
|
* rather than a wrong answer.
|
|
130
41
|
*/
|
|
131
|
-
function contentEqual(a, b) {
|
|
42
|
+
export function contentEqual(a, b) {
|
|
132
43
|
return JSON.stringify(a) === JSON.stringify(b);
|
|
133
44
|
}
|
|
134
45
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-changes.js","sourceRoot":"","sources":["../src/record-changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"record-changes.js","sourceRoot":"","sources":["../src/record-changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAQpE;;;;GAIG;AACH,MAAM,WAAW,GAA0B,IAAI,GAAG,CAAW;IAC3D,WAAW;IACX,YAAY;IACZ,SAAS;IACT,UAAU;IACV,QAAQ;IACR,MAAM;CACP,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAe;IAC1C,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,CAA0B,EAAE,CAA0B;IACjF,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,MAAmB;IACtC,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,EAAE;QACX,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;QACtE,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;QACzE,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;KAC7E,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAmB,EAAe,EAAE,CACjE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAElD;;;;GAIG;AACH,SAAS,cAAc,CAAC,MAAyB;IAC/C,OAAO,sBAAsB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAyB;IAC/D,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACpD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAE,IAA2B,CAAC;AACtF,CAAC"}
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAsE3D;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAU,QAAQ,UAAU,KAAG,OAAO,CAAC,MAAM,CAEnE,CAAC;AAmFF;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GACvB,iBAAiB,kBAAkB,EACnC,gBAAgB,kBAAkB,KACjC,OAA8F,CAAC;AASlG,MAAM,MAAM,oBAAoB,GAAG;IACjC,qHAAqH;IACrH,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAmGF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,UAAU,EAAE,WAAW,UAAU,KAAG,oBAAoB,EAI3F,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,kBAAkB,KAAG,MAAM,EAGrC,CAAC;AAM7B;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,KAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAIlF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,KAAG,MAA+C,CAAC;AAE1F;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,MAAM,EAAE,cAAc,OAAO,KAAG,MAAM,GAAG,IAW3E,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,EAAE,OAAO,MAAM,KAAG,MAAM,GAAG,IAWxE,CAAC"}
|
package/dist/schema.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* the namespaced ID controlled by the app author.
|
|
13
13
|
*/
|
|
14
14
|
import { formatEnumValues } from './validate.js';
|
|
15
|
+
import { sha256Hex } from './hash.js';
|
|
15
16
|
// -------------------------------------------------------
|
|
16
17
|
// Canonical schema serialization
|
|
17
18
|
// -------------------------------------------------------
|
|
@@ -76,11 +77,7 @@ const canonicalizeSchema = (schema) => {
|
|
|
76
77
|
* schemas hash differently, the schema was mutated without a version bump.
|
|
77
78
|
*/
|
|
78
79
|
export const hashSchema = async (schema) => {
|
|
79
|
-
|
|
80
|
-
const buffer = new TextEncoder().encode(canonical);
|
|
81
|
-
const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);
|
|
82
|
-
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
83
|
-
return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
80
|
+
return sha256Hex(JSON.stringify(canonicalizeSchema(schema)));
|
|
84
81
|
};
|
|
85
82
|
// -------------------------------------------------------
|
|
86
83
|
// Type compatibility
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authority snapshot
|
|
3
|
+
* -------------------------------------------------------
|
|
4
|
+
* The authority one request acts with, read once: the `_grant` Records,
|
|
5
|
+
* the roles the subject holds on rosters, and the reach each verb builds
|
|
6
|
+
* from them — each loaded on first use and shared after, so an operation
|
|
7
|
+
* reads each at most once however many Records it decides. An operation
|
|
8
|
+
* takes its own and drops it when done; a subscription holds one for its
|
|
9
|
+
* life, which is only safe because every write that can move it arrives as
|
|
10
|
+
* an event that clears it. See docs/spec/access-control.md § Reach.
|
|
11
|
+
*/
|
|
12
|
+
import type { RosterRoles } from '../access.js';
|
|
13
|
+
import type { Reach, StackRecord } from '../types/index.js';
|
|
14
|
+
/** The verbs a reach is built for: one per thing a request can do to a Record. */
|
|
15
|
+
export type ReachVerb = 'create' | 'read' | 'update' | 'delete';
|
|
16
|
+
export type AuthoritySources = {
|
|
17
|
+
grants: () => Promise<StackRecord[]>;
|
|
18
|
+
roles: RosterRoles;
|
|
19
|
+
reach: (verb: ReachVerb, snapshot: AuthoritySnapshot) => Promise<Reach>;
|
|
20
|
+
};
|
|
21
|
+
export declare class AuthoritySnapshot {
|
|
22
|
+
private readonly sources;
|
|
23
|
+
private readonly grantSet;
|
|
24
|
+
private readonly roleSet;
|
|
25
|
+
private readonly reaches;
|
|
26
|
+
constructor(sources: AuthoritySources);
|
|
27
|
+
readonly grants: () => Promise<StackRecord[]>;
|
|
28
|
+
readonly roles: RosterRoles;
|
|
29
|
+
reach(verb: ReachVerb): Promise<Reach>;
|
|
30
|
+
/**
|
|
31
|
+
* Drop whatever a change to `typeFamily` can move, and every reach built
|
|
32
|
+
* from it. A load already in flight still answers the event that started
|
|
33
|
+
* it, which precedes the write; the next question loads afresh.
|
|
34
|
+
*/
|
|
35
|
+
invalidateFor(typeFamily: string): void;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=authority-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authority-snapshot.d.ts","sourceRoot":"","sources":["../../src/scoped-stack/authority-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE5D,kFAAkF;AAClF,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACrC,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;CACzE,CAAC;AAEF,qBAAa,iBAAiB;IAKhB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;gBAEhC,OAAO,EAAE,gBAAgB;IAKtD,QAAQ,CAAC,MAAM,QAAO,OAAO,CAAC,WAAW,EAAE,CAAC,CAAwB;IACpE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAA4B;IAEvD,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;IAStC;;;;OAIG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAMxC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authority snapshot
|
|
3
|
+
* -------------------------------------------------------
|
|
4
|
+
* The authority one request acts with, read once: the `_grant` Records,
|
|
5
|
+
* the roles the subject holds on rosters, and the reach each verb builds
|
|
6
|
+
* from them — each loaded on first use and shared after, so an operation
|
|
7
|
+
* reads each at most once however many Records it decides. An operation
|
|
8
|
+
* takes its own and drops it when done; a subscription holds one for its
|
|
9
|
+
* life, which is only safe because every write that can move it arrives as
|
|
10
|
+
* an event that clears it. See docs/spec/access-control.md § Reach.
|
|
11
|
+
*/
|
|
12
|
+
import { Lazy } from '../lazy.js';
|
|
13
|
+
import { SYSTEM_TYPES } from '../types/index.js';
|
|
14
|
+
export class AuthoritySnapshot {
|
|
15
|
+
sources;
|
|
16
|
+
grantSet;
|
|
17
|
+
roleSet;
|
|
18
|
+
reaches = new Map();
|
|
19
|
+
constructor(sources) {
|
|
20
|
+
this.sources = sources;
|
|
21
|
+
this.grantSet = new Lazy(sources.grants);
|
|
22
|
+
this.roleSet = new Lazy(sources.roles);
|
|
23
|
+
}
|
|
24
|
+
grants = () => this.grantSet.get();
|
|
25
|
+
roles = () => this.roleSet.get();
|
|
26
|
+
reach(verb) {
|
|
27
|
+
let reach = this.reaches.get(verb);
|
|
28
|
+
if (!reach) {
|
|
29
|
+
reach = new Lazy(() => this.sources.reach(verb, this));
|
|
30
|
+
this.reaches.set(verb, reach);
|
|
31
|
+
}
|
|
32
|
+
return reach.get();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Drop whatever a change to `typeFamily` can move, and every reach built
|
|
36
|
+
* from it. A load already in flight still answers the event that started
|
|
37
|
+
* it, which precedes the write; the next question loads afresh.
|
|
38
|
+
*/
|
|
39
|
+
invalidateFor(typeFamily) {
|
|
40
|
+
if (typeFamily === SYSTEM_TYPES.GRANT)
|
|
41
|
+
this.grantSet.clear();
|
|
42
|
+
else if (typeFamily === SYSTEM_TYPES.GROUP)
|
|
43
|
+
this.roleSet.clear();
|
|
44
|
+
else
|
|
45
|
+
return;
|
|
46
|
+
this.reaches.clear();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=authority-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authority-snapshot.js","sourceRoot":"","sources":["../../src/scoped-stack/authority-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAajD,MAAM,OAAO,iBAAiB;IAKC;IAJZ,QAAQ,CAAsB;IAC9B,OAAO,CAAyC;IAChD,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE7D,YAA6B,OAAyB;QAAzB,YAAO,GAAP,OAAO,CAAkB;QACpD,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAEQ,MAAM,GAAG,GAA2B,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IAC3D,KAAK,GAAgB,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEvD,KAAK,CAAC,IAAe;QACnB,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,UAAkB;QAC9B,IAAI,UAAU,KAAK,YAAY,CAAC,KAAK;YAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;aACxD,IAAI,UAAU,KAAK,YAAY,CAAC,KAAK;YAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;;YAC5D,OAAO;QACZ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -8,24 +8,37 @@
|
|
|
8
8
|
* writes. See docs/spec/access-control.md § Delegation: principal and
|
|
9
9
|
* subject.
|
|
10
10
|
*/
|
|
11
|
-
import type {
|
|
11
|
+
import type { ReachedRecord } from '../adapter/reach.js';
|
|
12
12
|
import { StackError } from '../errors.js';
|
|
13
|
-
import type {
|
|
13
|
+
import type { SplitQuery } from '../query-validation.js';
|
|
14
|
+
import { AuthoritySnapshot } from './authority-snapshot.js';
|
|
15
|
+
import type { ReachVerb } from './authority-snapshot.js';
|
|
16
|
+
import type { Actor, EntityId, QueryResult, Reach, StackRecord, TypeId } from '../types/index.js';
|
|
14
17
|
import type { Stack } from '../stack/stack.js';
|
|
18
|
+
/** What a fence or reshare decision reads: reach, plus a `_group`'s roster. */
|
|
19
|
+
export type GatedRecord = ReachedRecord & Pick<StackRecord, 'associations'>;
|
|
15
20
|
export declare class ScopeAuthority {
|
|
16
21
|
private readonly stack;
|
|
17
22
|
/** Whose grants bound what this request may do — see ScopedStack.principalId. */
|
|
18
23
|
readonly principalId: EntityId | null;
|
|
19
24
|
/** Whom this request acts for and attributes writes to — see ScopedStack.subjectId. */
|
|
20
25
|
readonly subjectId: EntityId | null;
|
|
26
|
+
/** Stack.query() within a reach — see ScopedStack.query(). */
|
|
27
|
+
private readonly queryReadable;
|
|
21
28
|
constructor(stack: Stack,
|
|
22
29
|
/** Whose grants bound what this request may do — see ScopedStack.principalId. */
|
|
23
30
|
principalId: EntityId | null,
|
|
24
31
|
/** Whom this request acts for and attributes writes to — see ScopedStack.subjectId. */
|
|
25
|
-
subjectId: EntityId | null
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
subjectId: EntityId | null,
|
|
33
|
+
/** Stack.query() within a reach — see ScopedStack.query(). */
|
|
34
|
+
queryReadable: (split: SplitQuery, reach: Reach) => Promise<QueryResult>);
|
|
35
|
+
/**
|
|
36
|
+
* The authority this request acts with, for one operation: pass it to
|
|
37
|
+
* each check the operation makes, so the grants, the rosters and each
|
|
38
|
+
* verb's reach are read at most once. An anonymous request is named by no
|
|
39
|
+
* grant and held by no roster, so it reads neither.
|
|
40
|
+
*/
|
|
41
|
+
snapshot(): AuthoritySnapshot;
|
|
29
42
|
/** Whether a delegated app is acting for someone other than itself. */
|
|
30
43
|
get delegated(): boolean;
|
|
31
44
|
/**
|
|
@@ -50,55 +63,66 @@ export declare class ScopeAuthority {
|
|
|
50
63
|
* See docs/spec/access-control.md § Delegation: principal and subject.
|
|
51
64
|
*/
|
|
52
65
|
get ownerActingAlone(): boolean;
|
|
53
|
-
/** Whether the record's own permissions let the subject `mode` it. */
|
|
54
|
-
recordPermits(record: StackRecord, mode: AccessMode): Promise<boolean>;
|
|
55
66
|
/**
|
|
56
|
-
* Whether
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
|
|
67
|
+
* Whether no grant bounds the principal: undelegated, it is the subject
|
|
68
|
+
* itself, and the owner as principal is the owner's own software.
|
|
69
|
+
* See docs/spec/access-control.md § Delegation: principal and subject.
|
|
70
|
+
*/
|
|
71
|
+
private get principalUnbounded();
|
|
72
|
+
/**
|
|
73
|
+
* The families `grantee`'s grants convey one of `actions` on, read the way
|
|
74
|
+
* `side` reads a grant. Only the subject's side counts a group, so the
|
|
75
|
+
* rosters read are always the subject's.
|
|
76
|
+
* See docs/spec/access-control.md § Who a grant reaches.
|
|
60
77
|
*/
|
|
61
|
-
private
|
|
78
|
+
private familiesConveying;
|
|
62
79
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
80
|
+
* What this request may do with `verb` — that verb's rules, built whole
|
|
81
|
+
* even where a Record's own permissions would settle it, since every gate
|
|
82
|
+
* asks one value at a flat cost. The principal's grants fence it; within,
|
|
83
|
+
* the subject reaches what grants and permissions give it, an owner
|
|
84
|
+
* subject everything. See docs/spec/access-control.md § Reach.
|
|
67
85
|
*/
|
|
68
|
-
|
|
86
|
+
private buildReach;
|
|
69
87
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* installMayMigrate().
|
|
88
|
+
* The permission elements carrying `bit` to the subject, as the sets a
|
|
89
|
+
* Record must hold whole. A `read` stands alone, as does `anyone`; a
|
|
90
|
+
* `write` stands beside one of its readCompanions().
|
|
74
91
|
*/
|
|
75
|
-
|
|
92
|
+
private elementSets;
|
|
93
|
+
/** Whether this request may `verb` the Record: its reach, asked of one Record. */
|
|
94
|
+
may(verb: ReachVerb, record: ReachedRecord, snapshot: AuthoritySnapshot): Promise<boolean>;
|
|
76
95
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* subject is the entity a grant is written about.
|
|
96
|
+
* may() with the principal's fence set aside — whether the subject alone
|
|
97
|
+
* reaches the Record, for a refusal that says which side lacked the verb.
|
|
80
98
|
*/
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}): Promise<boolean>;
|
|
99
|
+
subjectMay(verb: ReachVerb, record: ReachedRecord, snapshot: AuthoritySnapshot): Promise<boolean>;
|
|
100
|
+
canRead(record: ReachedRecord, snapshot: AuthoritySnapshot): Promise<boolean>;
|
|
101
|
+
/** Whether this request may create a Record of the type, asked of the Record it would make. */
|
|
102
|
+
canCreate(typeId: TypeId, snapshot: AuthoritySnapshot): Promise<boolean>;
|
|
86
103
|
/**
|
|
87
104
|
* How to refuse a record this request addressed by ID: a permission error
|
|
88
105
|
* to a requester who can read it, the not-found answer to anyone else, so
|
|
89
106
|
* `message` only reaches someone holding the record already.
|
|
90
107
|
* See docs/spec/disclosure.md § Which refusal a Record answers with.
|
|
91
108
|
*/
|
|
92
|
-
denialFor(record: StackRecord, message: string): Promise<StackError>;
|
|
93
|
-
canRead(record: StackRecord, prefetchedGrants?: StackRecord[], groupRoles?: Map<string, GroupRole | null>): Promise<boolean>;
|
|
94
|
-
checkCreateGrant(typeId: TypeId): Promise<boolean>;
|
|
109
|
+
denialFor(record: StackRecord, message: string, snapshot: AuthoritySnapshot): Promise<StackError>;
|
|
95
110
|
/**
|
|
96
111
|
* `_group` records are managed, not merely written: only the owner or an
|
|
97
112
|
* `admin` roster holder may mutate them — ordinary write permissions and
|
|
98
|
-
* grants don't apply.
|
|
99
|
-
* a
|
|
113
|
+
* grants don't apply. Under delegation the subject must manage the Group
|
|
114
|
+
* and the principal must be the owner: a roster entry, like a group
|
|
115
|
+
* grant, never counts on the principal's side.
|
|
116
|
+
* See docs/spec/access-control.md § Delegation: principal and subject.
|
|
100
117
|
*/
|
|
101
|
-
isGroupManager(record: StackRecord): boolean;
|
|
118
|
+
isGroupManager(record: Pick<StackRecord, 'associations'>): boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Whether this request passes `record`'s family fence: none for an
|
|
121
|
+
* ordinary family, the owner acting alone for `_grant` and `_install`, the
|
|
122
|
+
* Group's managers for `_group`. Asked of the Record a create would make
|
|
123
|
+
* as of a stored one. See docs/spec/access-control.md § Per-verb gates.
|
|
124
|
+
*/
|
|
125
|
+
passesWriterFence(record: GatedRecord): boolean;
|
|
102
126
|
/** Whether one identity, on its own, manages `record` — see isGroupManager(). */
|
|
103
127
|
private managesGroup;
|
|
104
128
|
/**
|
|
@@ -107,37 +131,30 @@ export declare class ScopeAuthority {
|
|
|
107
131
|
* owner acting alone skips the lookup and leaves absence to `Stack`.
|
|
108
132
|
* See docs/spec/access-control.md § Reference-creation gating.
|
|
109
133
|
*/
|
|
110
|
-
canReadReferent(recordId: string): Promise<boolean>;
|
|
134
|
+
canReadReferent(recordId: string, snapshot: AuthoritySnapshot): Promise<boolean>;
|
|
111
135
|
/**
|
|
112
136
|
* Whether this request can read some record referencing `fileId`, other
|
|
113
137
|
* than an `_attachment@1` record — otherwise one correct guess would
|
|
114
138
|
* unlock unlimited further metadata records for the file.
|
|
115
139
|
* See docs/spec/attachments.md § Creating `_attachment@1` records directly.
|
|
116
140
|
*/
|
|
117
|
-
hasReadableReference(fileId: string): Promise<boolean>;
|
|
141
|
+
hasReadableReference(fileId: string, snapshot: AuthoritySnapshot): Promise<boolean>;
|
|
118
142
|
/**
|
|
119
143
|
* Whether this request may reference or download `fileId` — the dual of
|
|
120
144
|
* getAttachment()'s access rule. Nonexistent and inaccessible are
|
|
121
145
|
* indistinguishable (both false), so no confirmation oracle for guessed
|
|
122
146
|
* hashes. See docs/spec/access-control.md § Reference-creation gating.
|
|
123
147
|
*/
|
|
124
|
-
canAccessFile(fileId: string): Promise<boolean>;
|
|
148
|
+
canAccessFile(fileId: string, snapshot: AuthoritySnapshot): Promise<boolean>;
|
|
125
149
|
/**
|
|
126
150
|
* Whether this request is an installed app, acting as itself, migrating
|
|
127
151
|
* `record` within families its one live install claims, to a version the
|
|
128
152
|
* owner approved, holding `update-any` on each directly.
|
|
129
153
|
* See docs/spec/apps.md § Migrating an installed app's types.
|
|
130
154
|
*/
|
|
131
|
-
installMayMigrate(record: StackRecord, toTypeId: TypeId): Promise<boolean>;
|
|
155
|
+
installMayMigrate(record: StackRecord, toTypeId: TypeId, snapshot: AuthoritySnapshot): Promise<boolean>;
|
|
132
156
|
/** Names of the type's top-level file-ref fields — the content-reference half of referencesFileId matching. */
|
|
133
157
|
fileRefFieldNames(typeId: TypeId): Promise<string[]>;
|
|
134
|
-
/**
|
|
135
|
-
* Whether this request may widen who reaches a record, at create time or
|
|
136
|
-
* after. A delegated app may not, unless the owner is its principal:
|
|
137
|
-
* widening access is what containment most needs to hold.
|
|
138
|
-
* See docs/spec/access-control.md § Delegation: principal and subject.
|
|
139
|
-
*/
|
|
140
|
-
mayGrantAccess(): boolean;
|
|
141
158
|
/**
|
|
142
159
|
* Whether one identity, on its own, may decide who else reaches `record`
|
|
143
160
|
* — the owner-or-creator rule a reshare enforces, asked of one
|
|
@@ -148,9 +165,10 @@ export declare class ScopeAuthority {
|
|
|
148
165
|
/**
|
|
149
166
|
* Whether this request may decide who else reaches `record`: management
|
|
150
167
|
* for a `_group`, so a demoted creator keeps no side door; otherwise the
|
|
151
|
-
* owner-or-author rule, asked of both sides of a delegation
|
|
152
|
-
*
|
|
168
|
+
* owner-or-author rule, asked of both sides of a delegation, of a record
|
|
169
|
+
* the request can read. Asked of a create's Record before it exists too.
|
|
170
|
+
* See docs/spec/access-control.md § Write implies read.
|
|
153
171
|
*/
|
|
154
|
-
canReshare(record:
|
|
172
|
+
canReshare(record: GatedRecord, snapshot: AuthoritySnapshot): Promise<boolean>;
|
|
155
173
|
}
|
|
156
174
|
//# sourceMappingURL=authority.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../../src/scoped-stack/authority.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../../src/scoped-stack/authority.ts"],"names":[],"mappings":"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"}
|