@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// SDK surface: `Brass.documents.*`. The metadata surface: get /
|
|
2
|
-
// thumbnails
|
|
3
|
-
//
|
|
4
|
-
//
|
|
2
|
+
// thumbnails. The editable surface (snapshot + ops + mutate) is the
|
|
3
|
+
// `Document` runtime class via `Brass.openDocumentById` /
|
|
4
|
+
// `Brass.createDocument`. Access-granting is hosted-only (the share
|
|
5
5
|
// dialog), not a programmatic method here.
|
|
6
6
|
|
|
7
7
|
import type { Document } from './documents.js';
|
|
@@ -94,10 +94,9 @@ export interface DocumentRecord extends DocumentSummary {
|
|
|
94
94
|
// `organization_id`, so the hierarchy above the document can evolve
|
|
95
95
|
// (folders / teams) without a client change.
|
|
96
96
|
location_label: string | null;
|
|
97
|
-
// Whether
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
// resolves it, so a newly exportable format needs no client change.
|
|
97
|
+
// Whether anything can produce a file from this document. The server
|
|
98
|
+
// resolves who would write it, so a newly exportable format needs no
|
|
99
|
+
// client change.
|
|
101
100
|
downloadable: boolean;
|
|
102
101
|
}
|
|
103
102
|
|
|
@@ -177,6 +176,11 @@ export interface DocumentCheckpoint {
|
|
|
177
176
|
// changed" can read it). Omitted means no message.
|
|
178
177
|
export interface PushToDriveInput {
|
|
179
178
|
message?: string;
|
|
179
|
+
// The file's bytes, for a document the platform has no writer for: its
|
|
180
|
+
// own app serializes it. The SDK supplies these from the registered
|
|
181
|
+
// serializer, so nothing an app calls has to.
|
|
182
|
+
/** @internal */
|
|
183
|
+
bytes?: Uint8Array;
|
|
180
184
|
}
|
|
181
185
|
|
|
182
186
|
// Outcome of a successful push.
|
|
@@ -278,11 +282,11 @@ export interface DocumentsInternalNamespace {
|
|
|
278
282
|
doc: Document,
|
|
279
283
|
input?: PushToDriveInput,
|
|
280
284
|
): Promise<PushToDriveResult>;
|
|
281
|
-
// Fetch a presigned GET + descriptor for the
|
|
282
|
-
//
|
|
283
|
-
//
|
|
284
|
-
//
|
|
285
|
-
//
|
|
285
|
+
// Fetch a presigned GET + descriptor for the file a document was uploaded
|
|
286
|
+
// as, so an app that knows the format can download and parse it
|
|
287
|
+
// in-browser. Rejects with a `BrassError` when the document holds no such
|
|
288
|
+
// file or the caller cannot reach it (404). The per-doc instance method
|
|
289
|
+
// `doc.sourceBlob()` routes through this.
|
|
286
290
|
sourceBlob(doc: Document): Promise<DocumentSourceBlob>;
|
|
287
291
|
// The import-claim protocol behind `Brass.registerImporter`. The SDK
|
|
288
292
|
// (never the app) claims the right to run the import of a stored
|
|
@@ -305,6 +309,11 @@ export function createDocumentsNamespace(
|
|
|
305
309
|
opts: DocumentsFactoryOptions,
|
|
306
310
|
): DocumentsNamespace & DocumentsInternalNamespace {
|
|
307
311
|
const apiFetch = createApiFetch(opts);
|
|
312
|
+
// Identifies THIS client to the import claim, so two tabs of one app
|
|
313
|
+
// signed in as one user are two claimants and only one of them imports.
|
|
314
|
+
// Minted once per namespace, so re-claiming from this client refreshes
|
|
315
|
+
// its own claim rather than taking a second one.
|
|
316
|
+
const importClientId = randomToken();
|
|
308
317
|
|
|
309
318
|
return {
|
|
310
319
|
get(docId) {
|
|
@@ -427,8 +436,14 @@ export function createDocumentsNamespace(
|
|
|
427
436
|
{ status: 400 },
|
|
428
437
|
);
|
|
429
438
|
}
|
|
430
|
-
const body: {
|
|
439
|
+
const body: {
|
|
440
|
+
message?: string;
|
|
441
|
+
content_base64?: string;
|
|
442
|
+
} = {};
|
|
431
443
|
if (input?.message !== undefined) body.message = input.message;
|
|
444
|
+
if (input?.bytes !== undefined) {
|
|
445
|
+
body.content_base64 = bytesToBase64(input.bytes);
|
|
446
|
+
}
|
|
432
447
|
const res = await apiFetch<PushToDriveResult>({
|
|
433
448
|
method: 'POST',
|
|
434
449
|
path: `/documents/${encodeURIComponent(docId)}/drive-sync/push`,
|
|
@@ -452,12 +467,14 @@ export function createDocumentsNamespace(
|
|
|
452
467
|
return apiFetch<ImportClaimResponse>({
|
|
453
468
|
method: 'POST',
|
|
454
469
|
path: `/documents/${encodeURIComponent(docId)}/import-claim`,
|
|
470
|
+
body: { client_id: importClientId },
|
|
455
471
|
});
|
|
456
472
|
},
|
|
457
473
|
completeImport(docId) {
|
|
458
474
|
return apiFetch<{ schema_ref: { app_id: string; schema_hash: string } }>({
|
|
459
475
|
method: 'POST',
|
|
460
476
|
path: `/documents/${encodeURIComponent(docId)}/import-complete`,
|
|
477
|
+
body: { client_id: importClientId },
|
|
461
478
|
});
|
|
462
479
|
},
|
|
463
480
|
async getThumbnail(docId, options) {
|
|
@@ -477,6 +494,14 @@ export function createDocumentsNamespace(
|
|
|
477
494
|
};
|
|
478
495
|
}
|
|
479
496
|
|
|
497
|
+
function randomToken(): string {
|
|
498
|
+
const g = globalThis as { crypto?: { randomUUID?: () => string } };
|
|
499
|
+
if (g.crypto?.randomUUID) return g.crypto.randomUUID();
|
|
500
|
+
let s = '';
|
|
501
|
+
for (let i = 0; i < 32; i++) s += Math.floor(Math.random() * 16).toString(16);
|
|
502
|
+
return s;
|
|
503
|
+
}
|
|
504
|
+
|
|
480
505
|
// Reads `SetThumbnailInput.image` into base64 plus a resolved MIME
|
|
481
506
|
// type. A `Blob` carries its own `type` (canvas `toBlob` sets it);
|
|
482
507
|
// raw `ArrayBuffer` / `Uint8Array` bytes need an explicit
|