@brass-build/client 0.1.0 → 0.3.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 +72 -63
- package/CHANGELOG.md +97 -0
- package/README.md +325 -235
- package/dist/auth-flow.d.ts +10 -1
- package/dist/auth-flow.d.ts.map +1 -1
- package/dist/auth-flow.js +64 -20
- package/dist/auth-flow.js.map +1 -1
- package/dist/client.d.ts +4 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +245 -76
- package/dist/client.js.map +1 -1
- package/dist/document-checkpoints.d.ts +1 -0
- package/dist/document-checkpoints.d.ts.map +1 -1
- package/dist/document-checkpoints.js +27 -0
- package/dist/document-checkpoints.js.map +1 -1
- package/dist/document-engine.d.ts +4 -0
- package/dist/document-engine.d.ts.map +1 -0
- package/dist/document-engine.js +9 -0
- package/dist/document-engine.js.map +1 -0
- package/dist/document-signals.d.ts +31 -1
- package/dist/document-signals.d.ts.map +1 -1
- package/dist/document-signals.js +59 -0
- package/dist/document-signals.js.map +1 -1
- package/dist/document-streams.d.ts +8 -1
- package/dist/document-streams.d.ts.map +1 -1
- package/dist/document-streams.js +79 -8
- package/dist/document-streams.js.map +1 -1
- package/dist/document-thumbnail-capture.d.ts +20 -0
- package/dist/document-thumbnail-capture.d.ts.map +1 -1
- package/dist/document-thumbnail-capture.js +247 -9
- package/dist/document-thumbnail-capture.js.map +1 -1
- package/dist/documents-namespace.d.ts.map +1 -1
- package/dist/documents-namespace.js +22 -3
- package/dist/documents-namespace.js.map +1 -1
- package/dist/documents.d.ts +49 -16
- package/dist/documents.d.ts.map +1 -1
- package/dist/documents.js +981 -237
- package/dist/documents.js.map +1 -1
- package/dist/embed-protocol.d.ts +3 -0
- package/dist/embed-protocol.d.ts.map +1 -0
- package/dist/embed-protocol.js +26 -0
- package/dist/embed-protocol.js.map +1 -0
- package/dist/emitter.d.ts.map +1 -1
- package/dist/emitter.js +8 -1
- package/dist/emitter.js.map +1 -1
- package/dist/export-guest.d.ts.map +1 -1
- package/dist/export-guest.js +14 -6
- package/dist/export-guest.js.map +1 -1
- package/dist/fetch-deadline.d.ts +22 -0
- package/dist/fetch-deadline.d.ts.map +1 -0
- package/dist/fetch-deadline.js +96 -0
- package/dist/fetch-deadline.js.map +1 -0
- package/dist/fetch-retry.d.ts +1 -0
- package/dist/fetch-retry.d.ts.map +1 -1
- package/dist/fetch-retry.js +12 -5
- package/dist/fetch-retry.js.map +1 -1
- package/dist/handle-types.d.ts +150 -0
- package/dist/handle-types.d.ts.map +1 -0
- package/dist/handle-types.js +8 -0
- package/dist/handle-types.js.map +1 -0
- package/dist/handles.d.ts +48 -48
- package/dist/handles.d.ts.map +1 -1
- package/dist/handles.js +3122 -501
- package/dist/handles.js.map +1 -1
- package/dist/hosted-runtime.d.ts.map +1 -1
- package/dist/hosted-runtime.js +8 -12
- package/dist/hosted-runtime.js.map +1 -1
- package/dist/hosted-ui.d.ts +0 -1
- package/dist/hosted-ui.d.ts.map +1 -1
- package/dist/hosted-ui.js +29 -24
- package/dist/hosted-ui.js.map +1 -1
- package/dist/importer.d.ts.map +1 -1
- package/dist/importer.js +204 -8
- package/dist/importer.js.map +1 -1
- package/dist/index.d.ts +10 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +2 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -0
- package/dist/internal.js.map +1 -1
- package/dist/join-coverage.d.ts +12 -0
- package/dist/join-coverage.d.ts.map +1 -0
- package/dist/join-coverage.js +37 -0
- package/dist/join-coverage.js.map +1 -0
- package/dist/jwt.d.ts.map +1 -1
- package/dist/jwt.js +5 -1
- package/dist/jwt.js.map +1 -1
- package/dist/launch-context.js +2 -2
- package/dist/launch-context.js.map +1 -1
- package/dist/mutate-batching.d.ts +25 -2
- package/dist/mutate-batching.d.ts.map +1 -1
- package/dist/mutate-batching.js +57 -10
- package/dist/mutate-batching.js.map +1 -1
- package/dist/open-document.d.ts +30 -1
- package/dist/open-document.d.ts.map +1 -1
- package/dist/open-document.js +1905 -322
- package/dist/open-document.js.map +1 -1
- package/dist/presence.d.ts +28 -0
- package/dist/presence.d.ts.map +1 -1
- package/dist/presence.js +149 -7
- package/dist/presence.js.map +1 -1
- package/dist/record-paging.d.ts +335 -71
- package/dist/record-paging.d.ts.map +1 -1
- package/dist/record-paging.js +590 -127
- package/dist/record-paging.js.map +1 -1
- package/dist/selection-persistence.d.ts.map +1 -1
- package/dist/selection-persistence.js +11 -1
- package/dist/selection-persistence.js.map +1 -1
- package/dist/serializer.d.ts +30 -1
- package/dist/serializer.d.ts.map +1 -1
- package/dist/session-persistence.d.ts.map +1 -1
- package/dist/session-persistence.js +9 -8
- package/dist/session-persistence.js.map +1 -1
- package/dist/session-toolbar.d.ts +0 -1
- package/dist/session-toolbar.d.ts.map +1 -1
- package/dist/session-toolbar.js +356 -83
- package/dist/session-toolbar.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +87 -18
- package/dist/session.js.map +1 -1
- package/dist/tail-ops.d.ts +14 -4
- package/dist/tail-ops.d.ts.map +1 -1
- package/dist/tail-ops.js +75 -15
- package/dist/tail-ops.js.map +1 -1
- package/dist/topic-lifecycle.d.ts +4 -0
- package/dist/topic-lifecycle.d.ts.map +1 -1
- package/dist/topic-lifecycle.js +25 -1
- package/dist/topic-lifecycle.js.map +1 -1
- package/dist/types.d.ts +47 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/undo.d.ts +2 -3
- package/dist/undo.d.ts.map +1 -1
- package/dist/undo.js +11 -0
- package/dist/undo.js.map +1 -1
- package/dist/unload-guard.d.ts +5 -0
- package/dist/unload-guard.d.ts.map +1 -0
- package/dist/unload-guard.js +88 -0
- package/dist/unload-guard.js.map +1 -0
- package/dist/version-bar.d.ts +4 -3
- package/dist/version-bar.d.ts.map +1 -1
- package/dist/version-bar.js +162 -20
- package/dist/version-bar.js.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.js +1 -1
- package/dist/vite.d.ts +18 -2
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +133 -8
- package/dist/vite.js.map +1 -1
- package/dist/when-saved.d.ts +2 -0
- package/dist/when-saved.d.ts.map +1 -0
- package/dist/when-saved.js +70 -0
- package/dist/when-saved.js.map +1 -0
- package/dist/ws-client.d.ts +27 -3
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +408 -89
- package/dist/ws-client.js.map +1 -1
- package/dist/ws-frame-limit.d.ts.map +1 -1
- package/dist/ws-frame-limit.js +23 -17
- package/dist/ws-frame-limit.js.map +1 -1
- package/docs/app-manifest.md +7 -8
- package/docs/custom-chrome.md +21 -22
- package/docs/hosted-ui-advanced.md +14 -17
- package/docs/imported-documents.md +53 -197
- package/docs/presence.md +45 -21
- package/docs/schemas.md +12 -17
- package/docs/streams.md +55 -57
- package/package.json +4 -3
- package/src/auth-flow.ts +90 -23
- package/src/client.ts +262 -80
- package/src/document-checkpoints.ts +30 -0
- package/src/document-engine.ts +15 -0
- package/src/document-signals.ts +120 -8
- package/src/document-streams.ts +95 -9
- package/src/document-thumbnail-capture.ts +253 -9
- package/src/documents-namespace.ts +38 -13
- package/src/documents.ts +1103 -290
- package/src/embed-protocol.ts +25 -0
- package/src/emitter.ts +8 -1
- package/src/export-guest.ts +15 -9
- package/src/fetch-deadline.ts +119 -0
- package/src/fetch-retry.ts +14 -5
- package/src/handle-types.ts +303 -0
- package/src/handles.ts +3407 -683
- package/src/hosted-runtime.ts +8 -12
- package/src/hosted-ui.ts +28 -32
- package/src/importer.ts +216 -8
- package/src/index.ts +29 -18
- package/src/internal.ts +7 -0
- package/src/join-coverage.ts +42 -0
- package/src/jwt.ts +8 -1
- package/src/launch-context.ts +2 -2
- package/src/mutate-batching.ts +60 -11
- package/src/open-document.ts +2441 -502
- package/src/presence.ts +210 -11
- package/src/record-paging.ts +686 -137
- package/src/selection-persistence.ts +10 -1
- package/src/serializer.ts +33 -1
- package/src/session-persistence.ts +9 -8
- package/src/session-toolbar.ts +387 -89
- package/src/session.ts +91 -17
- package/src/tail-ops.ts +76 -10
- package/src/topic-lifecycle.ts +31 -1
- package/src/types.ts +56 -4
- package/src/undo.ts +13 -5
- package/src/unload-guard.ts +91 -0
- package/src/version-bar.ts +183 -26
- package/src/version.ts +1 -1
- package/src/vite.ts +175 -10
- package/src/when-saved.ts +66 -0
- package/src/ws-client.ts +461 -92
- package/src/ws-frame-limit.ts +23 -17
|
@@ -73,7 +73,16 @@ export function readLastDocument(
|
|
|
73
73
|
): SelectDocumentResult | null {
|
|
74
74
|
const storage = getStorage();
|
|
75
75
|
if (!storage) return null;
|
|
76
|
-
|
|
76
|
+
let raw: string | null;
|
|
77
|
+
try {
|
|
78
|
+
raw = storage.getItem(docKey(appId));
|
|
79
|
+
} catch {
|
|
80
|
+
// A storage that holds a handle but refuses reads (a partitioned or
|
|
81
|
+
// locked-down context). Recalling the last document is a niceness, so it
|
|
82
|
+
// degrades to none rather than throwing out of the caller, which would
|
|
83
|
+
// replace the real reason a document could not be reopened.
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
77
86
|
if (raw === null) return null;
|
|
78
87
|
let parsed: unknown;
|
|
79
88
|
try {
|
package/src/serializer.ts
CHANGED
|
@@ -1,4 +1,36 @@
|
|
|
1
1
|
import type { Document } from './documents.js';
|
|
2
|
+
import type { ListHandle, MapHandle } from './handle-types.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A container read whole.
|
|
6
|
+
*
|
|
7
|
+
* The handles an app holds do not offer this: an app is handed its records
|
|
8
|
+
* through `subscribe`, so a fire costs what changed rather than what the
|
|
9
|
+
* document holds. A serializer is the other kind of caller. It runs detached,
|
|
10
|
+
* with no subscription to have been fed by, and it needs the document once, so
|
|
11
|
+
* it is handed a view that reads whole containers instead of being told to go
|
|
12
|
+
* and fetch them.
|
|
13
|
+
*/
|
|
14
|
+
export interface StoredMap<T = unknown> extends MapHandle<T> {
|
|
15
|
+
read(): Record<string, T>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface StoredList<T = unknown> extends ListHandle<T> {
|
|
19
|
+
read(): T[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The document as a serializer sees it: the same containers, readable whole.
|
|
24
|
+
*
|
|
25
|
+
* A `Document` satisfies this, which is what keeps a serializer the platform
|
|
26
|
+
* ships and one an app registers on one surface. The difference between them
|
|
27
|
+
* is where they run, not what they are allowed to reach.
|
|
28
|
+
*/
|
|
29
|
+
export interface StoredDocument {
|
|
30
|
+
readonly id: string | null;
|
|
31
|
+
map<T = unknown>(key: string): StoredMap<T>;
|
|
32
|
+
list<T = unknown>(key: string): StoredList<T>;
|
|
33
|
+
}
|
|
2
34
|
|
|
3
35
|
// A per-app serializer that turns an app-owned (blob) document's records
|
|
4
36
|
// back into the source file's bytes: the inverse of the parse the app ran
|
|
@@ -11,5 +43,5 @@ import type { Document } from './documents.js';
|
|
|
11
43
|
// whole job. An app with no registered serializer cannot export its blob
|
|
12
44
|
// documents (the platform falls back to the stale-original passthrough).
|
|
13
45
|
export type DocumentSerializer = (
|
|
14
|
-
doc: Document,
|
|
46
|
+
doc: StoredDocument & Document,
|
|
15
47
|
) => Uint8Array | Promise<Uint8Array>;
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
// Per-app sessionStorage layer for the incognito / third-party-cookie
|
|
2
|
-
// fallback session token: the opaque
|
|
3
|
-
// a hard reload in a cookie-blocked browser (incognito, Safari ITP)
|
|
4
|
-
// the user signed in. In a normal browser the cross-site cookie carries
|
|
5
|
-
// session and nothing is written here.
|
|
2
|
+
// fallback session token: the opaque pointer a `brass_code` exchange hands
|
|
3
|
+
// back, so a hard reload in a cookie-blocked browser (incognito, Safari ITP)
|
|
4
|
+
// keeps the user signed in. In a normal browser the cross-site cookie carries
|
|
5
|
+
// the session and nothing is written here.
|
|
6
6
|
//
|
|
7
|
-
// The
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// close) matches the cookie-channel
|
|
7
|
+
// The pointer is bound server-side to the app it was minted for, so its
|
|
8
|
+
// authority is this app and it dies with this app's per-app sign-out. That is
|
|
9
|
+
// what makes it safe to persist at all, and why the key is per-app id.
|
|
10
|
+
// `sessionStorage` (per-tab, dropped on tab close) matches the cookie-channel
|
|
11
|
+
// UX.
|
|
11
12
|
|
|
12
13
|
const KEY_PREFIX = '__brass_session_';
|
|
13
14
|
|