@altertable/data-app 0.66.0 → 0.67.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.
Files changed (131) hide show
  1. package/CONTRIBUTING.md +22 -16
  2. package/dist/chunks/{contract-19ckn3n7.js → index-23dktynd.js} +8 -6
  3. package/dist/chunks/index-23dktynd.js.map +10 -0
  4. package/dist/chunks/{contract-havnjmdr.js → index-8qfxv0h5.js} +2272 -1123
  5. package/dist/chunks/index-8qfxv0h5.js.map +108 -0
  6. package/dist/chunks/{contract-rfbakka4.js → index-ag0cgnvq.js} +169 -35
  7. package/dist/chunks/index-ag0cgnvq.js.map +13 -0
  8. package/dist/chunks/index-dq7b35fn.js +307 -0
  9. package/dist/chunks/index-dq7b35fn.js.map +13 -0
  10. package/dist/chunks/{contract-e11m4y7f.js → index-ev2b5aaf.js} +11 -6
  11. package/dist/chunks/{contract-e11m4y7f.js.map → index-ev2b5aaf.js.map} +3 -3
  12. package/dist/chunks/{contract-awa2d5b1.js → index-f5cnbrjz.js} +19 -2
  13. package/dist/chunks/{contract-awa2d5b1.js.map → index-f5cnbrjz.js.map} +4 -3
  14. package/dist/chunks/{contract-13j5zb3c.js → index-ktmvs916.js} +8 -7
  15. package/dist/chunks/index-ktmvs916.js.map +13 -0
  16. package/dist/chunks/index-mt93ff2b.js +28 -0
  17. package/dist/chunks/index-mt93ff2b.js.map +10 -0
  18. package/dist/chunks/{contract-tf8c3qpv.js → index-qd5xgx6y.js} +46 -5
  19. package/dist/chunks/index-qd5xgx6y.js.map +13 -0
  20. package/dist/chunks/{contract-pk603qj7.js → index-x69p7cv7.js} +12 -9
  21. package/dist/chunks/index-x69p7cv7.js.map +10 -0
  22. package/dist/client/index.js +6 -6
  23. package/dist/core/appearance.js +1 -1
  24. package/dist/core/config.js +7 -3
  25. package/dist/core/config.js.map +1 -1
  26. package/dist/core/contract.js +14 -6
  27. package/dist/core/contract.js.map +1 -1
  28. package/dist/core/format.js +1 -1
  29. package/dist/embed/index.js +12 -10
  30. package/dist/embed/index.js.map +4 -4
  31. package/dist/index.js +12 -0
  32. package/dist/index.js.map +9 -0
  33. package/dist/local.js +20 -30
  34. package/dist/local.js.map +7 -8
  35. package/dist/react/embed/index.js +1 -1
  36. package/dist/react/embed/index.js.map +2 -2
  37. package/dist/react/index.js +57 -19
  38. package/dist/react/index.js.map +4 -4
  39. package/dist/react/ui/index.js +836 -178
  40. package/dist/react/ui/index.js.map +15 -9
  41. package/dist/server.js +13 -26
  42. package/dist/server.js.map +6 -7
  43. package/dist/types/client/annotations.d.ts +4 -0
  44. package/dist/types/client/data-client.d.ts +1 -2
  45. package/dist/types/client/iframe.d.ts +4 -2
  46. package/dist/types/core/annotations.d.ts +2 -0
  47. package/dist/types/core/config.d.ts +48 -4
  48. package/dist/types/core/contract.d.ts +20 -12
  49. package/dist/types/core/dimension.d.ts +6 -4
  50. package/dist/types/core/filters.d.ts +44 -0
  51. package/dist/types/core/messages.d.ts +2 -0
  52. package/dist/types/core/operation-types.d.ts +5 -2
  53. package/dist/types/core/operation.d.ts +3 -4
  54. package/dist/types/core/queries.d.ts +16 -0
  55. package/dist/types/core/uuid.d.ts +2 -0
  56. package/dist/types/core/variables.d.ts +32 -13
  57. package/dist/types/embed/runtime-html.d.ts +2 -0
  58. package/dist/types/embed/source.d.ts +2 -1
  59. package/dist/types/index.d.ts +3 -0
  60. package/dist/types/react/annotations/AnnotationBar.d.ts +7 -1
  61. package/dist/types/react/annotations/AnnotationEditor.d.ts +2 -1
  62. package/dist/types/react/annotations/useDataAppAnnotations.d.ts +3 -0
  63. package/dist/types/react/app-context.d.ts +3 -0
  64. package/dist/types/react/index.d.ts +3 -3
  65. package/dist/types/react/mount.d.ts +6 -4
  66. package/dist/types/react/style-contract.d.ts +22 -2
  67. package/dist/types/react/ui/Button.d.ts +3 -3
  68. package/dist/types/react/ui/ChartLegend.d.ts +31 -0
  69. package/dist/types/react/ui/Checkbox.d.ts +15 -4
  70. package/dist/types/react/ui/CheckboxGroup.d.ts +7 -0
  71. package/dist/types/react/ui/{Combobox.d.ts → ChoicePicker.d.ts} +10 -15
  72. package/dist/types/react/ui/ComposedChart.d.ts +41 -0
  73. package/dist/types/react/ui/ComposedChartLegend.d.ts +8 -0
  74. package/dist/types/react/ui/DataAppFrame.d.ts +1 -2
  75. package/dist/types/react/ui/DimensionPicker.d.ts +1 -1
  76. package/dist/types/react/ui/FilterActions.d.ts +10 -0
  77. package/dist/types/react/ui/FilterBar.d.ts +3 -0
  78. package/dist/types/react/ui/GettingStarted.d.ts +2 -4
  79. package/dist/types/react/ui/Menu.d.ts +12 -0
  80. package/dist/types/react/ui/NumberField.d.ts +27 -0
  81. package/dist/types/react/ui/NumberFilterPicker.d.ts +9 -0
  82. package/dist/types/react/ui/PieChart.d.ts +5 -2
  83. package/dist/types/react/ui/RadioGroup.d.ts +18 -0
  84. package/dist/types/react/ui/SearchInput.d.ts +2 -2
  85. package/dist/types/react/ui/Select.d.ts +14 -0
  86. package/dist/types/react/ui/SelectionMark.d.ts +2 -1
  87. package/dist/types/react/ui/TooltipSurface.d.ts +3 -0
  88. package/dist/types/react/ui/chart-data.d.ts +1 -1
  89. package/dist/types/react/ui/chart-primitives.d.ts +20 -0
  90. package/dist/types/react/ui/icons.d.ts +1 -0
  91. package/dist/types/react/ui/index.d.ts +26 -2
  92. package/dist/types/react/ui/keyboard.d.ts +6 -0
  93. package/dist/types/react/ui/shortcuts.d.ts +7 -0
  94. package/dist/types/react/ui/useAppAppearance.d.ts +1 -1
  95. package/dist/types/react/ui/variables.d.ts +4 -2
  96. package/dist/types/react/view-controls.d.ts +3 -1
  97. package/dist/types/server/handler.d.ts +4 -4
  98. package/dist/worker.js +20 -737
  99. package/docs/app-authoring.md +15 -1
  100. package/docs/client.md +8 -8
  101. package/docs/contract.md +42 -20
  102. package/docs/data-context.md +8 -6
  103. package/docs/embed.md +10 -2
  104. package/docs/formatting-and-appearance.md +23 -7
  105. package/docs/hosted-apps.md +9 -2
  106. package/docs/layout.md +1 -1
  107. package/docs/react-embed.md +3 -2
  108. package/docs/react.md +4 -3
  109. package/docs/server-bun.md +1 -1
  110. package/docs/server.md +4 -4
  111. package/docs/styling.md +10 -3
  112. package/docs/ui.md +158 -3
  113. package/docs/variables.md +80 -7
  114. package/docs/views.md +4 -8
  115. package/docs/widgets.md +16 -13
  116. package/examples/starter-data-app/index.tsx +34 -32
  117. package/package.json +16 -11
  118. package/dist/chunks/contract-13j5zb3c.js.map +0 -13
  119. package/dist/chunks/contract-19ckn3n7.js.map +0 -10
  120. package/dist/chunks/contract-h8a6f559.js +0 -286
  121. package/dist/chunks/contract-h8a6f559.js.map +0 -12
  122. package/dist/chunks/contract-havnjmdr.js.map +0 -99
  123. package/dist/chunks/contract-pk603qj7.js.map +0 -10
  124. package/dist/chunks/contract-rfbakka4.js.map +0 -13
  125. package/dist/chunks/contract-tf8c3qpv.js.map +0 -11
  126. package/dist/chunks/contract-wz59z8pq.js +0 -8
  127. package/dist/chunks/contract-wz59z8pq.js.map +0 -10
  128. /package/dist/chunks/{contract-m6n8ctfc.js → index-m6n8ctfc.js} +0 -0
  129. /package/dist/chunks/{contract-m6n8ctfc.js.map → index-m6n8ctfc.js.map} +0 -0
  130. /package/dist/chunks/{contract-mev09s5v.js → index-mev09s5v.js} +0 -0
  131. /package/dist/chunks/{contract-mev09s5v.js.map → index-mev09s5v.js.map} +0 -0
@@ -0,0 +1,307 @@
1
+ import {
2
+ randomUuid,
3
+ PARENT_PARAM,
4
+ MAX_PENDING,
5
+ REQUEST_TIMEOUT_MS,
6
+ validId,
7
+ createBridgeEndpoint
8
+ } from "./index-f5cnbrjz.js";
9
+ import {
10
+ MessageRoutingError2
11
+ } from "./index-qd5xgx6y.js";
12
+
13
+ // src/embed/host.ts
14
+ function attachDataAppConnection({
15
+ iframe,
16
+ connection,
17
+ javascript,
18
+ presentation,
19
+ logger,
20
+ onStatusChange,
21
+ onDiagnostic,
22
+ onMessage,
23
+ window: host = window
24
+ }) {
25
+ const frameOrigin = connection.type === "origin" ? connection.origin : "null";
26
+ if (connection.type === "origin" && new URL(frameOrigin).origin !== frameOrigin)
27
+ throw new Error("Expected an exact frame origin.");
28
+ if (connection.type === "opaque" && !validId(connection.token))
29
+ throw new Error("Invalid sandbox token.");
30
+ let token = connection.type === "opaque" ? connection.token : undefined;
31
+ const targetOrigin = connection.type === "opaque" ? "*" : frameOrigin;
32
+ let currentPresentation;
33
+ let presentationIdentity;
34
+ let disposed = false;
35
+ let documentId;
36
+ let sessionId;
37
+ const pending = new Map;
38
+ function hostState() {
39
+ return {
40
+ search: host.location.search,
41
+ hash: host.location.hash,
42
+ ...currentPresentation ? { presentation: currentPresentation } : {},
43
+ logging: logger !== undefined
44
+ };
45
+ }
46
+ function setLogger(value) {
47
+ if (disposed || value === logger)
48
+ return;
49
+ const wasEnabled = logger !== undefined;
50
+ logger = value;
51
+ if (wasEnabled !== (logger !== undefined))
52
+ publishState();
53
+ }
54
+ function setPresentation(value) {
55
+ if (disposed)
56
+ return;
57
+ const identity = JSON.stringify(value);
58
+ if (identity === presentationIdentity)
59
+ return;
60
+ presentationIdentity = identity;
61
+ currentPresentation = identity === undefined ? undefined : JSON.parse(identity);
62
+ publishState();
63
+ }
64
+ function cancelAll() {
65
+ for (const controller of pending.values())
66
+ controller.abort();
67
+ pending.clear();
68
+ }
69
+ const endpoint = createBridgeEndpoint({
70
+ role: "host",
71
+ origin: frameOrigin,
72
+ source: () => iframe.contentWindow,
73
+ opaque: connection.type === "opaque",
74
+ context: () => ({ documentId, sessionId, token }),
75
+ post: (message) => iframe.contentWindow?.postMessage(message, targetOrigin),
76
+ diagnostic: (direction, type) => onDiagnostic?.({ direction, type }),
77
+ invalidRequest: (id) => {
78
+ if (pending.has(id))
79
+ return;
80
+ if (pending.size >= MAX_PENDING)
81
+ error(id, "bridge_busy", "Too many pending data requests.");
82
+ else
83
+ error(id, "invalid_message", "Invalid message route.");
84
+ },
85
+ handlers: {
86
+ ready(message) {
87
+ if (message.documentId !== documentId) {
88
+ cancelAll();
89
+ documentId = message.documentId;
90
+ sessionId = randomUuid();
91
+ }
92
+ onStatusChange?.("connected");
93
+ if (disposed)
94
+ return;
95
+ send("initialize", { state: hostState() });
96
+ if (disposed)
97
+ return;
98
+ if (javascript !== undefined)
99
+ send("scriptLoad", { javascript });
100
+ },
101
+ runtimeLog({ payload }) {
102
+ try {
103
+ logger?.[payload.method](...payload.args);
104
+ } catch {}
105
+ },
106
+ runtimeReady() {
107
+ onStatusChange?.("ready");
108
+ },
109
+ runtimeError() {
110
+ onStatusChange?.("failed");
111
+ },
112
+ request(message) {
113
+ request(message);
114
+ },
115
+ cancel(message) {
116
+ pending.get(message.id)?.abort();
117
+ pending.delete(message.id);
118
+ },
119
+ disconnect() {
120
+ cancelAll();
121
+ documentId = undefined;
122
+ sessionId = undefined;
123
+ onStatusChange?.("disconnected");
124
+ }
125
+ }
126
+ });
127
+ const send = endpoint.send;
128
+ const receive = endpoint.receive;
129
+ function error(id, code, message, requestId) {
130
+ send("error", { id, code, message, requestId });
131
+ }
132
+ async function request(message) {
133
+ const id = message.id;
134
+ if (pending.has(id))
135
+ return;
136
+ if (pending.size >= MAX_PENDING)
137
+ return error(id, "bridge_busy", "Too many pending data requests.");
138
+ try {
139
+ const body = JSON.stringify(message.payload);
140
+ const limit = message.route === "annotation:draft" ? 384000 : 16384;
141
+ if (message.payload !== undefined && (typeof body !== "string" || body.length > limit))
142
+ throw new Error("Invalid payload");
143
+ } catch {
144
+ return error(id, "invalid_payload", "The message payload is invalid or too large.");
145
+ }
146
+ const controller = new AbortController;
147
+ pending.set(id, controller);
148
+ const timer = setTimeout(() => {
149
+ if (pending.get(id) !== controller)
150
+ return;
151
+ pending.delete(id);
152
+ controller.abort();
153
+ error(id, "timeout", "The data request timed out.");
154
+ }, REQUEST_TIMEOUT_MS);
155
+ controller.signal.addEventListener("abort", () => clearTimeout(timer), {
156
+ once: true
157
+ });
158
+ try {
159
+ const response = await onMessage({ route: message.route, payload: message.payload }, { signal: controller.signal });
160
+ if (pending.get(id) === controller)
161
+ send("result", { id, response });
162
+ } catch (failure) {
163
+ if (pending.get(id) === controller) {
164
+ if (failure instanceof MessageRoutingError2)
165
+ error(id, failure.code, failure.message, failure.requestId);
166
+ else
167
+ error(id, "request_failed", "The message request failed. Retry the request.");
168
+ }
169
+ } finally {
170
+ clearTimeout(timer);
171
+ if (pending.get(id) === controller)
172
+ pending.delete(id);
173
+ }
174
+ }
175
+ function publishState() {
176
+ if (disposed || !sessionId)
177
+ return;
178
+ send("stateUpdate", { state: hostState() });
179
+ }
180
+ function load() {
181
+ if (connection.type === "opaque")
182
+ token = randomUuid();
183
+ cancelAll();
184
+ documentId = undefined;
185
+ sessionId = undefined;
186
+ onStatusChange?.("connecting");
187
+ send("connect", {});
188
+ }
189
+ function dispose() {
190
+ disposed = true;
191
+ endpoint.dispose();
192
+ cancelAll();
193
+ iframe.removeEventListener("load", load);
194
+ host.removeEventListener("message", receive);
195
+ host.removeEventListener("popstate", publishState);
196
+ host.removeEventListener("pagehide", cancelAll);
197
+ }
198
+ setPresentation(presentation);
199
+ iframe.addEventListener("load", load);
200
+ host.addEventListener("message", receive);
201
+ host.addEventListener("popstate", publishState);
202
+ host.addEventListener("pagehide", cancelAll);
203
+ onStatusChange?.("connecting");
204
+ send("connect", {});
205
+ return { dispose, setPresentation, setLogger };
206
+ }
207
+
208
+ // src/embed/runtime-html.ts
209
+ var PAGE_CSP = "default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src data: blob:; connect-src 'none'; form-action 'none'; base-uri 'none'";
210
+ var inlineBootstrap = '(()=>{function q(){if(typeof crypto.randomUUID==="function")return crypto.randomUUID();let e=crypto.getRandomValues(new Uint8Array(16));e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t=Array.from(e,(r)=>r.toString(16).padStart(2,"0"));return[t.slice(0,4),t.slice(4,6),t.slice(6,8),t.slice(8,10),t.slice(10)].map((r)=>r.join("")).join("-")}function X(e){if(!e||typeof e!=="object")return!1;let t=e;return(t.method==="log"||t.method==="info"||t.method==="warn"||t.method==="error")&&Array.isArray(t.args)&&t.args.length<=128}var U="altertable:data-app";var J=128,Z=60000;function M(e){return typeof e==="string"&&/^[a-zA-Z0-9_-]{1,128}$/.test(e)}function g({wire:e,from:t,session:r,parse:n}){return{wire:e,from:t,session:r,parse:n}}function j(e){if(!M(e.id))throw Error("Invalid request ID.");return e.id}function L(e,t){let r=e[t];if(typeof r!=="string")throw Error(`Invalid ${t}.`);return r}function A(){return{}}var m={channel:U,version:1,events:{connect:g({wire:"bridge:connect",from:"host",session:"none",parse:A}),ready:g({wire:"bridge:ready",from:"app",session:"none",parse:A}),initialize:g({wire:"bridge:initialize",from:"host",session:"establish",parse:(e)=>({state:e.state})}),request:g({wire:"bridge:request",from:"app",session:"current",parse:(e)=>{let t=L(e,"route");if(!t||t.length>256)throw Error("Invalid message route.");return{id:j(e),route:t,payload:e.payload}}}),result:g({wire:"bridge:result",from:"host",session:"current",parse:(e)=>{if(!Object.hasOwn(e,"response"))throw Error("Missing response.");return{id:j(e),response:e.response}}}),error:g({wire:"bridge:error",from:"host",session:"current",parse:(e)=>{if(e.requestId!==void 0&&typeof e.requestId!=="string")throw Error("Invalid requestId.");return{id:j(e),code:L(e,"code"),message:L(e,"message"),...e.requestId===void 0?{}:{requestId:e.requestId}}}}),cancel:g({wire:"bridge:cancel",from:"app",session:"current",parse:(e)=>({id:j(e)})}),disconnect:g({wire:"bridge:disconnect",from:"app",session:"current",parse:A}),scriptLoad:g({wire:"script:load",from:"host",session:"current",parse:(e)=>({javascript:L(e,"javascript")})}),stateUpdate:g({wire:"state:update",from:"host",session:"current",parse:(e)=>({state:e.state})}),runtimeLog:g({wire:"runtime:log",from:"app",session:"current",parse:(e)=>{if(!X(e.payload))throw Error("Invalid log entry.");return{payload:e.payload}}}),runtimeReady:g({wire:"runtime:ready",from:"app",session:"current",parse:A}),runtimeError:g({wire:"runtime:error",from:"app",session:"current",parse:A})}},_=new Map;for(let e of Object.keys(m.events)){let t=m.events[e].wire;if(_.has(t))throw Error(`Duplicate bridge event: ${t}`);_.set(t,e)}function C(e){return _.get(e)}function F(e){if(!e||typeof e!=="object")return;let t=e;if(t.channel!==U||t.version!==m.version||typeof t.type!=="string"||typeof t.documentId!=="string"||!t.documentId||t.documentId.length>128||t.sessionId!==void 0&&!M(t.sessionId)||t.token!==void 0&&typeof t.token!=="string")return;return t}function W(e,t){try{return{channel:U,version:m.version,documentId:e.documentId,...e.sessionId===void 0?{}:{sessionId:e.sessionId},...e.token===void 0?{}:{token:e.token},type:t.wire,...t.parse(e)}}catch{return}}function Y(e){let t=F(e);if(!t)return;let r=C(t.type);if(!r)return;let n=m.events[r];if(n.session!=="none"&&t.sessionId===void 0)return;return W(t,n)}function ee({role:e,origin:t,source:r,opaque:n,context:o,post:d,diagnostic:a,invalidRequest:u,handlers:l}){let c=!1;function p(b,R){if(c)throw Error("The bridge endpoint has closed.");let i=m.events[b],f=o(),k=Y({...R,channel:m.channel,version:m.version,type:i.wire,documentId:b==="connect"?"host":f.documentId,sessionId:f.sessionId,token:n?f.token:void 0});if(!k||n&&!M(f.token))throw Error("The bridge is not ready to send this event.");if(a?.("send",i.wire),c)return;d(k)}function v(b){let R=r();if(c||!R||b.origin!==t||b.source!==R)return;let i=F(b.data);if(!i)return;let f=o(),k=e==="app"&&i.type===m.events.connect.wire;if(n&&(k?!M(i.token):!f.token||i.token!==f.token))return;let B=C(i.type);if(!B)return;let x=m.events[B];if(x.from===e)return;if(x.session==="establish"){if(i.documentId!==f.documentId||i.sessionId===void 0)return}else if(x.session==="current"){if(!f.sessionId||i.sessionId!==f.sessionId||i.documentId!==f.documentId)return}let N=W(i,x);if(!N){if(e==="host"&&B==="request"&&M(i.id))u?.(i.id);return}if(a?.("receive",x.wire),c)return;let T=l[B];T(N)}return{send:p,receive:v,dispose(){c=!0}}}function ge(e){return e===null||typeof e==="string"||typeof e==="boolean"||typeof e==="number"&&Number.isFinite(e)}function V(e){return!!e&&typeof e==="object"&&!Array.isArray(e)&&Object.values(e).every(ge)}var te=Symbol.for("@altertable/data-app/MessageRoutingError");class h extends Error{code;requestId;[te]=!0;static[Symbol.hasInstance](e){return e instanceof Error&&e[te]===!0}constructor(e,t,r){super(t);this.code=e;this.requestId=r;this.name="MessageRoutingError"}}function me(e){return e}function re(e){return{operations:e,input(t){if(!t||typeof t!=="object")throw Error("Invalid query.");let r=t;if(typeof r.operation!=="string"||!r.operation||r.operation.length>256||r.operation.includes("/"))throw Error("Invalid operation.");let n=e&&Object.hasOwn(e,r.operation)?e[r.operation]:void 0;if(e&&!n)throw Error("Unknown operation.");return{operation:r.operation,input:n?n.input(r.input):r.input}},output(t,r){if(!t||typeof t!=="object")throw Error("Invalid data response.");let n=t;if(!Number.isInteger(n.status)||n.status<100||n.status>599||!n.body||typeof n.body!=="object"||Array.isArray(n.body))throw Error("Invalid data response.");let o=n.body;if(n.status<200||n.status>=300){let a=o.error;throw new h(typeof a?.code==="string"?a.code:"request_failed",typeof a?.message==="string"?a.message:"Could not load data.",typeof a?.requestId==="string"?a.requestId:void 0)}if(!("data"in o)||typeof o.requestId!=="string"||typeof o.queriedAt!=="string"||!Array.isArray(o.queryIds)||!o.queryIds.every((a)=>typeof a==="string"))throw Error("Invalid data envelope.");if(o.queries!==void 0&&(!Array.isArray(o.queries)||!o.queries.every((a)=>a&&typeof a==="object"&&typeof a.name==="string"&&typeof a.statement==="string"&&(a.params===void 0||V(a.params))&&(a.queryId===void 0||typeof a.queryId==="string"))))throw Error("Invalid query evidence.");let d=e?.[r.operation];return{status:n.status,body:{...o,data:d?d.output(o.data):o.data}}}}}var ne=me({input(e){if(!e||typeof e!=="object")throw Error("Invalid SQL query.");let t=e;if(typeof t.statement!=="string"||!t.statement.trim()||typeof t.limit!=="number"||!Number.isSafeInteger(t.limit)||t.limit<1||t.params!==void 0&&!V(t.params))throw Error("Invalid SQL query.");return{statement:t.statement,limit:t.limit,...t.params===void 0?{}:{params:t.params}}},output(e,t){if(!e||typeof e!=="object")throw Error("Invalid query result.");let r=e;if(!Array.isArray(r.columns)||!r.columns.every((n)=>n&&typeof n.name==="string"&&(n.type===void 0||typeof n.type==="string"))||!Array.isArray(r.rows)||r.rows.length>t.limit||!r.rows.every((n)=>Array.isArray(n)&&n.length===r.columns.length)||r.queryId!==void 0&&typeof r.queryId!=="string")throw Error("Invalid query result.");return{columns:r.columns,rows:r.rows,...r.queryId===void 0?{}:{queryId:r.queryId}}}});function oe(e,t){return{async request(r,n,{signal:o}={}){if(o?.throwIfAborted(),!Object.hasOwn(e,r))throw new h("unknown_route","Unknown message route.");let d=e[r],a;try{a=d.input(n)}catch{throw new h("invalid_payload","Invalid message payload.")}let u=await t({route:r,payload:a},o);o?.throwIfAborted();try{return d.output(u,a)}catch(l){if(l instanceof h)throw l;throw new h("invalid_response","Invalid message response.")}}}}var se=Symbol.for("@altertable/data-app/DataAppError");class E extends Error{code;requestId;[se]=!0;static[Symbol.hasInstance](e){return e instanceof Error&&e[se]===!0}constructor(e,t,r){super(e);this.code=t;this.requestId=r;this.name="DataAppError"}}function ae(e,t){function r(o){if(o.length===1&&typeof o[0]==="function"){let d=o[0]();return Array.isArray(d)?d:[d]}return o.map((d)=>typeof d==="function"?d():d)}function n(o,d){if(!e())return;try{t({method:o,args:r(d)})}catch{}}return{log:(...o)=>n("log",o),info:(...o)=>n("info",o),warn:(...o)=>n("warn",o),error:(...o)=>n("error",o)}}function ie(e,t){if(t.type==="runtime:log")return;e.log(()=>{let r={type:t.type};if("id"in t)r.id=t.id;if(t.type==="bridge:request"){r.route=t.route;let n=t.payload;if(t.route==="data:query"&&n&&typeof n==="object"&&"operation"in n&&typeof n.operation==="string")r.operation=n.operation}return["Sending message to parent",r]})}function de(e){if(e instanceof h)throw new E(e.message,e.code,e.requestId);throw e}function ue({parentOrigin:e,window:t=window,timeoutMs:r=Z,mode:n="url",loadScript:o}){if(new URL(e).origin!==e)throw Error("Expected an exact parent origin.");let d=q(),a,u,l=!1,c=new Map,p,v=new Set,b=ae(()=>!l&&!!u&&!!p&&typeof p==="object"&&("logging"in p)&&p.logging===!0,(s)=>i("runtimeLog",{payload:s})),R=ee({role:"app",origin:e,source:()=>t.parent,opaque:n==="bundle",context:()=>({documentId:d,sessionId:u,token:a}),post(s){t.parent.postMessage(s,e),ie(b,s)},handlers:{connect(s){if(n==="bundle")a=s.token;i("ready",{})},initialize(s){if(u&&u!==s.sessionId)for(let I of c.values())I.reject(new E("The preview reconnected. Retry the request.","bridge_reset"));let y=!u;if(u=s.sessionId,k(s.state),y)for(let I of c.values())I.start();if(l)return;if(n==="url")i("runtimeReady",{})},stateUpdate(s){k(s.state)},scriptLoad(s){if(n==="bundle")o?.(s.javascript)},result(s){c.get(s.id)?.resolve(s.response)},error(s){c.get(s.id)?.reject(new h(s.code,s.message,s.requestId))}}}),{send:i,receive:f}=R;function k(s){p=s;for(let y of v)y(s)}t.addEventListener("message",f);function B(s,y){return new Promise((I,w)=>{if(l)return w(new E("The preview has closed.","bridge_closed"));if(y?.aborted)return w(y.reason);if(c.size>=J)return w(new E("Too many pending data requests.","bridge_busy"));let O=q(),Q=!1;function P(){clearTimeout(ye),y?.removeEventListener("abort",G),c.delete(O)}function G(){if(Q)i("cancel",{id:O});P(),w(y?.reason)}let ye=setTimeout(()=>{if(Q)i("cancel",{id:O});P(),w(new E(u?"The data request timed out.":"The preview shell is unavailable. Reload the preview.",u?"timeout":"bridge_unavailable"))},r),K={start(){if(Q)return;try{i("request",{id:O,route:s.route,payload:s.payload}),Q=!0}catch{P(),w(new E("The message payload could not be sent.","invalid_payload"))}},resolve(S){P(),I(S)},reject(S){P(),w(S)}};if(c.set(O,K),y?.addEventListener("abort",G,{once:!0}),u)K.start();else if(n==="url"||a)i("ready",{})})}let x=oe({"data:query":re(),"data:sql":ne},B);function N(s,y,I){return x.request("data:query",{operation:s,input:y},{signal:I}).catch(de)}function T(){if(u)i("disconnect",{});u=void 0;for(let s of c.values())s.reject(new E("The preview has closed.","bridge_closed"))}function H(s){if(s.persisted&&(n==="url"||a))i("ready",{})}function fe(){if(l)return;T(),l=!0,R.dispose(),t.removeEventListener("message",f),t.removeEventListener("pagehide",T),t.removeEventListener("pageshow",H),v.clear()}if(t.addEventListener("pagehide",T),t.addEventListener("pageshow",H),n==="url")i("ready",{});return{logger:b,request:B,transport:N,lakehouse:{queryAll(s,{limit:y,signal:I,params:w}){return x.request("data:sql",{statement:s,limit:y,...w===void 0?{}:{params:w}},{signal:I}).catch(de)}},dispose:fe,mode:n,snapshot(){return p},subscribe(s){return v.add(s),()=>{v.delete(s)}},ready(){if(!l&&u)i("runtimeReady",{})},fail(){if(!l&&u)i("runtimeError",{})}}}var z=Symbol.for("altertable.localFrameBridge"),D=Symbol.for("altertable.installedTransport");function pe(e,t=window){let r=t;if(r[D])throw Error("A data app transport is already installed.");return r[z]=e,r[D]=e,()=>{if(r[z]===e)delete r[z];if(r[D]===e)delete r[D];e.dispose()}}function ce({parentOrigin:e,window:t=window}){let r,n=!1,o=`altertable-data-app-${q()}.js`,d=ue({parentOrigin:e,window:t,mode:"bundle",loadScript(p){if(r!==void 0){if(p===r)if(n)d.fail();else d.ready();else d.fail();return}r=p;try{let v=t.document.createElement("script");if(v.textContent=`${p}\n//# sourceURL=${o}`,t.document.body.append(v),!n)d.ready()}catch{a()}}});function a(){n=!0,d.fail()}function u(p){if(p.filename===o)a()}function l(p){if(p.reason instanceof Error&&p.reason.stack?.includes(o))a()}t.addEventListener("error",u),t.addEventListener("unhandledrejection",l);let c=pe(d,t);return()=>{t.removeEventListener("error",u),t.removeEventListener("unhandledrejection",l),c()}}var le=document.currentScript?.dataset.parentOrigin;if(!le)throw Error("Missing trusted parent origin.");ce({parentOrigin:le});})();\n'.replace(/<\/script/gi, (match) => `<\\${match.slice(1)}`);
211
+ function runtimeHtml(parentOrigin) {
212
+ const attribute = parentOrigin.replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("'", "&#39;");
213
+ return `<!doctype html>
214
+ <html>
215
+ <head>
216
+ <meta charset="utf-8">
217
+ <meta name="viewport" content="width=device-width,initial-scale=1">
218
+ <meta http-equiv="Content-Security-Policy" content="${PAGE_CSP}">
219
+ </head>
220
+ <body>
221
+ <div id="root"></div>
222
+ <script data-parent-origin="${attribute}">${inlineBootstrap}</script>
223
+ </body>
224
+ </html>
225
+ `;
226
+ }
227
+
228
+ // src/embed/source.ts
229
+ function attachDataAppSource({
230
+ iframe,
231
+ source,
232
+ presentation,
233
+ logger,
234
+ onMessage,
235
+ onStatusChange,
236
+ onDiagnostic,
237
+ startupTimeoutMs = 30000
238
+ }) {
239
+ const host = iframe.ownerDocument.defaultView;
240
+ if (!host)
241
+ throw new Error("The iframe requires a host window.");
242
+ const url = new URL(source.type === "url" ? source.url : source.bootstrapUrl ?? `data:text/html;charset=utf-8,${encodeURIComponent(runtimeHtml(host.location.origin))}`, host.location.href);
243
+ if (!(source.type === "bundle" && source.bootstrapUrl === undefined) && !/^https?:$/.test(url.protocol))
244
+ throw new Error("Data apps require an HTTP(S) URL.");
245
+ const opaque = source.type === "bundle";
246
+ if (!opaque && url.origin === host.location.origin)
247
+ throw new Error("URL data apps require a separate origin from the host.");
248
+ iframe.setAttribute("sandbox", opaque ? "allow-scripts" : "allow-scripts allow-same-origin allow-downloads allow-popups allow-popups-to-escape-sandbox");
249
+ iframe.referrerPolicy = "no-referrer";
250
+ if (!opaque)
251
+ url.searchParams.set(PARENT_PARAM, host.location.origin);
252
+ let timer;
253
+ let failed = false;
254
+ function status(value) {
255
+ if (value === "connecting")
256
+ failed = false;
257
+ if (failed && value !== "connecting")
258
+ return;
259
+ clearTimeout(timer);
260
+ if (value === "connecting" || value === "connected")
261
+ timer = setTimeout(() => {
262
+ failed = true;
263
+ bridge.dispose();
264
+ onStatusChange?.("failed");
265
+ }, startupTimeoutMs);
266
+ if (value === "failed") {
267
+ failed = true;
268
+ bridge.dispose();
269
+ }
270
+ onStatusChange?.(value);
271
+ }
272
+ const bridge = attachDataAppConnection({
273
+ iframe,
274
+ connection: opaque ? { type: "opaque", token: randomUuid() } : { type: "origin", origin: url.origin },
275
+ javascript: opaque ? source.javascript : undefined,
276
+ presentation,
277
+ logger,
278
+ onMessage,
279
+ onStatusChange: status,
280
+ onDiagnostic,
281
+ window: host
282
+ });
283
+ function error() {
284
+ return status("failed");
285
+ }
286
+ iframe.addEventListener("error", error);
287
+ iframe.src = url.href;
288
+ function dispose() {
289
+ clearTimeout(timer);
290
+ iframe.removeEventListener("error", error);
291
+ bridge.dispose();
292
+ }
293
+ return {
294
+ dispose,
295
+ setPresentation: bridge.setPresentation,
296
+ setLogger: bridge.setLogger
297
+ };
298
+ }
299
+
300
+ // src/embed/bridge.ts
301
+ function attachDataAppBridge2(options) {
302
+ return options.source ? attachDataAppSource(options) : attachDataAppConnection(options);
303
+ }
304
+
305
+ export { attachDataAppBridge2 };
306
+
307
+ //# debugId=3328034B0990289B64756E2164756E21
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/embed/host.ts", "../src/embed/runtime-html.ts", "../src/embed/source.ts", "../src/embed/bridge.ts"],
4
+ "sourcesContent": [
5
+ "import { randomUuid } from '@/src/core/uuid';\nimport { createBridgeEndpoint } from '@/src/core/bridge-endpoint';\nimport type { DataAppPresentation } from '@/src/core/presentation';\nimport type { DataAppLogger } from '@/src/core/logger';\nimport {\n MAX_PENDING,\n REQUEST_TIMEOUT_MS,\n validId,\n type BridgeEventMessage,\n type BridgeMessage,\n} from '@/src/core/bridge';\n\nimport {\n MessageRoutingError,\n type MessageDispatcher,\n} from '@/src/core/messages';\n\nexport type DataAppConnection =\n | { type: 'origin'; origin: string }\n | { type: 'opaque'; token: string };\nexport type DataAppStatus =\n | 'connecting'\n | 'connected'\n | 'ready'\n | 'failed'\n | 'disconnected';\nexport type DataAppDiagnostic = {\n direction: 'send' | 'receive';\n type: BridgeMessage['type'];\n};\n\nexport type DataAppHost = {\n dispose: () => void;\n setPresentation: (presentation?: DataAppPresentation) => void;\n setLogger: (logger?: DataAppLogger) => void;\n};\n\nexport type DataAppHostOptions = {\n iframe: HTMLIFrameElement;\n presentation?: DataAppPresentation;\n logger?: DataAppLogger;\n onStatusChange?: (status: DataAppStatus) => void;\n onDiagnostic?: (event: DataAppDiagnostic) => void;\n onMessage: MessageDispatcher;\n};\n\nexport type DataAppConnectionOptions = DataAppHostOptions & {\n connection: DataAppConnection;\n javascript?: string;\n window?: Window;\n};\n\n/** The bridge owns delivery and cancellation; the routed handler owns validation, authorization and execution. */\nexport function attachDataAppConnection({\n iframe,\n connection,\n javascript,\n presentation,\n logger,\n onStatusChange,\n onDiagnostic,\n onMessage,\n window: host = window,\n}: DataAppConnectionOptions): DataAppHost {\n const frameOrigin = connection.type === 'origin' ? connection.origin : 'null';\n if (\n connection.type === 'origin' &&\n new URL(frameOrigin).origin !== frameOrigin\n )\n throw new Error('Expected an exact frame origin.');\n if (connection.type === 'opaque' && !validId(connection.token))\n throw new Error('Invalid sandbox token.');\n let token = connection.type === 'opaque' ? connection.token : undefined;\n const targetOrigin = connection.type === 'opaque' ? '*' : frameOrigin;\n let currentPresentation: DataAppPresentation | undefined;\n let presentationIdentity: string | undefined;\n let disposed = false;\n let documentId: string | undefined;\n let sessionId: string | undefined;\n const pending = new Map<string, AbortController>();\n\n function hostState() {\n return {\n search: host.location.search,\n hash: host.location.hash,\n ...(currentPresentation ? { presentation: currentPresentation } : {}),\n logging: logger !== undefined,\n };\n }\n\n function setLogger(value: DataAppLogger | undefined) {\n if (disposed || value === logger) return;\n const wasEnabled = logger !== undefined;\n logger = value;\n if (wasEnabled !== (logger !== undefined)) publishState();\n }\n\n function setPresentation(value: DataAppPresentation | undefined) {\n if (disposed) return;\n const identity = JSON.stringify(value);\n if (identity === presentationIdentity) return;\n presentationIdentity = identity;\n currentPresentation =\n identity === undefined\n ? undefined\n : (JSON.parse(identity) as DataAppPresentation);\n publishState();\n }\n\n function cancelAll() {\n for (const controller of pending.values()) controller.abort();\n pending.clear();\n }\n\n const endpoint = createBridgeEndpoint({\n role: 'host',\n origin: frameOrigin,\n source: () => iframe.contentWindow,\n opaque: connection.type === 'opaque',\n context: () => ({ documentId, sessionId, token }),\n post: message => iframe.contentWindow?.postMessage(message, targetOrigin),\n diagnostic: (direction, type) => onDiagnostic?.({ direction, type }),\n invalidRequest: id => {\n if (pending.has(id)) return;\n if (pending.size >= MAX_PENDING)\n error(id, 'bridge_busy', 'Too many pending data requests.');\n else error(id, 'invalid_message', 'Invalid message route.');\n },\n handlers: {\n ready(message) {\n if (message.documentId !== documentId) {\n cancelAll();\n documentId = message.documentId;\n sessionId = randomUuid();\n }\n onStatusChange?.('connected');\n if (disposed) return;\n send('initialize', { state: hostState() });\n if (disposed) return;\n if (javascript !== undefined) send('scriptLoad', { javascript });\n },\n runtimeLog({ payload }) {\n try {\n logger?.[payload.method](...payload.args);\n } catch {\n // A host logger failure must not break bridge delivery.\n }\n },\n runtimeReady() {\n onStatusChange?.('ready');\n },\n runtimeError() {\n onStatusChange?.('failed');\n },\n request(message) {\n void request(message);\n },\n cancel(message) {\n pending.get(message.id)?.abort();\n pending.delete(message.id);\n },\n disconnect() {\n cancelAll();\n documentId = undefined;\n sessionId = undefined;\n onStatusChange?.('disconnected');\n },\n },\n });\n const send = endpoint.send;\n const receive = endpoint.receive;\n\n function error(\n id: string,\n code: string,\n message: string,\n requestId?: string\n ) {\n send('error', { id, code, message, requestId });\n }\n\n async function request(message: BridgeEventMessage<'request'>) {\n const id = message.id;\n if (pending.has(id)) return;\n if (pending.size >= MAX_PENDING)\n return error(id, 'bridge_busy', 'Too many pending data requests.');\n try {\n const body = JSON.stringify(message.payload);\n // PNG annotation captures have a separate validated 256 KiB image budget.\n const limit = message.route === 'annotation:draft' ? 384_000 : 16_384;\n if (\n message.payload !== undefined &&\n (typeof body !== 'string' || body.length > limit)\n )\n throw new Error('Invalid payload');\n } catch {\n return error(\n id,\n 'invalid_payload',\n 'The message payload is invalid or too large.'\n );\n }\n const controller = new AbortController();\n pending.set(id, controller);\n const timer = setTimeout(() => {\n if (pending.get(id) !== controller) return;\n pending.delete(id);\n controller.abort();\n error(id, 'timeout', 'The data request timed out.');\n }, REQUEST_TIMEOUT_MS);\n controller.signal.addEventListener('abort', () => clearTimeout(timer), {\n once: true,\n });\n try {\n const response = await onMessage(\n { route: message.route, payload: message.payload },\n { signal: controller.signal }\n );\n if (pending.get(id) === controller) send('result', { id, response });\n } catch (failure) {\n if (pending.get(id) === controller) {\n if (failure instanceof MessageRoutingError)\n error(id, failure.code, failure.message, failure.requestId);\n else\n error(\n id,\n 'request_failed',\n 'The message request failed. Retry the request.'\n );\n }\n } finally {\n clearTimeout(timer);\n if (pending.get(id) === controller) pending.delete(id);\n }\n }\n\n function publishState() {\n if (disposed || !sessionId) return;\n send('stateUpdate', { state: hostState() });\n }\n\n function load() {\n if (connection.type === 'opaque') token = randomUuid();\n cancelAll();\n documentId = undefined;\n sessionId = undefined;\n onStatusChange?.('connecting');\n send('connect', {});\n }\n\n function dispose() {\n disposed = true;\n endpoint.dispose();\n cancelAll();\n iframe.removeEventListener('load', load);\n host.removeEventListener('message', receive);\n host.removeEventListener('popstate', publishState);\n host.removeEventListener('pagehide', cancelAll);\n }\n\n setPresentation(presentation);\n iframe.addEventListener('load', load);\n host.addEventListener('message', receive);\n host.addEventListener('popstate', publishState);\n host.addEventListener('pagehide', cancelAll);\n // Reconnect an already-loaded iframe when its host bridge mounts again.\n onStatusChange?.('connecting');\n send('connect', {});\n\n return { dispose, setPresentation, setLogger };\n}\n",
6
+ "// The package build embeds the compiled classic script, never a runtime import.\ndeclare const DATA_APP_BOOTSTRAP: string;\n\nexport const PAGE_CSP =\n \"default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src data: blob:; connect-src 'none'; form-action 'none'; base-uri 'none'\";\nconst inlineBootstrap = DATA_APP_BOOTSTRAP.replace(\n /<\\/script/gi,\n match => `<\\\\${match.slice(1)}`\n);\n\nexport function runtimeHtml(parentOrigin: string) {\n const attribute = parentOrigin\n .replaceAll('&', '&amp;')\n .replaceAll('\"', '&quot;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll(\"'\", '&#39;');\n\n return `<!doctype html>\n<html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n <meta http-equiv=\"Content-Security-Policy\" content=\"${PAGE_CSP}\">\n </head>\n <body>\n <div id=\"root\"></div>\n <script data-parent-origin=\"${attribute}\">${inlineBootstrap}</script>\n </body>\n</html>\n`;\n}\n",
7
+ "import { randomUuid } from '@/src/core/uuid';\nimport { runtimeHtml } from '@/src/embed/runtime-html';\nimport { PARENT_PARAM } from '@/src/core/bridge';\nimport {\n attachDataAppConnection,\n type DataAppStatus,\n type DataAppHost,\n type DataAppHostOptions,\n} from '@/src/embed/host';\n\nexport type DataAppSource =\n | { type: 'url'; url: string }\n | {\n type: 'bundle';\n /** Omit to use the packaged, network-isolated data document. */\n bootstrapUrl?: string;\n javascript: string;\n };\nexport type DataAppSourceOptions = DataAppHostOptions & {\n source: DataAppSource;\n startupTimeoutMs?: number;\n};\n\n/** Owns loading and sandbox policy. Dispose before replacing the source or retrying. */\nexport function attachDataAppSource({\n iframe,\n source,\n presentation,\n logger,\n onMessage,\n onStatusChange,\n onDiagnostic,\n startupTimeoutMs = 30_000,\n}: DataAppSourceOptions): DataAppHost {\n const host = iframe.ownerDocument.defaultView;\n if (!host) throw new Error('The iframe requires a host window.');\n const url = new URL(\n source.type === 'url'\n ? source.url\n : (source.bootstrapUrl ??\n `data:text/html;charset=utf-8,${encodeURIComponent(runtimeHtml(host.location.origin))}`),\n host.location.href\n );\n if (\n !(source.type === 'bundle' && source.bootstrapUrl === undefined) &&\n !/^https?:$/.test(url.protocol)\n )\n throw new Error('Data apps require an HTTP(S) URL.');\n const opaque = source.type === 'bundle';\n if (!opaque && url.origin === host.location.origin)\n throw new Error('URL data apps require a separate origin from the host.');\n iframe.setAttribute(\n 'sandbox',\n opaque\n ? 'allow-scripts'\n : 'allow-scripts allow-same-origin allow-downloads allow-popups allow-popups-to-escape-sandbox'\n );\n iframe.referrerPolicy = 'no-referrer';\n if (!opaque) url.searchParams.set(PARENT_PARAM, host.location.origin);\n let timer: ReturnType<typeof setTimeout> | undefined;\n let failed = false;\n\n function status(value: DataAppStatus) {\n if (value === 'connecting') failed = false;\n if (failed && value !== 'connecting') return;\n clearTimeout(timer);\n if (value === 'connecting' || value === 'connected')\n timer = setTimeout(() => {\n failed = true;\n bridge.dispose();\n onStatusChange?.('failed');\n }, startupTimeoutMs);\n if (value === 'failed') {\n failed = true;\n bridge.dispose();\n }\n onStatusChange?.(value);\n }\n\n const bridge = attachDataAppConnection({\n iframe,\n connection: opaque\n ? { type: 'opaque', token: randomUuid() }\n : { type: 'origin', origin: url.origin },\n javascript: opaque ? source.javascript : undefined,\n presentation,\n logger,\n onMessage,\n onStatusChange: status,\n onDiagnostic,\n window: host,\n });\n\n function error() {\n return status('failed');\n }\n\n iframe.addEventListener('error', error);\n iframe.src = url.href;\n\n function dispose() {\n clearTimeout(timer);\n iframe.removeEventListener('error', error);\n bridge.dispose();\n }\n\n return {\n dispose,\n setPresentation: bridge.setPresentation,\n setLogger: bridge.setLogger,\n };\n}\n",
8
+ "import {\n attachDataAppConnection,\n type DataAppConnectionOptions,\n} from '@/src/embed/host';\nimport {\n attachDataAppSource,\n type DataAppSourceOptions,\n} from '@/src/embed/source';\n\nexport type DataAppBridgeOptions =\n | (DataAppSourceOptions & {\n connection?: never;\n window?: never;\n javascript?: never;\n })\n | (DataAppConnectionOptions & { source?: never; startupTimeoutMs?: never });\n\n/** Source mode configures and loads the iframe; connection mode attaches to a host-owned document. */\nexport function attachDataAppBridge(options: DataAppBridgeOptions) {\n return options.source\n ? attachDataAppSource(options)\n : attachDataAppConnection(options);\n}\n"
9
+ ],
10
+ "mappings": ";;;;;;;;;;;;;AAqDO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ,OAAO;AAAA,GACyB;AAAA,EACxC,MAAM,cAAc,WAAW,SAAS,WAAW,WAAW,SAAS;AAAA,EACvE,IACE,WAAW,SAAS,YACpB,IAAI,IAAI,WAAW,EAAE,WAAW;AAAA,IAEhC,MAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD,IAAI,WAAW,SAAS,YAAY,CAAC,QAAQ,WAAW,KAAK;AAAA,IAC3D,MAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C,IAAI,QAAQ,WAAW,SAAS,WAAW,WAAW,QAAQ;AAAA,EAC9D,MAAM,eAAe,WAAW,SAAS,WAAW,MAAM;AAAA,EAC1D,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI,WAAW;AAAA,EACf,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM,UAAU,IAAI;AAAA,EAEpB,SAAS,SAAS,GAAG;AAAA,IACnB,OAAO;AAAA,MACL,QAAQ,KAAK,SAAS;AAAA,MACtB,MAAM,KAAK,SAAS;AAAA,SAChB,sBAAsB,EAAE,cAAc,oBAAoB,IAAI,CAAC;AAAA,MACnE,SAAS,WAAW;AAAA,IACtB;AAAA;AAAA,EAGF,SAAS,SAAS,CAAC,OAAkC;AAAA,IACnD,IAAI,YAAY,UAAU;AAAA,MAAQ;AAAA,IAClC,MAAM,aAAa,WAAW;AAAA,IAC9B,SAAS;AAAA,IACT,IAAI,gBAAgB,WAAW;AAAA,MAAY,aAAa;AAAA;AAAA,EAG1D,SAAS,eAAe,CAAC,OAAwC;AAAA,IAC/D,IAAI;AAAA,MAAU;AAAA,IACd,MAAM,WAAW,KAAK,UAAU,KAAK;AAAA,IACrC,IAAI,aAAa;AAAA,MAAsB;AAAA,IACvC,uBAAuB;AAAA,IACvB,sBACE,aAAa,YACT,YACC,KAAK,MAAM,QAAQ;AAAA,IAC1B,aAAa;AAAA;AAAA,EAGf,SAAS,SAAS,GAAG;AAAA,IACnB,WAAW,cAAc,QAAQ,OAAO;AAAA,MAAG,WAAW,MAAM;AAAA,IAC5D,QAAQ,MAAM;AAAA;AAAA,EAGhB,MAAM,WAAW,qBAAqB;AAAA,IACpC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ,MAAM,OAAO;AAAA,IACrB,QAAQ,WAAW,SAAS;AAAA,IAC5B,SAAS,OAAO,EAAE,YAAY,WAAW,MAAM;AAAA,IAC/C,MAAM,aAAW,OAAO,eAAe,YAAY,SAAS,YAAY;AAAA,IACxE,YAAY,CAAC,WAAW,SAAS,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,IACnE,gBAAgB,QAAM;AAAA,MACpB,IAAI,QAAQ,IAAI,EAAE;AAAA,QAAG;AAAA,MACrB,IAAI,QAAQ,QAAQ;AAAA,QAClB,MAAM,IAAI,eAAe,iCAAiC;AAAA,MACvD;AAAA,cAAM,IAAI,mBAAmB,wBAAwB;AAAA;AAAA,IAE5D,UAAU;AAAA,MACR,KAAK,CAAC,SAAS;AAAA,QACb,IAAI,QAAQ,eAAe,YAAY;AAAA,UACrC,UAAU;AAAA,UACV,aAAa,QAAQ;AAAA,UACrB,YAAY,WAAW;AAAA,QACzB;AAAA,QACA,iBAAiB,WAAW;AAAA,QAC5B,IAAI;AAAA,UAAU;AAAA,QACd,KAAK,cAAc,EAAE,OAAO,UAAU,EAAE,CAAC;AAAA,QACzC,IAAI;AAAA,UAAU;AAAA,QACd,IAAI,eAAe;AAAA,UAAW,KAAK,cAAc,EAAE,WAAW,CAAC;AAAA;AAAA,MAEjE,UAAU,GAAG,WAAW;AAAA,QACtB,IAAI;AAAA,UACF,SAAS,QAAQ,QAAQ,GAAG,QAAQ,IAAI;AAAA,UACxC,MAAM;AAAA;AAAA,MAIV,YAAY,GAAG;AAAA,QACb,iBAAiB,OAAO;AAAA;AAAA,MAE1B,YAAY,GAAG;AAAA,QACb,iBAAiB,QAAQ;AAAA;AAAA,MAE3B,OAAO,CAAC,SAAS;AAAA,QACV,QAAQ,OAAO;AAAA;AAAA,MAEtB,MAAM,CAAC,SAAS;AAAA,QACd,QAAQ,IAAI,QAAQ,EAAE,GAAG,MAAM;AAAA,QAC/B,QAAQ,OAAO,QAAQ,EAAE;AAAA;AAAA,MAE3B,UAAU,GAAG;AAAA,QACX,UAAU;AAAA,QACV,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,iBAAiB,cAAc;AAAA;AAAA,IAEnC;AAAA,EACF,CAAC;AAAA,EACD,MAAM,OAAO,SAAS;AAAA,EACtB,MAAM,UAAU,SAAS;AAAA,EAEzB,SAAS,KAAK,CACZ,IACA,MACA,SACA,WACA;AAAA,IACA,KAAK,SAAS,EAAE,IAAI,MAAM,SAAS,UAAU,CAAC;AAAA;AAAA,EAGhD,eAAe,OAAO,CAAC,SAAwC;AAAA,IAC7D,MAAM,KAAK,QAAQ;AAAA,IACnB,IAAI,QAAQ,IAAI,EAAE;AAAA,MAAG;AAAA,IACrB,IAAI,QAAQ,QAAQ;AAAA,MAClB,OAAO,MAAM,IAAI,eAAe,iCAAiC;AAAA,IACnE,IAAI;AAAA,MACF,MAAM,OAAO,KAAK,UAAU,QAAQ,OAAO;AAAA,MAE3C,MAAM,QAAQ,QAAQ,UAAU,qBAAqB,SAAU;AAAA,MAC/D,IACE,QAAQ,YAAY,cACnB,OAAO,SAAS,YAAY,KAAK,SAAS;AAAA,QAE3C,MAAM,IAAI,MAAM,iBAAiB;AAAA,MACnC,MAAM;AAAA,MACN,OAAO,MACL,IACA,mBACA,8CACF;AAAA;AAAA,IAEF,MAAM,aAAa,IAAI;AAAA,IACvB,QAAQ,IAAI,IAAI,UAAU;AAAA,IAC1B,MAAM,QAAQ,WAAW,MAAM;AAAA,MAC7B,IAAI,QAAQ,IAAI,EAAE,MAAM;AAAA,QAAY;AAAA,MACpC,QAAQ,OAAO,EAAE;AAAA,MACjB,WAAW,MAAM;AAAA,MACjB,MAAM,IAAI,WAAW,6BAA6B;AAAA,OACjD,kBAAkB;AAAA,IACrB,WAAW,OAAO,iBAAiB,SAAS,MAAM,aAAa,KAAK,GAAG;AAAA,MACrE,MAAM;AAAA,IACR,CAAC;AAAA,IACD,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,UACrB,EAAE,OAAO,QAAQ,OAAO,SAAS,QAAQ,QAAQ,GACjD,EAAE,QAAQ,WAAW,OAAO,CAC9B;AAAA,MACA,IAAI,QAAQ,IAAI,EAAE,MAAM;AAAA,QAAY,KAAK,UAAU,EAAE,IAAI,SAAS,CAAC;AAAA,MACnE,OAAO,SAAS;AAAA,MAChB,IAAI,QAAQ,IAAI,EAAE,MAAM,YAAY;AAAA,QAClC,IAAI,mBAAmB;AAAA,UACrB,MAAM,IAAI,QAAQ,MAAM,QAAQ,SAAS,QAAQ,SAAS;AAAA,QAE1D;AAAA,gBACE,IACA,kBACA,gDACF;AAAA,MACJ;AAAA,cACA;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,IAAI,QAAQ,IAAI,EAAE,MAAM;AAAA,QAAY,QAAQ,OAAO,EAAE;AAAA;AAAA;AAAA,EAIzD,SAAS,YAAY,GAAG;AAAA,IACtB,IAAI,YAAY,CAAC;AAAA,MAAW;AAAA,IAC5B,KAAK,eAAe,EAAE,OAAO,UAAU,EAAE,CAAC;AAAA;AAAA,EAG5C,SAAS,IAAI,GAAG;AAAA,IACd,IAAI,WAAW,SAAS;AAAA,MAAU,QAAQ,WAAW;AAAA,IACrD,UAAU;AAAA,IACV,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,iBAAiB,YAAY;AAAA,IAC7B,KAAK,WAAW,CAAC,CAAC;AAAA;AAAA,EAGpB,SAAS,OAAO,GAAG;AAAA,IACjB,WAAW;AAAA,IACX,SAAS,QAAQ;AAAA,IACjB,UAAU;AAAA,IACV,OAAO,oBAAoB,QAAQ,IAAI;AAAA,IACvC,KAAK,oBAAoB,WAAW,OAAO;AAAA,IAC3C,KAAK,oBAAoB,YAAY,YAAY;AAAA,IACjD,KAAK,oBAAoB,YAAY,SAAS;AAAA;AAAA,EAGhD,gBAAgB,YAAY;AAAA,EAC5B,OAAO,iBAAiB,QAAQ,IAAI;AAAA,EACpC,KAAK,iBAAiB,WAAW,OAAO;AAAA,EACxC,KAAK,iBAAiB,YAAY,YAAY;AAAA,EAC9C,KAAK,iBAAiB,YAAY,SAAS;AAAA,EAE3C,iBAAiB,YAAY;AAAA,EAC7B,KAAK,WAAW,CAAC,CAAC;AAAA,EAElB,OAAO,EAAE,SAAS,iBAAiB,UAAU;AAAA;;;AC1QxC,IAAM,WACX;AACF,IAAM,kBAAkB,y1YAAmB,QACzC,eACA,WAAS,MAAM,MAAM,MAAM,CAAC,GAC9B;AAEO,SAAS,WAAW,CAAC,cAAsB;AAAA,EAChD,MAAM,YAAY,aACf,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,QAAQ,EACxB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,OAAO;AAAA,EAE1B,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,0DAKiD;AAAA;AAAA;AAAA;AAAA,kCAIxB,cAAc;AAAA;AAAA;AAAA;AAAA;;;ACHzC,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,GACiB;AAAA,EACpC,MAAM,OAAO,OAAO,cAAc;AAAA,EAClC,IAAI,CAAC;AAAA,IAAM,MAAM,IAAI,MAAM,oCAAoC;AAAA,EAC/D,MAAM,MAAM,IAAI,IACd,OAAO,SAAS,QACZ,OAAO,MACN,OAAO,gBACN,gCAAgC,mBAAmB,YAAY,KAAK,SAAS,MAAM,CAAC,KAC1F,KAAK,SAAS,IAChB;AAAA,EACA,IACE,EAAE,OAAO,SAAS,YAAY,OAAO,iBAAiB,cACtD,CAAC,YAAY,KAAK,IAAI,QAAQ;AAAA,IAE9B,MAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD,MAAM,SAAS,OAAO,SAAS;AAAA,EAC/B,IAAI,CAAC,UAAU,IAAI,WAAW,KAAK,SAAS;AAAA,IAC1C,MAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E,OAAO,aACL,WACA,SACI,kBACA,6FACN;AAAA,EACA,OAAO,iBAAiB;AAAA,EACxB,IAAI,CAAC;AAAA,IAAQ,IAAI,aAAa,IAAI,cAAc,KAAK,SAAS,MAAM;AAAA,EACpE,IAAI;AAAA,EACJ,IAAI,SAAS;AAAA,EAEb,SAAS,MAAM,CAAC,OAAsB;AAAA,IACpC,IAAI,UAAU;AAAA,MAAc,SAAS;AAAA,IACrC,IAAI,UAAU,UAAU;AAAA,MAAc;AAAA,IACtC,aAAa,KAAK;AAAA,IAClB,IAAI,UAAU,gBAAgB,UAAU;AAAA,MACtC,QAAQ,WAAW,MAAM;AAAA,QACvB,SAAS;AAAA,QACT,OAAO,QAAQ;AAAA,QACf,iBAAiB,QAAQ;AAAA,SACxB,gBAAgB;AAAA,IACrB,IAAI,UAAU,UAAU;AAAA,MACtB,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,IACjB;AAAA,IACA,iBAAiB,KAAK;AAAA;AAAA,EAGxB,MAAM,SAAS,wBAAwB;AAAA,IACrC;AAAA,IACA,YAAY,SACR,EAAE,MAAM,UAAU,OAAO,WAAW,EAAE,IACtC,EAAE,MAAM,UAAU,QAAQ,IAAI,OAAO;AAAA,IACzC,YAAY,SAAS,OAAO,aAAa;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AAAA,EAED,SAAS,KAAK,GAAG;AAAA,IACf,OAAO,OAAO,QAAQ;AAAA;AAAA,EAGxB,OAAO,iBAAiB,SAAS,KAAK;AAAA,EACtC,OAAO,MAAM,IAAI;AAAA,EAEjB,SAAS,OAAO,GAAG;AAAA,IACjB,aAAa,KAAK;AAAA,IAClB,OAAO,oBAAoB,SAAS,KAAK;AAAA,IACzC,OAAO,QAAQ;AAAA;AAAA,EAGjB,OAAO;AAAA,IACL;AAAA,IACA,iBAAiB,OAAO;AAAA,IACxB,WAAW,OAAO;AAAA,EACpB;AAAA;;;AC5FK,SAAS,oBAAmB,CAAC,SAA+B;AAAA,EACjE,OAAO,QAAQ,SACX,oBAAoB,OAAO,IAC3B,wBAAwB,OAAO;AAAA;",
11
+ "debugId": "3328034B0990289B64756E2164756E21",
12
+ "names": []
13
+ }
@@ -2,20 +2,21 @@ import {
2
2
  createMessageClient2,
3
3
  localFrameBridge,
4
4
  getDataAppTransport2
5
- } from "./contract-13j5zb3c.js";
5
+ } from "./index-ktmvs916.js";
6
6
  import {
7
7
  PARENT_PARAM
8
- } from "./contract-awa2d5b1.js";
8
+ } from "./index-f5cnbrjz.js";
9
9
  import {
10
10
  annotationDraftRoute2,
11
11
  annotationEditorStateRoute2,
12
+ annotationSendRoute2,
12
13
  annotationUpdateRoute2,
13
14
  annotationModeRoute2
14
- } from "./contract-rfbakka4.js";
15
+ } from "./index-ag0cgnvq.js";
15
16
  import {
16
17
  validLocation,
17
18
  navigationUpdateRoute2
18
- } from "./contract-tf8c3qpv.js";
19
+ } from "./index-qd5xgx6y.js";
19
20
 
20
21
  // src/client/location.ts
21
22
  function createAppLocation(frame, virtual, publish) {
@@ -193,9 +194,13 @@ function createAnnotationClient2(transport) {
193
194
  "annotation:draft": annotationDraftRoute2,
194
195
  "annotation:update": annotationUpdateRoute2,
195
196
  "annotation:mode": annotationModeRoute2,
196
- "annotation:editor": annotationEditorStateRoute2
197
+ "annotation:editor": annotationEditorStateRoute2,
198
+ "annotation:send": annotationSendRoute2
197
199
  }, transport);
198
200
  return {
201
+ requestSendAnnotations(options) {
202
+ return client.request("annotation:send", null, options);
203
+ },
199
204
  reportAnnotationEditorState(state, options) {
200
205
  return client.request("annotation:editor", state, options);
201
206
  },
@@ -213,4 +218,4 @@ function createAnnotationClient2(transport) {
213
218
 
214
219
  export { createDataAppNavigation2, getDataAppNavigation2, createAnnotationClient2 };
215
220
 
216
- //# debugId=19B0E7BB9C5C8F2564756E2164756E21
221
+ //# debugId=CF3ECA50C8D7861964756E2164756E21
@@ -4,9 +4,9 @@
4
4
  "sourcesContent": [
5
5
  "import { PARENT_PARAM } from '@/src/core/bridge';\nimport { validLocation } from '@/src/core/navigation';\n\nimport type { AppLocation, HistoryMode } from '@/src/core/navigation';\nexport type { AppLocation } from '@/src/core/navigation';\nexport type DataAppLocation = {\n snapshot(): AppLocation;\n subscribe(listener: () => void): () => void;\n update(location: AppLocation, mode?: HistoryMode): void;\n};\n\n/** Opaque sandboxes keep app state in memory; URL frames retain their real URL for HMR. */\nexport function createAppLocation(\n frame: Window,\n virtual: boolean,\n publish: (location: AppLocation, mode: HistoryMode) => void\n) {\n let state: AppLocation = { search: '', hash: '' };\n let disposed = false;\n const listeners = new Set<() => void>();\n\n function notify() {\n for (const listener of listeners) listener();\n }\n\n function snapshot(): AppLocation {\n if (virtual) return state;\n const url = new URL(frame.location.href);\n url.searchParams.delete(PARENT_PARAM);\n if (state.search !== url.search || state.hash !== url.hash)\n state = { search: url.search, hash: url.hash };\n\n return state;\n }\n\n function apply(next: AppLocation) {\n const previous = snapshot();\n if (previous.search === next.search && previous.hash === next.hash) return;\n if (virtual) state = next;\n else {\n const url = new URL(frame.location.href);\n const parent = url.searchParams.get(PARENT_PARAM);\n url.search = next.search;\n if (parent) url.searchParams.set(PARENT_PARAM, parent);\n url.hash = next.hash;\n frame.history.replaceState(null, '', url);\n frame.dispatchEvent(new Event('popstate'));\n }\n if (virtual) notify();\n }\n\n const location: DataAppLocation = {\n snapshot,\n subscribe(listener) {\n listeners.add(listener);\n if (!virtual) frame.addEventListener('popstate', listener);\n\n return () => {\n listeners.delete(listener);\n frame.removeEventListener('popstate', listener);\n };\n },\n update(next, mode = 'replace') {\n if (disposed) return;\n if (!validLocation(next)) throw new Error('Invalid app location.');\n const before = snapshot();\n if (before.search === next.search && before.hash === next.hash) return;\n apply(next);\n publish(next, mode);\n },\n };\n\n function dispose() {\n disposed = true;\n for (const listener of listeners)\n frame.removeEventListener('popstate', listener);\n listeners.clear();\n }\n\n return { location, apply, dispose };\n}\n",
6
6
  "import type { AppLocation, HistoryMode } from '@/src/core/navigation';\nimport { createAppLocation, type DataAppLocation } from '@/src/client/location';\nimport { validLocation } from '@/src/core/navigation';\nimport {\n navigationUpdateRoute,\n type NavigationUpdate,\n} from '@/src/core/messages';\nimport { createMessageClient } from '@/src/client/messages';\nimport {\n getDataAppTransport,\n localFrameBridge,\n type IframeTransport,\n} from '@/src/client/iframe';\n\nexport type DataAppNavigation = DataAppLocation & {\n /** Publish URL changes made outside the adapter, including the document title. */\n publish(mode?: HistoryMode): void;\n dispose(): void;\n};\n\n/** Attach app URL behavior to an already authenticated bridge. */\nexport function createDataAppNavigation({\n bridge,\n window: frame = window,\n}: {\n bridge: IframeTransport;\n window?: Window;\n}): DataAppNavigation {\n return attachNavigation(frame, bridge.mode === 'bundle', bridge).navigation;\n}\n\nfunction attachNavigation(\n frame: Window,\n virtual: boolean,\n connection: IframeTransport | Promise<IframeTransport>\n) {\n let disposed = false;\n let unsubscribe: (() => void) | undefined;\n let send: ((update: NavigationUpdate) => void) | undefined;\n let pendingUpdate: NavigationUpdate | undefined;\n const { location, apply, dispose } = createAppLocation(\n frame,\n virtual,\n publish\n );\n\n function publish(location: AppLocation, mode: HistoryMode) {\n const update = { ...location, mode, title: frame.document.title };\n if (send) send(update);\n else pendingUpdate = update;\n }\n\n function attach(bridge: IframeTransport) {\n if (disposed) return;\n unsubscribe?.();\n const messages = createMessageClient(\n { 'navigation:update': navigationUpdateRoute },\n bridge.request\n );\n\n function sendUpdate(update: NavigationUpdate) {\n void messages.request('navigation:update', update).catch(() => {});\n }\n\n function receiveState(state: unknown) {\n if (!validLocation(state)) return;\n pendingUpdate = undefined;\n apply(state);\n }\n\n send = sendUpdate;\n unsubscribe = bridge.subscribe(receiveState);\n receiveState(bridge.snapshot());\n if (pendingUpdate) {\n sendUpdate(pendingUpdate);\n pendingUpdate = undefined;\n }\n }\n\n if ('then' in connection) void connection.then(attach).catch(() => {});\n else attach(connection);\n\n const navigation: DataAppNavigation = {\n ...location,\n publish(mode = 'replace') {\n if (!disposed) publish(location.snapshot(), mode);\n },\n dispose() {\n disposed = true;\n unsubscribe?.();\n dispose();\n send = undefined;\n pendingUpdate = undefined;\n },\n };\n\n return {\n navigation,\n attach,\n isDisposed() {\n return disposed;\n },\n };\n}\n\nconst navigationKey = Symbol.for('altertable.appNavigation');\ntype NavigationWindow = Window & {\n [navigationKey]?: ReturnType<typeof attachNavigation> & {\n bridge?: IframeTransport;\n };\n};\n\n/** URL controls attach navigation on demand; bootstrap and data-only clients do not. */\nexport function getDataAppNavigation(\n frame: Window = window\n): DataAppNavigation | undefined {\n const target = frame as NavigationWindow;\n const bridge = getDataAppTransport(frame);\n const cached = target[navigationKey]?.isDisposed()\n ? undefined\n : target[navigationKey];\n if (cached) {\n if (bridge && cached.bridge !== bridge) {\n cached.attach(bridge);\n cached.bridge = bridge;\n }\n\n return cached.navigation;\n }\n if (bridge) {\n const adapter = attachNavigation(frame, bridge.mode === 'bundle', bridge);\n target[navigationKey] = { bridge, ...adapter };\n\n return adapter.navigation;\n }\n const preview = localFrameBridge(frame);\n if (!preview?.connect) return undefined;\n const connection = preview.connect();\n const adapter = attachNavigation(frame, false, connection);\n const entry = {\n ...adapter,\n bridge: undefined as IframeTransport | undefined,\n };\n target[navigationKey] = entry;\n void connection\n .then(bridge => {\n entry.bridge = bridge;\n })\n .catch(() => {});\n\n return adapter.navigation;\n}\n",
7
- "import {\n annotationDraftRoute,\n annotationUpdateRoute,\n annotationModeRoute,\n annotationEditorStateRoute,\n type DataAppAnnotationDraft,\n} from '@/src/core/annotations';\nimport type { MessageTransport } from '@/src/core/messages';\nimport { createMessageClient } from '@/src/client/messages';\n\n/** Deliver annotations to the authenticated host. Acknowledgement means retained, not sent to an agent. */\nexport function createAnnotationClient(transport: MessageTransport) {\n const client = createMessageClient(\n {\n 'annotation:draft': annotationDraftRoute,\n 'annotation:update': annotationUpdateRoute,\n 'annotation:mode': annotationModeRoute,\n 'annotation:editor': annotationEditorStateRoute,\n },\n transport\n );\n return {\n /** Report the iframe editor's status so the host can guard batch submission. */\n reportAnnotationEditorState(\n state: { hasUnsavedChanges: boolean },\n options?: { signal?: AbortSignal }\n ) {\n return client.request('annotation:editor', state, options);\n },\n addAnnotation(\n draft: DataAppAnnotationDraft,\n options?: { signal?: AbortSignal }\n ) {\n return client.request('annotation:draft', draft, options);\n },\n updateAnnotation(\n id: string,\n comment: string,\n options?: { signal?: AbortSignal }\n ) {\n return client.request('annotation:update', { id, comment }, options);\n },\n /** Ask the host to change its controlled annotation mode. */\n requestAnnotationModeChange(\n request: { active: boolean },\n options?: { signal?: AbortSignal }\n ) {\n return client.request('annotation:mode', request, options);\n },\n };\n}\n"
7
+ "import {\n annotationDraftRoute,\n annotationUpdateRoute,\n annotationModeRoute,\n annotationEditorStateRoute,\n annotationSendRoute,\n type DataAppAnnotationDraft,\n} from '@/src/core/annotations';\nimport type { MessageTransport } from '@/src/core/messages';\nimport { createMessageClient } from '@/src/client/messages';\n\n/** Deliver annotations to the authenticated host. Acknowledgement means retained, not sent to an agent. */\nexport function createAnnotationClient(transport: MessageTransport) {\n const client = createMessageClient(\n {\n 'annotation:draft': annotationDraftRoute,\n 'annotation:update': annotationUpdateRoute,\n 'annotation:mode': annotationModeRoute,\n 'annotation:editor': annotationEditorStateRoute,\n 'annotation:send': annotationSendRoute,\n },\n transport\n );\n return {\n /** Ask the host to submit its saved annotations using its existing send guards. */\n requestSendAnnotations(options?: { signal?: AbortSignal }) {\n return client.request('annotation:send', null, options);\n },\n /** Report the iframe editor's status so the host can guard batch submission. */\n reportAnnotationEditorState(\n state: { hasUnsavedChanges: boolean },\n options?: { signal?: AbortSignal }\n ) {\n return client.request('annotation:editor', state, options);\n },\n addAnnotation(\n draft: DataAppAnnotationDraft,\n options?: { signal?: AbortSignal }\n ) {\n return client.request('annotation:draft', draft, options);\n },\n updateAnnotation(\n id: string,\n comment: string,\n options?: { signal?: AbortSignal }\n ) {\n return client.request('annotation:update', { id, comment }, options);\n },\n /** Ask the host to change its controlled annotation mode. */\n requestAnnotationModeChange(\n request: { active: boolean },\n options?: { signal?: AbortSignal }\n ) {\n return client.request('annotation:mode', request, options);\n },\n };\n}\n"
8
8
  ],
9
- "mappings": "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",
10
- "debugId": "19B0E7BB9C5C8F2564756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "CF3ECA50C8D7861964756E2164756E21",
11
11
  "names": []
12
12
  }
@@ -1,3 +1,20 @@
1
+ // src/core/uuid.ts
2
+ function randomUuid() {
3
+ if (typeof crypto.randomUUID === "function")
4
+ return crypto.randomUUID();
5
+ const bytes = crypto.getRandomValues(new Uint8Array(16));
6
+ bytes[6] = bytes[6] & 15 | 64;
7
+ bytes[8] = bytes[8] & 63 | 128;
8
+ const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0"));
9
+ return [
10
+ hex.slice(0, 4),
11
+ hex.slice(4, 6),
12
+ hex.slice(6, 8),
13
+ hex.slice(8, 10),
14
+ hex.slice(10)
15
+ ].map((part) => part.join("")).join("-");
16
+ }
17
+
1
18
  // src/core/logger.ts
2
19
  function isLogEntry(value) {
3
20
  if (!value || typeof value !== "object")
@@ -267,6 +284,6 @@ function createBridgeEndpoint({
267
284
  };
268
285
  }
269
286
 
270
- export { PARENT_PARAM, MAX_PENDING, REQUEST_TIMEOUT_MS, validId, createBridgeEndpoint };
287
+ export { randomUuid, PARENT_PARAM, MAX_PENDING, REQUEST_TIMEOUT_MS, validId, createBridgeEndpoint };
271
288
 
272
- //# debugId=856B2CD0C55C1CE964756E2164756E21
289
+ //# debugId=41803C2603D3735864756E2164756E21
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/core/logger.ts", "../src/core/bridge.ts", "../src/core/bridge-endpoint.ts"],
3
+ "sources": ["../src/core/uuid.ts", "../src/core/logger.ts", "../src/core/bridge.ts", "../src/core/bridge-endpoint.ts"],
4
4
  "sourcesContent": [
5
+ "/** Opaque documents can lack randomUUID even when cryptographic randomness is available. */\nexport function randomUuid(): string {\n if (typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n bytes[6] = (bytes[6]! & 15) | 64;\n bytes[8] = (bytes[8]! & 63) | 128;\n const hex = Array.from(bytes, byte => byte.toString(16).padStart(2, '0'));\n return [\n hex.slice(0, 4),\n hex.slice(4, 6),\n hex.slice(6, 8),\n hex.slice(8, 10),\n hex.slice(10),\n ]\n .map(part => part.join(''))\n .join('-');\n}\n",
5
6
  "/** Host-owned log sink; compatible with console and frontend createLogger(). */\nexport type DataAppLogger = {\n log: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n};\n\nexport type LogEntry = {\n method: keyof DataAppLogger;\n args: unknown[];\n};\n\nexport function isLogEntry(value: unknown): value is LogEntry {\n if (!value || typeof value !== 'object') return false;\n const entry = value as Record<string, unknown>;\n return (\n (entry.method === 'log' ||\n entry.method === 'info' ||\n entry.method === 'warn' ||\n entry.method === 'error') &&\n Array.isArray(entry.args) &&\n entry.args.length <= 128\n );\n}\n",
6
7
  "import { isLogEntry } from '@/src/core/logger';\n\n/** Data app delivery protocol. IDs identify a document, a shell session, and an individual call. */\nexport const BRIDGE = 'altertable:data-app';\nexport const PARENT_PARAM = '__altertable_parent';\n/** Bound pending requests in the client and host independently.\n * The host enforces its own limit because frames can send messages directly. */\nexport const MAX_PENDING = 128;\nexport const REQUEST_TIMEOUT_MS = 60_000;\nexport type { TransportResponse } from '@/src/core/operation-types';\n\nexport function validId(value: unknown): value is string {\n return typeof value === 'string' && /^[a-zA-Z0-9_-]{1,128}$/.test(value);\n}\n\ntype Fields = Record<string, unknown>;\nexport type BridgeRole = 'host' | 'app';\ntype SessionRule = 'none' | 'establish' | 'current';\n\nfunction event<\n const Wire extends string,\n const Role extends BridgeRole,\n const Session extends SessionRule,\n Payload,\n>({\n wire,\n from,\n session,\n parse,\n}: {\n wire: Wire;\n from: Role;\n session: Session;\n parse: (fields: Fields) => Payload;\n}) {\n return { wire, from, session, parse };\n}\n\nfunction id(fields: Fields) {\n if (!validId(fields.id)) throw new Error('Invalid request ID.');\n return fields.id;\n}\n\nfunction string(fields: Fields, key: string) {\n const value = fields[key];\n if (typeof value !== 'string') throw new Error(`Invalid ${key}.`);\n return value;\n}\n\nfunction empty() {\n return {};\n}\n\n/** Parsers project known fields; opaque values are validated by their owning route or adapter. */\nexport const bridgeProtocol = {\n channel: BRIDGE,\n version: 1,\n events: {\n connect: event({\n wire: 'bridge:connect',\n from: 'host',\n session: 'none',\n parse: empty,\n }),\n ready: event({\n wire: 'bridge:ready',\n from: 'app',\n session: 'none',\n parse: empty,\n }),\n initialize: event({\n wire: 'bridge:initialize',\n from: 'host',\n session: 'establish',\n parse: fields => ({ state: fields.state }),\n }),\n request: event({\n wire: 'bridge:request',\n from: 'app',\n session: 'current',\n parse: fields => {\n const route = string(fields, 'route');\n if (!route || route.length > 256)\n throw new Error('Invalid message route.');\n return { id: id(fields), route, payload: fields.payload };\n },\n }),\n result: event({\n wire: 'bridge:result',\n from: 'host',\n session: 'current',\n parse: fields => {\n if (!Object.hasOwn(fields, 'response'))\n throw new Error('Missing response.');\n return { id: id(fields), response: fields.response };\n },\n }),\n error: event({\n wire: 'bridge:error',\n from: 'host',\n session: 'current',\n parse: fields => {\n if (\n fields.requestId !== undefined &&\n typeof fields.requestId !== 'string'\n )\n throw new Error('Invalid requestId.');\n return {\n id: id(fields),\n code: string(fields, 'code'),\n message: string(fields, 'message'),\n ...(fields.requestId === undefined\n ? {}\n : { requestId: fields.requestId }),\n };\n },\n }),\n cancel: event({\n wire: 'bridge:cancel',\n from: 'app',\n session: 'current',\n parse: fields => ({ id: id(fields) }),\n }),\n disconnect: event({\n wire: 'bridge:disconnect',\n from: 'app',\n session: 'current',\n parse: empty,\n }),\n scriptLoad: event({\n wire: 'script:load',\n from: 'host',\n session: 'current',\n parse: fields => ({ javascript: string(fields, 'javascript') }),\n }),\n stateUpdate: event({\n wire: 'state:update',\n from: 'host',\n session: 'current',\n parse: fields => ({ state: fields.state }),\n }),\n runtimeLog: event({\n wire: 'runtime:log',\n from: 'app',\n session: 'current',\n parse: fields => {\n if (!isLogEntry(fields.payload)) throw new Error('Invalid log entry.');\n return { payload: fields.payload };\n },\n }),\n runtimeReady: event({\n wire: 'runtime:ready',\n from: 'app',\n session: 'current',\n parse: empty,\n }),\n runtimeError: event({\n wire: 'runtime:error',\n from: 'app',\n session: 'current',\n parse: empty,\n }),\n },\n} as const;\n\ntype Events = typeof bridgeProtocol.events;\nexport type BridgeEventName = keyof Events;\nexport type BridgePayload<Name extends BridgeEventName> = ReturnType<\n Events[Name]['parse']\n>;\nexport type BridgeEnvelope = {\n channel: typeof BRIDGE;\n version: typeof bridgeProtocol.version;\n documentId: string;\n sessionId?: string;\n token?: string;\n};\nexport type BridgeEventMessage<Name extends BridgeEventName> =\n Name extends BridgeEventName\n ? BridgeEnvelope & {\n type: Events[Name]['wire'];\n } & (Events[Name]['session'] extends 'none'\n ? {}\n : { sessionId: string }) &\n BridgePayload<Name>\n : never;\nexport type BridgeMessage = {\n [Name in BridgeEventName]: BridgeEventMessage<Name>;\n}[BridgeEventName];\nexport type BridgeEventsFrom<Role extends BridgeRole> = {\n [Name in BridgeEventName]: Events[Name]['from'] extends Role ? Name : never;\n}[BridgeEventName];\nexport type BridgeHandlers<Role extends BridgeRole> = {\n [Name in BridgeEventsFrom<Role extends 'host' ? 'app' : 'host'>]: (\n message: BridgeEventMessage<Name>\n ) => void;\n};\n\nconst byWire = new Map<string, BridgeEventName>();\nfor (const name of Object.keys(bridgeProtocol.events) as BridgeEventName[]) {\n const wire = bridgeProtocol.events[name].wire;\n if (byWire.has(wire)) throw new Error(`Duplicate bridge event: ${wire}`);\n byWire.set(wire, name);\n}\n\nexport function bridgeEventName(wire: string) {\n return byWire.get(wire);\n}\n\n/** Envelope parsing precedes authentication; event-specific fields remain untrusted. */\nexport function parseBridgeEnvelope(\n value: unknown\n): (BridgeEnvelope & Fields & { type: string }) | undefined {\n if (!value || typeof value !== 'object') return;\n const fields = value as Fields;\n if (\n fields.channel !== BRIDGE ||\n fields.version !== bridgeProtocol.version ||\n typeof fields.type !== 'string' ||\n typeof fields.documentId !== 'string' ||\n !fields.documentId ||\n fields.documentId.length > 128 ||\n (fields.sessionId !== undefined && !validId(fields.sessionId)) ||\n (fields.token !== undefined && typeof fields.token !== 'string')\n )\n return;\n return fields as BridgeEnvelope & Fields & { type: string };\n}\n\n/** Project event fields after the caller has checked envelope eligibility. */\nexport function parseBridgePayload(\n envelope: NonNullable<ReturnType<typeof parseBridgeEnvelope>>,\n definition: Events[BridgeEventName]\n): BridgeMessage | undefined {\n try {\n return {\n channel: BRIDGE,\n version: bridgeProtocol.version,\n documentId: envelope.documentId,\n ...(envelope.sessionId === undefined\n ? {}\n : { sessionId: envelope.sessionId }),\n ...(envelope.token === undefined ? {} : { token: envelope.token }),\n type: definition.wire,\n ...definition.parse(envelope),\n } as BridgeMessage;\n } catch {\n return;\n }\n}\n\nexport function parseBridgeMessage(value: unknown): BridgeMessage | undefined {\n const envelope = parseBridgeEnvelope(value);\n if (!envelope) return;\n const name = bridgeEventName(envelope.type);\n if (!name) return;\n const definition = bridgeProtocol.events[name];\n if (definition.session !== 'none' && envelope.sessionId === undefined) return;\n return parseBridgePayload(envelope, definition);\n}\n",
7
8
  "import {\n bridgeProtocol,\n bridgeEventName,\n parseBridgeEnvelope,\n parseBridgeMessage,\n parseBridgePayload,\n validId,\n type BridgeMessage,\n type BridgeRole,\n type BridgeEventsFrom,\n type BridgePayload,\n type BridgeEnvelope,\n type BridgeHandlers,\n} from '@/src/core/bridge';\n\ntype ConnectionContext = Pick<BridgeEnvelope, 'sessionId' | 'token'> & {\n documentId?: string;\n};\n\n/** The connection owns IDs and token rotation; callers can only supply event payloads. */\nexport function createBridgeEndpoint<const Role extends BridgeRole>({\n role,\n origin,\n source,\n opaque,\n context,\n post,\n diagnostic,\n invalidRequest,\n handlers,\n}: {\n role: Role;\n handlers: BridgeHandlers<NoInfer<Role>>;\n origin: string;\n source: () => MessageEventSource | null;\n opaque: boolean;\n context: () => ConnectionContext;\n post: (message: BridgeMessage) => void;\n diagnostic?: (\n direction: 'send' | 'receive',\n type: BridgeMessage['type']\n ) => void;\n invalidRequest?: (id: string) => void;\n}) {\n let disposed = false;\n\n function send<\n Name extends BridgeEventsFrom<Role>,\n const Payload extends BridgePayload<NoInfer<Name>>,\n >(\n name: Name,\n payload: Payload &\n Record<Exclude<keyof Payload, keyof BridgePayload<NoInfer<Name>>>, never>\n ) {\n if (disposed) throw new Error('The bridge endpoint has closed.');\n const definition = bridgeProtocol.events[name];\n const current = context();\n const message = parseBridgeMessage({\n ...payload,\n channel: bridgeProtocol.channel,\n version: bridgeProtocol.version,\n type: definition.wire,\n documentId: name === 'connect' ? 'host' : current.documentId,\n sessionId: current.sessionId,\n token: opaque ? current.token : undefined,\n });\n if (!message || (opaque && !validId(current.token)))\n throw new Error('The bridge is not ready to send this event.');\n diagnostic?.('send', definition.wire);\n if (disposed) return;\n post(message);\n }\n\n function receive(event: MessageEvent) {\n const peer = source();\n if (disposed || !peer || event.origin !== origin || event.source !== peer)\n return;\n const envelope = parseBridgeEnvelope(event.data);\n if (!envelope) return;\n const current = context();\n // The app learns its opaque token from a trusted host connect message.\n const connecting =\n role === 'app' && envelope.type === bridgeProtocol.events.connect.wire;\n if (\n opaque &&\n (connecting\n ? !validId(envelope.token)\n : !current.token || envelope.token !== current.token)\n )\n return;\n const name = bridgeEventName(envelope.type);\n if (!name) return;\n const definition = bridgeProtocol.events[name];\n if (definition.from === role) return;\n if (definition.session === 'establish') {\n if (\n envelope.documentId !== current.documentId ||\n envelope.sessionId === undefined\n )\n return;\n } else if (definition.session === 'current') {\n if (\n !current.sessionId ||\n envelope.sessionId !== current.sessionId ||\n envelope.documentId !== current.documentId\n )\n return;\n }\n const message = parseBridgePayload(envelope, definition);\n if (!message) {\n if (role === 'host' && name === 'request' && validId(envelope.id))\n invalidRequest?.(envelope.id);\n return;\n }\n diagnostic?.('receive', definition.wire);\n if (disposed) return;\n // The catalog lookup correlates the key and parsed discriminated message.\n const handler = (handlers as Record<string, (message: unknown) => void>)[\n name\n ]!;\n handler(message);\n }\n\n return {\n send,\n receive,\n dispose() {\n disposed = true;\n },\n };\n}\n"
8
9
  ],
9
- "mappings": "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",
10
- "debugId": "856B2CD0C55C1CE964756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "41803C2603D3735864756E2164756E21",
11
12
  "names": []
12
13
  }