@brass-build/client 0.1.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 +255 -0
- package/CHANGELOG.md +15 -0
- package/LICENSE +21 -0
- package/README.md +836 -0
- package/dist/api-fetch.d.ts +16 -0
- package/dist/api-fetch.d.ts.map +1 -0
- package/dist/api-fetch.js +97 -0
- package/dist/api-fetch.js.map +1 -0
- package/dist/api-headers.d.ts +3 -0
- package/dist/api-headers.d.ts.map +1 -0
- package/dist/api-headers.js +25 -0
- package/dist/api-headers.js.map +1 -0
- package/dist/auth-flow.d.ts +23 -0
- package/dist/auth-flow.d.ts.map +1 -0
- package/dist/auth-flow.js +76 -0
- package/dist/auth-flow.js.map +1 -0
- package/dist/client.d.ts +106 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1278 -0
- package/dist/client.js.map +1 -0
- package/dist/doc-url-sync.d.ts +19 -0
- package/dist/doc-url-sync.d.ts.map +1 -0
- package/dist/doc-url-sync.js +181 -0
- package/dist/doc-url-sync.js.map +1 -0
- package/dist/document-branches.d.ts +32 -0
- package/dist/document-branches.d.ts.map +1 -0
- package/dist/document-branches.js +89 -0
- package/dist/document-branches.js.map +1 -0
- package/dist/document-checkpoints.d.ts +24 -0
- package/dist/document-checkpoints.d.ts.map +1 -0
- package/dist/document-checkpoints.js +115 -0
- package/dist/document-checkpoints.js.map +1 -0
- package/dist/document-commands.d.ts +93 -0
- package/dist/document-commands.d.ts.map +1 -0
- package/dist/document-commands.js +423 -0
- package/dist/document-commands.js.map +1 -0
- package/dist/document-signals.d.ts +53 -0
- package/dist/document-signals.d.ts.map +1 -0
- package/dist/document-signals.js +114 -0
- package/dist/document-signals.js.map +1 -0
- package/dist/document-streams.d.ts +22 -0
- package/dist/document-streams.d.ts.map +1 -0
- package/dist/document-streams.js +98 -0
- package/dist/document-streams.js.map +1 -0
- package/dist/document-thumbnail-capture.d.ts +27 -0
- package/dist/document-thumbnail-capture.d.ts.map +1 -0
- package/dist/document-thumbnail-capture.js +160 -0
- package/dist/document-thumbnail-capture.js.map +1 -0
- package/dist/documents-namespace.d.ts +134 -0
- package/dist/documents-namespace.d.ts.map +1 -0
- package/dist/documents-namespace.js +190 -0
- package/dist/documents-namespace.js.map +1 -0
- package/dist/documents.d.ts +146 -0
- package/dist/documents.d.ts.map +1 -0
- package/dist/documents.js +2045 -0
- package/dist/documents.js.map +1 -0
- package/dist/emitter.d.ts +15 -0
- package/dist/emitter.d.ts.map +1 -0
- package/dist/emitter.js +90 -0
- package/dist/emitter.js.map +1 -0
- package/dist/errors.d.ts +18 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +22 -0
- package/dist/errors.js.map +1 -0
- package/dist/export-guest.d.ts +9 -0
- package/dist/export-guest.d.ts.map +1 -0
- package/dist/export-guest.js +225 -0
- package/dist/export-guest.js.map +1 -0
- package/dist/fetch-retry.d.ts +16 -0
- package/dist/fetch-retry.d.ts.map +1 -0
- package/dist/fetch-retry.js +90 -0
- package/dist/fetch-retry.js.map +1 -0
- package/dist/guest-link.d.ts +3 -0
- package/dist/guest-link.d.ts.map +1 -0
- package/dist/guest-link.js +13 -0
- package/dist/guest-link.js.map +1 -0
- package/dist/handles.d.ts +57 -0
- package/dist/handles.d.ts.map +1 -0
- package/dist/handles.js +1375 -0
- package/dist/handles.js.map +1 -0
- package/dist/hosted-runtime.d.ts +33 -0
- package/dist/hosted-runtime.d.ts.map +1 -0
- package/dist/hosted-runtime.js +99 -0
- package/dist/hosted-runtime.js.map +1 -0
- package/dist/hosted-ui.d.ts +84 -0
- package/dist/hosted-ui.d.ts.map +1 -0
- package/dist/hosted-ui.js +673 -0
- package/dist/hosted-ui.js.map +1 -0
- package/dist/importer.d.ts +22 -0
- package/dist/importer.d.ts.map +1 -0
- package/dist/importer.js +54 -0
- package/dist/importer.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +132 -0
- package/dist/index.js.map +1 -0
- package/dist/init-keys.d.ts +3 -0
- package/dist/init-keys.d.ts.map +1 -0
- package/dist/init-keys.js +13 -0
- package/dist/init-keys.js.map +1 -0
- package/dist/internal.d.ts +6 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +17 -0
- package/dist/internal.js.map +1 -0
- package/dist/jwt.d.ts +3 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +22 -0
- package/dist/jwt.js.map +1 -0
- package/dist/launch-context.d.ts +4 -0
- package/dist/launch-context.d.ts.map +1 -0
- package/dist/launch-context.js +44 -0
- package/dist/launch-context.js.map +1 -0
- package/dist/login-hint.d.ts +4 -0
- package/dist/login-hint.d.ts.map +1 -0
- package/dist/login-hint.js +63 -0
- package/dist/login-hint.js.map +1 -0
- package/dist/mutate-batching.d.ts +14 -0
- package/dist/mutate-batching.d.ts.map +1 -0
- package/dist/mutate-batching.js +65 -0
- package/dist/mutate-batching.js.map +1 -0
- package/dist/open-document.d.ts +127 -0
- package/dist/open-document.d.ts.map +1 -0
- package/dist/open-document.js +2121 -0
- package/dist/open-document.js.map +1 -0
- package/dist/page-title.d.ts +3 -0
- package/dist/page-title.d.ts.map +1 -0
- package/dist/page-title.js +32 -0
- package/dist/page-title.js.map +1 -0
- package/dist/perf.d.ts +9 -0
- package/dist/perf.d.ts.map +1 -0
- package/dist/perf.js +39 -0
- package/dist/perf.js.map +1 -0
- package/dist/presence.d.ts +62 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +331 -0
- package/dist/presence.js.map +1 -0
- package/dist/record-paging.d.ts +99 -0
- package/dist/record-paging.d.ts.map +1 -0
- package/dist/record-paging.js +220 -0
- package/dist/record-paging.js.map +1 -0
- package/dist/schema-conflict-dialog.d.ts +10 -0
- package/dist/schema-conflict-dialog.d.ts.map +1 -0
- package/dist/schema-conflict-dialog.js +164 -0
- package/dist/schema-conflict-dialog.js.map +1 -0
- package/dist/selection-persistence.d.ts +5 -0
- package/dist/selection-persistence.d.ts.map +1 -0
- package/dist/selection-persistence.js +90 -0
- package/dist/selection-persistence.js.map +1 -0
- package/dist/serializer.d.ts +3 -0
- package/dist/serializer.d.ts.map +1 -0
- package/dist/serializer.js +2 -0
- package/dist/serializer.js.map +1 -0
- package/dist/session-persistence.d.ts +4 -0
- package/dist/session-persistence.d.ts.map +1 -0
- package/dist/session-persistence.js +68 -0
- package/dist/session-persistence.js.map +1 -0
- package/dist/session-toolbar.d.ts +62 -0
- package/dist/session-toolbar.d.ts.map +1 -0
- package/dist/session-toolbar.js +1205 -0
- package/dist/session-toolbar.js.map +1 -0
- package/dist/session.d.ts +69 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +926 -0
- package/dist/session.js.map +1 -0
- package/dist/tail-ops.d.ts +28 -0
- package/dist/tail-ops.d.ts.map +1 -0
- package/dist/tail-ops.js +46 -0
- package/dist/tail-ops.js.map +1 -0
- package/dist/topic-lifecycle.d.ts +41 -0
- package/dist/topic-lifecycle.d.ts.map +1 -0
- package/dist/topic-lifecycle.js +169 -0
- package/dist/topic-lifecycle.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/undo.d.ts +18 -0
- package/dist/undo.d.ts.map +1 -0
- package/dist/undo.js +110 -0
- package/dist/undo.js.map +1 -0
- package/dist/version-bar.d.ts +22 -0
- package/dist/version-bar.d.ts.map +1 -0
- package/dist/version-bar.js +169 -0
- package/dist/version-bar.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/dist/vite.d.ts +15 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +36 -0
- package/dist/vite.js.map +1 -0
- package/dist/ws-client.d.ts +53 -0
- package/dist/ws-client.d.ts.map +1 -0
- package/dist/ws-client.js +604 -0
- package/dist/ws-client.js.map +1 -0
- package/dist/ws-frame-limit.d.ts +21 -0
- package/dist/ws-frame-limit.d.ts.map +1 -0
- package/dist/ws-frame-limit.js +40 -0
- package/dist/ws-frame-limit.js.map +1 -0
- package/docs/app-manifest.md +65 -0
- package/docs/custom-chrome.md +147 -0
- package/docs/hosted-ui-advanced.md +77 -0
- package/docs/imported-documents.md +261 -0
- package/docs/presence.md +129 -0
- package/docs/schemas.md +135 -0
- package/docs/streams.md +248 -0
- package/package.json +60 -0
- package/scripts/prepare.mjs +50 -0
- package/src/api-fetch.ts +127 -0
- package/src/api-headers.ts +28 -0
- package/src/auth-flow.ts +125 -0
- package/src/client.ts +1457 -0
- package/src/doc-url-sync.ts +183 -0
- package/src/document-branches.ts +124 -0
- package/src/document-checkpoints.ts +135 -0
- package/src/document-commands.ts +651 -0
- package/src/document-signals.ts +234 -0
- package/src/document-streams.ts +132 -0
- package/src/document-thumbnail-capture.ts +191 -0
- package/src/documents-namespace.ts +516 -0
- package/src/documents.ts +2426 -0
- package/src/emitter.ts +129 -0
- package/src/errors.ts +45 -0
- package/src/export-guest.ts +282 -0
- package/src/fetch-retry.ts +119 -0
- package/src/guest-link.ts +14 -0
- package/src/handles.ts +1731 -0
- package/src/hosted-runtime.ts +109 -0
- package/src/hosted-ui.ts +1020 -0
- package/src/importer.ts +89 -0
- package/src/index.ts +267 -0
- package/src/init-keys.ts +15 -0
- package/src/internal.ts +23 -0
- package/src/jwt.ts +18 -0
- package/src/launch-context.ts +43 -0
- package/src/login-hint.ts +60 -0
- package/src/mutate-batching.ts +63 -0
- package/src/open-document.ts +2869 -0
- package/src/page-title.ts +33 -0
- package/src/perf.ts +46 -0
- package/src/presence.ts +471 -0
- package/src/record-paging.ts +270 -0
- package/src/schema-conflict-dialog.ts +176 -0
- package/src/selection-persistence.ts +98 -0
- package/src/serializer.ts +15 -0
- package/src/session-persistence.ts +69 -0
- package/src/session-toolbar.ts +1457 -0
- package/src/session.ts +1262 -0
- package/src/tail-ops.ts +63 -0
- package/src/topic-lifecycle.ts +217 -0
- package/src/types.ts +75 -0
- package/src/undo.ts +125 -0
- package/src/version-bar.ts +221 -0
- package/src/version.ts +8 -0
- package/src/vite.ts +49 -0
- package/src/ws-client.ts +678 -0
- package/src/ws-frame-limit.ts +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** A tail op as the server sends it. */
|
|
2
|
+
export type WireTailOp = {
|
|
3
|
+
seq: number;
|
|
4
|
+
op_blob_b64: string;
|
|
5
|
+
} | {
|
|
6
|
+
seq: number;
|
|
7
|
+
op_blob_url: string;
|
|
8
|
+
};
|
|
9
|
+
/** A tail op with its bytes in hand. */
|
|
10
|
+
export interface ResolvedTailOp {
|
|
11
|
+
seq: number;
|
|
12
|
+
op_blob_b64: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Fetch any tail op whose bytes live behind a signed URL, leaving inline
|
|
16
|
+
* ops untouched, and return the tail in its original order.
|
|
17
|
+
*
|
|
18
|
+
* Ordering matters and concurrency does not disturb it: the fetches run
|
|
19
|
+
* together but each result lands back at its own index, so the caller
|
|
20
|
+
* still applies ops in ascending seq.
|
|
21
|
+
*
|
|
22
|
+
* A failed fetch throws rather than dropping the op. Skipping one would
|
|
23
|
+
* leave the reader a document missing an edit it will never be sent
|
|
24
|
+
* again, which reads as data loss; failing the join sends it back through
|
|
25
|
+
* a path that can succeed.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveTailOps(tailOps: readonly WireTailOp[], fetchImpl?: typeof fetch): Promise<ResolvedTailOp[]>;
|
|
28
|
+
//# sourceMappingURL=tail-ops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tail-ops.d.ts","sourceRoot":"","sources":["../src/tail-ops.ts"],"names":[],"mappings":"AAeA,wCAAwC;AACxC,MAAM,MAAM,UAAU,GAClB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,wCAAwC;AACxC,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,cAAc,EAAE,CAAC,CAgB3B"}
|
package/dist/tail-ops.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Tail ops arrive in one of two shapes and are used in only one.
|
|
2
|
+
//
|
|
3
|
+
// An op that fit its durable row carries its bytes inline. One that
|
|
4
|
+
// spilled to storage carries a short-lived signed URL instead, because a
|
|
5
|
+
// join response holding several megabytes of base64 is a response the
|
|
6
|
+
// server cannot build. Both mean the same thing to a reader: bytes to
|
|
7
|
+
// apply, in seq order.
|
|
8
|
+
//
|
|
9
|
+
// Resolving at the parse boundary is what keeps that difference from
|
|
10
|
+
// spreading. Every path that folds a tail in (a cold open, a reconnect,
|
|
11
|
+
// a version preview) then works on inline blobs exactly as before, and
|
|
12
|
+
// none of them has to be async to do it.
|
|
13
|
+
import { BrassError } from './errors.js';
|
|
14
|
+
function isUrlOp(op) {
|
|
15
|
+
return typeof op.op_blob_url === 'string';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Fetch any tail op whose bytes live behind a signed URL, leaving inline
|
|
19
|
+
* ops untouched, and return the tail in its original order.
|
|
20
|
+
*
|
|
21
|
+
* Ordering matters and concurrency does not disturb it: the fetches run
|
|
22
|
+
* together but each result lands back at its own index, so the caller
|
|
23
|
+
* still applies ops in ascending seq.
|
|
24
|
+
*
|
|
25
|
+
* A failed fetch throws rather than dropping the op. Skipping one would
|
|
26
|
+
* leave the reader a document missing an edit it will never be sent
|
|
27
|
+
* again, which reads as data loss; failing the join sends it back through
|
|
28
|
+
* a path that can succeed.
|
|
29
|
+
*/
|
|
30
|
+
export async function resolveTailOps(tailOps, fetchImpl = fetch) {
|
|
31
|
+
if (!tailOps.some(isUrlOp)) {
|
|
32
|
+
return tailOps;
|
|
33
|
+
}
|
|
34
|
+
return Promise.all(tailOps.map(async (op) => {
|
|
35
|
+
if (!isUrlOp(op))
|
|
36
|
+
return op;
|
|
37
|
+
// The URL is pre-signed, so it carries no Brass headers: adding one
|
|
38
|
+
// would fall outside the signature and be refused.
|
|
39
|
+
const response = await fetchImpl(op.op_blob_url, { method: 'GET' });
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
throw new BrassError('Tail op fetch failed', { status: response.status });
|
|
42
|
+
}
|
|
43
|
+
return { seq: op.seq, op_blob_b64: await response.text() };
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=tail-ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tail-ops.js","sourceRoot":"","sources":["../src/tail-ops.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,EAAE;AACF,oEAAoE;AACpE,yEAAyE;AACzE,sEAAsE;AACtE,sEAAsE;AACtE,uBAAuB;AACvB,EAAE;AACF,qEAAqE;AACrE,wEAAwE;AACxE,uEAAuE;AACvE,yCAAyC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAazC,SAAS,OAAO,CAAC,EAAc;IAC7B,OAAO,OAAQ,EAAgC,CAAC,WAAW,KAAK,QAAQ,CAAC;AAC3E,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA8B,EAC9B,YAA0B,KAAK;IAE/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAA2B,CAAC;IACrC,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAChB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACvB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAAE,OAAO,EAAE,CAAC;QAC5B,oEAAoE;QACpE,mDAAmD;QACnD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,UAAU,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IAC7D,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type TopicPhase = 'idle' | 'subscribing' | 'established' | 'retrying' | 'tornDown';
|
|
2
|
+
export interface TopicState {
|
|
3
|
+
phase: TopicPhase;
|
|
4
|
+
retrySpent: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare const IDLE_TOPIC: TopicState;
|
|
7
|
+
export type TopicEvent = {
|
|
8
|
+
type: 'user_subscribe';
|
|
9
|
+
} | {
|
|
10
|
+
type: 'user_unsubscribe';
|
|
11
|
+
} | {
|
|
12
|
+
type: 'socket_open';
|
|
13
|
+
} | {
|
|
14
|
+
type: 'socket_closed';
|
|
15
|
+
} | {
|
|
16
|
+
type: 'subscribed_ack';
|
|
17
|
+
} | {
|
|
18
|
+
type: 'error';
|
|
19
|
+
reason: string;
|
|
20
|
+
};
|
|
21
|
+
export type TopicEffect = {
|
|
22
|
+
kind: 'send_subscribe';
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'send_unsubscribe';
|
|
25
|
+
} | {
|
|
26
|
+
kind: 'flush_held';
|
|
27
|
+
} | {
|
|
28
|
+
kind: 'drop_held';
|
|
29
|
+
} | {
|
|
30
|
+
kind: 'drop_listeners';
|
|
31
|
+
} | {
|
|
32
|
+
kind: 'fire_error';
|
|
33
|
+
reason: string;
|
|
34
|
+
};
|
|
35
|
+
export interface StepResult {
|
|
36
|
+
state: TopicState;
|
|
37
|
+
effects: TopicEffect[];
|
|
38
|
+
}
|
|
39
|
+
export declare function holdsFrames(state: TopicState): boolean;
|
|
40
|
+
export declare function step(state: TopicState, event: TopicEvent): StepResult;
|
|
41
|
+
//# sourceMappingURL=topic-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topic-lifecycle.d.ts","sourceRoot":"","sources":["../src/topic-lifecycle.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,aAAa,GACb,aAAa,GACb,UAAU,GACV,UAAU,CAAC;AAEf,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,UAAU,CAAC;IAGlB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,UAAU,EAAE,UAAiD,CAAC;AAE3E,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAE5B;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GAGrB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAKD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAEtD;AAqCD,wBAAgB,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU,CA8GrE"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// Pure per-topic subscription lifecycle for `BrassWsClient`. The client
|
|
2
|
+
// owns the socket, timers, and frame queues; every decision about a
|
|
3
|
+
// topic's subscription (what to send, when to hold or drop queued frames,
|
|
4
|
+
// when to surface an error) comes from `step`'s transition table.
|
|
5
|
+
//
|
|
6
|
+
// Phases:
|
|
7
|
+
// - `idle`: not wanted. Errors and acks for it are ignored.
|
|
8
|
+
// - `subscribing`: wanted, first subscribe on this connection unacked
|
|
9
|
+
// (or not yet sendable). Topic-scoped frames are held until the ack.
|
|
10
|
+
// - `established`: acked; frames flow.
|
|
11
|
+
// - `retrying`: the one silent re-subscribe this connection grants is in
|
|
12
|
+
// flight after a mid-stream `not_subscribed` eviction. Further
|
|
13
|
+
// `not_subscribed` errors describe frames that predate the retry and
|
|
14
|
+
// are swallowed; any other reason is the retry's own rejection.
|
|
15
|
+
// - `tornDown`: rejected or evicted with the retry spent. Terminal until
|
|
16
|
+
// a fresh `user_subscribe` or the next socket transition prunes it.
|
|
17
|
+
// `retrySpent` survives into a same-connection re-subscribe so the
|
|
18
|
+
// retry stays one-per-topic-per-connection.
|
|
19
|
+
//
|
|
20
|
+
// Invariant: every transition into `tornDown` emits `send_unsubscribe`,
|
|
21
|
+
// so no server-side subscription row can outlive the client-side state
|
|
22
|
+
// (an orphan row would have its `last_seen` kept fresh by the heartbeat,
|
|
23
|
+
// making it immune to the server's stale reaper).
|
|
24
|
+
export const IDLE_TOPIC = { phase: 'idle', retrySpent: false };
|
|
25
|
+
// True while topic-scoped frames must be held back: sending before the
|
|
26
|
+
// `subscribed` ack races the server's SUB# row write and draws a spurious
|
|
27
|
+
// `forbidden`.
|
|
28
|
+
export function holdsFrames(state) {
|
|
29
|
+
return state.phase === 'subscribing' || state.phase === 'retrying';
|
|
30
|
+
}
|
|
31
|
+
const SEND_SUBSCRIBE = { kind: 'send_subscribe' };
|
|
32
|
+
const FLUSH_HELD = { kind: 'flush_held' };
|
|
33
|
+
const DROP_HELD = { kind: 'drop_held' };
|
|
34
|
+
// Rejection / spent-retry teardown. `send_unsubscribe` releases any
|
|
35
|
+
// server-side row a completed retry may have re-created (the invariant in
|
|
36
|
+
// the header); `unsubscribe` is idempotent server-side, so sending it when
|
|
37
|
+
// no row exists is safe.
|
|
38
|
+
function tearDown(state, reason) {
|
|
39
|
+
return {
|
|
40
|
+
state: { phase: 'tornDown', retrySpent: state.retrySpent },
|
|
41
|
+
effects: [
|
|
42
|
+
DROP_HELD,
|
|
43
|
+
{ kind: 'drop_listeners' },
|
|
44
|
+
{ kind: 'send_unsubscribe' },
|
|
45
|
+
{ kind: 'fire_error', reason },
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// A (re)opened socket grants a fresh retry and a fresh subscribe.
|
|
50
|
+
function reopened() {
|
|
51
|
+
return {
|
|
52
|
+
state: { phase: 'subscribing', retrySpent: false },
|
|
53
|
+
effects: [SEND_SUBSCRIBE],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function unsubscribed() {
|
|
57
|
+
return {
|
|
58
|
+
state: IDLE_TOPIC,
|
|
59
|
+
effects: [DROP_HELD, { kind: 'send_unsubscribe' }],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function step(state, event) {
|
|
63
|
+
switch (state.phase) {
|
|
64
|
+
case 'idle':
|
|
65
|
+
if (event.type === 'user_subscribe') {
|
|
66
|
+
return {
|
|
67
|
+
state: { phase: 'subscribing', retrySpent: false },
|
|
68
|
+
effects: [SEND_SUBSCRIBE],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return { state, effects: [] };
|
|
72
|
+
case 'subscribing':
|
|
73
|
+
switch (event.type) {
|
|
74
|
+
case 'subscribed_ack':
|
|
75
|
+
return {
|
|
76
|
+
state: { ...state, phase: 'established' },
|
|
77
|
+
effects: [FLUSH_HELD],
|
|
78
|
+
};
|
|
79
|
+
case 'error':
|
|
80
|
+
// Never established on this connection: the rejection is final.
|
|
81
|
+
return tearDown(state, event.reason);
|
|
82
|
+
case 'socket_open':
|
|
83
|
+
return reopened();
|
|
84
|
+
case 'socket_closed':
|
|
85
|
+
return { state, effects: [DROP_HELD] };
|
|
86
|
+
case 'user_unsubscribe':
|
|
87
|
+
return unsubscribed();
|
|
88
|
+
case 'user_subscribe':
|
|
89
|
+
return { state, effects: [] };
|
|
90
|
+
}
|
|
91
|
+
break;
|
|
92
|
+
case 'established':
|
|
93
|
+
switch (event.type) {
|
|
94
|
+
case 'error':
|
|
95
|
+
// A mid-stream `not_subscribed` is an eviction (the server
|
|
96
|
+
// dropped the subscription row while this client stayed alive,
|
|
97
|
+
// e.g. a presence reap that raced a live-but-quiet connection),
|
|
98
|
+
// not a rejection: recover silently with one re-subscribe per
|
|
99
|
+
// connection, keeping the listeners and held-frame queue. Any
|
|
100
|
+
// other reason is a genuine refusal (role, scope, membership)
|
|
101
|
+
// that a re-subscribe would just repeat.
|
|
102
|
+
if (event.reason === 'not_subscribed' && !state.retrySpent) {
|
|
103
|
+
return {
|
|
104
|
+
state: { phase: 'retrying', retrySpent: true },
|
|
105
|
+
effects: [SEND_SUBSCRIBE],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return tearDown(state, event.reason);
|
|
109
|
+
case 'subscribed_ack':
|
|
110
|
+
return { state, effects: [FLUSH_HELD] };
|
|
111
|
+
case 'socket_open':
|
|
112
|
+
return reopened();
|
|
113
|
+
case 'socket_closed':
|
|
114
|
+
return { state: { ...state, phase: 'subscribing' }, effects: [DROP_HELD] };
|
|
115
|
+
case 'user_unsubscribe':
|
|
116
|
+
return unsubscribed();
|
|
117
|
+
case 'user_subscribe':
|
|
118
|
+
return { state, effects: [] };
|
|
119
|
+
}
|
|
120
|
+
break;
|
|
121
|
+
case 'retrying':
|
|
122
|
+
switch (event.type) {
|
|
123
|
+
case 'error':
|
|
124
|
+
// An eviction draws errors for EVERY frame in flight against the
|
|
125
|
+
// reaped row; the trailing ones land while the retry's subscribe
|
|
126
|
+
// is unacked and describe frames that predate it, so the retry
|
|
127
|
+
// supersedes them. A non-`not_subscribed` reason in this window
|
|
128
|
+
// is the retry's own rejection.
|
|
129
|
+
if (event.reason === 'not_subscribed') {
|
|
130
|
+
return { state, effects: [] };
|
|
131
|
+
}
|
|
132
|
+
return tearDown(state, event.reason);
|
|
133
|
+
case 'subscribed_ack':
|
|
134
|
+
return {
|
|
135
|
+
state: { ...state, phase: 'established' },
|
|
136
|
+
effects: [FLUSH_HELD],
|
|
137
|
+
};
|
|
138
|
+
case 'socket_open':
|
|
139
|
+
return reopened();
|
|
140
|
+
case 'socket_closed':
|
|
141
|
+
return { state: { ...state, phase: 'subscribing' }, effects: [DROP_HELD] };
|
|
142
|
+
case 'user_unsubscribe':
|
|
143
|
+
return unsubscribed();
|
|
144
|
+
case 'user_subscribe':
|
|
145
|
+
return { state, effects: [] };
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
case 'tornDown':
|
|
149
|
+
switch (event.type) {
|
|
150
|
+
case 'user_subscribe':
|
|
151
|
+
// Same-connection re-subscribe: a spent retry stays spent, so
|
|
152
|
+
// the fresh subscribe rides the retrying phase's error handling.
|
|
153
|
+
return {
|
|
154
|
+
state: {
|
|
155
|
+
phase: state.retrySpent ? 'retrying' : 'subscribing',
|
|
156
|
+
retrySpent: state.retrySpent,
|
|
157
|
+
},
|
|
158
|
+
effects: [SEND_SUBSCRIBE],
|
|
159
|
+
};
|
|
160
|
+
case 'socket_open':
|
|
161
|
+
case 'socket_closed':
|
|
162
|
+
return { state: IDLE_TOPIC, effects: [] };
|
|
163
|
+
default:
|
|
164
|
+
return { state, effects: [] };
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return { state, effects: [] };
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=topic-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topic-lifecycle.js","sourceRoot":"","sources":["../src/topic-lifecycle.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface BrassUser {
|
|
2
|
+
sub: string;
|
|
3
|
+
email?: string;
|
|
4
|
+
display_name?: string;
|
|
5
|
+
avatar_url?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface BrassInitOptions {
|
|
8
|
+
authBaseUrl?: string;
|
|
9
|
+
apiBaseUrl?: string;
|
|
10
|
+
wsBaseUrl?: string;
|
|
11
|
+
dashboardBaseUrl?: string;
|
|
12
|
+
hostedUiTheme?: 'light' | 'dark' | 'auto';
|
|
13
|
+
openIncompatibleDocuments?: boolean;
|
|
14
|
+
syncDocToUrl?: boolean;
|
|
15
|
+
docUrlParam?: string;
|
|
16
|
+
branchUrlParam?: string;
|
|
17
|
+
syncDocToTitle?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export type AuthStatus = 'unknown' | 'signed-in' | 'signed-out' | 'guest';
|
|
20
|
+
export type UserChangeListener = (user: BrassUser | null) => void;
|
|
21
|
+
export type ErrorListener = (error: Error) => void;
|
|
22
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAI/B,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,UAAU,CAAC,EAAE,MAAM,CAAC;IAOpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAK1B,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAM1C,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAOpC,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,cAAc,CAAC,EAAE,MAAM,CAAC;IAOxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAWD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;AAE1E,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;AAKlE,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/undo.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type LoroDoc } from 'loro-crdt';
|
|
2
|
+
export interface UndoControllerOptions {
|
|
3
|
+
maxUndoSteps?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare class UndoController {
|
|
6
|
+
private readonly _mgr;
|
|
7
|
+
private _groupOpen;
|
|
8
|
+
constructor(loroDoc: LoroDoc, options?: UndoControllerOptions);
|
|
9
|
+
undo(): boolean;
|
|
10
|
+
redo(): boolean;
|
|
11
|
+
private outsideGroup;
|
|
12
|
+
canUndo(): boolean;
|
|
13
|
+
canRedo(): boolean;
|
|
14
|
+
sealStep(): void;
|
|
15
|
+
clear(): void;
|
|
16
|
+
free(): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=undo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"undo.d.ts","sourceRoot":"","sources":["../src/undo.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBtD,MAAM,WAAW,qBAAqB;IAGpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IAOnC,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAgB7D,IAAI,IAAI,OAAO;IAIf,IAAI,IAAI,OAAO;IAIf,OAAO,CAAC,YAAY;IAapB,OAAO,IAAI,OAAO;IAIlB,OAAO,IAAI,OAAO;IASlB,QAAQ,IAAI,IAAI;IAWhB,KAAK,IAAI,IAAI;IAYb,IAAI,IAAI,IAAI;CAWb"}
|
package/dist/undo.js
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// Per-Document undo/redo, backed by Loro's UndoManager: undo is
|
|
2
|
+
// local-peer-scoped (reverts only this peer's ops), group bracketing collapses
|
|
3
|
+
// same-stroke edits into one entry, and remote-import bookkeeping keeps the
|
|
4
|
+
// redo stack honest across other peers' edits.
|
|
5
|
+
import { UndoManager } from 'loro-crdt';
|
|
6
|
+
// Loro's time-based merge is permanently disabled. The undo boundary here is
|
|
7
|
+
// the checkpoint group bracket (`sealStep`), and the two are incompatible: a
|
|
8
|
+
// nonzero merge interval merges adjacent changes by *timestamp*, and that
|
|
9
|
+
// merge reaches ACROSS a `groupEnd()` / `groupStart()` seal, collapsing two
|
|
10
|
+
// separately-sealed steps into one. That silently violates the "every
|
|
11
|
+
// checkpoint is an undo boundary" contract (one Ctrl-Z reverts more than the
|
|
12
|
+
// last operation and the rendered state jumps past where the user expected).
|
|
13
|
+
// Same-stroke collapsing is still handled, by the open group not the clock:
|
|
14
|
+
// every commit between two seals brackets into one entry. Apps tune
|
|
15
|
+
// granularity via `setAutoCheckpointIntervalMs` and `createCheckpoint`.
|
|
16
|
+
const UNDO_MERGE_INTERVAL_MS = 0;
|
|
17
|
+
// Cap on retained undo steps (Loro's default is 100). 200 at typical AEC
|
|
18
|
+
// entity sizes is a few hundred KB, well below anything that matters.
|
|
19
|
+
const DEFAULT_MAX_UNDO_STEPS = 200;
|
|
20
|
+
// Thin wrapper around Loro's UndoManager exposing only what the Document
|
|
21
|
+
// needs. Owned by the Document; not part of the public SDK surface.
|
|
22
|
+
export class UndoController {
|
|
23
|
+
_mgr;
|
|
24
|
+
// Whether an implicit group is open. The Document keeps one open between
|
|
25
|
+
// checkpoints so `createCheckpoint` is THE undo boundary: every commit
|
|
26
|
+
// between two checkpoints collapses into one step. `sealStep` closes and
|
|
27
|
+
// reopens the group, the only way to force a boundary into Loro's stack
|
|
28
|
+
// (Loro has no "force boundary here" primitive). This is a hard boundary
|
|
29
|
+
// only because the merge interval is disabled (see above).
|
|
30
|
+
_groupOpen = false;
|
|
31
|
+
constructor(loroDoc, options) {
|
|
32
|
+
this._mgr = new UndoManager(loroDoc, {
|
|
33
|
+
mergeInterval: UNDO_MERGE_INTERVAL_MS,
|
|
34
|
+
maxUndoSteps: options?.maxUndoSteps ?? DEFAULT_MAX_UNDO_STEPS,
|
|
35
|
+
});
|
|
36
|
+
// Open the implicit group so commits before the first `createCheckpoint`
|
|
37
|
+
// still bracket as one undo step.
|
|
38
|
+
this._mgr.groupStart();
|
|
39
|
+
this._groupOpen = true;
|
|
40
|
+
}
|
|
41
|
+
// undo/redo run OUTSIDE the implicit group: Loro groups every commit while a
|
|
42
|
+
// group is open, INCLUDING the one a `redo()` / `undo()` itself produces, so
|
|
43
|
+
// running them inside would fold the reapplied step into the group and the
|
|
44
|
+
// next sealed edit would merge with it (one Ctrl-Z reverts both). Closing
|
|
45
|
+
// first also makes unsealed pending commits their own boundary.
|
|
46
|
+
undo() {
|
|
47
|
+
return this.outsideGroup(() => this._mgr.undo());
|
|
48
|
+
}
|
|
49
|
+
redo() {
|
|
50
|
+
return this.outsideGroup(() => this._mgr.redo());
|
|
51
|
+
}
|
|
52
|
+
outsideGroup(op) {
|
|
53
|
+
if (this._groupOpen) {
|
|
54
|
+
this._mgr.groupEnd();
|
|
55
|
+
this._groupOpen = false;
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
return op();
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
this._mgr.groupStart();
|
|
62
|
+
this._groupOpen = true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
canUndo() {
|
|
66
|
+
return this._mgr.canUndo();
|
|
67
|
+
}
|
|
68
|
+
canRedo() {
|
|
69
|
+
return this._mgr.canRedo();
|
|
70
|
+
}
|
|
71
|
+
// Seal the current undo step: close the implicit group (commits since the
|
|
72
|
+
// previous seal collapse into one entry) and open a fresh one.
|
|
73
|
+
// `createCheckpoint` and the auto-checkpoint scheduler call this so every
|
|
74
|
+
// checkpoint is a Ctrl-Z boundary. Idempotent: calling twice with no
|
|
75
|
+
// intervening commit is safe (Loro collapses the empty group).
|
|
76
|
+
sealStep() {
|
|
77
|
+
if (this._groupOpen) {
|
|
78
|
+
this._mgr.groupEnd();
|
|
79
|
+
this._groupOpen = false;
|
|
80
|
+
}
|
|
81
|
+
this._mgr.groupStart();
|
|
82
|
+
this._groupOpen = true;
|
|
83
|
+
}
|
|
84
|
+
// Drop both stacks. Called by `_applySnapshot`: the prior entries reference a
|
|
85
|
+
// state the new snapshot superseded.
|
|
86
|
+
clear() {
|
|
87
|
+
// Close the open group first so `clear()` sees a clean state (defensive;
|
|
88
|
+
// Loro's `clear` drops both stacks regardless).
|
|
89
|
+
if (this._groupOpen) {
|
|
90
|
+
this._mgr.groupEnd();
|
|
91
|
+
this._groupOpen = false;
|
|
92
|
+
}
|
|
93
|
+
this._mgr.clear();
|
|
94
|
+
this._mgr.groupStart();
|
|
95
|
+
this._groupOpen = true;
|
|
96
|
+
}
|
|
97
|
+
free() {
|
|
98
|
+
if (this._groupOpen) {
|
|
99
|
+
try {
|
|
100
|
+
this._mgr.groupEnd();
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Best-effort; the underlying manager is about to free.
|
|
104
|
+
}
|
|
105
|
+
this._groupOpen = false;
|
|
106
|
+
}
|
|
107
|
+
this._mgr.free();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=undo.js.map
|
package/dist/undo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"undo.js","sourceRoot":"","sources":["../src/undo.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,+EAA+E;AAC/E,4EAA4E;AAC5E,+CAA+C;AAC/C,OAAO,EAAE,WAAW,EAAgB,MAAM,WAAW,CAAC;AAEtD,6EAA6E;AAC7E,6EAA6E;AAC7E,0EAA0E;AAC1E,4EAA4E;AAC5E,sEAAsE;AACtE,6EAA6E;AAC7E,6EAA6E;AAC7E,4EAA4E;AAC5E,oEAAoE;AACpE,wEAAwE;AACxE,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,yEAAyE;AACzE,sEAAsE;AACtE,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAQnC,yEAAyE;AACzE,oEAAoE;AACpE,MAAM,OAAO,cAAc;IACR,IAAI,CAAc;IACnC,yEAAyE;IACzE,uEAAuE;IACvE,yEAAyE;IACzE,wEAAwE;IACxE,yEAAyE;IACzE,2DAA2D;IACnD,UAAU,GAAG,KAAK,CAAC;IAE3B,YAAY,OAAgB,EAAE,OAA+B;QAC3D,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE;YACnC,aAAa,EAAE,sBAAsB;YACrC,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,sBAAsB;SAC9D,CAAC,CAAC;QACH,yEAAyE;QACzE,kCAAkC;QAClC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,6EAA6E;IAC7E,6EAA6E;IAC7E,2EAA2E;IAC3E,0EAA0E;IAC1E,gEAAgE;IAChE,IAAI;QACF,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAEO,YAAY,CAAC,EAAiB;QACpC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC;YACH,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,0EAA0E;IAC1E,+DAA+D;IAC/D,0EAA0E;IAC1E,qEAAqE;IACrE,+DAA+D;IAC/D,QAAQ;QACN,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,8EAA8E;IAC9E,qCAAqC;IACrC,KAAK;QACH,yEAAyE;QACzE,gDAAgD;QAChD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,wDAAwD;YAC1D,CAAC;YACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface VersionBarDeps {
|
|
2
|
+
dashboardBaseUrl: string;
|
|
3
|
+
theme?: 'light' | 'dark' | 'auto';
|
|
4
|
+
getSessionToken?: () => string | null | undefined;
|
|
5
|
+
checkoutVersion: (version: number) => void;
|
|
6
|
+
returnToHead: () => void;
|
|
7
|
+
fork: (fromVersion: number, name?: string) => void;
|
|
8
|
+
browse: () => void;
|
|
9
|
+
close: () => void;
|
|
10
|
+
}
|
|
11
|
+
export interface VersionBarContext {
|
|
12
|
+
docId: string;
|
|
13
|
+
branch: string | undefined;
|
|
14
|
+
version: number | null;
|
|
15
|
+
branchName?: string | undefined;
|
|
16
|
+
}
|
|
17
|
+
export interface VersionBarFrame {
|
|
18
|
+
update(ctx: VersionBarContext): void;
|
|
19
|
+
destroy(): void;
|
|
20
|
+
}
|
|
21
|
+
export declare function createVersionBarFrame(root: HTMLElement, deps: VersionBarDeps): VersionBarFrame;
|
|
22
|
+
//# sourceMappingURL=version-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-bar.d.ts","sourceRoot":"","sources":["../src/version-bar.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,cAAc;IAG7B,gBAAgB,EAAE,MAAM,CAAC;IAEzB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAGlC,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAElD,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,MAAM,EAAE,MAAM,IAAI,CAAC;IAInB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAG3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAGvB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAI9B,MAAM,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAOD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,cAAc,GACnB,eAAe,CAoJjB"}
|