@haverstack/core 0.37.0 → 0.39.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 +19 -15
- package/dist/access.d.ts +4 -6
- package/dist/access.d.ts.map +1 -1
- package/dist/access.js +7 -8
- package/dist/access.js.map +1 -1
- package/dist/adapter-entry.d.ts +7 -6
- package/dist/adapter-entry.d.ts.map +1 -1
- package/dist/adapter-entry.js +6 -5
- package/dist/adapter-entry.js.map +1 -1
- package/dist/attachment-download.d.ts +3 -1
- package/dist/attachment-download.d.ts.map +1 -1
- package/dist/attachment-download.js +1 -1
- package/dist/attachment-download.js.map +1 -1
- package/dist/changes.d.ts +22 -16
- package/dist/changes.d.ts.map +1 -1
- package/dist/changes.js +43 -32
- package/dist/changes.js.map +1 -1
- package/dist/combine.d.ts +1 -1
- package/dist/combine.js +6 -6
- package/dist/combine.js.map +1 -1
- package/dist/errors.d.ts +24 -12
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +32 -17
- package/dist/errors.js.map +1 -1
- package/dist/grants.d.ts +17 -25
- package/dist/grants.d.ts.map +1 -1
- package/dist/grants.js +27 -14
- package/dist/grants.js.map +1 -1
- package/dist/identity-bindings.js +2 -2
- package/dist/index.d.ts +12 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/dist/query-validation.d.ts +28 -11
- package/dist/query-validation.d.ts.map +1 -1
- package/dist/query-validation.js +95 -36
- package/dist/query-validation.js.map +1 -1
- package/dist/record-changes.d.ts +11 -10
- package/dist/record-changes.d.ts.map +1 -1
- package/dist/record-changes.js +33 -25
- package/dist/record-changes.js.map +1 -1
- package/dist/record-id.d.ts +3 -3
- package/dist/record-id.js +8 -8
- package/dist/record-id.js.map +1 -1
- package/dist/scoped-stack.d.ts +71 -34
- package/dist/scoped-stack.d.ts.map +1 -1
- package/dist/scoped-stack.js +107 -88
- package/dist/scoped-stack.js.map +1 -1
- package/dist/stack-reads.d.ts +2 -2
- package/dist/stack-reads.js +5 -5
- package/dist/stack-reads.js.map +1 -1
- package/dist/stack.d.ts +132 -161
- package/dist/stack.d.ts.map +1 -1
- package/dist/stack.js +287 -288
- package/dist/stack.js.map +1 -1
- package/dist/testing.d.ts +17 -17
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +46 -42
- package/dist/testing.js.map +1 -1
- package/dist/types.d.ts +169 -143
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/dist/wire-body.d.ts +71 -0
- package/dist/wire-body.d.ts.map +1 -0
- package/dist/wire-body.js +138 -0
- package/dist/wire-body.js.map +1 -0
- package/dist/wire-entry.d.ts +9 -8
- package/dist/wire-entry.d.ts.map +1 -1
- package/dist/wire-entry.js +13 -14
- package/dist/wire-entry.js.map +1 -1
- package/dist/wire-record.d.ts +4 -4
- package/dist/wire-record.d.ts.map +1 -1
- package/dist/wire-record.js +35 -22
- package/dist/wire-record.js.map +1 -1
- package/dist/wire-request.d.ts +37 -4
- package/dist/wire-request.d.ts.map +1 -1
- package/dist/wire-request.js +288 -79
- package/dist/wire-request.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -25,16 +25,16 @@ import { LocalAdapter } from '@haverstack/adapter-local';
|
|
|
25
25
|
import { writeFile } from 'node:fs/promises';
|
|
26
26
|
|
|
27
27
|
const dbPath = './my-stack.db';
|
|
28
|
-
const keyPath = './my-stack.key.json'; // see "Key custody"
|
|
28
|
+
const keyPath = './my-stack.key.json'; // see "Key custody" under Identity for where this really belongs
|
|
29
29
|
|
|
30
30
|
// First run: neither file exists yet, so this generates an identity
|
|
31
31
|
// keypair and persists the private key before initializing. Every run
|
|
32
|
-
// after that: the db exists, so this just opens it — the
|
|
32
|
+
// after that: the db exists, so this just opens it — the ownerEntityId
|
|
33
33
|
// function below is never called, so no throwaway keypair is minted.
|
|
34
34
|
const adapter = await LocalAdapter.openOrInitialize({
|
|
35
35
|
path: dbPath,
|
|
36
36
|
timezone: 'America/New_York',
|
|
37
|
-
|
|
37
|
+
ownerEntityId: async () => {
|
|
38
38
|
const { did, privateKey } = await generateDidKeypair();
|
|
39
39
|
await writeFile(keyPath, JSON.stringify(await exportDidPrivateKeyJwk(privateKey)));
|
|
40
40
|
return did;
|
|
@@ -43,12 +43,16 @@ const adapter = await LocalAdapter.openOrInitialize({
|
|
|
43
43
|
|
|
44
44
|
// ownerProfile creates your own _entity profile record on first run —
|
|
45
45
|
// safe to keep passing on every open, it's a no-op once the record exists.
|
|
46
|
-
const stack = await Stack.
|
|
46
|
+
const stack = await Stack.open(adapter, { ownerProfile: { name: 'Jane Smith' } });
|
|
47
47
|
|
|
48
48
|
// Define a type
|
|
49
|
-
await stack.defineType(
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
await stack.defineType({
|
|
50
|
+
id: 'com.example.myapp/note@1',
|
|
51
|
+
name: 'Note',
|
|
52
|
+
schema: {
|
|
53
|
+
text: { kind: 'text', required: true },
|
|
54
|
+
title: { kind: 'string' },
|
|
55
|
+
},
|
|
52
56
|
});
|
|
53
57
|
|
|
54
58
|
// Create a record
|
|
@@ -89,7 +93,7 @@ The fundamental unit of data. Every record has:
|
|
|
89
93
|
- A **Crockford base-32 ID** — time-sortable, human-readable, URL-safe
|
|
90
94
|
- A **type** — defined by the app that created it
|
|
91
95
|
- **Content** — a JSON object validated against the type's schema
|
|
92
|
-
- Optional: `parentId`, `
|
|
96
|
+
- Optional: `parentId`, `createdBy`, `appId`, `permissions`, `associations`
|
|
93
97
|
|
|
94
98
|
### Identity
|
|
95
99
|
|
|
@@ -114,7 +118,7 @@ Tags, attachments, and relationships are unified under a single model:
|
|
|
114
118
|
```ts
|
|
115
119
|
{ kind: 'tag', label: 'favourite' }
|
|
116
120
|
{ kind: 'attachment', label: 'avatar', fileId: '...' }
|
|
117
|
-
{ kind: 'relationship', label: 'reply-to', recordId: '...' }
|
|
121
|
+
{ kind: 'relationship', label: 'reply-to', target: { kind: 'record', recordId: '...' } }
|
|
118
122
|
```
|
|
119
123
|
|
|
120
124
|
### Migrations
|
|
@@ -122,12 +126,12 @@ Tags, attachments, and relationships are unified under a single model:
|
|
|
122
126
|
Types can evolve over time. Register migration functions between adjacent versions and the library composes them into chains automatically:
|
|
123
127
|
|
|
124
128
|
```ts
|
|
125
|
-
await stack.defineType(
|
|
126
|
-
'com.example.myapp/note@2',
|
|
127
|
-
'Note',
|
|
128
|
-
{ text: { kind: 'text', required: true }, title: { kind: 'string' } },
|
|
129
|
-
|
|
130
|
-
);
|
|
129
|
+
await stack.defineType({
|
|
130
|
+
id: 'com.example.myapp/note@2',
|
|
131
|
+
name: 'Note',
|
|
132
|
+
schema: { text: { kind: 'text', required: true }, title: { kind: 'string' } },
|
|
133
|
+
migratesFrom: 'com.example.myapp/note@1',
|
|
134
|
+
});
|
|
131
135
|
|
|
132
136
|
stack.registerMigration({
|
|
133
137
|
from: 'com.example.myapp/note@1',
|
package/dist/access.d.ts
CHANGED
|
@@ -12,11 +12,9 @@
|
|
|
12
12
|
* it. Every tier is affirmative, so an element read past its own kind —
|
|
13
13
|
* or carrying no kind at all — confers nothing.
|
|
14
14
|
*/
|
|
15
|
-
import type { Association, AuthorityAssociation, DataAssociation, EntityId, RecordId, StackRecord } from './types.js';
|
|
15
|
+
import type { Association, AuthorityAssociation, DataAssociation, EntityId, GroupRole, RecordId, StackRecord } from './types.js';
|
|
16
16
|
import type { ValidationError } from './validate.js';
|
|
17
17
|
export type AccessMode = 'read' | 'write';
|
|
18
|
-
/** An entity's standing within a `_group` Record's roster. `admin` implies `member` for ACL purposes. */
|
|
19
|
-
export type GroupRole = 'member' | 'admin';
|
|
20
18
|
/**
|
|
21
19
|
* Resolves a Record by ID. Used to walk a `_group` Record's associations for
|
|
22
20
|
* membership checks without requiring a full StackAdapter.
|
|
@@ -69,7 +67,7 @@ export declare function groupRoleFromAssociations(associations: DataAssociation[
|
|
|
69
67
|
*/
|
|
70
68
|
export declare function hasGroupAdmin(associations: DataAssociation[] | undefined): boolean;
|
|
71
69
|
/**
|
|
72
|
-
* Whether one association is an `admin` roster entry. The `entity`
|
|
70
|
+
* Whether one association is an `admin` roster entry. The `entity` target is
|
|
73
71
|
* what makes it one — a `record` target carrying the same label confers
|
|
74
72
|
* nothing, so it must not count toward the invariant either.
|
|
75
73
|
* See docs/spec/data-model.md § Relationship targets.
|
|
@@ -81,8 +79,8 @@ export declare function isGroupAdminAssociation(association: Association): boole
|
|
|
81
79
|
* own, whichever side of a delegation the owner is on.
|
|
82
80
|
* See docs/spec/access-control.md § Delegation: principal and subject.
|
|
83
81
|
*/
|
|
84
|
-
export declare function isOwnerActingAlone(
|
|
85
|
-
principalId: EntityId | null;
|
|
82
|
+
export declare function isOwnerActingAlone(actor: {
|
|
86
83
|
subjectId: EntityId | null;
|
|
84
|
+
principalId?: EntityId | null;
|
|
87
85
|
}, ownerEntityId: EntityId): boolean;
|
|
88
86
|
//# sourceMappingURL=access.d.ts.map
|
package/dist/access.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,QAAQ,
|
|
1
|
+
{"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACR,SAAS,EAET,QAAQ,EACR,WAAW,EACZ,MAAM,YAAY,CAAC;AAGpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1C;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AAE3E;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,WAAW,EACnB,eAAe,EAAE,QAAQ,GAAG,IAAI,EAChC,aAAa,EAAE,QAAQ,GAAG,IAAI,EAC9B,IAAI,EAAE,UAAU,EAChB,aAAa,EAAE,cAAc,GAC5B,OAAO,CAAC,OAAO,CAAC,CAyBlB;AAyCD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,oBAAoB,EAAE,GAAG,SAAS,EAC/C,IAAI,SAAgB,GACnB,eAAe,EAAE,CAanB;AAaD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAE1D;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,eAAe,EAAE,GAAG,SAAS,EAC3C,QAAQ,EAAE,QAAQ,GACjB,SAAS,GAAG,IAAI,CASlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,eAAe,EAAE,GAAG,SAAS,GAAG,OAAO,CAElF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAMzE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE;IAAE,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;CAAE,EACpE,aAAa,EAAE,QAAQ,GACtB,OAAO,CAGT"}
|
package/dist/access.js
CHANGED
|
@@ -80,7 +80,7 @@ function isWorldRead(association) {
|
|
|
80
80
|
async function granteeCovers(grantee, subjectEntityId, resolveRecord) {
|
|
81
81
|
if (!subjectEntityId)
|
|
82
82
|
return false;
|
|
83
|
-
if (grantee.
|
|
83
|
+
if (grantee.kind === 'entity')
|
|
84
84
|
return grantee.entityId === subjectEntityId;
|
|
85
85
|
const role = await resolveGroupRole(grantee.groupId, subjectEntityId, resolveRecord);
|
|
86
86
|
return grantee.role === 'admin' ? role === 'admin' : role !== null;
|
|
@@ -136,9 +136,7 @@ export function carriesRoster(record) {
|
|
|
136
136
|
export function groupRoleFromAssociations(associations, entityId) {
|
|
137
137
|
let role = null;
|
|
138
138
|
for (const a of associations ?? []) {
|
|
139
|
-
if (a.kind === 'relationship' &&
|
|
140
|
-
a.target.scope === 'entity' &&
|
|
141
|
-
a.target.entityId === entityId) {
|
|
139
|
+
if (a.kind === 'relationship' && a.target.kind === 'entity' && a.target.entityId === entityId) {
|
|
142
140
|
if (a.label === 'admin')
|
|
143
141
|
return 'admin';
|
|
144
142
|
if (a.label === 'member')
|
|
@@ -160,7 +158,7 @@ export function hasGroupAdmin(associations) {
|
|
|
160
158
|
return (associations ?? []).some(isGroupAdminAssociation);
|
|
161
159
|
}
|
|
162
160
|
/**
|
|
163
|
-
* Whether one association is an `admin` roster entry. The `entity`
|
|
161
|
+
* Whether one association is an `admin` roster entry. The `entity` target is
|
|
164
162
|
* what makes it one — a `record` target carrying the same label confers
|
|
165
163
|
* nothing, so it must not count toward the invariant either.
|
|
166
164
|
* See docs/spec/data-model.md § Relationship targets.
|
|
@@ -168,7 +166,7 @@ export function hasGroupAdmin(associations) {
|
|
|
168
166
|
export function isGroupAdminAssociation(association) {
|
|
169
167
|
return (association.kind === 'relationship' &&
|
|
170
168
|
association.label === 'admin' &&
|
|
171
|
-
association.target.
|
|
169
|
+
association.target.kind === 'entity');
|
|
172
170
|
}
|
|
173
171
|
/**
|
|
174
172
|
* Whether a request is the stack owner acting alone — the tier behind every
|
|
@@ -176,7 +174,8 @@ export function isGroupAdminAssociation(association) {
|
|
|
176
174
|
* own, whichever side of a delegation the owner is on.
|
|
177
175
|
* See docs/spec/access-control.md § Delegation: principal and subject.
|
|
178
176
|
*/
|
|
179
|
-
export function isOwnerActingAlone(
|
|
180
|
-
|
|
177
|
+
export function isOwnerActingAlone(actor, ownerEntityId) {
|
|
178
|
+
const principalId = actor.principalId === undefined ? actor.subjectId : actor.principalId;
|
|
179
|
+
return principalId === ownerEntityId && actor.subjectId === ownerEntityId;
|
|
181
180
|
}
|
|
182
181
|
//# sourceMappingURL=access.js.map
|
package/dist/access.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access.js","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"access.js","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"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"}
|
package/dist/adapter-entry.d.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @haverstack/core/adapter
|
|
3
3
|
* -------------------------------------------------------
|
|
4
|
-
* The interfaces a storage adapter implements —
|
|
5
|
-
*
|
|
6
|
-
* implementers (see the in-repo
|
|
7
|
-
* reads
|
|
4
|
+
* The interfaces a storage adapter implements — the full StackAdapter,
|
|
5
|
+
* its record and blob halves, and the options Stack hands them — plus the
|
|
6
|
+
* helpers adapters share. Audience: adapter implementers (see the in-repo
|
|
7
|
+
* adapters). Types an app reads too, such as StackCapabilities, live in
|
|
8
|
+
* the root entry point instead: every export has exactly one home.
|
|
8
9
|
*/
|
|
9
|
-
export type { StackRecordAdapter, StackBlobAdapter,
|
|
10
|
+
export type { StackAdapter, StackRecordAdapter, StackBlobAdapter, BlobInfo, BumpVersionOptions, SnapshotOptions, JournalEntryInput, JournalOptions, SubscribeChangesOptions, } from './types.js';
|
|
10
11
|
export { combineAdapters } from './combine.js';
|
|
11
|
-
export { assertQueryCapabilities, assertSortCapability, assertValidSort,
|
|
12
|
+
export { assertQueryCapabilities, assertSortCapability, assertValidSort, assertValidAssociationFilters, assertValidJournalQuery, filtersContent, parseContentFilterKey, } from './query-validation.js';
|
|
12
13
|
export { contentSortEntry, contentSortKey, compareSortEntries } from './sort.js';
|
|
13
14
|
export type { SortEntry } from './sort.js';
|
|
14
15
|
//# sourceMappingURL=adapter-entry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-entry.d.ts","sourceRoot":"","sources":["../src/adapter-entry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"adapter-entry.d.ts","sourceRoot":"","sources":["../src/adapter-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACR,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EACf,6BAA6B,EAC7B,uBAAuB,EACvB,cAAc,EACd,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACjF,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/adapter-entry.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @haverstack/core/adapter
|
|
3
3
|
* -------------------------------------------------------
|
|
4
|
-
* The interfaces a storage adapter implements —
|
|
5
|
-
*
|
|
6
|
-
* implementers (see the in-repo
|
|
7
|
-
* reads
|
|
4
|
+
* The interfaces a storage adapter implements — the full StackAdapter,
|
|
5
|
+
* its record and blob halves, and the options Stack hands them — plus the
|
|
6
|
+
* helpers adapters share. Audience: adapter implementers (see the in-repo
|
|
7
|
+
* adapters). Types an app reads too, such as StackCapabilities, live in
|
|
8
|
+
* the root entry point instead: every export has exactly one home.
|
|
8
9
|
*/
|
|
9
10
|
export { combineAdapters } from './combine.js';
|
|
10
|
-
export { assertQueryCapabilities, assertSortCapability, assertValidSort,
|
|
11
|
+
export { assertQueryCapabilities, assertSortCapability, assertValidSort, assertValidAssociationFilters, assertValidJournalQuery, filtersContent, parseContentFilterKey, } from './query-validation.js';
|
|
11
12
|
export { contentSortEntry, contentSortKey, compareSortEntries } from './sort.js';
|
|
12
13
|
//# sourceMappingURL=adapter-entry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter-entry.js","sourceRoot":"","sources":["../src/adapter-entry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"adapter-entry.js","sourceRoot":"","sources":["../src/adapter-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EACf,6BAA6B,EAC7B,uBAAuB,EACvB,cAAc,EACd,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -84,7 +84,9 @@ export declare function compareRecordedAttachments<T extends {
|
|
|
84
84
|
export declare function resolveReferencedAttachment<T extends {
|
|
85
85
|
id: string;
|
|
86
86
|
createdAt: Date;
|
|
87
|
-
|
|
87
|
+
createdBy?: {
|
|
88
|
+
subjectId: string;
|
|
89
|
+
};
|
|
88
90
|
}>(records: readonly T[], opts?: {
|
|
89
91
|
attachmentRecordId?: string;
|
|
90
92
|
requesterEntityId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment-download.d.ts","sourceRoot":"","sources":["../src/attachment-download.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAcH,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,6BAA6B,CAAC;AAE9D,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAC5D,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAqB9C;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMrE;AAmCD,yKAAyK;AACzK,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGjF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,CAAA;CAAE,EAC/E,OAAO,EAAE,SAAS,CAAC,EAAE,GACpB,CAAC,GAAG,SAAS,CAKf;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,CAAA;CAAE,EAClF,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,GACH,MAAM,CAIR;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,2BAA2B,CACzC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,CAAC;IAAC,
|
|
1
|
+
{"version":3,"file":"attachment-download.d.ts","sourceRoot":"","sources":["../src/attachment-download.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAcH,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,6BAA6B,CAAC;AAE9D,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAC5D,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAqB9C;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMrE;AAmCD,yKAAyK;AACzK,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGjF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,CAAA;CAAE,EAC/E,OAAO,EAAE,SAAS,CAAC,EAAE,GACpB,CAAC,GAAG,SAAS,CAKf;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,CAAA;CAAE,EAClF,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,GACH,MAAM,CAIR;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,2BAA2B,CACzC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EAE5E,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,IAAI,GAAE;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAO,GACrE,CAAC,GAAG,SAAS,CAUf;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAAC,KAAK,EAAE;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,6BAA6B,CAUhC"}
|
|
@@ -156,7 +156,7 @@ export function resolveReferencedAttachment(records, opts = {}) {
|
|
|
156
156
|
return named;
|
|
157
157
|
}
|
|
158
158
|
if (opts.requesterEntityId) {
|
|
159
|
-
const own = records.filter((record) => record.
|
|
159
|
+
const own = records.filter((record) => record.createdBy?.subjectId === opts.requesterEntityId);
|
|
160
160
|
if (own.length > 0)
|
|
161
161
|
return firstRecordedAttachment(own);
|
|
162
162
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment-download.js","sourceRoot":"","sources":["../src/attachment-download.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,mEAAmE;AACnE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,iBAAiB,EAAE,YAAY,EAAE,0BAA0B,CAAC,CAAC,CAAC;AAEhG,wFAAwF;AACxF,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAErD;;;GAGG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;AAEpD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AAE9D,MAAM,CAAC,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AAC5D,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAE9C,+GAA+G;AAC/G,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA,8BAA8B,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,mBAAmB,GAAG,IAAI,MAAM,CACpC,IAAI,KAAK,IAAI,KAAK,eAAe,KAAK,OAAO,KAAK,kCAAkC,CACrF,CAAC;AAEF,0JAA0J;AAC1J,SAAS,iBAAiB,CAAC,QAAgB;IACzC,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC1D,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,oBAAoB,GAAqC;IAC7D,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,WAAW;IAChB,KAAK,EAAE,uBAAuB;IAC9B,GAAG,EAAE,eAAe;IACpB,EAAE,EAAE,iBAAiB;IACrB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,UAAU;CAChB,CAAC;AAEF,yKAAyK;AACzK,MAAM,UAAU,4BAA4B,CAAC,QAAgB;IAC3D,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1E,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAqB;IAErB,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,0BAA0B,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAC7F,SAAS,CACV,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,CAAI,EACJ,CAAI;IAEJ,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC5D,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,2BAA2B,CAGzC,OAAqB,EACrB,OAAoE,EAAE;IAEtE,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC9E,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"attachment-download.js","sourceRoot":"","sources":["../src/attachment-download.ts"],"names":[],"mappings":"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"}
|
package/dist/changes.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* The split between those last two is the point of this module. Emission
|
|
9
9
|
* always carries the record — a permission filter has nothing to decide
|
|
10
|
-
* with otherwise, and on a
|
|
10
|
+
* with otherwise, and on a purge there is nothing left to fetch —
|
|
11
11
|
* while the frame handed to a handler is projected from it. So the rule
|
|
12
12
|
* that a purge discloses neither the record nor its provenance is a
|
|
13
13
|
* property of one function here, not a convention every emission site has
|
|
@@ -37,10 +37,18 @@ export type EmittedChange = {
|
|
|
37
37
|
* record did not move. See docs/spec/events.md § The reparent transition.
|
|
38
38
|
*/
|
|
39
39
|
previousParentId?: string | null;
|
|
40
|
+
/**
|
|
41
|
+
* The type a `migrate` or `restore` took the record out of. Emitter-side
|
|
42
|
+
* only, like `previousParentId` and for the same reason: a `typeId` or
|
|
43
|
+
* `baseId` filter answers for the origin as well as the destination.
|
|
44
|
+
* Absent wherever the type did not change. See docs/spec/events.md
|
|
45
|
+
* § The type-change transition.
|
|
46
|
+
*/
|
|
47
|
+
previousTypeId?: string;
|
|
40
48
|
};
|
|
41
49
|
/**
|
|
42
50
|
* Whether an emission matches a subscription's filter. Reads the record
|
|
43
|
-
* for the fields the envelope deliberately omits, so `
|
|
51
|
+
* for the fields the envelope deliberately omits, so `createdBy` filters on
|
|
44
52
|
* the author and `purged` frames stay filterable without carrying either.
|
|
45
53
|
*/
|
|
46
54
|
export declare function matchesFilter(emitted: EmittedChange, filter?: ChangeFilter): boolean;
|
|
@@ -55,7 +63,7 @@ export declare function matchesFilter(emitted: EmittedChange, filter?: ChangeFil
|
|
|
55
63
|
export declare function passesUnlistedBoundary(emitted: EmittedChange, includeUnlisted?: boolean): boolean;
|
|
56
64
|
/**
|
|
57
65
|
* The frame a subscriber receives. A `purged` frame never carries the
|
|
58
|
-
* record, whatever was asked for:
|
|
66
|
+
* record, whatever was asked for: purge is the erasure primitive,
|
|
59
67
|
* and a frame that shipped the body — or the author — of a record the
|
|
60
68
|
* stack has just destroyed would hand every subscriber a permanent copy of
|
|
61
69
|
* the thing being erased. See docs/spec/events.md § Purged records carry
|
|
@@ -123,11 +131,17 @@ export declare class PendingChange {
|
|
|
123
131
|
constructor(ops: ChangeOp | ChangeOp[], moved?: {
|
|
124
132
|
/**
|
|
125
133
|
* The requester behind a write that stamps nothing on the record
|
|
126
|
-
* itself. A version-bumping write stamps `updatedBy
|
|
127
|
-
*
|
|
134
|
+
* itself. A version-bumping write stamps `updatedBy`, so its
|
|
135
|
+
* emission reads it back instead — see emission() below.
|
|
128
136
|
*/
|
|
129
137
|
actor?: ChangeActor;
|
|
130
138
|
previousParentId?: string | null;
|
|
139
|
+
/**
|
|
140
|
+
* The type before a write that can change it. Feed-only: every journal
|
|
141
|
+
* entry carries its own `typeId`, so consecutive entries already show
|
|
142
|
+
* the change.
|
|
143
|
+
*/
|
|
144
|
+
previousTypeId?: string;
|
|
131
145
|
/**
|
|
132
146
|
* What the write moved, association by association. One list for
|
|
133
147
|
* both halves: the journal takes it as it stands and the feed is
|
|
@@ -142,8 +156,8 @@ export declare class PendingChange {
|
|
|
142
156
|
*
|
|
143
157
|
* Absent for a purge, which destroys the log an entry would be appended
|
|
144
158
|
* to. The rule lives here rather than at each call site that would
|
|
145
|
-
* otherwise have to remember it. See docs/spec/journal.md § A
|
|
146
|
-
*
|
|
159
|
+
* otherwise have to remember it. See docs/spec/journal.md § A purge
|
|
160
|
+
* destroys the journal.
|
|
147
161
|
*/
|
|
148
162
|
get journal(): JournalEntryInput | undefined;
|
|
149
163
|
/**
|
|
@@ -158,15 +172,7 @@ export declare class PendingChange {
|
|
|
158
172
|
* record of some type was destroyed and nothing about whose it was.
|
|
159
173
|
*/
|
|
160
174
|
emission(record: StackRecord, at?: Date): EmittedChange;
|
|
161
|
-
/**
|
|
162
|
-
* The frame's two flat lists, flattened out of the one the journal
|
|
163
|
-
* takes. Present only where non-empty.
|
|
164
|
-
*
|
|
165
|
-
* The data half alone: the `permissions` op is what announces an ACL
|
|
166
|
-
* move, so a subscriber watching tags is never handed the sharing graph
|
|
167
|
-
* as a side effect of the partition sharing one delta.
|
|
168
|
-
* See docs/spec/events.md § The event shape.
|
|
169
|
-
*/
|
|
175
|
+
/** The frame's two flat lists, present only where non-empty. */
|
|
170
176
|
private associationDeltas;
|
|
171
177
|
}
|
|
172
178
|
/**
|
package/dist/changes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,WAAW,EACZ,MAAM,YAAY,CAAC;AAIpB;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACrC;;;;OAIG;IACH,MAAM,EAAE,WAAW,CAAC;IACpB;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"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"}
|
package/dist/changes.js
CHANGED
|
@@ -7,19 +7,19 @@
|
|
|
7
7
|
*
|
|
8
8
|
* The split between those last two is the point of this module. Emission
|
|
9
9
|
* always carries the record — a permission filter has nothing to decide
|
|
10
|
-
* with otherwise, and on a
|
|
10
|
+
* with otherwise, and on a purge there is nothing left to fetch —
|
|
11
11
|
* while the frame handed to a handler is projected from it. So the rule
|
|
12
12
|
* that a purge discloses neither the record nor its provenance is a
|
|
13
13
|
* property of one function here, not a convention every emission site has
|
|
14
14
|
* to remember. See docs/spec/events.md.
|
|
15
15
|
*/
|
|
16
|
-
import {
|
|
17
|
-
import { bumpsVersion, feedAssociationDelta
|
|
16
|
+
import { StackBadRequestError } from './errors.js';
|
|
17
|
+
import { bumpsVersion, feedAssociationDelta } from './record-changes.js';
|
|
18
18
|
/** The `baseId@version` split, as grants and query filters read it. */
|
|
19
19
|
const baseIdOf = (typeId) => typeId.split('@')[0];
|
|
20
20
|
/**
|
|
21
21
|
* Whether an emission matches a subscription's filter. Reads the record
|
|
22
|
-
* for the fields the envelope deliberately omits, so `
|
|
22
|
+
* for the fields the envelope deliberately omits, so `createdBy` filters on
|
|
23
23
|
* the author and `purged` frames stay filterable without carrying either.
|
|
24
24
|
*/
|
|
25
25
|
export function matchesFilter(emitted, filter) {
|
|
@@ -28,10 +28,19 @@ export function matchesFilter(emitted, filter) {
|
|
|
28
28
|
const { change, record } = emitted;
|
|
29
29
|
if (filter.kinds && !filter.kinds.includes(change.kind))
|
|
30
30
|
return false;
|
|
31
|
+
// A type change is announced to both types it concerns, as a move is to
|
|
32
|
+
// both containers: see docs/spec/events.md § The type-change transition.
|
|
33
|
+
const typeIds = [change.typeId];
|
|
34
|
+
if (emitted.previousTypeId !== undefined)
|
|
35
|
+
typeIds.push(emitted.previousTypeId);
|
|
31
36
|
if (filter.typeId !== undefined) {
|
|
32
|
-
const wanted =
|
|
33
|
-
|
|
34
|
-
|
|
37
|
+
const wanted = asArray(filter.typeId);
|
|
38
|
+
if (!typeIds.some((t) => wanted.includes(t)))
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
if (filter.baseId !== undefined) {
|
|
42
|
+
const wanted = asArray(filter.baseId);
|
|
43
|
+
if (!typeIds.some((t) => wanted.includes(baseIdOf(t))))
|
|
35
44
|
return false;
|
|
36
45
|
}
|
|
37
46
|
if (filter.parentId !== undefined) {
|
|
@@ -45,10 +54,17 @@ export function matchesFilter(emitted, filter) {
|
|
|
45
54
|
if (parentId !== filter.parentId && origin !== filter.parentId)
|
|
46
55
|
return false;
|
|
47
56
|
}
|
|
48
|
-
|
|
49
|
-
|
|
57
|
+
for (const field of ['subjectId', 'principalId']) {
|
|
58
|
+
const wanted = filter.createdBy?.[field];
|
|
59
|
+
if (wanted === undefined)
|
|
60
|
+
continue;
|
|
61
|
+
const id = record.createdBy?.[field];
|
|
62
|
+
if (id === undefined || !asArray(wanted).includes(id))
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
50
65
|
return true;
|
|
51
66
|
}
|
|
67
|
+
const asArray = (value) => (Array.isArray(value) ? value : [value]);
|
|
52
68
|
/**
|
|
53
69
|
* Whether an emission passes the unlisted-enumeration boundary for one
|
|
54
70
|
* subscription. The `unlist` transition is the one exception to the
|
|
@@ -66,7 +82,7 @@ export function passesUnlistedBoundary(emitted, includeUnlisted) {
|
|
|
66
82
|
}
|
|
67
83
|
/**
|
|
68
84
|
* The frame a subscriber receives. A `purged` frame never carries the
|
|
69
|
-
* record, whatever was asked for:
|
|
85
|
+
* record, whatever was asked for: purge is the erasure primitive,
|
|
70
86
|
* and a frame that shipped the body — or the author — of a record the
|
|
71
87
|
* stack has just destroyed would hand every subscriber a permanent copy of
|
|
72
88
|
* the thing being erased. See docs/spec/events.md § Purged records carry
|
|
@@ -215,8 +231,8 @@ export class PendingChange {
|
|
|
215
231
|
*
|
|
216
232
|
* Absent for a purge, which destroys the log an entry would be appended
|
|
217
233
|
* to. The rule lives here rather than at each call site that would
|
|
218
|
-
* otherwise have to remember it. See docs/spec/journal.md § A
|
|
219
|
-
*
|
|
234
|
+
* otherwise have to remember it. See docs/spec/journal.md § A purge
|
|
235
|
+
* destroys the journal.
|
|
220
236
|
*/
|
|
221
237
|
get journal() {
|
|
222
238
|
if (this.kind === 'purged')
|
|
@@ -262,6 +278,10 @@ export class PendingChange {
|
|
|
262
278
|
...(this.moved.previousParentId !== undefined && {
|
|
263
279
|
previousParentId: this.moved.previousParentId,
|
|
264
280
|
}),
|
|
281
|
+
...(this.moved.previousTypeId !== undefined &&
|
|
282
|
+
this.moved.previousTypeId !== record.typeId && {
|
|
283
|
+
previousTypeId: this.moved.previousTypeId,
|
|
284
|
+
}),
|
|
265
285
|
change: {
|
|
266
286
|
kind: this.kind,
|
|
267
287
|
ops: this.ops,
|
|
@@ -275,17 +295,9 @@ export class PendingChange {
|
|
|
275
295
|
},
|
|
276
296
|
};
|
|
277
297
|
}
|
|
278
|
-
/**
|
|
279
|
-
* The frame's two flat lists, flattened out of the one the journal
|
|
280
|
-
* takes. Present only where non-empty.
|
|
281
|
-
*
|
|
282
|
-
* The data half alone: the `permissions` op is what announces an ACL
|
|
283
|
-
* move, so a subscriber watching tags is never handed the sharing graph
|
|
284
|
-
* as a side effect of the partition sharing one delta.
|
|
285
|
-
* See docs/spec/events.md § The event shape.
|
|
286
|
-
*/
|
|
298
|
+
/** The frame's two flat lists, present only where non-empty. */
|
|
287
299
|
associationDeltas() {
|
|
288
|
-
const { added, removed } = feedAssociationDelta(
|
|
300
|
+
const { added, removed } = feedAssociationDelta(this.moved.associations ?? []);
|
|
289
301
|
return {
|
|
290
302
|
...(added.length && { associationsAdded: added }),
|
|
291
303
|
...(removed.length && { associationsRemoved: removed }),
|
|
@@ -302,8 +314,7 @@ function actorOf(record, kind) {
|
|
|
302
314
|
if (!record.updatedBy)
|
|
303
315
|
return undefined;
|
|
304
316
|
return {
|
|
305
|
-
|
|
306
|
-
...(record.updatedVia !== undefined && { principalId: record.updatedVia }),
|
|
317
|
+
...record.updatedBy,
|
|
307
318
|
...(kind === 'created' && record.appId !== undefined && { appId: record.appId }),
|
|
308
319
|
};
|
|
309
320
|
}
|
|
@@ -360,12 +371,12 @@ export const CHANGE_KINDS = {
|
|
|
360
371
|
patch: 'changed',
|
|
361
372
|
associate: 'changed',
|
|
362
373
|
dissociate: 'changed',
|
|
363
|
-
|
|
374
|
+
reshare: 'changed',
|
|
364
375
|
migrate: 'changed',
|
|
365
376
|
restore: 'changed',
|
|
366
377
|
undelete: 'changed',
|
|
367
378
|
delete: 'deleted',
|
|
368
|
-
|
|
379
|
+
purge: 'purged',
|
|
369
380
|
list: 'changed',
|
|
370
381
|
unlist: 'deleted',
|
|
371
382
|
reparent: 'changed',
|
|
@@ -376,7 +387,7 @@ export const CHANGE_KINDS = {
|
|
|
376
387
|
* Same charset and same reason as the auth nonce — see
|
|
377
388
|
* docs/spec/change-feed.md § Frames.
|
|
378
389
|
*/
|
|
379
|
-
const
|
|
390
|
+
const CURSOR_FORMAT = /^[A-Za-z0-9_-]+$/;
|
|
380
391
|
/**
|
|
381
392
|
* `since` only means something where a relay exists: a stack with no
|
|
382
393
|
* third party whose writes could have been missed has no cursor it could
|
|
@@ -393,14 +404,14 @@ export function assertSinceUsable(since, relaysChanges) {
|
|
|
393
404
|
if (since === undefined)
|
|
394
405
|
return;
|
|
395
406
|
if (!relaysChanges) {
|
|
396
|
-
throw new
|
|
407
|
+
throw new StackBadRequestError('subscribe() was passed `since`, but this stack relays no changes from elsewhere and so ' +
|
|
397
408
|
'has no cursor it could ever have minted. Omit `since` — or, for a stack that relays ' +
|
|
398
|
-
'from a server, use the
|
|
409
|
+
'from a server, use the cursor off a previously delivered RecordChange.');
|
|
399
410
|
}
|
|
400
|
-
if (!
|
|
401
|
-
throw new
|
|
411
|
+
if (!CURSOR_FORMAT.test(since)) {
|
|
412
|
+
throw new StackBadRequestError(`subscribe() was passed the resume cursor "${since}", which cannot be framed: a cursor ` +
|
|
402
413
|
'carries unreserved base64url characters only, because it travels in a frame id. Use ' +
|
|
403
|
-
'the
|
|
414
|
+
'the cursor off a previously delivered RecordChange, unaltered.');
|
|
404
415
|
}
|
|
405
416
|
}
|
|
406
417
|
//# sourceMappingURL=changes.js.map
|
package/dist/changes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changes.js","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAcH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"changes.js","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"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"}
|
package/dist/combine.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { StackAdapter, StackRecordAdapter, StackBlobAdapter } from './types
|
|
|
4
4
|
* Use this when you want different backends for records and blobs, e.g.:
|
|
5
5
|
*
|
|
6
6
|
* const adapter = combineAdapters({ record: sqliteAdapter, blob: s3Adapter });
|
|
7
|
-
* const stack = await Stack.
|
|
7
|
+
* const stack = await Stack.open(adapter);
|
|
8
8
|
*/
|
|
9
9
|
export declare function combineAdapters(parts: {
|
|
10
10
|
record: StackRecordAdapter;
|