@kumwe/studio-preview 0.1.0-alpha.6 → 0.1.0-beta.3

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.
@@ -1,486 +1 @@
1
- import { isPreviewMarker, isPreviewMessage, isPreviewRenderedPayload, STUDIO_CONTRACT_VERSION, STUDIO_WIRE_PROTOCOL_VERSION, } from '@kumwe/studio-protocol';
2
- import { normalizeOrigin, } from './preview-client.js';
3
- /**
4
- * The preview-surface half of the channel: answers `studio.preview/render` and
5
- * `studio.preview/measure` requests from a `PreviewClient` and forwards
6
- * `studio.preview/select` to registered listeners. Inbound messages are filtered exactly
7
- * like the client filters its own: pinned origin, expected source window, canonical
8
- * schema, channel ID, session generation, and a strictly increasing sequence.
9
- */
10
- export class PreviewHost {
11
- #channelId;
12
- #listener;
13
- #measureCallback;
14
- #renderCallback;
15
- #renderer;
16
- #viewportListeners = new Set();
17
- #disposeListeners = new Set();
18
- #selectListeners = new Set();
19
- #markerInventory = new Set();
20
- #sessionGeneration;
21
- #source;
22
- #target;
23
- #targetOrigin;
24
- #usedRequestIds = new Set();
25
- #viewports;
26
- #activeMeasure;
27
- #activeRender;
28
- #disposed = false;
29
- #lastInboundSequence = -1;
30
- #measureGeneration = 0;
31
- #measuredRenderDigest;
32
- #renderGeneration = 0;
33
- #sequence = 0;
34
- constructor(options) {
35
- this.#targetOrigin = normalizeOrigin(options.targetOrigin);
36
- this.#channelId = options.channelId;
37
- this.#sessionGeneration = options.sessionGeneration;
38
- this.#source = options.source;
39
- this.#target = options.target;
40
- this.#measureCallback = options.measure;
41
- this.#renderCallback = options.render;
42
- this.#renderer = options.renderer;
43
- this.#viewports = [...options.viewports];
44
- this.#listener = (event) => {
45
- this.#receive(event);
46
- };
47
- this.#source.addEventListener('message', this.#listener);
48
- }
49
- /**
50
- * Posts the `studio.preview/ready` announcement carrying the wire protocol version,
51
- * renderer id, and viewport inventory. Announcement is an explicit step so the host can
52
- * finish its own setup before opening the channel.
53
- */
54
- announce() {
55
- this.#assertActive();
56
- this.#post({
57
- channelId: this.#channelId,
58
- contractVersion: STUDIO_CONTRACT_VERSION,
59
- kind: 'preview-message',
60
- payload: {
61
- protocolVersion: STUDIO_WIRE_PROTOCOL_VERSION,
62
- renderer: this.#renderer,
63
- viewports: [...this.#viewports],
64
- },
65
- sequence: this.#sequence,
66
- sessionGeneration: this.#sessionGeneration,
67
- type: 'studio.preview/ready',
68
- });
69
- }
70
- dispose() {
71
- if (this.#disposed) {
72
- return;
73
- }
74
- this.#disposed = true;
75
- this.#source.removeEventListener('message', this.#listener);
76
- this.#selectListeners.clear();
77
- this.#viewportListeners.clear();
78
- this.#disposeListeners.clear();
79
- this.#invalidateMeasure('Preview host was disposed.');
80
- this.#invalidateRender('Preview host was disposed.');
81
- this.#measuredRenderDigest = undefined;
82
- this.#markerInventory.clear();
83
- }
84
- /**
85
- * Report a trusted interaction with a marked region. The renderer reports
86
- * intent, never raw input events, and the marker carries nothing beyond the
87
- * node identity the render already published.
88
- */
89
- announceActivation(payload) {
90
- this.#assertActive();
91
- if (!this.#markerInventory.has(payload.marker) ||
92
- !isPreviewMarker(payload.marker, this.#measuredRenderDigest)) {
93
- throw new RangeError('Preview activation marker is not in the current render inventory.');
94
- }
95
- this.#post({
96
- channelId: this.#channelId,
97
- contractVersion: STUDIO_CONTRACT_VERSION,
98
- kind: 'preview-message',
99
- payload,
100
- sequence: this.#sequence,
101
- sessionGeneration: this.#sessionGeneration,
102
- type: 'studio.preview/activated',
103
- });
104
- }
105
- /** Observe viewport instructions the client drives the surface with. */
106
- onViewport(listener) {
107
- this.#viewportListeners.add(listener);
108
- return () => {
109
- this.#viewportListeners.delete(listener);
110
- };
111
- }
112
- /** Observe requests to revoke the resources held for a superseded draft. */
113
- onDispose(listener) {
114
- this.#disposeListeners.add(listener);
115
- return () => {
116
- this.#disposeListeners.delete(listener);
117
- };
118
- }
119
- onSelect(listener) {
120
- this.#selectListeners.add(listener);
121
- return () => {
122
- this.#selectListeners.delete(listener);
123
- };
124
- }
125
- /**
126
- * Announce that the renderer reloaded: any in-flight render or measurement is
127
- * void and the client must resend. The host re-announces readiness afterwards.
128
- */
129
- reload(reason) {
130
- this.#assertActive();
131
- this.#invalidateMeasure('Preview renderer reloaded.');
132
- this.#invalidateRender('Preview renderer reloaded.');
133
- this.#measuredRenderDigest = undefined;
134
- this.#markerInventory.clear();
135
- this.#post({
136
- channelId: this.#channelId,
137
- contractVersion: STUDIO_CONTRACT_VERSION,
138
- kind: 'preview-message',
139
- payload: { reason },
140
- sequence: this.#sequence,
141
- sessionGeneration: this.#sessionGeneration,
142
- type: 'studio.preview/reload',
143
- });
144
- this.announce();
145
- }
146
- /** Announce channel closure to the client, then dispose this host. */
147
- teardown(reason) {
148
- this.#assertActive();
149
- this.#post({
150
- channelId: this.#channelId,
151
- contractVersion: STUDIO_CONTRACT_VERSION,
152
- kind: 'preview-message',
153
- payload: { reason },
154
- sequence: this.#sequence,
155
- sessionGeneration: this.#sessionGeneration,
156
- type: 'studio.preview/teardown',
157
- });
158
- this.dispose();
159
- }
160
- #assertActive() {
161
- if (this.#disposed) {
162
- throw new Error('Preview host was disposed.');
163
- }
164
- }
165
- #handleMeasure(payload) {
166
- const requestId = payload.requestId;
167
- if (this.#usedRequestIds.has(requestId)) {
168
- this.#postError(requestId, {
169
- code: 'studio.preview/request-id-reused',
170
- defaultMessage: 'The preview request identifier was already used in this session.',
171
- retryable: false,
172
- });
173
- return;
174
- }
175
- this.#usedRequestIds.add(requestId);
176
- if (this.#measuredRenderDigest === undefined) {
177
- // Nothing has rendered yet, so there is no digest to bind geometry to.
178
- this.#postError(requestId, {
179
- code: 'studio.preview/measure-unavailable',
180
- defaultMessage: 'Preview measurement is unavailable.',
181
- retryable: true,
182
- });
183
- return;
184
- }
185
- const draftDigest = this.#measuredRenderDigest;
186
- if (payload.markers.some((marker) => !this.#markerInventory.has(marker) || !isPreviewMarker(marker, draftDigest))) {
187
- this.#postError(requestId, {
188
- code: 'studio.preview/measure-stale-marker',
189
- defaultMessage: 'Preview measurement markers are not in the current render inventory.',
190
- retryable: true,
191
- });
192
- return;
193
- }
194
- if (this.#measureCallback === undefined) {
195
- this.#postError(requestId, {
196
- code: 'studio.preview/measure-unavailable',
197
- defaultMessage: 'Preview measurement is unavailable.',
198
- retryable: false,
199
- });
200
- return;
201
- }
202
- this.#invalidateMeasure('Preview measurement was superseded.');
203
- const active = {
204
- controller: new AbortController(),
205
- draftDigest,
206
- generation: this.#measureGeneration,
207
- requestId,
208
- };
209
- this.#activeMeasure = active;
210
- const markers = [...payload.markers];
211
- let result;
212
- try {
213
- result = this.#measureCallback(markers, active.controller.signal);
214
- }
215
- catch {
216
- this.#settleMeasureFailure(active, measureFailed());
217
- return;
218
- }
219
- void Promise.resolve(result).then((measurement) => {
220
- try {
221
- this.#settleMeasured(active, markers, measurement);
222
- }
223
- catch {
224
- this.#settleMeasureFailure(active, measureFailed());
225
- }
226
- }, () => {
227
- this.#settleMeasureFailure(active, measureFailed());
228
- });
229
- }
230
- #handleRender(payload) {
231
- if (this.#usedRequestIds.has(payload.requestId)) {
232
- this.#postError(payload.requestId, {
233
- code: 'studio.preview/request-id-reused',
234
- defaultMessage: 'The preview request identifier was already used in this session.',
235
- retryable: false,
236
- });
237
- return;
238
- }
239
- this.#usedRequestIds.add(payload.requestId);
240
- this.#invalidateMeasure('Preview measurement was superseded by a render.');
241
- this.#invalidateRender('Preview render was superseded.');
242
- this.#measuredRenderDigest = undefined;
243
- this.#markerInventory.clear();
244
- const active = {
245
- controller: new AbortController(),
246
- draftDigest: payload.draftDigest,
247
- generation: this.#renderGeneration,
248
- requestId: payload.requestId,
249
- };
250
- this.#activeRender = active;
251
- let result;
252
- try {
253
- result = this.#renderCallback(payload, active.controller.signal);
254
- }
255
- catch {
256
- this.#settleFailure(active);
257
- return;
258
- }
259
- void Promise.resolve(result).then((rendered) => {
260
- try {
261
- this.#settleRendered(active, rendered);
262
- }
263
- catch {
264
- this.#settleFailure(active);
265
- }
266
- }, () => {
267
- this.#settleFailure(active);
268
- });
269
- }
270
- #post(message) {
271
- if (!isPreviewMessage(message)) {
272
- throw new TypeError('Refused an invalid outbound preview message.');
273
- }
274
- this.#sequence += 1;
275
- this.#target.postMessage(message, this.#targetOrigin);
276
- }
277
- #receive(event) {
278
- if (event.origin !== this.#targetOrigin ||
279
- event.source !== this.#target ||
280
- !isPreviewMessage(event.data) ||
281
- event.data.channelId !== this.#channelId ||
282
- event.data.sessionGeneration !== this.#sessionGeneration ||
283
- event.data.sequence <= this.#lastInboundSequence) {
284
- return;
285
- }
286
- this.#lastInboundSequence = event.data.sequence;
287
- if (event.data.type === 'studio.preview/render') {
288
- this.#handleRender(event.data.payload);
289
- }
290
- else if (event.data.type === 'studio.preview/measure') {
291
- this.#handleMeasure(event.data.payload);
292
- }
293
- else if (event.data.type === 'studio.preview/select') {
294
- for (const listener of this.#selectListeners) {
295
- listener(event.data.payload);
296
- }
297
- }
298
- else if (event.data.type === 'studio.preview/viewport') {
299
- // Geometry captured before a resize or semantic viewport switch no longer
300
- // describes the surface. Invalidate before listeners apply the new viewport.
301
- this.#invalidateMeasure('Preview viewport changed.');
302
- for (const listener of this.#viewportListeners) {
303
- listener(event.data.payload);
304
- }
305
- }
306
- else if (event.data.type === 'studio.preview/dispose') {
307
- // Resource revocation for a superseded draft; the channel stays open.
308
- if (event.data.payload.draftDigest === undefined ||
309
- event.data.payload.draftDigest === this.#activeRender?.draftDigest) {
310
- this.#invalidateRender('Preview render was disposed.');
311
- }
312
- if (event.data.payload.draftDigest === undefined ||
313
- event.data.payload.draftDigest === this.#measuredRenderDigest) {
314
- this.#invalidateMeasure('Preview measurement was disposed.');
315
- this.#measuredRenderDigest = undefined;
316
- this.#markerInventory.clear();
317
- }
318
- for (const listener of this.#disposeListeners) {
319
- listener(event.data.payload);
320
- }
321
- }
322
- else if (event.data.type === 'studio.preview/teardown') {
323
- this.dispose();
324
- }
325
- }
326
- // Measurer failure details never cross the channel: the rejection reason is dropped and a
327
- // stable generic error is posted instead, correlated by the request identifier.
328
- #settleMeasureFailure(active, failure) {
329
- if (!this.#isActiveMeasure(active)) {
330
- return;
331
- }
332
- this.#activeMeasure = undefined;
333
- this.#postError(active.requestId, failure);
334
- }
335
- #postError(correlationId, failure) {
336
- if (this.#disposed) {
337
- return;
338
- }
339
- this.#post({
340
- channelId: this.#channelId,
341
- contractVersion: STUDIO_CONTRACT_VERSION,
342
- kind: 'preview-message',
343
- payload: {
344
- code: failure.code,
345
- correlationId,
346
- message: { defaultMessage: failure.defaultMessage, key: failure.code },
347
- retryable: failure.retryable,
348
- },
349
- sequence: this.#sequence,
350
- sessionGeneration: this.#sessionGeneration,
351
- type: 'studio.preview/error',
352
- });
353
- }
354
- // Geometry is stamped with the digest of the render the surface currently shows, and only
355
- // markers from the request are answered — requested markers the measurer cannot place are
356
- // listed as unknown, extra markers it invents are dropped. A measurement superseded by a
357
- // newer request, voided by a reload, or settling after disposal is dropped silently.
358
- #settleMeasured(active, markers, measurement) {
359
- if (!this.#isActiveMeasure(active)) {
360
- return;
361
- }
362
- const measurements = {};
363
- const unknown = [];
364
- for (const marker of markers) {
365
- const rects = Object.hasOwn(measurement.rects, marker)
366
- ? measurement.rects[marker]
367
- : undefined;
368
- if (rects === undefined || rects.length === 0) {
369
- unknown.push(marker);
370
- }
371
- else {
372
- measurements[marker] = rects.map((rect) => ({
373
- height: rect.height,
374
- width: rect.width,
375
- x: rect.x,
376
- y: rect.y,
377
- }));
378
- }
379
- }
380
- const message = {
381
- channelId: this.#channelId,
382
- contractVersion: STUDIO_CONTRACT_VERSION,
383
- kind: 'preview-message',
384
- payload: {
385
- draftDigest: active.draftDigest,
386
- measurements,
387
- requestId: active.requestId,
388
- unknown,
389
- viewport: {
390
- devicePixelRatio: measurement.viewport.devicePixelRatio,
391
- height: measurement.viewport.height,
392
- scrollX: measurement.viewport.scrollX,
393
- scrollY: measurement.viewport.scrollY,
394
- width: measurement.viewport.width,
395
- },
396
- },
397
- sequence: this.#sequence,
398
- sessionGeneration: this.#sessionGeneration,
399
- type: 'studio.preview/measurements',
400
- };
401
- if (!isPreviewMessage(message)) {
402
- this.#settleMeasureFailure(active, measureFailed());
403
- return;
404
- }
405
- this.#activeMeasure = undefined;
406
- this.#post(message);
407
- }
408
- // Renderer failure details never cross the channel: the rejection reason is dropped and a
409
- // stable generic error is posted instead, correlated by the unique render request id.
410
- #settleFailure(active) {
411
- if (!this.#isActiveRender(active)) {
412
- return;
413
- }
414
- this.#activeRender = undefined;
415
- this.#postError(active.requestId, {
416
- code: 'studio.preview/render-failed',
417
- defaultMessage: 'Preview rendering failed.',
418
- retryable: true,
419
- });
420
- }
421
- // The response digest is stamped from the request, so a callback can never answer for a
422
- // different draft than the one it was asked to render. Results that were superseded by a
423
- // newer request, or that settle after disposal, are dropped silently.
424
- #settleRendered(active, rendered) {
425
- if (!this.#isActiveRender(active)) {
426
- return;
427
- }
428
- if (!isPreviewRenderedPayload(rendered) ||
429
- rendered.draftDigest !== active.draftDigest ||
430
- rendered.requestId !== active.requestId) {
431
- this.#settleFailure(active);
432
- return;
433
- }
434
- this.#activeRender = undefined;
435
- // The surface now shows this render; measurements are bound to its digest.
436
- this.#measuredRenderDigest = active.draftDigest;
437
- this.#markerInventory.clear();
438
- for (const marker of rendered.markers) {
439
- this.#markerInventory.add(marker);
440
- }
441
- this.#post({
442
- channelId: this.#channelId,
443
- contractVersion: STUDIO_CONTRACT_VERSION,
444
- kind: 'preview-message',
445
- payload: {
446
- diagnostics: rendered.diagnostics,
447
- draftDigest: active.draftDigest,
448
- markers: rendered.markers,
449
- markerMap: rendered.markerMap,
450
- requestId: active.requestId,
451
- },
452
- sequence: this.#sequence,
453
- sessionGeneration: this.#sessionGeneration,
454
- type: 'studio.preview/rendered',
455
- });
456
- }
457
- #invalidateMeasure(reason) {
458
- this.#measureGeneration += 1;
459
- this.#activeMeasure?.controller.abort(reason);
460
- this.#activeMeasure = undefined;
461
- }
462
- #invalidateRender(reason) {
463
- this.#renderGeneration += 1;
464
- this.#activeRender?.controller.abort(reason);
465
- this.#activeRender = undefined;
466
- }
467
- #isActiveMeasure(active) {
468
- return (!this.#disposed &&
469
- this.#activeMeasure === active &&
470
- active.generation === this.#measureGeneration &&
471
- active.draftDigest === this.#measuredRenderDigest);
472
- }
473
- #isActiveRender(active) {
474
- return (!this.#disposed &&
475
- this.#activeRender === active &&
476
- active.generation === this.#renderGeneration);
477
- }
478
- }
479
- function measureFailed() {
480
- return {
481
- code: 'studio.preview/measure-failed',
482
- defaultMessage: 'Preview measurement failed.',
483
- retryable: true,
484
- };
485
- }
486
- //# sourceMappingURL=preview-host.js.map
1
+ import{isPreviewMarker as e,isPreviewMessage as t,isPreviewRenderedPayload as n,STUDIO_CONTRACT_VERSION as r,STUDIO_WIRE_PROTOCOL_VERSION as i}from"@kumwe/studio-protocol";import{normalizeOrigin as a}from"./preview-client.js";export class PreviewHost{#channelId;#listener;#measureCallback;#renderCallback;#renderer;#viewportListeners=new Set;#disposeListeners=new Set;#selectListeners=new Set;#markerInventory=new Set;#sessionGeneration;#source;#target;#targetOrigin;#usedRequestIds=new Set;#viewports;#activeMeasure;#activeRender;#disposed=!1;#lastInboundSequence=-1;#measureGeneration=0;#measuredRenderDigest;#renderGeneration=0;#sequence=0;constructor(e){this.#targetOrigin=a(e.targetOrigin),this.#channelId=e.channelId,this.#sessionGeneration=e.sessionGeneration,this.#source=e.source,this.#target=e.target,this.#measureCallback=e.measure,this.#renderCallback=e.render,this.#renderer=e.renderer,this.#viewports=[...e.viewports],this.#listener=e=>{this.#receive(e)},this.#source.addEventListener(`message`,this.#listener)}announce(){this.#assertActive(),this.#post({channelId:this.#channelId,contractVersion:r,kind:`preview-message`,payload:{protocolVersion:i,renderer:this.#renderer,viewports:[...this.#viewports]},sequence:this.#sequence,sessionGeneration:this.#sessionGeneration,type:`studio.preview/ready`})}dispose(){this.#disposed||(this.#disposed=!0,this.#source.removeEventListener(`message`,this.#listener),this.#selectListeners.clear(),this.#viewportListeners.clear(),this.#disposeListeners.clear(),this.#invalidateMeasure(`Preview host was disposed.`),this.#invalidateRender(`Preview host was disposed.`),this.#measuredRenderDigest=void 0,this.#markerInventory.clear())}announceActivation(t){if(this.#assertActive(),!this.#markerInventory.has(t.marker)||!e(t.marker,this.#measuredRenderDigest))throw RangeError(`Preview activation marker is not in the current render inventory.`);this.#post({channelId:this.#channelId,contractVersion:r,kind:`preview-message`,payload:t,sequence:this.#sequence,sessionGeneration:this.#sessionGeneration,type:`studio.preview/activated`})}onViewport(e){return this.#viewportListeners.add(e),()=>{this.#viewportListeners.delete(e)}}onDispose(e){return this.#disposeListeners.add(e),()=>{this.#disposeListeners.delete(e)}}onSelect(e){return this.#selectListeners.add(e),()=>{this.#selectListeners.delete(e)}}reload(e){this.#assertActive(),this.#invalidateMeasure(`Preview renderer reloaded.`),this.#invalidateRender(`Preview renderer reloaded.`),this.#measuredRenderDigest=void 0,this.#markerInventory.clear(),this.#post({channelId:this.#channelId,contractVersion:r,kind:`preview-message`,payload:{reason:e},sequence:this.#sequence,sessionGeneration:this.#sessionGeneration,type:`studio.preview/reload`}),this.announce()}teardown(e){this.#assertActive(),this.#post({channelId:this.#channelId,contractVersion:r,kind:`preview-message`,payload:{reason:e},sequence:this.#sequence,sessionGeneration:this.#sessionGeneration,type:`studio.preview/teardown`}),this.dispose()}#assertActive(){if(this.#disposed)throw Error(`Preview host was disposed.`)}#handleMeasure(t){let n=t.requestId;if(this.#usedRequestIds.has(n)){this.#postError(n,{code:`studio.preview/request-id-reused`,defaultMessage:`The preview request identifier was already used in this session.`,retryable:!1});return}if(this.#usedRequestIds.add(n),this.#measuredRenderDigest===void 0){this.#postError(n,{code:`studio.preview/measure-unavailable`,defaultMessage:`Preview measurement is unavailable.`,retryable:!0});return}let r=this.#measuredRenderDigest;if(t.markers.some(t=>!this.#markerInventory.has(t)||!e(t,r))){this.#postError(n,{code:`studio.preview/measure-stale-marker`,defaultMessage:`Preview measurement markers are not in the current render inventory.`,retryable:!0});return}if(this.#measureCallback===void 0){this.#postError(n,{code:`studio.preview/measure-unavailable`,defaultMessage:`Preview measurement is unavailable.`,retryable:!1});return}this.#invalidateMeasure(`Preview measurement was superseded.`);let i={controller:new AbortController,draftDigest:r,generation:this.#measureGeneration,requestId:n};this.#activeMeasure=i;let a=[...t.markers],o;try{o=this.#measureCallback(a,i.controller.signal)}catch{this.#settleMeasureFailure(i,s());return}Promise.resolve(o).then(e=>{try{this.#settleMeasured(i,a,e)}catch{this.#settleMeasureFailure(i,s())}},()=>{this.#settleMeasureFailure(i,s())})}#handleRender(e){if(this.#usedRequestIds.has(e.requestId)){this.#postError(e.requestId,{code:`studio.preview/request-id-reused`,defaultMessage:`The preview request identifier was already used in this session.`,retryable:!1});return}this.#usedRequestIds.add(e.requestId),this.#invalidateMeasure(`Preview measurement was superseded by a render.`),this.#invalidateRender(`Preview render was superseded.`),this.#measuredRenderDigest=void 0,this.#markerInventory.clear();let t={controller:new AbortController,draftDigest:e.draftDigest,generation:this.#renderGeneration,requestId:e.requestId};this.#activeRender=t;let n;try{n=this.#renderCallback(e,t.controller.signal)}catch{this.#settleFailure(t);return}Promise.resolve(n).then(e=>{try{this.#settleRendered(t,e)}catch{this.#settleFailure(t)}},()=>{this.#settleFailure(t)})}#post(e){if(!t(e))throw TypeError(`Refused an invalid outbound preview message.`);this.#sequence+=1,this.#target.postMessage(e,this.#targetOrigin)}#receive(e){if(!(e.origin!==this.#targetOrigin||e.source!==this.#target||!t(e.data)||e.data.channelId!==this.#channelId||e.data.sessionGeneration!==this.#sessionGeneration||e.data.sequence<=this.#lastInboundSequence)){if(this.#lastInboundSequence=e.data.sequence,e.data.type===`studio.preview/render`)this.#handleRender(e.data.payload);else if(e.data.type===`studio.preview/measure`)this.#handleMeasure(e.data.payload);else if(e.data.type===`studio.preview/select`)for(let t of this.#selectListeners)t(e.data.payload);else if(e.data.type===`studio.preview/viewport`){this.#invalidateMeasure(`Preview viewport changed.`);for(let t of this.#viewportListeners)t(e.data.payload)}else if(e.data.type===`studio.preview/dispose`){(e.data.payload.draftDigest===void 0||e.data.payload.draftDigest===this.#activeRender?.draftDigest)&&this.#invalidateRender(`Preview render was disposed.`),(e.data.payload.draftDigest===void 0||e.data.payload.draftDigest===this.#measuredRenderDigest)&&(this.#invalidateMeasure(`Preview measurement was disposed.`),this.#measuredRenderDigest=void 0,this.#markerInventory.clear());for(let t of this.#disposeListeners)t(e.data.payload)}else e.data.type===`studio.preview/teardown`&&this.dispose()}}#settleMeasureFailure(e,t){this.#isActiveMeasure(e)&&(this.#activeMeasure=void 0,this.#postError(e.requestId,t))}#postError(e,t){this.#disposed||this.#post({channelId:this.#channelId,contractVersion:r,kind:`preview-message`,payload:{code:t.code,correlationId:e,message:{defaultMessage:t.defaultMessage,key:t.code},retryable:t.retryable},sequence:this.#sequence,sessionGeneration:this.#sessionGeneration,type:`studio.preview/error`})}#settleMeasured(e,n,i){if(!this.#isActiveMeasure(e))return;let a={},o=[];for(let e of n){let t=Object.hasOwn(i.rects,e)?i.rects[e]:void 0;t===void 0||t.length===0?o.push(e):a[e]=t.map(e=>({height:e.height,width:e.width,x:e.x,y:e.y}))}let c={channelId:this.#channelId,contractVersion:r,kind:`preview-message`,payload:{draftDigest:e.draftDigest,measurements:a,requestId:e.requestId,unknown:o,viewport:{devicePixelRatio:i.viewport.devicePixelRatio,height:i.viewport.height,scrollX:i.viewport.scrollX,scrollY:i.viewport.scrollY,width:i.viewport.width}},sequence:this.#sequence,sessionGeneration:this.#sessionGeneration,type:`studio.preview/measurements`};if(!t(c)){this.#settleMeasureFailure(e,s());return}this.#activeMeasure=void 0,this.#post(c)}#settleFailure(e){this.#isActiveRender(e)&&(this.#activeRender=void 0,this.#postError(e.requestId,{code:`studio.preview/render-failed`,defaultMessage:`Preview rendering failed.`,retryable:!0}))}#settleRendered(e,t){if(this.#isActiveRender(e)){if(!n(t)||t.draftDigest!==e.draftDigest||t.requestId!==e.requestId){this.#settleFailure(e);return}this.#activeRender=void 0,this.#measuredRenderDigest=e.draftDigest,this.#markerInventory.clear();for(let e of t.markers)this.#markerInventory.add(e);this.#post({channelId:this.#channelId,contractVersion:r,kind:`preview-message`,payload:{diagnostics:t.diagnostics,draftDigest:e.draftDigest,markers:t.markers,markerMap:t.markerMap,requestId:e.requestId},sequence:this.#sequence,sessionGeneration:this.#sessionGeneration,type:`studio.preview/rendered`})}}#invalidateMeasure(e){this.#measureGeneration+=1,this.#activeMeasure?.controller.abort(e),this.#activeMeasure=void 0}#invalidateRender(e){this.#renderGeneration+=1,this.#activeRender?.controller.abort(e),this.#activeRender=void 0}#isActiveMeasure(e){return!this.#disposed&&this.#activeMeasure===e&&e.generation===this.#measureGeneration&&e.draftDigest===this.#measuredRenderDigest}#isActiveRender(e){return!this.#disposed&&this.#activeRender===e&&e.generation===this.#renderGeneration}}function s(){return{code:`studio.preview/measure-failed`,defaultMessage:`Preview measurement failed.`,retryable:!0}}
@@ -1,61 +1 @@
1
- import { canonicalUtf8Bytes } from '@kumwe/studio-core';
2
- const draftDigestPattern = /^[0-9a-f]{64}$/u;
3
- const maximumMarkerOrdinal = 99_999;
4
- /**
5
- * Return the exact digest preimage for a complete, schema-valid Studio draft.
6
- * No transport envelope, prefix, BOM, viewport, revision override, or trailing
7
- * newline is added: the preimage is only the canonical UTF-8 artifact bytes.
8
- * The authoritative host MUST schema- and semantics-validate the artifact
9
- * before treating this helper's result as a valid draft identity.
10
- */
11
- export function canonicalPreviewDraftBytes(draft, options = {}) {
12
- return canonicalUtf8Bytes(draft, options);
13
- }
14
- /** Compute the lowercase SHA-256 hex identity of a complete Studio draft. */
15
- export async function computePreviewDraftDigest(draft, options = {}) {
16
- const subtle = options.subtle ?? globalThis.crypto.subtle;
17
- const serializationOptions = options.maximumDepth === undefined ? {} : { maximumDepth: options.maximumDepth };
18
- const preimage = Uint8Array.from(canonicalPreviewDraftBytes(draft, serializationOptions));
19
- const digest = await subtle.digest('SHA-256', preimage);
20
- return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, '0')).join('');
21
- }
22
- /** Create the canonical marker for one zero-based Blueprint preorder ordinal. */
23
- export function createPreviewMarker(draftDigest, ordinal) {
24
- if (!draftDigestPattern.test(draftDigest)) {
25
- throw new TypeError('Preview draft digest must be 64 lowercase hexadecimal characters.');
26
- }
27
- if (!Number.isSafeInteger(ordinal) || ordinal < 0 || ordinal > maximumMarkerOrdinal) {
28
- throw new RangeError(`Preview marker ordinal must be between 0 and ${maximumMarkerOrdinal}.`);
29
- }
30
- return `studio.preview/node/${draftDigest}/${ordinal}`;
31
- }
32
- /**
33
- * Build the portable marker inventory for a Blueprint. Traversal is roots in
34
- * array order, each node before descendants, slot names in ascending UTF-16
35
- * code-unit order, and children in array order. Node ids must be unique.
36
- */
37
- export function createPreviewMarkerInventory(draft, draftDigest) {
38
- const markerMap = {};
39
- const markers = [];
40
- const nodeIds = new Set();
41
- const visit = (node) => {
42
- if (nodeIds.has(node.id)) {
43
- throw new TypeError(`Preview marker inventory cannot contain duplicate node id ${node.id}.`);
44
- }
45
- nodeIds.add(node.id);
46
- const marker = createPreviewMarker(draftDigest, markers.length);
47
- markers.push(marker);
48
- markerMap[marker] = node.id;
49
- const slots = Object.entries(node.slots).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0);
50
- for (const [, children] of slots) {
51
- for (const child of children) {
52
- visit(child);
53
- }
54
- }
55
- };
56
- for (const root of draft.roots) {
57
- visit(root);
58
- }
59
- return { markerMap, markers };
60
- }
61
- //# sourceMappingURL=preview-identity.js.map
1
+ import{canonicalUtf8Bytes as e}from"@kumwe/studio-core";const t=/^[0-9a-f]{64}$/u,n=99999;export function canonicalPreviewDraftBytes(t,n={}){return e(t,n)}export async function computePreviewDraftDigest(e,t={}){let n=t.subtle??globalThis.crypto.subtle,i=t.maximumDepth===void 0?{}:{maximumDepth:t.maximumDepth},a=Uint8Array.from(canonicalPreviewDraftBytes(e,i)),o=await n.digest(`SHA-256`,a);return[...new Uint8Array(o)].map(e=>e.toString(16).padStart(2,`0`)).join(``)}export function createPreviewMarker(e,r){if(!t.test(e))throw TypeError(`Preview draft digest must be 64 lowercase hexadecimal characters.`);if(!Number.isSafeInteger(r)||r<0||r>n)throw RangeError(`Preview marker ordinal must be between 0 and ${n}.`);return`studio.preview/node/${e}/${r}`}export function createPreviewMarkerInventory(e,t){let n={},r=[],i=new Set,o=e=>{if(i.has(e.id))throw TypeError(`Preview marker inventory cannot contain duplicate node id ${e.id}.`);i.add(e.id);let s=createPreviewMarker(t,r.length);r.push(s),n[s]=e.id;let c=Object.entries(e.slots).sort(([e],[t])=>e<t?-1:+(e>t));for(let[,e]of c)for(let t of e)o(t)};for(let t of e.roots)o(t);return{markerMap:n,markers:r}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kumwe/studio-preview",
3
- "version": "0.1.0-alpha.6",
3
+ "version": "0.1.0-beta.3",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/kumwe/studio.git",
@@ -13,6 +13,8 @@
13
13
  "sideEffects": false,
14
14
  "files": [
15
15
  "LICENSE",
16
+ "THIRD_PARTY_NOTICES.md",
17
+ "third-party-licenses",
16
18
  "dist",
17
19
  "README.md"
18
20
  ],
@@ -23,11 +25,11 @@
23
25
  }
24
26
  },
25
27
  "scripts": {
26
- "build": "tsc -b"
28
+ "build": "tsc -b && node ../../scripts/minify-package-dist.mjs --package packages/preview"
27
29
  },
28
30
  "dependencies": {
29
- "@kumwe/studio-core": "0.1.0-alpha.8",
30
- "@kumwe/studio-protocol": "0.1.0-alpha.6"
31
+ "@kumwe/studio-core": "0.1.0-beta.3",
32
+ "@kumwe/studio-protocol": "0.1.0-beta.3"
31
33
  },
32
34
  "publishConfig": {
33
35
  "access": "public",
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,mBAAmB,GAWpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,WAAW,GAMZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,mBAAmB,EACnB,4BAA4B,GAG7B,MAAM,uBAAuB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"preview-client.js","sourceRoot":"","sources":["../src/preview-client.ts"],"names":[],"mappings":"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"}