@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/stack/integrity.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Write invariants
|
|
3
3
|
* -------------------------------------------------------
|
|
4
|
-
* The integrity rules a Stack write owes whoever makes it —
|
|
5
|
-
* bindings, containment, attachment metadata
|
|
4
|
+
* The integrity rules a Stack write owes whoever makes it — immutable
|
|
5
|
+
* fields, DID and appId bindings, containment, attachment metadata and a
|
|
6
6
|
* group's admin roster. They bind every requester, the stack owner
|
|
7
7
|
* included, which is why they live beneath `ScopedStack`'s permission
|
|
8
8
|
* gates rather than among them. Each reads unscoped: through the Stack it
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { hasGroupAdmin, isGroupRecord } from '../access.js';
|
|
12
12
|
import { ARGUMENTS_INVALID, StackConflictError, StackValidationError } from '../errors.js';
|
|
13
|
-
import {
|
|
13
|
+
import { bindingsOf, immutableFieldsOf, isUnset } from './field-rules.js';
|
|
14
14
|
import { filtersContent } from '../query-validation.js';
|
|
15
15
|
import { associationIdentical } from '../associations/identity.js';
|
|
16
16
|
import { validateRecordId } from './record-id.js';
|
|
@@ -18,63 +18,59 @@ import { baseIdOf } from '../schema.js';
|
|
|
18
18
|
import { findFirstMatch } from './reads.js';
|
|
19
19
|
import { SYSTEM_TYPES } from '../types/index.js';
|
|
20
20
|
// -------------------------------------------------------
|
|
21
|
-
//
|
|
21
|
+
// Content writes
|
|
22
22
|
// -------------------------------------------------------
|
|
23
|
-
/** Uniqueness for every unique binding field a newly created card claims. */
|
|
24
|
-
export async function checkBindingsOnCreate(stack, typeId, content) {
|
|
25
|
-
const family = baseIdOf(typeId);
|
|
26
|
-
for (const field of uniqueBindingFieldsOf(family)) {
|
|
27
|
-
await checkBindingUnique(stack, family, field, content[field]);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
23
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
24
|
+
* Every content integrity check create, patch, restore and migrate owe: a
|
|
25
|
+
* change, judged against `prior` (absent on create), then claims, judged
|
|
26
|
+
* against other records. A claim is asked only of a value not already held
|
|
27
|
+
* in the destination family, so a claim check never finds the record itself.
|
|
28
|
+
* See docs/spec/data-model.md § Immutable fields.
|
|
35
29
|
*/
|
|
36
|
-
export async function
|
|
30
|
+
export async function checkContentWrite(stack, typeId, content, prior) {
|
|
31
|
+
if (prior)
|
|
32
|
+
checkImmutableFields(prior, content);
|
|
37
33
|
const family = baseIdOf(typeId);
|
|
38
|
-
const
|
|
39
|
-
for (const field of
|
|
40
|
-
if (!
|
|
34
|
+
const held = prior && baseIdOf(prior.typeId) === family ? prior.content : {};
|
|
35
|
+
for (const { field, unique } of bindingsOf(family)) {
|
|
36
|
+
if (!unique || content[field] === held[field])
|
|
41
37
|
continue;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
await checkBindingUnique(stack, family, field, content[field]);
|
|
39
|
+
}
|
|
40
|
+
if (family === SYSTEM_TYPES.ATTACHMENT &&
|
|
41
|
+
(content.fileId !== held.fileId || content.mimeType !== held.mimeType)) {
|
|
42
|
+
await checkAttachmentMimeType(stack, content);
|
|
46
43
|
}
|
|
47
44
|
}
|
|
45
|
+
// -------------------------------------------------------
|
|
46
|
+
// Immutable fields
|
|
47
|
+
// -------------------------------------------------------
|
|
48
48
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* uniqueness, of the destination only. See docs/spec/identity.md § DID bindings.
|
|
49
|
+
* Refuse a write that moves or clears an immutable field the record holds.
|
|
50
|
+
* Only the family the record is in now is asked: a field of the family it
|
|
51
|
+
* enters was never held, and arriving with one is a claim, not a change.
|
|
53
52
|
*/
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
checked.add(field);
|
|
63
|
-
checkBindingImmutable(family, field, existing[field], content[field]);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
for (const field of uniqueBindingFieldsOf(toFamily)) {
|
|
67
|
-
await checkBindingUnique(stack, toFamily, field, content[field], id);
|
|
53
|
+
function checkImmutableFields(existing, next) {
|
|
54
|
+
const family = baseIdOf(existing.typeId);
|
|
55
|
+
const content = existing.content;
|
|
56
|
+
for (const field of immutableFieldsOf(family)) {
|
|
57
|
+
const held = content[field];
|
|
58
|
+
if (isUnset(held) || next[field] === held)
|
|
59
|
+
continue;
|
|
60
|
+
throw new StackConflictError(`Cannot change ${family}.${field}: it is immutable once set.`);
|
|
68
61
|
}
|
|
69
62
|
}
|
|
63
|
+
// -------------------------------------------------------
|
|
64
|
+
// Claims on stored values
|
|
65
|
+
// -------------------------------------------------------
|
|
70
66
|
/**
|
|
71
67
|
* Refuse a second card claiming a value an Actor is resolved by. A
|
|
72
68
|
* property of the set rather than the value, so no schema can say it.
|
|
73
69
|
* Read-then-write: two racing creates can both pass.
|
|
74
70
|
* See docs/spec/identity.md § DID bindings.
|
|
75
71
|
*/
|
|
76
|
-
async function checkBindingUnique(stack, family, field, value
|
|
77
|
-
if (
|
|
72
|
+
async function checkBindingUnique(stack, family, field, value) {
|
|
73
|
+
if (isUnset(value))
|
|
78
74
|
return;
|
|
79
75
|
const clash = await findFirstMatch((q) => stack.query(q), {
|
|
80
76
|
filter: {
|
|
@@ -83,34 +79,16 @@ async function checkBindingUnique(stack, family, field, value, excludeId) {
|
|
|
83
79
|
includeUnlisted: true,
|
|
84
80
|
...(filtersContent(stack.capabilities) && { content: { [field]: value } }),
|
|
85
81
|
},
|
|
86
|
-
}, (r) => r.
|
|
82
|
+
}, (r) => r.content[field] === value);
|
|
87
83
|
if (clash) {
|
|
88
84
|
throw new StackConflictError(`Another ${family} record already claims the ${field} "${value}"`);
|
|
89
85
|
}
|
|
90
86
|
}
|
|
91
|
-
/**
|
|
92
|
-
* A binding is permanent once made: uniqueness stops a second card claiming
|
|
93
|
-
* a value, but only immutability stops an existing card being moved onto
|
|
94
|
-
* one. A subject whose key changes gets a new card.
|
|
95
|
-
* See docs/spec/identity.md § DID bindings.
|
|
96
|
-
*/
|
|
97
|
-
export function checkBindingImmutable(family, field, existing, next) {
|
|
98
|
-
if (typeof existing !== 'string' || existing === '')
|
|
99
|
-
return;
|
|
100
|
-
if (next === existing)
|
|
101
|
-
return;
|
|
102
|
-
throw new StackValidationError([
|
|
103
|
-
{
|
|
104
|
-
path: field,
|
|
105
|
-
message: `${field} is immutable once set; register a new ${family} record instead`,
|
|
106
|
-
},
|
|
107
|
-
]);
|
|
108
|
-
}
|
|
109
87
|
// -------------------------------------------------------
|
|
110
88
|
// Containment
|
|
111
89
|
// -------------------------------------------------------
|
|
112
90
|
/**
|
|
113
|
-
* How far a
|
|
91
|
+
* How far a `parentId` will walk a proposed ancestor chain before refusing
|
|
114
92
|
* the move. Bounds the reads one call can cost; a hierarchy deeper than
|
|
115
93
|
* this is beyond what `parentId` is for. See docs/spec/data-model.md
|
|
116
94
|
* § Reparenting.
|
|
@@ -154,23 +132,14 @@ export async function assertNoParentCycle(read, id, parentId) {
|
|
|
154
132
|
// -------------------------------------------------------
|
|
155
133
|
// Attachments
|
|
156
134
|
// -------------------------------------------------------
|
|
157
|
-
/**
|
|
158
|
-
* The `_attachment@1` fields a write may not move, each with the message it
|
|
159
|
-
* is refused by. Ordered as reported. See docs/spec/attachments.md § The
|
|
160
|
-
* `_attachment` record type.
|
|
161
|
-
*/
|
|
162
|
-
const ATTACHMENT_IMMUTABLE_FIELDS = [
|
|
163
|
-
['mimeType', 'mimeType is immutable after creation; delete and re-upload to change it'],
|
|
164
|
-
['fileId', 'fileId is immutable'],
|
|
165
|
-
['size', 'size is immutable'],
|
|
166
|
-
];
|
|
167
135
|
/**
|
|
168
136
|
* mimeType belongs to the fileId: its first metadata record fixes it, and
|
|
169
|
-
* a conflicting later one is refused
|
|
137
|
+
* a conflicting later one is refused — a clash with stored state, as a
|
|
138
|
+
* binding's second claimant is. Best-effort against a racing first
|
|
170
139
|
* upload; what survives the race is a deterministic winner. See
|
|
171
140
|
* docs/spec/attachments.md § The `_attachment` record type.
|
|
172
141
|
*/
|
|
173
|
-
|
|
142
|
+
async function checkAttachmentMimeType(stack, content) {
|
|
174
143
|
const { fileId, mimeType } = content;
|
|
175
144
|
if (typeof fileId !== 'string')
|
|
176
145
|
return; // schema validation already rejected this
|
|
@@ -182,12 +151,7 @@ export async function checkAttachmentMimeTypeOnCreate(stack, content) {
|
|
|
182
151
|
// Deliberately does not name the established mimeType — that would
|
|
183
152
|
// confirm a guessed fileId's content type. See the anti-oracle rule
|
|
184
153
|
// in docs/spec/attachments.md.
|
|
185
|
-
throw new
|
|
186
|
-
{
|
|
187
|
-
path: 'mimeType',
|
|
188
|
-
message: 'mimeType conflicts with the mimeType already established for this fileId',
|
|
189
|
-
},
|
|
190
|
-
]);
|
|
154
|
+
throw new StackConflictError('mimeType conflicts with the mimeType already established for this fileId');
|
|
191
155
|
}
|
|
192
156
|
}
|
|
193
157
|
/**
|
|
@@ -202,7 +166,7 @@ export async function checkAttachmentAssociationPointers(read, associations, sto
|
|
|
202
166
|
!stored.some((a) => associationIdentical(a, association))
|
|
203
167
|
? [{ fileId: association.fileId, attachmentRecordId: association.attachmentRecordId }]
|
|
204
168
|
: []);
|
|
205
|
-
// One round trip per pointer, taken together: a
|
|
169
|
+
// One round trip per pointer, taken together: a write carries a
|
|
206
170
|
// whole association list, and each pointer is an independent read.
|
|
207
171
|
const named = await Promise.all(pointed.map(({ attachmentRecordId }) => read(attachmentRecordId)));
|
|
208
172
|
pointed.forEach(({ fileId }, i) => {
|
|
@@ -224,33 +188,9 @@ export async function checkAttachmentAssociationPointers(read, associations, sto
|
|
|
224
188
|
], ARGUMENTS_INVALID);
|
|
225
189
|
});
|
|
226
190
|
}
|
|
227
|
-
/**
|
|
228
|
-
* Refuse a write that moves an `_attachment@1` record's fileId, size or
|
|
229
|
-
* mimeType. `violates` decides what counts as a move, since a patch names
|
|
230
|
-
* only what it changes while a migration re-sends all three.
|
|
231
|
-
* See docs/spec/attachments.md § The `_attachment` record type.
|
|
232
|
-
*/
|
|
233
|
-
export function assertAttachmentImmutable(violates) {
|
|
234
|
-
const errors = ATTACHMENT_IMMUTABLE_FIELDS.filter(([field]) => violates(field)).map(([path, message]) => ({ path, message }));
|
|
235
|
-
if (errors.length > 0) {
|
|
236
|
-
throw new StackValidationError(errors);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
191
|
// -------------------------------------------------------
|
|
240
|
-
//
|
|
192
|
+
// Groups
|
|
241
193
|
// -------------------------------------------------------
|
|
242
|
-
/**
|
|
243
|
-
* `_config.entityId` defines stack ownership; neither patchContent() nor
|
|
244
|
-
* restoreVersion() may change it. A conflict with stack integrity, not a
|
|
245
|
-
* schema violation — hence StackConflictError. See docs/spec.md § The
|
|
246
|
-
* `_config` record.
|
|
247
|
-
*/
|
|
248
|
-
export function checkConfigEntityIdUnchanged(existingEntityId, newEntityId) {
|
|
249
|
-
if (newEntityId !== existingEntityId) {
|
|
250
|
-
throw new StackConflictError('Cannot change _config.entityId: it defines stack ownership. ' +
|
|
251
|
-
'Ownership transfer is not a supported operation.');
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
194
|
/**
|
|
255
195
|
* Refuse a write that would leave a `_group` Record with no `admin`, asked
|
|
256
196
|
* of the roster the write would produce. An integrity rule, not a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrity.js","sourceRoot":"","sources":["../../src/stack/integrity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE5D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"integrity.js","sourceRoot":"","sources":["../../src/stack/integrity.ts"],"names":[],"mappings":"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"}
|
package/dist/stack/limits.d.ts
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
export declare function assertAttachmentSize(byteLength: number, attachmentBytes: number | null): void;
|
|
14
14
|
/**
|
|
15
15
|
* The content half of the same pre-check, on Stack.create() and
|
|
16
|
-
* Stack.
|
|
16
|
+
* Stack.patchContent(). A `null` ceiling — every local adapter's — skips the
|
|
17
17
|
* serialization entirely.
|
|
18
18
|
*/
|
|
19
19
|
export declare function assertContentSize(content: Record<string, unknown>, contentBytes: number | null, what: 'Content' | 'Patch'): void;
|
package/dist/stack/limits.js
CHANGED
|
@@ -18,7 +18,7 @@ export function assertAttachmentSize(byteLength, attachmentBytes) {
|
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
20
|
* The content half of the same pre-check, on Stack.create() and
|
|
21
|
-
* Stack.
|
|
21
|
+
* Stack.patchContent(). A `null` ceiling — every local adapter's — skips the
|
|
22
22
|
* serialization entirely.
|
|
23
23
|
*/
|
|
24
24
|
export function assertContentSize(content, contentBytes, what) {
|
package/dist/stack/reads.d.ts
CHANGED
|
@@ -12,11 +12,7 @@
|
|
|
12
12
|
* None of these is a public API.
|
|
13
13
|
*/
|
|
14
14
|
import type { Stack } from './stack.js';
|
|
15
|
-
import type { EntityId, GrantContent, InstallContent, QueryResult, StackQuery, StackRecord } from '../types/index.js';
|
|
16
|
-
/** The page size query() answers with when the caller names none. */
|
|
17
|
-
export declare const DEFAULT_QUERY_LIMIT = 50;
|
|
18
|
-
/** The largest page query() returns, whatever the caller asks for. */
|
|
19
|
-
export declare const MAX_QUERY_LIMIT = 1000;
|
|
15
|
+
import type { EntityId, GrantContent, GroupRole, InstallContent, QueryResult, RecordId, StackQuery, StackRecord } from '../types/index.js';
|
|
20
16
|
/**
|
|
21
17
|
* Walks `cursor` to exhaustion for the internal call sites that need every
|
|
22
18
|
* match (grant checks, attachment cleanup) — query() itself always
|
|
@@ -62,4 +58,12 @@ export declare function loadInstallRecords(stack: Stack): Promise<(StackRecord &
|
|
|
62
58
|
export declare function loadGrantRecords(run: (query: StackQuery) => Promise<QueryResult>): Promise<(StackRecord & {
|
|
63
59
|
content: GrantContent;
|
|
64
60
|
})[]>;
|
|
61
|
+
/**
|
|
62
|
+
* The role `entityId` holds on every roster that holds it, keyed by group
|
|
63
|
+
* id — the one reading of which rosters reach an entity. A roster is a
|
|
64
|
+
* live `_group`'s relationships: a Record outside the family or a deleted
|
|
65
|
+
* Group reaches nobody, and unlisted ones count, as for grants above. See
|
|
66
|
+
* docs/spec/access-control.md § Record-level permissions.
|
|
67
|
+
*/
|
|
68
|
+
export declare function loadRosterRoles(run: (query: StackQuery) => Promise<QueryResult>, entityId: EntityId): Promise<Map<RecordId, GroupRole>>;
|
|
65
69
|
//# sourceMappingURL=reads.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reads.d.ts","sourceRoot":"","sources":["../../src/stack/reads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"reads.d.ts","sourceRoot":"","sources":["../../src/stack/reads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAGV,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,cAAc,EACd,WAAW,EACX,QAAQ,EACR,UAAU,EACV,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAE3B;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,EAChD,KAAK,EAAE,UAAU,EACjB,GAAG,SAAgB,GAClB,OAAO,CAAC,WAAW,EAAE,CAAC,CAcxB;AAKD;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,EAChD,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAC9D,GAAG,SAAgB,GAClB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAiBlC;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,EAChD,GAAG,EAAE,QAAQ,EACb,gBAAgB,EAAE,OAAO,EACzB,eAAe,EAAE,OAAO,GACvB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAc7B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAa9F;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,CAAC,WAAW,GAAG;IAAE,OAAO,EAAE,cAAc,CAAA;CAAE,CAAC,EAAE,CAAC,CAKxD;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,GAC/C,OAAO,CAAC,CAAC,WAAW,GAAG;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,EAAE,CAAC,CAKtD;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,EAChD,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAcnC"}
|
package/dist/stack/reads.js
CHANGED
|
@@ -11,13 +11,10 @@
|
|
|
11
11
|
*
|
|
12
12
|
* None of these is a public API.
|
|
13
13
|
*/
|
|
14
|
+
import { groupRoleFromAssociations } from '../access.js';
|
|
14
15
|
import { StackBadRequestError } from '../errors.js';
|
|
15
16
|
import { filtersContent } from '../query-validation.js';
|
|
16
17
|
import { SYSTEM_TYPES } from '../types/index.js';
|
|
17
|
-
/** The page size query() answers with when the caller names none. */
|
|
18
|
-
export const DEFAULT_QUERY_LIMIT = 50;
|
|
19
|
-
/** The largest page query() returns, whatever the caller asks for. */
|
|
20
|
-
export const MAX_QUERY_LIMIT = 1000;
|
|
21
18
|
/**
|
|
22
19
|
* Walks `cursor` to exhaustion for the internal call sites that need every
|
|
23
20
|
* match (grant checks, attachment cleanup) — query() itself always
|
|
@@ -118,4 +115,27 @@ export async function loadGrantRecords(run) {
|
|
|
118
115
|
});
|
|
119
116
|
return records;
|
|
120
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* The role `entityId` holds on every roster that holds it, keyed by group
|
|
120
|
+
* id — the one reading of which rosters reach an entity. A roster is a
|
|
121
|
+
* live `_group`'s relationships: a Record outside the family or a deleted
|
|
122
|
+
* Group reaches nobody, and unlisted ones count, as for grants above. See
|
|
123
|
+
* docs/spec/access-control.md § Record-level permissions.
|
|
124
|
+
*/
|
|
125
|
+
export async function loadRosterRoles(run, entityId) {
|
|
126
|
+
const groups = await queryAllPages(run, {
|
|
127
|
+
filter: {
|
|
128
|
+
baseId: SYSTEM_TYPES.GROUP,
|
|
129
|
+
relatedTo: { target: { kind: 'entity', entityId } },
|
|
130
|
+
includeUnlisted: true,
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
const roles = new Map();
|
|
134
|
+
for (const group of groups) {
|
|
135
|
+
const role = groupRoleFromAssociations(group.associations, entityId);
|
|
136
|
+
if (role)
|
|
137
|
+
roles.set(group.id, role);
|
|
138
|
+
}
|
|
139
|
+
return roles;
|
|
140
|
+
}
|
|
121
141
|
//# sourceMappingURL=reads.js.map
|
package/dist/stack/reads.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reads.js","sourceRoot":"","sources":["../../src/stack/reads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"reads.js","sourceRoot":"","sources":["../../src/stack/reads.ts"],"names":[],"mappings":"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"}
|