@brass-build/client 0.4.0 → 0.5.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/AGENTS.md +142 -41
- package/CHANGELOG.md +93 -4
- package/README.md +666 -179
- package/dist/acting-organization.d.ts.map +1 -1
- package/dist/acting-organization.js +6 -11
- package/dist/acting-organization.js.map +1 -1
- package/dist/api-fetch.d.ts +8 -0
- package/dist/api-fetch.d.ts.map +1 -1
- package/dist/api-fetch.js +35 -8
- package/dist/api-fetch.js.map +1 -1
- package/dist/batched-get.d.ts +11 -0
- package/dist/batched-get.d.ts.map +1 -0
- package/dist/batched-get.js +92 -0
- package/dist/batched-get.js.map +1 -0
- package/dist/call-service.d.ts +4 -0
- package/dist/call-service.d.ts.map +1 -1
- package/dist/call-service.js +66 -3
- package/dist/call-service.js.map +1 -1
- package/dist/client.d.ts +51 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +982 -124
- package/dist/client.js.map +1 -1
- package/dist/document-checkpoints.d.ts +25 -2
- package/dist/document-checkpoints.d.ts.map +1 -1
- package/dist/document-checkpoints.js +258 -61
- package/dist/document-checkpoints.js.map +1 -1
- package/dist/document-commands.d.ts.map +1 -1
- package/dist/document-commands.js +5 -3
- package/dist/document-commands.js.map +1 -1
- package/dist/document-contents.d.ts +10 -0
- package/dist/document-contents.d.ts.map +1 -1
- package/dist/document-contents.js +23 -1
- package/dist/document-contents.js.map +1 -1
- package/dist/document-set-subscription.d.ts +56 -0
- package/dist/document-set-subscription.d.ts.map +1 -0
- package/dist/document-set-subscription.js +240 -0
- package/dist/document-set-subscription.js.map +1 -0
- package/dist/document-signals.d.ts +6 -0
- package/dist/document-signals.d.ts.map +1 -1
- package/dist/document-signals.js +31 -1
- package/dist/document-signals.js.map +1 -1
- package/dist/document-streams.d.ts +36 -2
- package/dist/document-streams.d.ts.map +1 -1
- package/dist/document-streams.js +69 -18
- package/dist/document-streams.js.map +1 -1
- package/dist/document-thumbnail-capture.d.ts +12 -2
- package/dist/document-thumbnail-capture.d.ts.map +1 -1
- package/dist/document-thumbnail-capture.js +103 -27
- package/dist/document-thumbnail-capture.js.map +1 -1
- package/dist/documents-namespace.d.ts +92 -10
- package/dist/documents-namespace.d.ts.map +1 -1
- package/dist/documents-namespace.js +285 -39
- package/dist/documents-namespace.js.map +1 -1
- package/dist/documents.d.ts +173 -8
- package/dist/documents.d.ts.map +1 -1
- package/dist/documents.js +1778 -310
- package/dist/documents.js.map +1 -1
- package/dist/errors.d.ts +3 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/fetch-retry.d.ts +1 -0
- package/dist/fetch-retry.d.ts.map +1 -1
- package/dist/fetch-retry.js +2 -0
- package/dist/fetch-retry.js.map +1 -1
- package/dist/file-choice.d.ts +2 -0
- package/dist/file-choice.d.ts.map +1 -0
- package/dist/file-choice.js +27 -0
- package/dist/file-choice.js.map +1 -0
- package/dist/guest-link.d.ts +18 -1
- package/dist/guest-link.d.ts.map +1 -1
- package/dist/guest-link.js +329 -1
- package/dist/guest-link.js.map +1 -1
- package/dist/handle-types.d.ts +67 -5
- package/dist/handle-types.d.ts.map +1 -1
- package/dist/handles.d.ts +15 -19
- package/dist/handles.d.ts.map +1 -1
- package/dist/handles.js +231 -76
- package/dist/handles.js.map +1 -1
- package/dist/hosted-ui.d.ts +61 -0
- package/dist/hosted-ui.d.ts.map +1 -1
- package/dist/hosted-ui.js +94 -42
- package/dist/hosted-ui.js.map +1 -1
- package/dist/import-contract.d.ts +74 -0
- package/dist/import-contract.d.ts.map +1 -0
- package/dist/import-contract.js +163 -0
- package/dist/import-contract.js.map +1 -0
- package/dist/import-guest.d.ts +9 -0
- package/dist/import-guest.d.ts.map +1 -0
- package/dist/import-guest.js +155 -0
- package/dist/import-guest.js.map +1 -0
- package/dist/import-report.d.ts +17 -0
- package/dist/import-report.d.ts.map +1 -0
- package/dist/import-report.js +7 -0
- package/dist/import-report.js.map +1 -0
- package/dist/importer-wait.d.ts +2 -0
- package/dist/importer-wait.d.ts.map +1 -0
- package/dist/importer-wait.js +5 -0
- package/dist/importer-wait.js.map +1 -0
- package/dist/importer.d.ts +18 -4
- package/dist/importer.d.ts.map +1 -1
- package/dist/importer.js +322 -105
- package/dist/importer.js.map +1 -1
- package/dist/in-development.d.ts +2 -0
- package/dist/in-development.d.ts.map +1 -0
- package/dist/in-development.js +10 -0
- package/dist/in-development.js.map +1 -0
- package/dist/index.d.ts +16 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -8
- package/dist/index.js.map +1 -1
- package/dist/init-keys.d.ts +1 -1
- package/dist/init-keys.d.ts.map +1 -1
- package/dist/init-keys.js +6 -1
- package/dist/init-keys.js.map +1 -1
- package/dist/input-documents.d.ts +67 -0
- package/dist/input-documents.d.ts.map +1 -0
- package/dist/input-documents.js +693 -0
- package/dist/input-documents.js.map +1 -0
- package/dist/inputs-status.d.ts +80 -0
- package/dist/inputs-status.d.ts.map +1 -0
- package/dist/inputs-status.js +460 -0
- package/dist/inputs-status.js.map +1 -0
- package/dist/inputs.d.ts +2 -0
- package/dist/inputs.d.ts.map +1 -0
- package/dist/inputs.js +793 -0
- package/dist/inputs.js.map +1 -0
- package/dist/internal.d.ts +6 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +4 -1
- package/dist/internal.js.map +1 -1
- package/dist/join-content.d.ts +33 -0
- package/dist/join-content.d.ts.map +1 -0
- package/dist/join-content.js +114 -0
- package/dist/join-content.js.map +1 -0
- package/dist/join-stamp.d.ts +3 -0
- package/dist/join-stamp.d.ts.map +1 -0
- package/dist/join-stamp.js +12 -0
- package/dist/join-stamp.js.map +1 -0
- package/dist/manifest-drift.d.ts +9 -0
- package/dist/manifest-drift.d.ts.map +1 -0
- package/dist/manifest-drift.js +46 -0
- package/dist/manifest-drift.js.map +1 -0
- package/dist/open-document.d.ts +109 -2
- package/dist/open-document.d.ts.map +1 -1
- package/dist/open-document.js +1822 -811
- package/dist/open-document.js.map +1 -1
- package/dist/page-restore.d.ts +12 -0
- package/dist/page-restore.d.ts.map +1 -0
- package/dist/page-restore.js +23 -0
- package/dist/page-restore.js.map +1 -0
- package/dist/placement.d.ts +13 -0
- package/dist/placement.d.ts.map +1 -0
- package/dist/placement.js +34 -0
- package/dist/placement.js.map +1 -0
- package/dist/presence.d.ts +1 -0
- package/dist/presence.d.ts.map +1 -1
- package/dist/presence.js +16 -4
- package/dist/presence.js.map +1 -1
- package/dist/read-only-document.d.ts +87 -0
- package/dist/read-only-document.d.ts.map +1 -0
- package/dist/read-only-document.js +4 -0
- package/dist/read-only-document.js.map +1 -0
- package/dist/record-paging.d.ts +63 -6
- package/dist/record-paging.d.ts.map +1 -1
- package/dist/record-paging.js +122 -29
- package/dist/record-paging.js.map +1 -1
- package/dist/references.d.ts +40 -0
- package/dist/references.d.ts.map +1 -0
- package/dist/references.js +135 -0
- package/dist/references.js.map +1 -0
- package/dist/request-lane.d.ts +5 -0
- package/dist/request-lane.d.ts.map +1 -0
- package/dist/request-lane.js +48 -0
- package/dist/request-lane.js.map +1 -0
- package/dist/sealed-arrow.d.ts +170 -0
- package/dist/sealed-arrow.d.ts.map +1 -0
- package/dist/sealed-arrow.js +769 -0
- package/dist/sealed-arrow.js.map +1 -0
- package/dist/sealed-cache.d.ts +21 -0
- package/dist/sealed-cache.d.ts.map +1 -0
- package/dist/sealed-cache.js +247 -0
- package/dist/sealed-cache.js.map +1 -0
- package/dist/sealed-encode.d.ts +87 -0
- package/dist/sealed-encode.d.ts.map +1 -0
- package/dist/sealed-encode.js +876 -0
- package/dist/sealed-encode.js.map +1 -0
- package/dist/sealed-handles.d.ts +45 -0
- package/dist/sealed-handles.d.ts.map +1 -0
- package/dist/sealed-handles.js +408 -0
- package/dist/sealed-handles.js.map +1 -0
- package/dist/sealed-store.d.ts +242 -0
- package/dist/sealed-store.d.ts.map +1 -0
- package/dist/sealed-store.js +1155 -0
- package/dist/sealed-store.js.map +1 -0
- package/dist/serializer.d.ts +6 -15
- package/dist/serializer.d.ts.map +1 -1
- package/dist/session-toolbar.d.ts +20 -5
- package/dist/session-toolbar.d.ts.map +1 -1
- package/dist/session-toolbar.js +419 -67
- package/dist/session-toolbar.js.map +1 -1
- package/dist/session.d.ts +38 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +562 -79
- package/dist/session.js.map +1 -1
- package/dist/sha256.d.ts +3 -0
- package/dist/sha256.d.ts.map +1 -0
- package/dist/sha256.js +74 -0
- package/dist/sha256.js.map +1 -0
- package/dist/stable-handles.d.ts +19 -0
- package/dist/stable-handles.d.ts.map +1 -0
- package/dist/stable-handles.js +193 -0
- package/dist/stable-handles.js.map +1 -0
- package/dist/staged-seal.d.ts +2 -0
- package/dist/staged-seal.d.ts.map +1 -0
- package/dist/staged-seal.js +76 -0
- package/dist/staged-seal.js.map +1 -0
- package/dist/subscriber-delivery.d.ts +8 -0
- package/dist/subscriber-delivery.d.ts.map +1 -0
- package/dist/subscriber-delivery.js +31 -0
- package/dist/subscriber-delivery.js.map +1 -0
- package/dist/tail-op-import.d.ts +10 -0
- package/dist/tail-op-import.d.ts.map +1 -0
- package/dist/tail-op-import.js +33 -0
- package/dist/tail-op-import.js.map +1 -0
- package/dist/topic-lifecycle.d.ts +6 -0
- package/dist/topic-lifecycle.d.ts.map +1 -1
- package/dist/topic-lifecycle.js +32 -2
- package/dist/topic-lifecycle.js.map +1 -1
- package/dist/trial-replace-dialog.d.ts +10 -0
- package/dist/trial-replace-dialog.d.ts.map +1 -0
- package/dist/trial-replace-dialog.js +153 -0
- package/dist/trial-replace-dialog.js.map +1 -0
- package/dist/types.d.ts +8 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/undo.d.ts +60 -5
- package/dist/undo.d.ts.map +1 -1
- package/dist/undo.js +344 -75
- package/dist/undo.js.map +1 -1
- package/dist/version-bar.d.ts +1 -0
- package/dist/version-bar.d.ts.map +1 -1
- package/dist/version-bar.js +2 -1
- package/dist/version-bar.js.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.js +1 -1
- package/dist/ws-client.d.ts +21 -0
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +192 -8
- package/dist/ws-client.js.map +1 -1
- package/dist/ws-frame-limit.d.ts +1 -0
- package/dist/ws-frame-limit.d.ts.map +1 -1
- package/dist/ws-frame-limit.js.map +1 -1
- package/docs/app-manifest.md +121 -17
- package/docs/custom-chrome.md +24 -16
- package/docs/hosted-ui-advanced.md +38 -6
- package/docs/imported-documents.md +104 -51
- package/docs/presence.md +16 -4
- package/docs/schemas.md +8 -5
- package/docs/services.md +6 -6
- package/docs/streams.md +139 -150
- package/docs/text-fields.md +26 -19
- package/package.json +5 -2
- package/src/acting-organization.ts +6 -12
- package/src/api-fetch.ts +53 -3
- package/src/auth-flow.ts +1 -1
- package/src/batched-get.ts +117 -0
- package/src/call-service.ts +78 -3
- package/src/client.ts +1092 -121
- package/src/document-checkpoints.ts +307 -65
- package/src/document-commands.ts +5 -5
- package/src/document-contents.ts +27 -1
- package/src/document-set-subscription.ts +274 -0
- package/src/document-signals.ts +47 -5
- package/src/document-streams.ts +85 -16
- package/src/document-thumbnail-capture.ts +118 -32
- package/src/documents-namespace.ts +539 -84
- package/src/documents.ts +2017 -348
- package/src/errors.ts +17 -6
- package/src/fetch-retry.ts +5 -0
- package/src/file-choice.ts +26 -0
- package/src/guest-link.ts +362 -1
- package/src/handle-types.ts +73 -47
- package/src/handles.ts +253 -83
- package/src/hosted-ui.ts +211 -50
- package/src/import-contract.ts +227 -0
- package/src/import-guest.ts +193 -0
- package/src/import-report.ts +24 -0
- package/src/importer-wait.ts +4 -0
- package/src/importer.ts +386 -131
- package/src/in-development.ts +10 -0
- package/src/index.ts +76 -16
- package/src/init-keys.ts +6 -1
- package/src/input-documents.ts +819 -0
- package/src/inputs-status.ts +598 -0
- package/src/inputs.ts +1090 -0
- package/src/internal.ts +7 -0
- package/src/join-content.ts +135 -0
- package/src/join-stamp.ts +12 -0
- package/src/manifest-drift.ts +54 -0
- package/src/open-document.ts +2346 -930
- package/src/page-restore.ts +38 -0
- package/src/placement.ts +54 -0
- package/src/presence.ts +21 -5
- package/src/read-only-document.ts +133 -0
- package/src/record-paging.ts +147 -25
- package/src/references.ts +207 -0
- package/src/request-lane.ts +59 -0
- package/src/sealed-arrow.ts +843 -0
- package/src/sealed-cache.ts +267 -0
- package/src/sealed-encode.ts +1015 -0
- package/src/sealed-handles.ts +486 -0
- package/src/sealed-store.ts +1330 -0
- package/src/serializer.ts +8 -20
- package/src/session-toolbar.ts +463 -72
- package/src/session.ts +740 -99
- package/src/sha256.ts +65 -0
- package/src/stable-handles.ts +235 -0
- package/src/staged-seal.ts +90 -0
- package/src/subscriber-delivery.ts +37 -0
- package/src/tail-op-import.ts +30 -0
- package/src/topic-lifecycle.ts +38 -2
- package/src/trial-replace-dialog.ts +163 -0
- package/src/types.ts +6 -6
- package/src/undo.ts +386 -73
- package/src/version-bar.ts +5 -1
- package/src/version.ts +1 -1
- package/src/ws-client.ts +208 -16
- package/src/ws-frame-limit.ts +1 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { DocumentListing, ListDocumentsQuery } from './documents-namespace.js';
|
|
2
|
+
import type { InputReference } from './hosted-ui.js';
|
|
3
|
+
import type { SubscribeOptions, WsTopicCallback } from './ws-client.js';
|
|
4
|
+
/** The slice of the socket client a subscription uses. */
|
|
5
|
+
export interface DocumentSetSocket {
|
|
6
|
+
subscribe(topic: string, callback: WsTopicCallback, options?: SubscribeOptions): () => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The feed topic that covers each reference: `organization:<id>`,
|
|
10
|
+
* `project:<id>`, or `reference:<id>` for a document, which fires when the
|
|
11
|
+
* document or anything filed under it changes.
|
|
12
|
+
*/
|
|
13
|
+
export declare function feedTopicsFor(refs: readonly InputReference[]): string[];
|
|
14
|
+
/** Whether a frame on a feed could have moved what a listing answers: any
|
|
15
|
+
* data frame does, whatever its type, since the listing decides. */
|
|
16
|
+
export declare function frameCouldMoveSet(frame: unknown): boolean;
|
|
17
|
+
/** Whether two listings differ, keyed by `doc_id`: a document joined, left,
|
|
18
|
+
* or has a different `updated_at` or work `status`. */
|
|
19
|
+
export declare function listingsDiffer(previous: readonly DocumentListing[], next: readonly DocumentListing[]): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* How long a trigger waits before listing, so a burst of frames (a move
|
|
22
|
+
* stamps the document and nudges both containers) is one listing.
|
|
23
|
+
*/
|
|
24
|
+
export declare const RELIST_COALESCE_MS = 250;
|
|
25
|
+
/** The longest the first listing waits for its feeds to be established. */
|
|
26
|
+
export declare const FEED_WAIT_MS = 3000;
|
|
27
|
+
/**
|
|
28
|
+
* Watch the set `query` lists and call `listener` whenever a listing differs
|
|
29
|
+
* from the last one, starting from `initial`. Returns the stop function.
|
|
30
|
+
*/
|
|
31
|
+
export declare function watchDocumentSet(args: {
|
|
32
|
+
query: ListDocumentsQuery;
|
|
33
|
+
list: (query: ListDocumentsQuery) => Promise<DocumentListing[]>;
|
|
34
|
+
socket: DocumentSetSocket | undefined;
|
|
35
|
+
listener: () => void;
|
|
36
|
+
initial: DocumentListing[];
|
|
37
|
+
}): () => void;
|
|
38
|
+
/** A listing, as `Brass.documents.list` returns it. */
|
|
39
|
+
export interface DocumentList {
|
|
40
|
+
/** The set as it stood when it was listed. */
|
|
41
|
+
readonly documents: DocumentListing[];
|
|
42
|
+
/** Whether the set has moved since: a document joined it, left it, or
|
|
43
|
+
* changed (its `updated_at` or work `status`). List again to see how. */
|
|
44
|
+
readonly changed: boolean;
|
|
45
|
+
/** Fires once, when the set moves. The set is watched only while a
|
|
46
|
+
* listener is registered and until `close`; throws after `close`. */
|
|
47
|
+
onChanged(cb: () => void): () => void;
|
|
48
|
+
close(): void;
|
|
49
|
+
}
|
|
50
|
+
export declare function createDocumentList(args: {
|
|
51
|
+
documents: DocumentListing[];
|
|
52
|
+
query: ListDocumentsQuery;
|
|
53
|
+
list: (query: ListDocumentsQuery) => Promise<DocumentListing[]>;
|
|
54
|
+
socket: DocumentSetSocket | undefined;
|
|
55
|
+
}): DocumentList;
|
|
56
|
+
//# sourceMappingURL=document-set-subscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-set-subscription.d.ts","sourceRoot":"","sources":["../src/document-set-subscription.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAExE,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,SAAS,CACP,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,eAAe,EACzB,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,IAAI,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,EAAE,CAYvE;AAcD;qEACqE;AACrE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAIzD;AAED;wDACwD;AACxD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,SAAS,eAAe,EAAE,EACpC,IAAI,EAAE,SAAS,eAAe,EAAE,GAC/B,OAAO,CAOT;AASD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,2EAA2E;AAC3E,eAAO,MAAM,YAAY,OAAQ,CAAC;AAElC;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,IAAI,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAChE,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACtC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,GAAG,MAAM,IAAI,CA8Fb;AAED,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,eAAe,EAAE,CAAC;IACtC;8EAC0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;0EACsE;IACtE,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IACtC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,IAAI,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAChE,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACvC,GAAG,YAAY,CAwDf"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
// What lets a listing notice that its set moved (`DocumentList.onChanged`).
|
|
2
|
+
//
|
|
3
|
+
// A feed frame is a trigger and the listing is the truth. The socket feeds
|
|
4
|
+
// that cover a query's references say THAT something in their scope moved;
|
|
5
|
+
// the listing decides what the set is, so folder ancestry, archive members,
|
|
6
|
+
// type matching and the reader's own access are decided in one place, the
|
|
7
|
+
// server's listing, and never re-derived from frames here.
|
|
8
|
+
/**
|
|
9
|
+
* The feed topic that covers each reference: `organization:<id>`,
|
|
10
|
+
* `project:<id>`, or `reference:<id>` for a document, which fires when the
|
|
11
|
+
* document or anything filed under it changes.
|
|
12
|
+
*/
|
|
13
|
+
export function feedTopicsFor(refs) {
|
|
14
|
+
const topics = new Set();
|
|
15
|
+
for (const ref of refs) {
|
|
16
|
+
if (ref.extent === 'organization') {
|
|
17
|
+
topics.add(`organization:${ref.organization_id}`);
|
|
18
|
+
}
|
|
19
|
+
else if (ref.extent === 'project' && ref.project_id) {
|
|
20
|
+
topics.add(`project:${ref.project_id}`);
|
|
21
|
+
}
|
|
22
|
+
else if (ref.extent === 'document' && ref.doc_id) {
|
|
23
|
+
topics.add(`reference:${ref.doc_id}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return [...topics];
|
|
27
|
+
}
|
|
28
|
+
// Frames the socket client hands a topic's callback that report on the
|
|
29
|
+
// subscription itself rather than on anything in its scope.
|
|
30
|
+
const CONTROL_FRAMES = new Set([
|
|
31
|
+
'subscribed',
|
|
32
|
+
'subscribed_ack',
|
|
33
|
+
'unsubscribed',
|
|
34
|
+
'not_subscribed',
|
|
35
|
+
'server_ended',
|
|
36
|
+
'error',
|
|
37
|
+
'pong',
|
|
38
|
+
]);
|
|
39
|
+
/** Whether a frame on a feed could have moved what a listing answers: any
|
|
40
|
+
* data frame does, whatever its type, since the listing decides. */
|
|
41
|
+
export function frameCouldMoveSet(frame) {
|
|
42
|
+
if (frame === null || typeof frame !== 'object')
|
|
43
|
+
return false;
|
|
44
|
+
const type = frame.type;
|
|
45
|
+
return typeof type === 'string' && !CONTROL_FRAMES.has(type);
|
|
46
|
+
}
|
|
47
|
+
/** Whether two listings differ, keyed by `doc_id`: a document joined, left,
|
|
48
|
+
* or has a different `updated_at` or work `status`. */
|
|
49
|
+
export function listingsDiffer(previous, next) {
|
|
50
|
+
if (previous.length !== next.length)
|
|
51
|
+
return true;
|
|
52
|
+
const before = new Map(previous.map((d) => [d.doc_id, d]));
|
|
53
|
+
return next.some((doc) => {
|
|
54
|
+
const was = before.get(doc.doc_id);
|
|
55
|
+
return was === undefined || was.updated_at !== doc.updated_at || !sameStatus(was.status, doc.status);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
// An import that fails writes its status without moving the stamp, so the
|
|
59
|
+
// status is compared as well.
|
|
60
|
+
function sameStatus(a, b) {
|
|
61
|
+
if (a === undefined || b === undefined)
|
|
62
|
+
return a === b;
|
|
63
|
+
return a.pending === b.pending && a.blocking === b.blocking && a.message === b.message;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* How long a trigger waits before listing, so a burst of frames (a move
|
|
67
|
+
* stamps the document and nudges both containers) is one listing.
|
|
68
|
+
*/
|
|
69
|
+
export const RELIST_COALESCE_MS = 250;
|
|
70
|
+
/** The longest the first listing waits for its feeds to be established. */
|
|
71
|
+
export const FEED_WAIT_MS = 3_000;
|
|
72
|
+
/**
|
|
73
|
+
* Watch the set `query` lists and call `listener` whenever a listing differs
|
|
74
|
+
* from the last one, starting from `initial`. Returns the stop function.
|
|
75
|
+
*/
|
|
76
|
+
export function watchDocumentSet(args) {
|
|
77
|
+
const { query, list, socket, listener } = args;
|
|
78
|
+
let stopped = false;
|
|
79
|
+
let last = args.initial;
|
|
80
|
+
let inFlight = false;
|
|
81
|
+
let again = false;
|
|
82
|
+
let timer = null;
|
|
83
|
+
const relist = async () => {
|
|
84
|
+
if (stopped)
|
|
85
|
+
return;
|
|
86
|
+
if (inFlight) {
|
|
87
|
+
// A frame that lands while a listing is out may describe a write that
|
|
88
|
+
// listing already missed, so one more follows it.
|
|
89
|
+
again = true;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
inFlight = true;
|
|
93
|
+
try {
|
|
94
|
+
const next = await list(query);
|
|
95
|
+
if (stopped)
|
|
96
|
+
return;
|
|
97
|
+
const moved = listingsDiffer(last, next);
|
|
98
|
+
last = next;
|
|
99
|
+
if (moved)
|
|
100
|
+
listener();
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
// The watch keeps its last answer and lists again on the next trigger.
|
|
104
|
+
if (!stopped)
|
|
105
|
+
console.error('Brass.documents.list:', error);
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
inFlight = false;
|
|
109
|
+
if (again && !stopped) {
|
|
110
|
+
again = false;
|
|
111
|
+
schedule();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
const schedule = () => {
|
|
116
|
+
// Before the first listing, that listing answers whatever moved.
|
|
117
|
+
if (stopped || !firstListed || timer !== null)
|
|
118
|
+
return;
|
|
119
|
+
timer = setTimeout(() => {
|
|
120
|
+
timer = null;
|
|
121
|
+
void relist();
|
|
122
|
+
}, RELIST_COALESCE_MS);
|
|
123
|
+
};
|
|
124
|
+
// The first listing waits for the feeds to be established, so a write
|
|
125
|
+
// landing between that listing and the subscription cannot fall between
|
|
126
|
+
// them. A feed the socket refuses, or one that never answers, stops being
|
|
127
|
+
// waited for rather than holding the first answer back.
|
|
128
|
+
const awaiting = new Set();
|
|
129
|
+
let firstListed = false;
|
|
130
|
+
const listFirst = () => {
|
|
131
|
+
if (firstListed)
|
|
132
|
+
return;
|
|
133
|
+
firstListed = true;
|
|
134
|
+
if (firstTimer !== null)
|
|
135
|
+
clearTimeout(firstTimer);
|
|
136
|
+
void relist();
|
|
137
|
+
};
|
|
138
|
+
const settled = (topic) => {
|
|
139
|
+
awaiting.delete(topic);
|
|
140
|
+
if (awaiting.size === 0)
|
|
141
|
+
listFirst();
|
|
142
|
+
};
|
|
143
|
+
const unsubscribes = [];
|
|
144
|
+
const topics = socket ? feedTopicsFor(query.from ?? []) : [];
|
|
145
|
+
for (const topic of topics)
|
|
146
|
+
awaiting.add(topic);
|
|
147
|
+
let firstTimer = topics.length > 0 ? setTimeout(listFirst, FEED_WAIT_MS) : null;
|
|
148
|
+
for (const topic of topics) {
|
|
149
|
+
unsubscribes.push(socket.subscribe(topic, (frame) => {
|
|
150
|
+
if (frameCouldMoveSet(frame))
|
|
151
|
+
schedule();
|
|
152
|
+
}, {
|
|
153
|
+
onSubscribed: ({ resubscribed }) => {
|
|
154
|
+
// Frames fanned out while the socket was down are gone, so a
|
|
155
|
+
// re-established feed is answered with a listing.
|
|
156
|
+
if (resubscribed)
|
|
157
|
+
schedule();
|
|
158
|
+
else
|
|
159
|
+
settled(topic);
|
|
160
|
+
},
|
|
161
|
+
onEnded: () => settled(topic),
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
if (topics.length === 0)
|
|
165
|
+
listFirst();
|
|
166
|
+
return () => {
|
|
167
|
+
if (stopped)
|
|
168
|
+
return;
|
|
169
|
+
stopped = true;
|
|
170
|
+
if (timer !== null)
|
|
171
|
+
clearTimeout(timer);
|
|
172
|
+
if (firstTimer !== null)
|
|
173
|
+
clearTimeout(firstTimer);
|
|
174
|
+
for (const unsubscribe of unsubscribes)
|
|
175
|
+
unsubscribe();
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
export function createDocumentList(args) {
|
|
179
|
+
let changed = false;
|
|
180
|
+
let closed = false;
|
|
181
|
+
let stopWatching = null;
|
|
182
|
+
const listeners = new Set();
|
|
183
|
+
const stopWatch = () => {
|
|
184
|
+
stopWatching?.();
|
|
185
|
+
stopWatching = null;
|
|
186
|
+
};
|
|
187
|
+
const markChanged = () => {
|
|
188
|
+
if (changed || closed)
|
|
189
|
+
return;
|
|
190
|
+
changed = true;
|
|
191
|
+
stopWatch();
|
|
192
|
+
const fire = [...listeners];
|
|
193
|
+
listeners.clear();
|
|
194
|
+
for (const cb of fire) {
|
|
195
|
+
try {
|
|
196
|
+
cb();
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
console.error('Brass: an onChanged listener threw', err);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
const set = {
|
|
204
|
+
documents: args.documents,
|
|
205
|
+
get changed() {
|
|
206
|
+
return changed;
|
|
207
|
+
},
|
|
208
|
+
onChanged(cb) {
|
|
209
|
+
if (closed)
|
|
210
|
+
throw new Error('DocumentList is closed');
|
|
211
|
+
if (changed) {
|
|
212
|
+
queueMicrotask(() => {
|
|
213
|
+
if (!closed)
|
|
214
|
+
cb();
|
|
215
|
+
});
|
|
216
|
+
return () => { };
|
|
217
|
+
}
|
|
218
|
+
listeners.add(cb);
|
|
219
|
+
stopWatching ??= watchDocumentSet({
|
|
220
|
+
query: args.query,
|
|
221
|
+
list: args.list,
|
|
222
|
+
socket: args.socket,
|
|
223
|
+
initial: args.documents,
|
|
224
|
+
listener: markChanged,
|
|
225
|
+
});
|
|
226
|
+
return () => {
|
|
227
|
+
listeners.delete(cb);
|
|
228
|
+
if (listeners.size === 0)
|
|
229
|
+
stopWatch();
|
|
230
|
+
};
|
|
231
|
+
},
|
|
232
|
+
close() {
|
|
233
|
+
closed = true;
|
|
234
|
+
listeners.clear();
|
|
235
|
+
stopWatch();
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
return set;
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=document-set-subscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-set-subscription.js","sourceRoot":"","sources":["../src/document-set-subscription.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,7 @@ export interface DrivePublishTarget {
|
|
|
41
41
|
detail: string;
|
|
42
42
|
publishing: boolean;
|
|
43
43
|
publishFailed: boolean;
|
|
44
|
+
unpublishable: boolean;
|
|
44
45
|
}
|
|
45
46
|
export declare class GoneSignal {
|
|
46
47
|
private readonly _emitter;
|
|
@@ -51,9 +52,14 @@ export declare class GoneSignal {
|
|
|
51
52
|
}
|
|
52
53
|
export declare class WorkStatusSignal {
|
|
53
54
|
private readonly _emitter;
|
|
55
|
+
private _work;
|
|
56
|
+
private _notice;
|
|
54
57
|
get status(): DocumentWorkStatus | null;
|
|
58
|
+
get work(): DocumentWorkStatus | null;
|
|
59
|
+
get notice(): DocumentWorkStatus | null;
|
|
55
60
|
on(cb: DocumentStatusListener): DocumentStatusUnsubscribe;
|
|
56
61
|
emit(status: DocumentWorkStatus): void;
|
|
62
|
+
setNotice(notice: DocumentWorkStatus | null): void;
|
|
57
63
|
clearListeners(): void;
|
|
58
64
|
}
|
|
59
65
|
export declare class DriveStatusSignal {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-signals.d.ts","sourceRoot":"","sources":["../src/document-signals.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD,MAAM,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;AACxE,MAAM,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC;AAOjD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IAMjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAC1E,MAAM,MAAM,yBAAyB,GAAG,MAAM,IAAI,CAAC;AAMnD,MAAM,MAAM,0BAA0B,GAClC,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,UAAU,CAAC;AAKf,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,aAAa,CAAC;AAO7D,MAAM,WAAW,mBAAmB;IAGlC,SAAS,EAAE,MAAM,CAAC;IAElB,SAAS,EAAE,MAAM,CAAC;IAElB,KAAK,EAAE,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"document-signals.d.ts","sourceRoot":"","sources":["../src/document-signals.ts"],"names":[],"mappings":"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"}
|
package/dist/document-signals.js
CHANGED
|
@@ -41,9 +41,18 @@ export class GoneSignal {
|
|
|
41
41
|
this._emitter.clear();
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
+
const NO_WORK_STATUS = { message: '', pending: false, blocking: false };
|
|
44
45
|
// Latest-retained, re-emit-per-phase signal for `doc_status`. Not one-shot:
|
|
45
46
|
// phases arrive repeatedly until terminal (`pending: false`), and the latest
|
|
46
47
|
// is retained so a late subscriber still sees the final state.
|
|
48
|
+
//
|
|
49
|
+
// A notice is the SDK's own status, raised over the platform's work rather
|
|
50
|
+
// than replacing it: `status` reads the notice while one is up, and `work`
|
|
51
|
+
// keeps answering what the platform reported, which is what every SDK-side
|
|
52
|
+
// decision about pending work reads. A work status arriving under a notice
|
|
53
|
+
// still reaches the listeners (the SDK's own import waiters attach here and
|
|
54
|
+
// wait for a terminal one), and the notice is re-emitted straight after it so
|
|
55
|
+
// the last thing a listener hears matches `status`.
|
|
47
56
|
export class WorkStatusSignal {
|
|
48
57
|
_emitter = createEmitter({
|
|
49
58
|
fireOnAttach: true,
|
|
@@ -52,14 +61,34 @@ export class WorkStatusSignal {
|
|
|
52
61
|
console.error('[Brass] onStatus listener threw:', err);
|
|
53
62
|
},
|
|
54
63
|
});
|
|
64
|
+
_work = null;
|
|
65
|
+
_notice = null;
|
|
55
66
|
get status() {
|
|
56
|
-
return this.
|
|
67
|
+
return this._notice ?? this._work;
|
|
68
|
+
}
|
|
69
|
+
get work() {
|
|
70
|
+
return this._work;
|
|
71
|
+
}
|
|
72
|
+
get notice() {
|
|
73
|
+
return this._notice;
|
|
57
74
|
}
|
|
58
75
|
on(cb) {
|
|
59
76
|
return this._emitter.on(cb);
|
|
60
77
|
}
|
|
61
78
|
emit(status) {
|
|
79
|
+
this._work = status;
|
|
62
80
|
this._emitter.emit(status);
|
|
81
|
+
if (this._notice !== null)
|
|
82
|
+
this._emitter.emit(this._notice);
|
|
83
|
+
}
|
|
84
|
+
// Raise or clear the notice. Clearing hands listeners the work status it
|
|
85
|
+
// covered, or a terminal empty one when there is none, since a listener
|
|
86
|
+
// takes a status rather than `null`.
|
|
87
|
+
setNotice(notice) {
|
|
88
|
+
if (notice === this._notice)
|
|
89
|
+
return;
|
|
90
|
+
this._notice = notice;
|
|
91
|
+
this._emitter.emit(notice ?? this._work ?? NO_WORK_STATUS);
|
|
63
92
|
}
|
|
64
93
|
clearListeners() {
|
|
65
94
|
this._emitter.clear();
|
|
@@ -162,6 +191,7 @@ function driveStatusEqual(a, b) {
|
|
|
162
191
|
a.detail === b.detail &&
|
|
163
192
|
a.broken === b.broken &&
|
|
164
193
|
a.pushReplacesRemote === b.pushReplacesRemote &&
|
|
194
|
+
a.keepsPriorVersions === b.keepsPriorVersions &&
|
|
165
195
|
a.mirrorDirection === b.mirrorDirection &&
|
|
166
196
|
a.ref === b.ref &&
|
|
167
197
|
a.refUpdatedAt === b.refUpdatedAt &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-signals.js","sourceRoot":"","sources":["../src/document-signals.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,2EAA2E;AAC3E,kDAAkD;AAClD,EAAE;AACF,sEAAsE;AACtE,4DAA4D;AAC5D,yEAAyE;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"document-signals.js","sourceRoot":"","sources":["../src/document-signals.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { Document, DocumentMutator, DocumentSubscriber, DocumentUnsubscribe, EntityProxy, RootKind } from './documents.js';
|
|
2
2
|
import type { DocumentStreamInfo } from './documents-namespace.js';
|
|
3
3
|
import type { DocumentGoneListener, DocumentGoneUnsubscribe, DocumentStatusListener, DocumentStatusUnsubscribe, DocumentWorkStatus } from './document-signals.js';
|
|
4
|
-
import type {
|
|
4
|
+
import type { InputDocumentHandlers, InputDocumentOptions } from './input-documents.js';
|
|
5
|
+
import type { ListHandle, MapHandle, MutateOptions, OrderedMapHandle, TextHandle } from './handle-types.js';
|
|
6
|
+
import type { InputReference } from './hosted-ui.js';
|
|
5
7
|
export interface StreamRuntime {
|
|
6
8
|
list(): Promise<DocumentStreamInfo[]>;
|
|
7
9
|
create(name: string): Promise<DocumentStreamInfo>;
|
|
@@ -13,7 +15,11 @@ export declare class DocumentStream {
|
|
|
13
15
|
map<T = unknown>(key: string): MapHandle<T>;
|
|
14
16
|
list<T = unknown>(key: string): ListHandle<T>;
|
|
15
17
|
orderedMap<T = unknown>(mapKey: string, orderKey: string): OrderedMapHandle<T>;
|
|
16
|
-
mutate<E extends object = EntityProxy>(fn: (d: DocumentMutator<E>) => void): void;
|
|
18
|
+
mutate<E extends object = EntityProxy>(fn: (d: DocumentMutator<E>) => void, options?: MutateOptions): void;
|
|
19
|
+
/** Records the documents `key` depends on for this stream; see
|
|
20
|
+
* `Document.dependsOn`. A reference to any stream of this document is
|
|
21
|
+
* refused. */
|
|
22
|
+
dependsOn(key: string, refs: readonly InputReference[] | null): void;
|
|
17
23
|
roots(): Record<string, RootKind>;
|
|
18
24
|
text(key: string): TextHandle;
|
|
19
25
|
toJSON(): Record<string, unknown>;
|
|
@@ -21,11 +27,39 @@ export declare class DocumentStream {
|
|
|
21
27
|
get readOnly(): boolean;
|
|
22
28
|
get savingCount(): number;
|
|
23
29
|
get atCapacity(): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* The work in flight on this stream, or `null` when there is none. Render
|
|
32
|
+
* `message` verbatim.
|
|
33
|
+
*/
|
|
24
34
|
get status(): DocumentWorkStatus | null;
|
|
35
|
+
/**
|
|
36
|
+
* Calls `cb` with every work-status update for this stream, and once on
|
|
37
|
+
* attach when a status is already known. Returns an unsubscribe.
|
|
38
|
+
*/
|
|
25
39
|
onStatus(cb: DocumentStatusListener): DocumentStatusUnsubscribe;
|
|
26
40
|
onGone(cb: DocumentGoneListener): DocumentGoneUnsubscribe;
|
|
41
|
+
/** The input files of a key this stream records references under;
|
|
42
|
+
* see `Document.subscribeInputDocuments`. A stream's keys are its own,
|
|
43
|
+
* apart from the document's and every other stream's. */
|
|
44
|
+
subscribeInputDocuments(key: string, handlers: InputDocumentHandlers, options?: InputDocumentOptions): () => void;
|
|
45
|
+
/**
|
|
46
|
+
* Reverts this stream's part of the newest undo step that touched it,
|
|
47
|
+
* leaving the document's other streams as they are.
|
|
48
|
+
* @deprecated Call `doc.undo()`, which reverts the newest step in every
|
|
49
|
+
* stream it touched.
|
|
50
|
+
*/
|
|
27
51
|
undo(): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Re-applies this stream's part of the step it most recently undid.
|
|
54
|
+
* @deprecated Call `doc.redo()`.
|
|
55
|
+
*/
|
|
28
56
|
redo(): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Ends the document's open undo step, so the next local edit in any stream
|
|
59
|
+
* starts a new one.
|
|
60
|
+
* @deprecated Call `doc.createCheckpoint()` at the end of each user action,
|
|
61
|
+
* which also ends the step.
|
|
62
|
+
*/
|
|
29
63
|
sealUndoStep(): void;
|
|
30
64
|
}
|
|
31
65
|
//# sourceMappingURL=document-streams.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-streams.d.ts","sourceRoot":"","sources":["../src/document-streams.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACT,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EACV,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"document-streams.d.ts","sourceRoot":"","sources":["../src/document-streams.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACT,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EACV,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,UAAU,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAQrD,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACtC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC7C;AAED,qBAAa,cAAc;IAGzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAQtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IAWrC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAI3C,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;IAI7C,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAI9E,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,WAAW,EACnC,EAAE,EAAE,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,EACnC,OAAO,CAAC,EAAE,aAAa,GACtB,IAAI;IAIP;;mBAEe;IACf,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI,GAAG,IAAI;IAUpE,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;IAIjC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAI7B,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIjC,SAAS,CAAC,EAAE,EAAE,kBAAkB,GAAG,mBAAmB;IAWtD,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAYD,IAAI,WAAW,IAAI,MAAM,CAExB;IAKD,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,kBAAkB,GAAG,IAAI,CAEtC;IAED;;;OAGG;IACH,QAAQ,CAAC,EAAE,EAAE,sBAAsB,GAAG,yBAAyB;IAM/D,MAAM,CAAC,EAAE,EAAE,oBAAoB,GAAG,uBAAuB;IAqBzD;;8DAE0D;IAC1D,uBAAuB,CACrB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,qBAAqB,EAC/B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,MAAM,IAAI;IASb;;;;;OAKG;IACH,IAAI,IAAI,OAAO;IAIf;;;OAGG;IACH,IAAI,IAAI,OAAO;IAIf;;;;;OAKG;IACH,YAAY,IAAI,IAAI;CAoErB"}
|
package/dist/document-streams.js
CHANGED
|
@@ -38,8 +38,19 @@ export class DocumentStream {
|
|
|
38
38
|
orderedMap(mapKey, orderKey) {
|
|
39
39
|
return this._inner.orderedMap(mapKey, orderKey);
|
|
40
40
|
}
|
|
41
|
-
mutate(fn) {
|
|
42
|
-
this._inner.mutate(fn);
|
|
41
|
+
mutate(fn, options) {
|
|
42
|
+
this._inner.mutate(fn, options);
|
|
43
|
+
}
|
|
44
|
+
/** Records the documents `key` depends on for this stream; see
|
|
45
|
+
* `Document.dependsOn`. A reference to any stream of this document is
|
|
46
|
+
* refused. */
|
|
47
|
+
dependsOn(key, refs) {
|
|
48
|
+
this._inner.dependsOn(key, refs);
|
|
49
|
+
}
|
|
50
|
+
/** @internal Records what this reader read for the key `status` reports
|
|
51
|
+
* on this stream; see `Document.markRead`. */
|
|
52
|
+
markRead(status, options) {
|
|
53
|
+
this._inner.markRead(status, options);
|
|
43
54
|
}
|
|
44
55
|
roots() {
|
|
45
56
|
return this._inner.roots();
|
|
@@ -62,6 +73,11 @@ export class DocumentStream {
|
|
|
62
73
|
get readOnly() {
|
|
63
74
|
return this._inner.readOnly;
|
|
64
75
|
}
|
|
76
|
+
/** @internal This stream's line's `updated_at` as it was opened; see
|
|
77
|
+
* `Document.updatedAt`. */
|
|
78
|
+
get updatedAt() {
|
|
79
|
+
return this._inner.updatedAt;
|
|
80
|
+
}
|
|
65
81
|
// Locally-issued ops on this stream the server has not acked yet. This
|
|
66
82
|
// stream's own line: `doc.savingCount` is the one that adds the streams up,
|
|
67
83
|
// and the default stream's inner IS the document, so reading that here would
|
|
@@ -75,13 +91,17 @@ export class DocumentStream {
|
|
|
75
91
|
get atCapacity() {
|
|
76
92
|
return this._inner.atCapacity;
|
|
77
93
|
}
|
|
78
|
-
|
|
79
|
-
|
|
94
|
+
/**
|
|
95
|
+
* The work in flight on this stream, or `null` when there is none. Render
|
|
96
|
+
* `message` verbatim.
|
|
97
|
+
*/
|
|
80
98
|
get status() {
|
|
81
99
|
return this._inner.status;
|
|
82
100
|
}
|
|
83
|
-
|
|
84
|
-
|
|
101
|
+
/**
|
|
102
|
+
* Calls `cb` with every work-status update for this stream, and once on
|
|
103
|
+
* attach when a status is already known. Returns an unsubscribe.
|
|
104
|
+
*/
|
|
85
105
|
onStatus(cb) {
|
|
86
106
|
return this._inner.onStatus(cb);
|
|
87
107
|
}
|
|
@@ -90,21 +110,52 @@ export class DocumentStream {
|
|
|
90
110
|
onGone(cb) {
|
|
91
111
|
return this._inner.onGone(cb);
|
|
92
112
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
113
|
+
/** @internal On a frozen copy: whether this stream has moved since it was
|
|
114
|
+
* read. Each stream is its own line, so each is watched on its own. */
|
|
115
|
+
get changed() {
|
|
116
|
+
return this._inner.changed;
|
|
117
|
+
}
|
|
118
|
+
/** @internal */
|
|
119
|
+
onChanged(cb) {
|
|
120
|
+
return this._inner.onChanged(cb);
|
|
121
|
+
}
|
|
122
|
+
/** @internal Typed on `ReadOnlyStream`: loads this stream as it stands now
|
|
123
|
+
* on a frozen copy. */
|
|
124
|
+
reload() {
|
|
125
|
+
return this._inner.reload();
|
|
126
|
+
}
|
|
127
|
+
/** The input files of a key this stream records references under;
|
|
128
|
+
* see `Document.subscribeInputDocuments`. A stream's keys are its own,
|
|
129
|
+
* apart from the document's and every other stream's. */
|
|
130
|
+
subscribeInputDocuments(key, handlers, options) {
|
|
131
|
+
return this._inner.subscribeInputDocuments(key, handlers, options);
|
|
132
|
+
}
|
|
133
|
+
/** @internal The status of a key this stream records references under. */
|
|
134
|
+
subscribeInputStatus(key, cb) {
|
|
135
|
+
return this._inner.subscribeInputStatus(key, cb);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Reverts this stream's part of the newest undo step that touched it,
|
|
139
|
+
* leaving the document's other streams as they are.
|
|
140
|
+
* @deprecated Call `doc.undo()`, which reverts the newest step in every
|
|
141
|
+
* stream it touched.
|
|
142
|
+
*/
|
|
96
143
|
undo() {
|
|
97
|
-
return this._inner.undo
|
|
144
|
+
return this._inner._replayOwnUndoStep('undo');
|
|
98
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* Re-applies this stream's part of the step it most recently undid.
|
|
148
|
+
* @deprecated Call `doc.redo()`.
|
|
149
|
+
*/
|
|
99
150
|
redo() {
|
|
100
|
-
return this._inner.redo
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
151
|
+
return this._inner._replayOwnUndoStep('redo');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Ends the document's open undo step, so the next local edit in any stream
|
|
155
|
+
* starts a new one.
|
|
156
|
+
* @deprecated Call `doc.createCheckpoint()` at the end of each user action,
|
|
157
|
+
* which also ends the step.
|
|
158
|
+
*/
|
|
108
159
|
sealUndoStep() {
|
|
109
160
|
this._inner._sealUndoStep();
|
|
110
161
|
}
|