@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,90 @@
|
|
|
1
|
+
// Bounded transient-retry for HTTP requests, with the replay policy as an
|
|
2
|
+
// explicit argument so the read path and the one write path we replay share
|
|
3
|
+
// a single implementation instead of hand-rolling a loop per call site.
|
|
4
|
+
//
|
|
5
|
+
// A cold Brass API container can reject a request at the gateway with a
|
|
6
|
+
// transient 5xx (503 while the API scales into a concurrent burst, 502 /
|
|
7
|
+
// 504 on a cold-start blip) or 429 (a short rate spike). These are not
|
|
8
|
+
// the caller's error and clear within a second or two, so a single hard
|
|
9
|
+
// failure on a document open reads as "the app is broken" when a brief
|
|
10
|
+
// wait-and-retry would have succeeded.
|
|
11
|
+
//
|
|
12
|
+
// What is safe to replay depends on whether the request is idempotent,
|
|
13
|
+
// which is why the policy is a parameter rather than a constant:
|
|
14
|
+
//
|
|
15
|
+
// - A GET is idempotent, so replaying it is always safe: retry the whole
|
|
16
|
+
// transient 5xx / 429 set AND a thrown network error (`RETRY_READ`).
|
|
17
|
+
// - A write is NOT idempotent, so only a 503 is safe to replay: the API
|
|
18
|
+
// gateway returns a 503 BEFORE the request reaches the handler (a transient
|
|
19
|
+
// throttle / scale-up / deploy-window blip), so the write never ran and
|
|
20
|
+
// a replay cannot double-apply it. A 502 / 504 / 429 or a network throw
|
|
21
|
+
// might mean the handler ran, so those stay hard failures (`RETRY_WRITE_503`).
|
|
22
|
+
// - A 500 is never retried under either policy: an unhandled server error
|
|
23
|
+
// is usually deterministic, so a replay just doubles the cost without
|
|
24
|
+
// changing the outcome.
|
|
25
|
+
// A 4xx other than 429 (403 app_not_installed, 404) is a definitive answer
|
|
26
|
+
// and is never in a policy's replay set.
|
|
27
|
+
// Idempotent GET: replay the full transient set and network throws.
|
|
28
|
+
export const RETRY_READ = {
|
|
29
|
+
replayStatuses: new Set([429, 502, 503, 504]),
|
|
30
|
+
replayNetworkErrors: true,
|
|
31
|
+
};
|
|
32
|
+
// Non-idempotent write: replay ONLY a pre-handler 503, never a network throw.
|
|
33
|
+
export const RETRY_WRITE_503 = {
|
|
34
|
+
replayStatuses: new Set([503]),
|
|
35
|
+
replayNetworkErrors: false,
|
|
36
|
+
};
|
|
37
|
+
// Idempotent write: replay the full transient set AND a network throw, exactly
|
|
38
|
+
// like a read. Safe only when the request carries a STABLE idempotency key the
|
|
39
|
+
// server dedupes on, so a replay the handler already applied returns the
|
|
40
|
+
// original result instead of applying twice. This is what lets document create
|
|
41
|
+
// stop assuming a 503 is always pre-handler (`RETRY_WRITE_503`'s constraint):
|
|
42
|
+
// with a key, even a post-handler 503 or a network throw is replay-safe.
|
|
43
|
+
export const RETRY_IDEMPOTENT_WRITE = {
|
|
44
|
+
replayStatuses: new Set([429, 502, 503, 504]),
|
|
45
|
+
replayNetworkErrors: true,
|
|
46
|
+
};
|
|
47
|
+
const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
48
|
+
// Run `doFetch` (which performs one request) up to `maxAttempts` times,
|
|
49
|
+
// replaying per `policy` with exponential backoff plus jitter between tries.
|
|
50
|
+
// Returns the last Response (replayable or not) so the caller keeps its own
|
|
51
|
+
// status handling; rethrows the last network error only if the policy replays
|
|
52
|
+
// throws and every attempt threw. A network throw the policy does not replay
|
|
53
|
+
// propagates immediately.
|
|
54
|
+
export async function fetchWithRetry(doFetch, options = {}) {
|
|
55
|
+
const policy = options.policy ?? RETRY_READ;
|
|
56
|
+
const maxAttempts = options.maxAttempts ?? 3;
|
|
57
|
+
const baseDelayMs = options.baseDelayMs ?? 300;
|
|
58
|
+
const sleep = options.sleep ?? defaultSleep;
|
|
59
|
+
let lastError;
|
|
60
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
61
|
+
let response;
|
|
62
|
+
try {
|
|
63
|
+
response = await doFetch();
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
// A network-level throw is only replayable for an idempotent request;
|
|
67
|
+
// a write policy rethrows it rather than risk a double-apply.
|
|
68
|
+
if (!policy.replayNetworkErrors)
|
|
69
|
+
throw err;
|
|
70
|
+
lastError = err;
|
|
71
|
+
}
|
|
72
|
+
if (response && !policy.replayStatuses.has(response.status)) {
|
|
73
|
+
return response;
|
|
74
|
+
}
|
|
75
|
+
if (attempt === maxAttempts) {
|
|
76
|
+
if (response)
|
|
77
|
+
return response;
|
|
78
|
+
throw lastError;
|
|
79
|
+
}
|
|
80
|
+
options.onRetry?.(attempt, response);
|
|
81
|
+
// Exponential backoff with jitter so a burst of clients that all
|
|
82
|
+
// failed together do not re-collide on the same retry tick.
|
|
83
|
+
const backoff = baseDelayMs * 2 ** (attempt - 1);
|
|
84
|
+
const jitter = Math.random() * baseDelayMs;
|
|
85
|
+
await sleep(backoff + jitter);
|
|
86
|
+
}
|
|
87
|
+
// Unreachable: the loop returns or throws on the final attempt.
|
|
88
|
+
throw lastError ?? new Error('fetchWithRetry: no attempts made');
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=fetch-retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-retry.js","sourceRoot":"","sources":["../src/fetch-retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guest-link.d.ts","sourceRoot":"","sources":["../src/guest-link.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,gBAAgB,eAAe,CAAC;AAE7C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGhE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// The anonymous "anyone with the link" boot signal. When Brass routes a
|
|
2
|
+
// no-sign-in share link into an app, it appends `?brass_link=<token>` to
|
|
3
|
+
// the app's URL. `Brass.init` reads it here and opens the document
|
|
4
|
+
// read-only through the token (`GET /links/:token/view`), with no sign-in.
|
|
5
|
+
//
|
|
6
|
+
// Pure + search-string-in so it stays testable, mirroring
|
|
7
|
+
// `isExportMode(search)`.
|
|
8
|
+
export const GUEST_LINK_PARAM = 'brass_link';
|
|
9
|
+
export function readGuestLinkToken(search) {
|
|
10
|
+
const value = new URLSearchParams(search).get(GUEST_LINK_PARAM);
|
|
11
|
+
return value && value.trim() !== '' ? value : null;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=guest-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guest-link.js","sourceRoot":"","sources":["../src/guest-link.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,yEAAyE;AACzE,mEAAmE;AACnE,2EAA2E;AAC3E,EAAE;AACF,0DAA0D;AAC1D,0BAA0B;AAE1B,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAE7C,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAChE,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { LoroList, LoroMap } from 'loro-crdt';
|
|
2
|
+
import { MutateBatcher } from './mutate-batching.js';
|
|
3
|
+
export interface Change<T = unknown> {
|
|
4
|
+
readonly set: ReadonlyMap<string, T>;
|
|
5
|
+
readonly deleted: readonly string[];
|
|
6
|
+
readonly order?: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
export type ChangeSource = 'local' | 'remote' | 'undo' | 'redo' | 'checkout';
|
|
9
|
+
export interface ChangeOrigin {
|
|
10
|
+
readonly source: ChangeSource;
|
|
11
|
+
}
|
|
12
|
+
export type MapSubscriber<T = unknown> = (change: Change<T>, origin?: ChangeOrigin) => void;
|
|
13
|
+
export type ListSubscriber = () => void;
|
|
14
|
+
export type HandleUnsubscribe = () => void;
|
|
15
|
+
export interface HandleOwner {
|
|
16
|
+
assertWritable(): void;
|
|
17
|
+
ensureLocalUpdatesSubscribed(): void;
|
|
18
|
+
commitMutate(): void;
|
|
19
|
+
originOf(event: unknown): ChangeSource;
|
|
20
|
+
}
|
|
21
|
+
export interface MapHandle<T = unknown> {
|
|
22
|
+
read(): Record<string, T>;
|
|
23
|
+
get(entryKey: string): T | undefined;
|
|
24
|
+
keys(): string[];
|
|
25
|
+
has(entryKey: string): boolean;
|
|
26
|
+
mutate(fn: (draft: Record<string, T>) => void): void;
|
|
27
|
+
subscribe(cb: MapSubscriber<T>): HandleUnsubscribe;
|
|
28
|
+
map<U>(entryKey: string): MapHandle<U>;
|
|
29
|
+
list<U>(entryKey: string): ListHandle<U>;
|
|
30
|
+
}
|
|
31
|
+
export interface ListHandle<T = unknown> {
|
|
32
|
+
read(): T[];
|
|
33
|
+
length(): number;
|
|
34
|
+
mutate(fn: (draft: T[]) => void): void;
|
|
35
|
+
subscribe(cb: ListSubscriber): HandleUnsubscribe;
|
|
36
|
+
}
|
|
37
|
+
export interface OrderedMapHandle<T = unknown> {
|
|
38
|
+
read(): Record<string, T>;
|
|
39
|
+
get(entryKey: string): T | undefined;
|
|
40
|
+
has(entryKey: string): boolean;
|
|
41
|
+
keys(): string[];
|
|
42
|
+
ordered(): {
|
|
43
|
+
key: string;
|
|
44
|
+
value: T;
|
|
45
|
+
}[];
|
|
46
|
+
mutate(fn: (draft: Record<string, T>) => void): void;
|
|
47
|
+
subscribe(cb: MapSubscriber<T>): HandleUnsubscribe;
|
|
48
|
+
}
|
|
49
|
+
export declare function wrapLoroMapProxy(loroMap: LoroMap, batcher?: MutateBatcher): Record<string, unknown>;
|
|
50
|
+
export declare function createRootMapHandle<T>(root: LoroMap, owner: HandleOwner, pageCount?: () => number, pagingScheme?: () => number): MapHandle<T>;
|
|
51
|
+
export declare function createRootListHandle<T>(root: LoroList, owner: HandleOwner): ListHandle<T>;
|
|
52
|
+
export declare function rebindRootMapAnchor(handle: MapHandle<unknown>, next: LoroMap): void;
|
|
53
|
+
export declare function rebindRootListAnchor(handle: ListHandle<unknown>, next: LoroList): void;
|
|
54
|
+
export declare function resyncRootHandle(handle: MapHandle<unknown> | ListHandle<unknown>): void;
|
|
55
|
+
export declare function teardownRootHandle(handle: MapHandle<unknown> | ListHandle<unknown>): void;
|
|
56
|
+
export declare function createOrderedMapHandle<T>(map: MapHandle<T>, order: ListHandle<string>, owner: HandleOwner): OrderedMapHandle<T>;
|
|
57
|
+
//# sourceMappingURL=handles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handles.d.ts","sourceRoot":"","sources":["../src/handles.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,QAAQ,EACR,OAAO,EAGR,MAAM,WAAW,CAAC;AAcnB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAOrD,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG,OAAO;IAKjC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAErC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAKpC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAOD,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAC7E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;CAC/B;AAOD,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI,CACvC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,MAAM,CAAC,EAAE,YAAY,KAClB,IAAI,CAAC;AAqBV,MAAM,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC;AAExC,MAAM,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC;AAK3C,MAAM,WAAW,WAAW;IAE1B,cAAc,IAAI,IAAI,CAAC;IAEvB,4BAA4B,IAAI,IAAI,CAAC;IAGrC,YAAY,IAAI,IAAI,CAAC;IAGrB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC;CACxC;AAID,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,OAAO;IAGpC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAE1B,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAErC,IAAI,IAAI,MAAM,EAAE,CAAC;IAEjB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAG/B,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAMrD,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;IAInD,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,IAAI,IAAI,CAAC,EAAE,CAAC;IACZ,MAAM,IAAI,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAMvC,SAAS,CAAC,EAAE,EAAE,cAAc,GAAG,iBAAiB,CAAC;CAClD;AAYD,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IAE3C,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAE1B,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAErC,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAE/B,IAAI,IAAI,MAAM,EAAE,CAAC;IAGjB,OAAO,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,EAAE,CAAC;IAKvC,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAMrD,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;CACpD;AA6ID,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAKhB,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2FzB;AA4sCD,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,WAAW,EAClB,SAAS,CAAC,EAAE,MAAM,MAAM,EACxB,YAAY,CAAC,EAAE,MAAM,MAAM,GAC1B,SAAS,CAAC,CAAC,CAAC,CAOd;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,WAAW,GACjB,UAAU,CAAC,CAAC,CAAC,CAEf;AAgBD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,EAC1B,IAAI,EAAE,OAAO,GACZ,IAAI,CAEN;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,EAC3B,IAAI,EAAE,QAAQ,GACb,IAAI,CAEN;AAMD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,GAC/C,IAAI,CAEN;AAOD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,GAC/C,IAAI,CAEN;AAKD,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,EACjB,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,EACzB,KAAK,EAAE,WAAW,GACjB,gBAAgB,CAAC,CAAC,CAAC,CAMrB"}
|