@flighthq/application 0.3.0-next.906.07cea63 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,6 @@
1
+ import type { ApplicationRenderView, ApplicationRenderViewResize, RenderState, RenderTargetDimensions } from '@flighthq/types/contract';
2
+ export declare function attachApplicationRenderView(view: ApplicationRenderView): void;
3
+ export declare function createApplicationRenderView<State extends RenderState, Target extends RenderTargetDimensions>(window: ApplicationRenderView<State, Target>['window'], renderState: State, renderTarget: Target, viewport: ApplicationRenderView<State, Target>['viewport'], resize: ApplicationRenderViewResize<State, Target>): ApplicationRenderView<State, Target>;
4
+ export declare function detachApplicationRenderView(view: ApplicationRenderView): void;
5
+ export declare function synchronizeApplicationRenderView(view: ApplicationRenderView): void;
6
+ //# sourceMappingURL=applicationRenderView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applicationRenderView.d.ts","sourceRoot":"","sources":["../src/applicationRenderView.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,qBAAqB,EACrB,2BAA2B,EAE3B,WAAW,EACX,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAgBlC,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAM7E;AAKD,wBAAgB,2BAA2B,CAAC,KAAK,SAAS,WAAW,EAAE,MAAM,SAAS,sBAAsB,EAC1G,MAAM,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,EACtD,WAAW,EAAE,KAAK,EAClB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,EAC1D,MAAM,EAAE,2BAA2B,CAAC,KAAK,EAAE,MAAM,CAAC,GACjD,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CActC;AAID,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAK7E;AAID,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAgBlF"}
@@ -0,0 +1,63 @@
1
+ import { createEntity, createEntityRuntime } from '@flighthq/entity/contract';
2
+ import { connectSignal, disconnectSignal } from '@flighthq/signals/contract';
3
+ import { EntityRuntimeKey } from '@flighthq/types/contract';
4
+ import { computeWindowDeviceTransform } from './window';
5
+ // Starts window-driven synchronization for a view. Idempotent: attaching an already attached view first
6
+ // removes its existing signal connection, then synchronizes once and installs exactly one connection.
7
+ export function attachApplicationRenderView(view) {
8
+ const runtime = getApplicationRenderViewRuntime(view);
9
+ if (runtime.attached)
10
+ disconnectSignal(view.window.onResize, runtime.synchronize);
11
+ synchronizeApplicationRenderView(view);
12
+ connectSignal(view.window.onResize, runtime.synchronize);
13
+ runtime.attached = true;
14
+ }
15
+ // Links an existing window, command state, target, and viewport without taking ownership of any of
16
+ // them. The resize operation is the backend's allocation seam; it must be idempotent because
17
+ // synchronizeApplicationRenderView invokes it even when storage already has the requested extent.
18
+ export function createApplicationRenderView(window, renderState, renderTarget, viewport, resize) {
19
+ const view = createEntity({
20
+ renderState,
21
+ renderTarget,
22
+ viewport,
23
+ window,
24
+ });
25
+ const runtime = createEntityRuntime();
26
+ runtime.attached = false;
27
+ runtime.resize = resize;
28
+ runtime.synchronize = () => synchronizeApplicationRenderView(view);
29
+ view[EntityRuntimeKey] = runtime;
30
+ synchronizeApplicationRenderView(view);
31
+ return view;
32
+ }
33
+ // Stops window-driven synchronization. The linked window/state/target/viewport remain caller-owned and
34
+ // independently usable.
35
+ export function detachApplicationRenderView(view) {
36
+ const runtime = getApplicationRenderViewRuntime(view);
37
+ if (!runtime.attached)
38
+ return;
39
+ disconnectSignal(view.window.onResize, runtime.synchronize);
40
+ runtime.attached = false;
41
+ }
42
+ // Reconciles one view from its window authority. Logical window dimensions become device-pixel target
43
+ // and viewport dimensions; the render state's pixel ratio and 2D device transform receive the same DPR.
44
+ export function synchronizeApplicationRenderView(view) {
45
+ const devicePixelRatio = view.window.devicePixelRatio;
46
+ const width = Math.max(0, Math.round(view.window.width * devicePixelRatio));
47
+ const height = Math.max(0, Math.round(view.window.height * devicePixelRatio));
48
+ const runtime = getApplicationRenderViewRuntime(view);
49
+ runtime.resize(view.renderState, view.renderTarget, width, height);
50
+ view.viewport.devicePixelRatio = devicePixelRatio;
51
+ view.viewport.height = height;
52
+ view.viewport.width = width;
53
+ view.viewport.x = 0;
54
+ view.viewport.y = 0;
55
+ view.renderState.pixelRatio = devicePixelRatio;
56
+ if (view.renderState.renderTransform2D !== null) {
57
+ computeWindowDeviceTransform(view.window, view.renderState.renderTransform2D);
58
+ }
59
+ }
60
+ function getApplicationRenderViewRuntime(view) {
61
+ return view[EntityRuntimeKey];
62
+ }
63
+ //# sourceMappingURL=applicationRenderView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applicationRenderView.js","sourceRoot":"","sources":["../src/applicationRenderView.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  export * from './application';
2
+ export * from './applicationRenderView';
2
3
  export * from './window';
3
4
  //# sourceMappingURL=contract.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,UAAU,CAAC"}
package/dist/contract.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './application';
2
+ export * from './applicationRenderView';
2
3
  export * from './window';
3
4
  //# sourceMappingURL=contract.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,UAAU,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { attachApplicationExit, attachApplicationLifecycle, attachWindowClose, attachWindowDropFile, attachWindowFocus, attachWindowFullscreen, attachWindowMove, attachWindowOrientation, attachWindowRenderContext, attachWindowRenderState, attachWindowResize, attachWindowVisibility, centerWindow, closeWindow, computeWindowDeviceTransform, createApplication, createApplicationWindow, detachApplicationExit, detachWindowClose, detachWindowDropFile, detachWindowFocus, detachWindowFullscreen, detachWindowMove, detachWindowOrientation, detachWindowRenderContext, detachWindowRenderState, detachWindowResize, detachWindowVisibility, disposeApplication, disposeApplicationWindow, enableApplicationLifecycleSignals, exitApplicationFullscreen, exitApplicationPointerLock, flashWindowFrame, focusWindow, forEachApplicationWindow, getApplicationFrameRate, getApplicationMainWindow, getApplicationWindows, getWindowBounds, getWindowDisplay, hideWindow, isApplicationRunning, lockApplicationPointer, maximizeWindow, minimizeWindow, openWindow, pauseApplicationLoop, prepareElementForInput, registerApplicationWindow, requestApplicationFullscreen, requestWindowAttention, requestWindowClose, restoreWindow, resumeApplicationLoop, setApplicationMainWindow, setWindowAlwaysOnTop, setWindowContentProtection, setWindowFullscreen, setWindowHasShadow, setWindowIcon, setWindowMaximumSize, setWindowMenuBarVisible, setWindowMinimumSize, setWindowOpacity, setWindowParent, setWindowPosition, setWindowProgress, setWindowResizable, setWindowSize, setWindowSkipTaskbar, setWindowTitle, showWindow, startApplicationLoop, stepApplicationLoop, stopApplicationLoop, unregisterApplicationWindow, } from './contract';
1
+ export { attachApplicationExit, attachApplicationLifecycle, attachApplicationRenderView, attachWindowClose, attachWindowDropFile, attachWindowFocus, attachWindowFullscreen, attachWindowMove, attachWindowOrientation, attachWindowRenderContext, attachWindowRenderState, attachWindowResize, attachWindowVisibility, centerWindow, closeWindow, computeWindowDeviceTransform, createApplication, createApplicationRenderView, createApplicationWindow, detachApplicationExit, detachApplicationRenderView, detachWindowClose, detachWindowDropFile, detachWindowFocus, detachWindowFullscreen, detachWindowMove, detachWindowOrientation, detachWindowRenderContext, detachWindowRenderState, detachWindowResize, detachWindowVisibility, disposeApplication, disposeApplicationWindow, enableApplicationLifecycleSignals, exitApplicationFullscreen, exitApplicationPointerLock, flashWindowFrame, focusWindow, forEachApplicationWindow, getApplicationFrameRate, getApplicationMainWindow, getApplicationWindows, getWindowBounds, getWindowDisplay, hideWindow, isApplicationRunning, lockApplicationPointer, maximizeWindow, minimizeWindow, openWindow, pauseApplicationLoop, prepareElementForInput, registerApplicationWindow, requestApplicationFullscreen, requestWindowAttention, requestWindowClose, restoreWindow, resumeApplicationLoop, setApplicationMainWindow, setWindowAlwaysOnTop, setWindowContentProtection, setWindowFullscreen, setWindowHasShadow, setWindowIcon, setWindowMaximumSize, setWindowMenuBarVisible, setWindowMinimumSize, setWindowOpacity, setWindowParent, setWindowPosition, setWindowProgress, setWindowResizable, setWindowSize, setWindowSkipTaskbar, setWindowTitle, showWindow, startApplicationLoop, stepApplicationLoop, stopApplicationLoop, synchronizeApplicationRenderView, unregisterApplicationWindow, } from './contract';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACX,4BAA4B,EAC5B,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,iCAAiC,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,gBAAgB,EAChB,WAAW,EACX,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,4BAA4B,EAC5B,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACX,4BAA4B,EAC5B,iBAAiB,EACjB,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,EACrB,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,iCAAiC,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,gBAAgB,EAChB,WAAW,EACX,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,4BAA4B,EAC5B,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,gCAAgC,EAChC,2BAA2B,GAC5B,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { attachApplicationExit, attachApplicationLifecycle, attachWindowClose, attachWindowDropFile, attachWindowFocus, attachWindowFullscreen, attachWindowMove, attachWindowOrientation, attachWindowRenderContext, attachWindowRenderState, attachWindowResize, attachWindowVisibility, centerWindow, closeWindow, computeWindowDeviceTransform, createApplication, createApplicationWindow, detachApplicationExit, detachWindowClose, detachWindowDropFile, detachWindowFocus, detachWindowFullscreen, detachWindowMove, detachWindowOrientation, detachWindowRenderContext, detachWindowRenderState, detachWindowResize, detachWindowVisibility, disposeApplication, disposeApplicationWindow, enableApplicationLifecycleSignals, exitApplicationFullscreen, exitApplicationPointerLock, flashWindowFrame, focusWindow, forEachApplicationWindow, getApplicationFrameRate, getApplicationMainWindow, getApplicationWindows, getWindowBounds, getWindowDisplay, hideWindow, isApplicationRunning, lockApplicationPointer, maximizeWindow, minimizeWindow, openWindow, pauseApplicationLoop, prepareElementForInput, registerApplicationWindow, requestApplicationFullscreen, requestWindowAttention, requestWindowClose, restoreWindow, resumeApplicationLoop, setApplicationMainWindow, setWindowAlwaysOnTop, setWindowContentProtection, setWindowFullscreen, setWindowHasShadow, setWindowIcon, setWindowMaximumSize, setWindowMenuBarVisible, setWindowMinimumSize, setWindowOpacity, setWindowParent, setWindowPosition, setWindowProgress, setWindowResizable, setWindowSize, setWindowSkipTaskbar, setWindowTitle, showWindow, startApplicationLoop, stepApplicationLoop, stopApplicationLoop, unregisterApplicationWindow, } from './contract';
1
+ export { attachApplicationExit, attachApplicationLifecycle, attachApplicationRenderView, attachWindowClose, attachWindowDropFile, attachWindowFocus, attachWindowFullscreen, attachWindowMove, attachWindowOrientation, attachWindowRenderContext, attachWindowRenderState, attachWindowResize, attachWindowVisibility, centerWindow, closeWindow, computeWindowDeviceTransform, createApplication, createApplicationRenderView, createApplicationWindow, detachApplicationExit, detachApplicationRenderView, detachWindowClose, detachWindowDropFile, detachWindowFocus, detachWindowFullscreen, detachWindowMove, detachWindowOrientation, detachWindowRenderContext, detachWindowRenderState, detachWindowResize, detachWindowVisibility, disposeApplication, disposeApplicationWindow, enableApplicationLifecycleSignals, exitApplicationFullscreen, exitApplicationPointerLock, flashWindowFrame, focusWindow, forEachApplicationWindow, getApplicationFrameRate, getApplicationMainWindow, getApplicationWindows, getWindowBounds, getWindowDisplay, hideWindow, isApplicationRunning, lockApplicationPointer, maximizeWindow, minimizeWindow, openWindow, pauseApplicationLoop, prepareElementForInput, registerApplicationWindow, requestApplicationFullscreen, requestWindowAttention, requestWindowClose, restoreWindow, resumeApplicationLoop, setApplicationMainWindow, setWindowAlwaysOnTop, setWindowContentProtection, setWindowFullscreen, setWindowHasShadow, setWindowIcon, setWindowMaximumSize, setWindowMenuBarVisible, setWindowMinimumSize, setWindowOpacity, setWindowParent, setWindowPosition, setWindowProgress, setWindowResizable, setWindowSize, setWindowSkipTaskbar, setWindowTitle, showWindow, startApplicationLoop, stepApplicationLoop, stopApplicationLoop, synchronizeApplicationRenderView, unregisterApplicationWindow, } from './contract';
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACX,4BAA4B,EAC5B,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,iCAAiC,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,gBAAgB,EAChB,WAAW,EACX,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,4BAA4B,EAC5B,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACX,4BAA4B,EAC5B,iBAAiB,EACjB,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,EACrB,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,iCAAiC,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,gBAAgB,EAChB,WAAW,EACX,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,4BAA4B,EAC5B,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,gCAAgC,EAChC,2BAA2B,GAC5B,MAAM,YAAY,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "name": "@flighthq/application",
3
- "version": "0.3.0-next.906.07cea63",
3
+ "version": "0.3.0",
4
+ "author": "Joshua Granick and other contributors",
5
+ "license": "MIT",
4
6
  "repository": {
5
7
  "type": "git",
6
8
  "url": "https://github.com/flighthq/flight.git",
@@ -36,8 +38,9 @@
36
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
37
39
  },
38
40
  "dependencies": {
39
- "@flighthq/signals": "0.3.0-next.906.07cea63",
40
- "@flighthq/types": "0.3.0-next.906.07cea63"
41
+ "@flighthq/entity": "0.3.0",
42
+ "@flighthq/signals": "0.3.0",
43
+ "@flighthq/types": "0.3.0"
41
44
  },
42
45
  "devDependencies": {
43
46
  "typescript": "^5.3.0"
@@ -0,0 +1,110 @@
1
+ import { emitSignal } from '@flighthq/signals/contract';
2
+ import type { Matrix, RenderState, RenderTargetDimensions, Viewport } from '@flighthq/types/contract';
3
+ import { EntityRuntimeKey } from '@flighthq/types/contract';
4
+
5
+ import {
6
+ attachApplicationRenderView,
7
+ createApplicationRenderView,
8
+ detachApplicationRenderView,
9
+ synchronizeApplicationRenderView,
10
+ } from './applicationRenderView';
11
+ import { createApplicationWindow } from './window';
12
+
13
+ describe('attachApplicationRenderView', () => {
14
+ it('tracks window resize through one idempotent signal connection', () => {
15
+ const { resize, target, view, window } = makeView();
16
+ attachApplicationRenderView(view);
17
+ attachApplicationRenderView(view);
18
+ resize.mockClear();
19
+
20
+ window.width = 40;
21
+ emitSignal(window.onResize);
22
+
23
+ expect(resize).toHaveBeenCalledTimes(1);
24
+ expect(target.width).toBe(80);
25
+ });
26
+ });
27
+
28
+ describe('createApplicationRenderView', () => {
29
+ it('links the four independently accessible components on an Entity', () => {
30
+ const { state, target, view, viewport, window } = makeView();
31
+
32
+ expect(view.window).toBe(window);
33
+ expect(view.renderState).toBe(state);
34
+ expect(view.renderTarget).toBe(target);
35
+ expect(view.viewport).toBe(viewport);
36
+ expect(view[EntityRuntimeKey]).toBeDefined();
37
+ });
38
+ });
39
+
40
+ describe('detachApplicationRenderView', () => {
41
+ it('stops window-driven synchronization without releasing the linked components', () => {
42
+ const { resize, view, window } = makeView();
43
+ attachApplicationRenderView(view);
44
+ detachApplicationRenderView(view);
45
+ resize.mockClear();
46
+
47
+ window.width = 40;
48
+ emitSignal(window.onResize);
49
+
50
+ expect(resize).not.toHaveBeenCalled();
51
+ expect(view.window).toBe(window);
52
+ });
53
+ });
54
+
55
+ describe('synchronizeApplicationRenderView', () => {
56
+ it('writes device-pixel target, viewport, and render-state values from the window authority', () => {
57
+ const { resize, state, target, view, viewport, window } = makeView();
58
+ window.width = 100;
59
+ window.height = 60;
60
+ window.devicePixelRatio = 1.5;
61
+ viewport.x = 8;
62
+ viewport.y = 9;
63
+ resize.mockClear();
64
+
65
+ synchronizeApplicationRenderView(view);
66
+
67
+ expect(resize).toHaveBeenCalledWith(state, target, 150, 90);
68
+ expect(viewport).toMatchObject({ devicePixelRatio: 1.5, height: 90, width: 150, x: 0, y: 0 });
69
+ expect(state.pixelRatio).toBe(1.5);
70
+ expect(state.renderTransform2D).toMatchObject({ a: 1.5, b: 0, c: 0, d: 1.5, tx: 0, ty: 0 });
71
+ });
72
+
73
+ it('invokes the backend resize seam even when the requested extent is unchanged', () => {
74
+ const { resize, view } = makeView();
75
+ resize.mockClear();
76
+
77
+ synchronizeApplicationRenderView(view);
78
+
79
+ expect(resize).toHaveBeenCalledOnce();
80
+ });
81
+ });
82
+
83
+ function makeView() {
84
+ const window = createApplicationWindow();
85
+ window.width = 20;
86
+ window.height = 10;
87
+ window.devicePixelRatio = 2;
88
+ const state = {
89
+ pixelRatio: 1,
90
+ renderTransform2D: makeMatrix(),
91
+ } as RenderState;
92
+ const target: RenderTargetDimensions = { height: 1, width: 1 };
93
+ const viewport = {
94
+ devicePixelRatio: 1,
95
+ height: 1,
96
+ width: 1,
97
+ x: 0,
98
+ y: 0,
99
+ } as Viewport;
100
+ const resize = vi.fn((_state: RenderState, resizedTarget: RenderTargetDimensions, width: number, height: number) => {
101
+ resizedTarget.width = width;
102
+ resizedTarget.height = height;
103
+ });
104
+ const view = createApplicationRenderView(window, state, target, viewport, resize);
105
+ return { resize, state, target, view, viewport, window };
106
+ }
107
+
108
+ function makeMatrix(): Matrix {
109
+ return { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 } as Matrix;
110
+ }