@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,109 @@
|
|
|
1
|
+
// Runtime config resolution for Brass-hosted bundles.
|
|
2
|
+
//
|
|
3
|
+
// A bundle served by app hosting (`https://{slug}.onbrass.app` and non-prod
|
|
4
|
+
// equivalents under `.onbrass.app`) gets its identity and environment from
|
|
5
|
+
// the serving slot, not from code: the api writes
|
|
6
|
+
// `/.well-known/brass-runtime.json` into the served prefix (see CONTRACT.md
|
|
7
|
+
// "App hosting"), and `Brass.init()` reads it back same-origin and adopts
|
|
8
|
+
// it wholesale. It is authoritative on a hosted origin, so the same artifact
|
|
9
|
+
// picks up each environment's config from whichever origin serves it and a
|
|
10
|
+
// bundle that hardcodes one environment can't carry it onto another's slot.
|
|
11
|
+
// `isBrassHostedHost` recognizes the default `*.onbrass.app` slots by
|
|
12
|
+
// hostname; a custom serving domain (a vanity URL) is not recognizable that
|
|
13
|
+
// way, so the SDK also reads the descriptor whenever a bundle relies on the
|
|
14
|
+
// slot for its environment (no `env` / `*BaseUrl` passed to `Brass.init`),
|
|
15
|
+
// on any host. A present descriptor is authoritative and overrides even a
|
|
16
|
+
// baked app id. A developer on their own hosting passes explicit origins and
|
|
17
|
+
// never triggers the fetch.
|
|
18
|
+
|
|
19
|
+
export const HOSTED_RUNTIME_PATH = '/.well-known/brass-runtime.json';
|
|
20
|
+
|
|
21
|
+
// The window global a Brass serving slot stamps into the served `index.html`
|
|
22
|
+
// (an inline script the unpack worker injects). This is the primary,
|
|
23
|
+
// fetch-free path: the HOST decides whether a bundle is on a Brass slot by
|
|
24
|
+
// whether the served page carries this global, so the SDK never guesses from
|
|
25
|
+
// the hostname (a custom serving domain is indistinguishable from
|
|
26
|
+
// self-hosting by name) nor makes a request that 404s off a slot. Must match
|
|
27
|
+
// `HOSTED_RUNTIME_GLOBAL` in infra/lambda/lib/hosting-runtime.ts (the
|
|
28
|
+
// published package cannot import the workspace module, so the name is
|
|
29
|
+
// duplicated by necessity).
|
|
30
|
+
const HOSTED_RUNTIME_GLOBAL = '__brassRuntime';
|
|
31
|
+
|
|
32
|
+
// The apex app hosting serves bundles under. Every hosting origin is some
|
|
33
|
+
// host below `onbrass.app`, and the descriptor each serves carries its
|
|
34
|
+
// environment's config, so the SDK only recognizes the apex, never parses
|
|
35
|
+
// the host itself.
|
|
36
|
+
const HOSTING_APEX = 'onbrass.app';
|
|
37
|
+
|
|
38
|
+
/** True when `hostname` is a Brass app-hosting serving origin. */
|
|
39
|
+
export function isBrassHostedHost(hostname: string): boolean {
|
|
40
|
+
return hostname.toLowerCase().endsWith(`.${HOSTING_APEX}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface HostedRuntime {
|
|
44
|
+
appId: string;
|
|
45
|
+
authBaseUrl: string;
|
|
46
|
+
apiBaseUrl: string;
|
|
47
|
+
wsBaseUrl: string;
|
|
48
|
+
dashboardBaseUrl: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function httpsUrl(value: unknown): string | null {
|
|
52
|
+
if (typeof value !== 'string' || !value.startsWith('https://')) return null;
|
|
53
|
+
return value.replace(/\/$/, '');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function wssUrl(value: unknown): string | null {
|
|
57
|
+
if (typeof value !== 'string' || !value.startsWith('wss://')) return null;
|
|
58
|
+
return value.replace(/\/$/, '');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Parse + validate descriptor JSON into a `HostedRuntime`, or null when
|
|
63
|
+
* any required field is missing or malformed. All-or-nothing: a partial
|
|
64
|
+
* descriptor would mix descriptor and default origins, the exact
|
|
65
|
+
* cross-environment drift the descriptor exists to remove.
|
|
66
|
+
*/
|
|
67
|
+
export function parseHostedRuntime(value: unknown): HostedRuntime | null {
|
|
68
|
+
if (typeof value !== 'object' || value === null) return null;
|
|
69
|
+
const record = value as Record<string, unknown>;
|
|
70
|
+
const appId = record['app_id'];
|
|
71
|
+
if (typeof appId !== 'string' || !appId.startsWith('brass_app_')) return null;
|
|
72
|
+
const authBaseUrl = httpsUrl(record['auth_base_url']);
|
|
73
|
+
const apiBaseUrl = httpsUrl(record['api_base_url']);
|
|
74
|
+
const wsBaseUrl = wssUrl(record['ws_base_url']);
|
|
75
|
+
const dashboardBaseUrl = httpsUrl(record['dashboard_base_url']);
|
|
76
|
+
if (!authBaseUrl || !apiBaseUrl || !wsBaseUrl || !dashboardBaseUrl) return null;
|
|
77
|
+
return { appId, authBaseUrl, apiBaseUrl, wsBaseUrl, dashboardBaseUrl };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Read the descriptor a serving slot stamped into the page as
|
|
82
|
+
* `window.__brassRuntime`, or null when it is absent or malformed. Synchronous
|
|
83
|
+
* and fetch-free: this is the primary path, and its presence is the host's
|
|
84
|
+
* signal that this origin is a Brass slot (see `HOSTED_RUNTIME_GLOBAL`).
|
|
85
|
+
*/
|
|
86
|
+
export function readInjectedRuntime(scope: unknown = globalThis): HostedRuntime | null {
|
|
87
|
+
if (typeof scope !== 'object' || scope === null) return null;
|
|
88
|
+
const value = (scope as Record<string, unknown>)[HOSTED_RUNTIME_GLOBAL];
|
|
89
|
+
return value === undefined ? null : parseHostedRuntime(value);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Fetch + parse the serving slot's runtime descriptor, or null when the
|
|
94
|
+
* fetch fails or the body doesn't parse. The fetch fallback for a served page
|
|
95
|
+
* that predates the injected global; callers try `readInjectedRuntime` first.
|
|
96
|
+
* Null is a soft signal (the caller falls back to explicit init args), so
|
|
97
|
+
* every failure mode collapses to it.
|
|
98
|
+
*/
|
|
99
|
+
export async function fetchHostedRuntime(
|
|
100
|
+
fetchFn: typeof fetch = fetch,
|
|
101
|
+
): Promise<HostedRuntime | null> {
|
|
102
|
+
try {
|
|
103
|
+
const res = await fetchFn(HOSTED_RUNTIME_PATH);
|
|
104
|
+
if (!res.ok) return null;
|
|
105
|
+
return parseHostedRuntime(await res.json());
|
|
106
|
+
} catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|