@brass-build/client 0.4.0 → 0.5.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 +142 -41
- package/CHANGELOG.md +93 -4
- package/README.md +666 -179
- package/dist/acting-organization.d.ts.map +1 -1
- package/dist/acting-organization.js +6 -11
- package/dist/acting-organization.js.map +1 -1
- package/dist/api-fetch.d.ts +8 -0
- package/dist/api-fetch.d.ts.map +1 -1
- package/dist/api-fetch.js +35 -8
- package/dist/api-fetch.js.map +1 -1
- package/dist/batched-get.d.ts +11 -0
- package/dist/batched-get.d.ts.map +1 -0
- package/dist/batched-get.js +92 -0
- package/dist/batched-get.js.map +1 -0
- package/dist/call-service.d.ts +4 -0
- package/dist/call-service.d.ts.map +1 -1
- package/dist/call-service.js +66 -3
- package/dist/call-service.js.map +1 -1
- package/dist/client.d.ts +51 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +982 -124
- package/dist/client.js.map +1 -1
- package/dist/document-checkpoints.d.ts +25 -2
- package/dist/document-checkpoints.d.ts.map +1 -1
- package/dist/document-checkpoints.js +258 -61
- package/dist/document-checkpoints.js.map +1 -1
- package/dist/document-commands.d.ts.map +1 -1
- package/dist/document-commands.js +5 -3
- package/dist/document-commands.js.map +1 -1
- package/dist/document-contents.d.ts +10 -0
- package/dist/document-contents.d.ts.map +1 -1
- package/dist/document-contents.js +23 -1
- package/dist/document-contents.js.map +1 -1
- package/dist/document-set-subscription.d.ts +56 -0
- package/dist/document-set-subscription.d.ts.map +1 -0
- package/dist/document-set-subscription.js +240 -0
- package/dist/document-set-subscription.js.map +1 -0
- package/dist/document-signals.d.ts +6 -0
- package/dist/document-signals.d.ts.map +1 -1
- package/dist/document-signals.js +31 -1
- package/dist/document-signals.js.map +1 -1
- package/dist/document-streams.d.ts +36 -2
- package/dist/document-streams.d.ts.map +1 -1
- package/dist/document-streams.js +69 -18
- package/dist/document-streams.js.map +1 -1
- package/dist/document-thumbnail-capture.d.ts +12 -2
- package/dist/document-thumbnail-capture.d.ts.map +1 -1
- package/dist/document-thumbnail-capture.js +103 -27
- package/dist/document-thumbnail-capture.js.map +1 -1
- package/dist/documents-namespace.d.ts +92 -10
- package/dist/documents-namespace.d.ts.map +1 -1
- package/dist/documents-namespace.js +285 -39
- package/dist/documents-namespace.js.map +1 -1
- package/dist/documents.d.ts +173 -8
- package/dist/documents.d.ts.map +1 -1
- package/dist/documents.js +1778 -310
- package/dist/documents.js.map +1 -1
- package/dist/errors.d.ts +3 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/fetch-retry.d.ts +1 -0
- package/dist/fetch-retry.d.ts.map +1 -1
- package/dist/fetch-retry.js +2 -0
- package/dist/fetch-retry.js.map +1 -1
- package/dist/file-choice.d.ts +2 -0
- package/dist/file-choice.d.ts.map +1 -0
- package/dist/file-choice.js +27 -0
- package/dist/file-choice.js.map +1 -0
- package/dist/guest-link.d.ts +18 -1
- package/dist/guest-link.d.ts.map +1 -1
- package/dist/guest-link.js +329 -1
- package/dist/guest-link.js.map +1 -1
- package/dist/handle-types.d.ts +67 -5
- package/dist/handle-types.d.ts.map +1 -1
- package/dist/handles.d.ts +15 -19
- package/dist/handles.d.ts.map +1 -1
- package/dist/handles.js +231 -76
- package/dist/handles.js.map +1 -1
- package/dist/hosted-ui.d.ts +61 -0
- package/dist/hosted-ui.d.ts.map +1 -1
- package/dist/hosted-ui.js +94 -42
- package/dist/hosted-ui.js.map +1 -1
- package/dist/import-contract.d.ts +74 -0
- package/dist/import-contract.d.ts.map +1 -0
- package/dist/import-contract.js +163 -0
- package/dist/import-contract.js.map +1 -0
- package/dist/import-guest.d.ts +9 -0
- package/dist/import-guest.d.ts.map +1 -0
- package/dist/import-guest.js +155 -0
- package/dist/import-guest.js.map +1 -0
- package/dist/import-report.d.ts +17 -0
- package/dist/import-report.d.ts.map +1 -0
- package/dist/import-report.js +7 -0
- package/dist/import-report.js.map +1 -0
- package/dist/importer-wait.d.ts +2 -0
- package/dist/importer-wait.d.ts.map +1 -0
- package/dist/importer-wait.js +5 -0
- package/dist/importer-wait.js.map +1 -0
- package/dist/importer.d.ts +18 -4
- package/dist/importer.d.ts.map +1 -1
- package/dist/importer.js +322 -105
- package/dist/importer.js.map +1 -1
- package/dist/in-development.d.ts +2 -0
- package/dist/in-development.d.ts.map +1 -0
- package/dist/in-development.js +10 -0
- package/dist/in-development.js.map +1 -0
- package/dist/index.d.ts +16 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -8
- package/dist/index.js.map +1 -1
- package/dist/init-keys.d.ts +1 -1
- package/dist/init-keys.d.ts.map +1 -1
- package/dist/init-keys.js +6 -1
- package/dist/init-keys.js.map +1 -1
- package/dist/input-documents.d.ts +67 -0
- package/dist/input-documents.d.ts.map +1 -0
- package/dist/input-documents.js +693 -0
- package/dist/input-documents.js.map +1 -0
- package/dist/inputs-status.d.ts +80 -0
- package/dist/inputs-status.d.ts.map +1 -0
- package/dist/inputs-status.js +460 -0
- package/dist/inputs-status.js.map +1 -0
- package/dist/inputs.d.ts +2 -0
- package/dist/inputs.d.ts.map +1 -0
- package/dist/inputs.js +793 -0
- package/dist/inputs.js.map +1 -0
- package/dist/internal.d.ts +6 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +4 -1
- package/dist/internal.js.map +1 -1
- package/dist/join-content.d.ts +33 -0
- package/dist/join-content.d.ts.map +1 -0
- package/dist/join-content.js +114 -0
- package/dist/join-content.js.map +1 -0
- package/dist/join-stamp.d.ts +3 -0
- package/dist/join-stamp.d.ts.map +1 -0
- package/dist/join-stamp.js +12 -0
- package/dist/join-stamp.js.map +1 -0
- package/dist/manifest-drift.d.ts +9 -0
- package/dist/manifest-drift.d.ts.map +1 -0
- package/dist/manifest-drift.js +46 -0
- package/dist/manifest-drift.js.map +1 -0
- package/dist/open-document.d.ts +109 -2
- package/dist/open-document.d.ts.map +1 -1
- package/dist/open-document.js +1822 -811
- package/dist/open-document.js.map +1 -1
- package/dist/page-restore.d.ts +12 -0
- package/dist/page-restore.d.ts.map +1 -0
- package/dist/page-restore.js +23 -0
- package/dist/page-restore.js.map +1 -0
- package/dist/placement.d.ts +13 -0
- package/dist/placement.d.ts.map +1 -0
- package/dist/placement.js +34 -0
- package/dist/placement.js.map +1 -0
- package/dist/presence.d.ts +1 -0
- package/dist/presence.d.ts.map +1 -1
- package/dist/presence.js +16 -4
- package/dist/presence.js.map +1 -1
- package/dist/read-only-document.d.ts +87 -0
- package/dist/read-only-document.d.ts.map +1 -0
- package/dist/read-only-document.js +4 -0
- package/dist/read-only-document.js.map +1 -0
- package/dist/record-paging.d.ts +63 -6
- package/dist/record-paging.d.ts.map +1 -1
- package/dist/record-paging.js +122 -29
- package/dist/record-paging.js.map +1 -1
- package/dist/references.d.ts +40 -0
- package/dist/references.d.ts.map +1 -0
- package/dist/references.js +135 -0
- package/dist/references.js.map +1 -0
- package/dist/request-lane.d.ts +5 -0
- package/dist/request-lane.d.ts.map +1 -0
- package/dist/request-lane.js +48 -0
- package/dist/request-lane.js.map +1 -0
- package/dist/sealed-arrow.d.ts +170 -0
- package/dist/sealed-arrow.d.ts.map +1 -0
- package/dist/sealed-arrow.js +769 -0
- package/dist/sealed-arrow.js.map +1 -0
- package/dist/sealed-cache.d.ts +21 -0
- package/dist/sealed-cache.d.ts.map +1 -0
- package/dist/sealed-cache.js +247 -0
- package/dist/sealed-cache.js.map +1 -0
- package/dist/sealed-encode.d.ts +87 -0
- package/dist/sealed-encode.d.ts.map +1 -0
- package/dist/sealed-encode.js +876 -0
- package/dist/sealed-encode.js.map +1 -0
- package/dist/sealed-handles.d.ts +45 -0
- package/dist/sealed-handles.d.ts.map +1 -0
- package/dist/sealed-handles.js +408 -0
- package/dist/sealed-handles.js.map +1 -0
- package/dist/sealed-store.d.ts +242 -0
- package/dist/sealed-store.d.ts.map +1 -0
- package/dist/sealed-store.js +1155 -0
- package/dist/sealed-store.js.map +1 -0
- package/dist/serializer.d.ts +6 -15
- package/dist/serializer.d.ts.map +1 -1
- package/dist/session-toolbar.d.ts +20 -5
- package/dist/session-toolbar.d.ts.map +1 -1
- package/dist/session-toolbar.js +419 -67
- package/dist/session-toolbar.js.map +1 -1
- package/dist/session.d.ts +38 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +562 -79
- package/dist/session.js.map +1 -1
- package/dist/sha256.d.ts +3 -0
- package/dist/sha256.d.ts.map +1 -0
- package/dist/sha256.js +74 -0
- package/dist/sha256.js.map +1 -0
- package/dist/stable-handles.d.ts +19 -0
- package/dist/stable-handles.d.ts.map +1 -0
- package/dist/stable-handles.js +193 -0
- package/dist/stable-handles.js.map +1 -0
- package/dist/staged-seal.d.ts +2 -0
- package/dist/staged-seal.d.ts.map +1 -0
- package/dist/staged-seal.js +76 -0
- package/dist/staged-seal.js.map +1 -0
- package/dist/subscriber-delivery.d.ts +8 -0
- package/dist/subscriber-delivery.d.ts.map +1 -0
- package/dist/subscriber-delivery.js +31 -0
- package/dist/subscriber-delivery.js.map +1 -0
- package/dist/tail-op-import.d.ts +10 -0
- package/dist/tail-op-import.d.ts.map +1 -0
- package/dist/tail-op-import.js +33 -0
- package/dist/tail-op-import.js.map +1 -0
- package/dist/topic-lifecycle.d.ts +6 -0
- package/dist/topic-lifecycle.d.ts.map +1 -1
- package/dist/topic-lifecycle.js +32 -2
- package/dist/topic-lifecycle.js.map +1 -1
- package/dist/trial-replace-dialog.d.ts +10 -0
- package/dist/trial-replace-dialog.d.ts.map +1 -0
- package/dist/trial-replace-dialog.js +153 -0
- package/dist/trial-replace-dialog.js.map +1 -0
- package/dist/types.d.ts +8 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/undo.d.ts +60 -5
- package/dist/undo.d.ts.map +1 -1
- package/dist/undo.js +344 -75
- package/dist/undo.js.map +1 -1
- package/dist/version-bar.d.ts +1 -0
- package/dist/version-bar.d.ts.map +1 -1
- package/dist/version-bar.js +2 -1
- package/dist/version-bar.js.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.js +1 -1
- package/dist/ws-client.d.ts +21 -0
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +192 -8
- package/dist/ws-client.js.map +1 -1
- package/dist/ws-frame-limit.d.ts +1 -0
- package/dist/ws-frame-limit.d.ts.map +1 -1
- package/dist/ws-frame-limit.js.map +1 -1
- package/docs/app-manifest.md +121 -17
- package/docs/custom-chrome.md +24 -16
- package/docs/hosted-ui-advanced.md +38 -6
- package/docs/imported-documents.md +104 -51
- package/docs/presence.md +16 -4
- package/docs/schemas.md +8 -5
- package/docs/services.md +6 -6
- package/docs/streams.md +139 -150
- package/docs/text-fields.md +26 -19
- package/package.json +5 -2
- package/src/acting-organization.ts +6 -12
- package/src/api-fetch.ts +53 -3
- package/src/auth-flow.ts +1 -1
- package/src/batched-get.ts +117 -0
- package/src/call-service.ts +78 -3
- package/src/client.ts +1092 -121
- package/src/document-checkpoints.ts +307 -65
- package/src/document-commands.ts +5 -5
- package/src/document-contents.ts +27 -1
- package/src/document-set-subscription.ts +274 -0
- package/src/document-signals.ts +47 -5
- package/src/document-streams.ts +85 -16
- package/src/document-thumbnail-capture.ts +118 -32
- package/src/documents-namespace.ts +539 -84
- package/src/documents.ts +2017 -348
- package/src/errors.ts +17 -6
- package/src/fetch-retry.ts +5 -0
- package/src/file-choice.ts +26 -0
- package/src/guest-link.ts +362 -1
- package/src/handle-types.ts +73 -47
- package/src/handles.ts +253 -83
- package/src/hosted-ui.ts +211 -50
- package/src/import-contract.ts +227 -0
- package/src/import-guest.ts +193 -0
- package/src/import-report.ts +24 -0
- package/src/importer-wait.ts +4 -0
- package/src/importer.ts +386 -131
- package/src/in-development.ts +10 -0
- package/src/index.ts +76 -16
- package/src/init-keys.ts +6 -1
- package/src/input-documents.ts +819 -0
- package/src/inputs-status.ts +598 -0
- package/src/inputs.ts +1090 -0
- package/src/internal.ts +7 -0
- package/src/join-content.ts +135 -0
- package/src/join-stamp.ts +12 -0
- package/src/manifest-drift.ts +54 -0
- package/src/open-document.ts +2346 -930
- package/src/page-restore.ts +38 -0
- package/src/placement.ts +54 -0
- package/src/presence.ts +21 -5
- package/src/read-only-document.ts +133 -0
- package/src/record-paging.ts +147 -25
- package/src/references.ts +207 -0
- package/src/request-lane.ts +59 -0
- package/src/sealed-arrow.ts +843 -0
- package/src/sealed-cache.ts +267 -0
- package/src/sealed-encode.ts +1015 -0
- package/src/sealed-handles.ts +486 -0
- package/src/sealed-store.ts +1330 -0
- package/src/serializer.ts +8 -20
- package/src/session-toolbar.ts +463 -72
- package/src/session.ts +740 -99
- package/src/sha256.ts +65 -0
- package/src/stable-handles.ts +235 -0
- package/src/staged-seal.ts +90 -0
- package/src/subscriber-delivery.ts +37 -0
- package/src/tail-op-import.ts +30 -0
- package/src/topic-lifecycle.ts +38 -2
- package/src/trial-replace-dialog.ts +163 -0
- package/src/types.ts +6 -6
- package/src/undo.ts +386 -73
- package/src/version-bar.ts +5 -1
- package/src/version.ts +1 -1
- package/src/ws-client.ts +208 -16
- package/src/ws-frame-limit.ts +1 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// Import-guest: the app side of a platform-run import. Brass loads the app's
|
|
2
|
+
// own bundle with the import-mode URL flag in a headless browser it hosts,
|
|
3
|
+
// hands it the file over the `__brass_embed` envelope, and takes back what
|
|
4
|
+
// the registered importer produced, already encoded in the frozen form the
|
|
5
|
+
// platform seals. The mirror of `export-guest.ts`: Brass is the framer, the
|
|
6
|
+
// app's SDK is the guest, and the guest never authenticates or calls the API.
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
encodeImportStreams,
|
|
10
|
+
encodeStreamBundle,
|
|
11
|
+
readImportResult,
|
|
12
|
+
type DocumentImporter,
|
|
13
|
+
type ImportFile,
|
|
14
|
+
} from './import-contract.js';
|
|
15
|
+
import { EMBED_ENVELOPE, EMBED_PROTOCOL_VERSION } from './embed-protocol.js';
|
|
16
|
+
import { SDK_VERSION } from './version.js';
|
|
17
|
+
|
|
18
|
+
export const IMPORT_MODE_PARAM = '__brass_import';
|
|
19
|
+
|
|
20
|
+
// How long to wait for a late `registerImporter` before answering
|
|
21
|
+
// `no_importer`.
|
|
22
|
+
const IMPORTER_WAIT_MS = 10_000;
|
|
23
|
+
|
|
24
|
+
export function isImportMode(search: string): boolean {
|
|
25
|
+
return new URLSearchParams(search).has(IMPORT_MODE_PARAM);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ImportGuestController {
|
|
29
|
+
setImporter(importer: DocumentImporter): void;
|
|
30
|
+
dispose(): void;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface HandedFile {
|
|
34
|
+
name: string;
|
|
35
|
+
content_type: string;
|
|
36
|
+
bytes: Uint8Array;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface PendingRequest {
|
|
40
|
+
requestId: string;
|
|
41
|
+
file: HandedFile;
|
|
42
|
+
hostOrigin: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
type Outcome =
|
|
46
|
+
| { ok: true; bundle: Uint8Array; entries: number; report?: unknown }
|
|
47
|
+
| {
|
|
48
|
+
ok: false;
|
|
49
|
+
code: 'importer_failed' | 'no_importer' | 'empty' | 'unsupported_request';
|
|
50
|
+
message: string;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
function toImportFile(file: HandedFile): ImportFile {
|
|
54
|
+
return {
|
|
55
|
+
name: file.name,
|
|
56
|
+
content_type: file.content_type,
|
|
57
|
+
byte_size: file.bytes.byteLength,
|
|
58
|
+
bytes: () => Promise.resolve(file.bytes),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Start listening as an import guest. Called from `Brass.init` only when
|
|
63
|
+
// `isImportMode(location.search)` is true.
|
|
64
|
+
export function startImportGuest(): ImportGuestController {
|
|
65
|
+
let importer: DocumentImporter | null = null;
|
|
66
|
+
let pending: PendingRequest | null = null;
|
|
67
|
+
let done = false;
|
|
68
|
+
let waitTimer: ReturnType<typeof setTimeout> | undefined;
|
|
69
|
+
|
|
70
|
+
function reply(hostOrigin: string, requestId: string, outcome: Outcome): void {
|
|
71
|
+
const send = (answer: Outcome): void =>
|
|
72
|
+
window.parent.postMessage(
|
|
73
|
+
{ [EMBED_ENVELOPE]: EMBED_PROTOCOL_VERSION, type: 'import-result', requestId, ...answer },
|
|
74
|
+
hostOrigin,
|
|
75
|
+
);
|
|
76
|
+
try {
|
|
77
|
+
send(outcome);
|
|
78
|
+
} catch {
|
|
79
|
+
// A report the browser cannot clone (one holding a function, say) is
|
|
80
|
+
// left behind, so the framer still receives the content.
|
|
81
|
+
if (outcome.ok && outcome.report !== undefined) {
|
|
82
|
+
const { report: _unsent, ...content } = outcome;
|
|
83
|
+
try {
|
|
84
|
+
send(content);
|
|
85
|
+
return;
|
|
86
|
+
} catch {
|
|
87
|
+
// Answered as a failure below.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
send({ ok: false, code: 'importer_failed', message: 'The import result could not be sent.' });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function run(): Promise<void> {
|
|
95
|
+
if (done || !pending || !importer) return;
|
|
96
|
+
done = true;
|
|
97
|
+
if (waitTimer !== undefined) clearTimeout(waitTimer);
|
|
98
|
+
const { hostOrigin, requestId, file } = pending;
|
|
99
|
+
let outcome: Outcome;
|
|
100
|
+
try {
|
|
101
|
+
const result = readImportResult(await importer(toImportFile(file)));
|
|
102
|
+
const streams = result === null ? [] : await encodeImportStreams(result);
|
|
103
|
+
if (result === null || streams.length === 0) {
|
|
104
|
+
outcome = { ok: false, code: 'empty', message: 'The importer returned no content.' };
|
|
105
|
+
} else {
|
|
106
|
+
outcome = {
|
|
107
|
+
ok: true,
|
|
108
|
+
bundle: encodeStreamBundle(streams),
|
|
109
|
+
entries: streams.reduce((sum, s) => sum + s.entries, 0),
|
|
110
|
+
...(result.report !== undefined ? { report: result.report } : {}),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
} catch (err) {
|
|
114
|
+
outcome = {
|
|
115
|
+
ok: false,
|
|
116
|
+
code: 'importer_failed',
|
|
117
|
+
message: err instanceof Error ? err.message : 'The importer failed.',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
reply(hostOrigin, requestId, outcome);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function onMessage(event: MessageEvent): void {
|
|
124
|
+
if (event.source !== window.parent) return;
|
|
125
|
+
const data = event.data as Record<string, unknown> | null;
|
|
126
|
+
if (!data || typeof data !== 'object' || !(EMBED_ENVELOPE in data)) return;
|
|
127
|
+
if (pending !== null) return;
|
|
128
|
+
const requestId = typeof data['requestId'] === 'string' ? data['requestId'] : '';
|
|
129
|
+
// Anything the framer sends that this guest cannot serve is answered at
|
|
130
|
+
// once, so the framer never waits out its own timeout on it.
|
|
131
|
+
const unsupported = (): void =>
|
|
132
|
+
reply(event.origin, requestId, {
|
|
133
|
+
ok: false,
|
|
134
|
+
code: 'unsupported_request',
|
|
135
|
+
message: 'This app cannot serve that import request.',
|
|
136
|
+
});
|
|
137
|
+
if (data[EMBED_ENVELOPE] !== EMBED_PROTOCOL_VERSION || data['type'] !== 'import-request') {
|
|
138
|
+
unsupported();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const files = data['files'];
|
|
142
|
+
// The request carries a list, and an importer reads one file.
|
|
143
|
+
if (requestId === '' || !Array.isArray(files) || files.length !== 1) {
|
|
144
|
+
unsupported();
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const file = files[0] as Record<string, unknown> | null;
|
|
148
|
+
if (
|
|
149
|
+
typeof file?.['name'] !== 'string' ||
|
|
150
|
+
typeof file['content_type'] !== 'string' ||
|
|
151
|
+
!(file['bytes'] instanceof Uint8Array)
|
|
152
|
+
) {
|
|
153
|
+
unsupported();
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
pending = {
|
|
157
|
+
requestId,
|
|
158
|
+
file: { name: file['name'], content_type: file['content_type'], bytes: file['bytes'] },
|
|
159
|
+
hostOrigin: event.origin,
|
|
160
|
+
};
|
|
161
|
+
if (importer) {
|
|
162
|
+
void run();
|
|
163
|
+
} else {
|
|
164
|
+
waitTimer = setTimeout(() => {
|
|
165
|
+
if (done || !pending) return;
|
|
166
|
+
done = true;
|
|
167
|
+
reply(pending.hostOrigin, pending.requestId, {
|
|
168
|
+
ok: false,
|
|
169
|
+
code: 'no_importer',
|
|
170
|
+
message: 'No importer registered.',
|
|
171
|
+
});
|
|
172
|
+
}, IMPORTER_WAIT_MS);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
window.addEventListener('message', onMessage);
|
|
177
|
+
// `accepts` names the forms a request may hand the file in.
|
|
178
|
+
window.parent.postMessage(
|
|
179
|
+
{ [EMBED_ENVELOPE]: EMBED_PROTOCOL_VERSION, type: 'ready', sdk: SDK_VERSION, accepts: ['bytes'] },
|
|
180
|
+
'*',
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
setImporter(next: DocumentImporter): void {
|
|
185
|
+
importer = next;
|
|
186
|
+
if (pending) void run();
|
|
187
|
+
},
|
|
188
|
+
dispose(): void {
|
|
189
|
+
window.removeEventListener('message', onMessage);
|
|
190
|
+
if (waitTimer !== undefined) clearTimeout(waitTimer);
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// What an importer made of a file. `Brass.registerImporter`'s importer may
|
|
2
|
+
// return one, and the platform's own importers write the same shape; it
|
|
3
|
+
// reaches readers as `doc.importReport` on the document it describes.
|
|
4
|
+
//
|
|
5
|
+
// A clean import returns nothing: a report with no findings is not stored.
|
|
6
|
+
|
|
7
|
+
/** `skipped`: content the file holds that the import did not read.
|
|
8
|
+
* `assumed`: a value the file did not give, which the import supplied.
|
|
9
|
+
* `missing`: something the file names that the import did not receive. */
|
|
10
|
+
export type ImportFindingKind = 'skipped' | 'assumed' | 'missing';
|
|
11
|
+
|
|
12
|
+
/** One thing an import skipped, assumed or did not receive. */
|
|
13
|
+
export interface ImportFinding {
|
|
14
|
+
kind: ImportFindingKind;
|
|
15
|
+
/** One complete sentence, shown to the reader verbatim. */
|
|
16
|
+
message: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** What an importer made of a file. A clean import returns none. */
|
|
20
|
+
export interface ImportReport {
|
|
21
|
+
/** One sentence stating what was read, shown above the findings. */
|
|
22
|
+
summary?: string;
|
|
23
|
+
findings: ImportFinding[];
|
|
24
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// The rejections of opens that stopped waiting for this app's
|
|
2
|
+
// `registerImporter`. A follower keeps an input refused this way for the
|
|
3
|
+
// registration, where an input another app imports waits for its import.
|
|
4
|
+
export const importerWaitRejections = new WeakSet<object>();
|