@realitycollective/service-framework-iwsdk 1.0.0 → 1.0.1-preview.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,49 @@
1
+ # Changelog
2
+
3
+ Change log for the Reality Collective Service Framework for TypeScript. All packages in this repository are versioned and released together; the version below is the one carried by the `v<version>` release tag.
4
+
5
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Preview builds are not listed separately. The entry for a version accumulates while its previews are published, and is dated when that version is released.
6
+
7
+ ## [1.0.1]
8
+
9
+ Packaging, tooling and documentation. No runtime behaviour changed, and no public API was added, removed or altered.
10
+
11
+ ### Added
12
+
13
+ - Updated documentation packs for all projects.
14
+ - Improved release scripting and validation to improve delivery coherance.
15
+ - `scripts/release.config.json` - names the core package and the publish order, so the release tooling is identical across every Reality Collective TypeScript repository.
16
+ - A deploy stage in CI for `runtime-examples/*`, which were never built by CI before.
17
+ - `.gitattributes`, pinning the repository to LF and marking lockfiles as generated.
18
+
19
+ ### Changed
20
+
21
+ - CI and deployment merged into one workflow. They previously ran concurrently and repeated the same install, build, typecheck and test on every pull request. The deploy jobs now consume the artifacts the build job already produced.
22
+ - CI runs on every pull request regardless of target branch, and reports through merge queues.
23
+ - Published sourcemaps embed their sources (`inlineSources`), so stepping into the framework works for consumers. Declaration maps are no longer emitted, because they can only resolve against a `src` directory that is not shipped. Each package is roughly 12% smaller as a result.
24
+
25
+ ### Fixed
26
+
27
+ - `runtime-examples/*` white-screened with `Cannot read properties of null (reading 'useMemo')`. The Vite aliases point into `../../packages`, so the framework's React binding resolved React from the repository root while the app used its own copy. Two React instances leave the hook dispatcher null. Both example configs now set `resolve.dedupe`.
28
+
29
+ ### Removed
30
+
31
+ - Build output is no longer committed: 72 files under `packages/*/dist/` and 44 compiled `.js`, `.d.ts` and `.map` files that sat beside the sources in `packages/*/src/`. The test suite had been executing that committed JavaScript rather than the TypeScript, so coverage now measures `src/**/*.ts`.
32
+ - The generated `coverage/` report, which every test run rewrote with a new timestamp.
33
+
34
+ ## [1.0.0] - 2026-06-18
35
+
36
+ First release. Six packages, published together.
37
+
38
+ ### Added
39
+
40
+ - `@realitycollective/service-framework` - the core runtime: `ServiceManager` with dependency-ordered start and stop, `BaseService` and `BaseServiceModule`, type-safe resolution through `createServiceToken`, the scheduler channels, an event service for service-to-service messaging, profile-based configuration and environment description.
41
+ - `@realitycollective/service-framework-react` - `ServiceFrameworkProvider` plus the `useServiceManager`, `useService` and `useServices` hooks.
42
+ - `@realitycollective/service-framework-three` - `ThreeRenderLoopBridge`, connecting `renderer.setAnimationLoop()` to the `renderTick` channel. Accepts anything with `setAnimationLoop`, so a renderer or a test double both work.
43
+ - `@realitycollective/service-framework-client` - the React and three.js pieces wired together, so an app starts from a working runtime instead of assembling the scheduler and bridge by hand.
44
+ - `@realitycollective/service-framework-babylon` - Babylon.js bindings, connecting `engine.runRenderLoop()` to the same `renderTick` channel the three.js bridge uses. A service written against `BaseService<TConfig>` runs unchanged on either renderer.
45
+ - `@realitycollective/service-framework-iwsdk` - Meta IWSDK (WebXR) bindings. IWSDK owns its own render loop, so this package is a passive frame source: one system relays each frame to services and maps `visibilityState` onto focus and pause, so services pause when the headset comes off. Services depend only on `RuntimeAdapter`, never on `@iwsdk/core`.
46
+ - A worked example in every package's `Examples/` folder, and two runnable Vite apps in `runtime-examples/`.
47
+
48
+ [1.0.1]: https://github.com/realitycollective/com.realitycollective.service-framework.ts/compare/v1.0.0...HEAD
49
+ [1.0.0]: https://github.com/realitycollective/com.realitycollective.service-framework.ts/releases/tag/v1.0.0
package/Examples/main.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * service-framework-iwsdk minimal usage example
2
+ * service-framework-iwsdk - minimal usage example
3
3
  *
4
4
  * Mirrors the three.js / Babylon.js examples, but for the Meta IWSDK frame
5
5
  * source. IWSDK owns the render loop, so instead of a bridge that owns
@@ -39,7 +39,7 @@ import {
39
39
 
40
40
  // ---------------------------------------------------------------------------
41
41
  // A leaf service that owns its state and decays energy once per frame.
42
- // It depends only on RuntimeAdapter never on @iwsdk/core so it is portable
42
+ // It depends only on RuntimeAdapter - never on @iwsdk/core - so it is portable
43
43
  // and unit-testable headless against MockRuntimeAdapter.
44
44
  // ---------------------------------------------------------------------------
45
45
 
@@ -81,7 +81,7 @@ function createEnergyProfile(adapter: IWSDKAdapter): ServiceProfile {
81
81
  }
82
82
 
83
83
  // ---------------------------------------------------------------------------
84
- // Mock @iwsdk/core primitives swap for the real ones in an IWSDK app.
84
+ // Mock @iwsdk/core primitives - swap for the real ones in an IWSDK app.
85
85
  // ---------------------------------------------------------------------------
86
86
 
87
87
  const VISIBLE: string = "visible";
package/README.md CHANGED
@@ -8,9 +8,13 @@ Lets `@realitycollective/service-framework` services run inside the [IWSDK](http
8
8
 
9
9
  ## How it differs from the render-loop bridges
10
10
 
11
- `service-framework-three` and `service-framework-babylon` **own** the loop the bridge calls `renderer.setAnimationLoop(...)` / `engine.runRenderLoop(...)`. **IWSDK already owns the loop**, the XR session, input and the ECS, so this shim must *not* own one.
11
+ `service-framework-three` and `service-framework-babylon` **own** the render loop: the bridge calls `renderer.setAnimationLoop(...)` or `engine.runRenderLoop(...)` itself.
12
12
 
13
- Instead it is a **passive frame source**: a single IWSDK ECS system (`ServiceBridgeSystem`) is pumped one frame at a time by the engine, fans those frames out to subscribed services via `IWSDKAdapter`, and maps IWSDK's `visibilityState` to the manager's focus/pause signals (auto-pause when the headset comes off).
13
+ IWSDK is different. It already owns the render loop, the XR session, input, and its Entity Component System (ECS, the pattern IWSDK uses to organise scene objects and the code that runs on them). So this package must not start a loop of its own.
14
+
15
+ Instead it is a **passive frame source**: it receives frames rather than producing them.
16
+
17
+ IWSDK calls one system, `ServiceBridgeSystem`, once per frame. That system hands the frame to every subscribed service through `IWSDKAdapter`. It also maps IWSDK's `visibilityState` onto the manager's focus and pause signals, so services pause when the headset comes off.
14
18
 
15
19
  ```
16
20
  IWSDK World (render loop, XR session, input, ECS)
@@ -26,13 +30,13 @@ IWSDKAdapter (RuntimeAdapter) → onFrame fan-out → services
26
30
  ServiceManager → your SnapshotService graph
27
31
  ```
28
32
 
29
- **Invariant:** services depend only on `RuntimeAdapter`, never on `@iwsdk/core`. That is what keeps them unit-testable headless swap `IWSDKAdapter` for `MockRuntimeAdapter`.
33
+ **Invariant:** services depend only on `RuntimeAdapter`, never on `@iwsdk/core`. That is what keeps them unit-testable headless - swap `IWSDKAdapter` for `MockRuntimeAdapter`.
30
34
 
31
35
  ---
32
36
 
33
37
  ## No hard dependency on `@iwsdk/core`
34
38
 
35
- Like the three.js and Babylon.js bridges keep their renderer packages at arm's length, this package **never imports `@iwsdk/core`**. The IWSDK primitives the bridge needs `createSystem` and the `VisibilityState.Visible` value are passed in by the consumer (who owns IWSDK). This keeps the package tree-shakeable, version-tolerant across IWSDK `0.4.x`, and trivially mockable in unit tests.
39
+ Like the three.js and Babylon.js bridges keep their renderer packages at arm's length, this package **never imports `@iwsdk/core`**. The IWSDK primitives the bridge needs - `createSystem` and the `VisibilityState.Visible` value - are passed in by the consumer (who owns IWSDK). This keeps the package tree-shakeable, version-tolerant across IWSDK `0.4.x`, and trivially mockable in unit tests.
36
40
 
37
41
  `@iwsdk/core` is declared as an **optional peer dependency**.
38
42
 
@@ -67,13 +71,13 @@ world.registerSystem(
67
71
  );
68
72
  ```
69
73
 
70
- Game logic ticks **only while the session is visible/focused** in the browser / 2D preview the host app shows its own "Enter VR" gate and services stay idle until the player enters VR.
74
+ Game logic ticks **only while the session is visible/focused** - in the browser / 2D preview the host app shows its own "Enter VR" gate and services stay idle until the player enters VR.
71
75
 
72
76
  ---
73
77
 
74
78
  ## Services own their state: `SnapshotService`
75
79
 
76
- `SnapshotService<TConfig, TSnapshot>` is the "services own state" base one immutable snapshot plus pub/sub. Subscribers receive the current value immediately, then every publish. It has **no IWSDK dependency**.
80
+ `SnapshotService<TConfig, TSnapshot>` is the "services own state" base - one immutable snapshot plus pub/sub. Subscribers receive the current value immediately, then every publish. It has **no IWSDK dependency**.
77
81
 
78
82
  ```typescript
79
83
  import { SnapshotService, type ServiceContext, type RuntimeAdapter } from "@realitycollective/service-framework-iwsdk";
@@ -123,7 +127,7 @@ No `@iwsdk/core` import appears anywhere in the test.
123
127
 
124
128
  ## Capabilities
125
129
 
126
- `AdapterCapabilities` (`immersive`, `handTracking`, `planeDetection`, `passthrough`) is what gating services read (`adapter.getCapabilities()`) or subscribe to (`adapter.onCapabilitiesChange(cb)` mirrors `onFrame`, so gates don't poll every frame). Refine them with `adapter.setCapabilities({ ... })`.
130
+ `AdapterCapabilities` (`immersive`, `handTracking`, `planeDetection`, `passthrough`) is what gating services read (`adapter.getCapabilities()`) or subscribe to (`adapter.onCapabilitiesChange(cb)` - mirrors `onFrame`, so gates don't poll every frame). Refine them with `adapter.setCapabilities({ ... })`.
127
131
 
128
132
  > **One gap still to close:** deriving capabilities from the live `XRSession` (enabled features, blend mode, hand input sources) is intentionally left to the host wiring because it needs IWSDK session internals. Until that is wired, the adapter reports `DEFAULT_CAPABILITIES` (all-false) and gating services behave conservatively. `IWSDKAdapter.getWorld()` exposes the bound world as the source for that derivation, and `onCapabilitiesChange` is the notification channel for when it lands.
129
133
 
@@ -166,6 +170,11 @@ The example mocks the `@iwsdk/core` primitives so it runs in plain Node.js: it d
166
170
 
167
171
  ---
168
172
 
173
+ ## Live examples
174
+
175
+ - Weather client walkthrough: **[service-framework-weather.pages.dev](https://service-framework-weather.pages.dev)**
176
+ - Client runtime reference: **[service-framework-client-app.pages.dev](https://service-framework-client-app.pages.dev)**
177
+
169
178
  ## License
170
179
 
171
180
  MIT
@@ -17,4 +17,3 @@ export interface ServiceRuntime {
17
17
  * `(adapter) => createServiceProfile("my-app", [...])`.
18
18
  */
19
19
  export declare function startServiceRuntime(world: IWSDKWorldLike, profileFactory: (adapter: IWSDKAdapter) => ServiceProfile): ServiceRuntime;
20
- //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAqB,EACrB,cAAyD;IAEzD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;IACrC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAqB,EACrB,cAAyD;IAEzD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;IACrC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC","sourcesContent":["/**\n * Non-React bootstrap for an IWSDK client: build the adapter, stand up the\n * ServiceManager from the app's profile, and start it. The caller registers\n * {@link makeServiceBridgeSystem} with the IWSDK world to pump per-frame ticks.\n */\nimport { ServiceManager } from \"@realitycollective/service-framework\";\nimport type { ServiceProfile } from \"@realitycollective/service-framework\";\nimport { IWSDKAdapter } from \"./iwsdk-adapter.js\";\nimport type { IWSDKWorldLike } from \"./iwsdk-host.js\";\n\nexport interface ServiceRuntime {\n readonly manager: ServiceManager;\n readonly adapter: IWSDKAdapter;\n}\n\n/**\n * @param world the IWSDK world (owns the loop / XR session).\n * @param profileFactory builds the app service graph from the adapter, e.g.\n * `(adapter) => createServiceProfile(\"my-app\", [...])`.\n */\nexport function startServiceRuntime(\n world: IWSDKWorldLike,\n profileFactory: (adapter: IWSDKAdapter) => ServiceProfile,\n): ServiceRuntime {\n const adapter = new IWSDKAdapter(world);\n const manager = new ServiceManager();\n manager.initializeProfile(profileFactory(adapter));\n manager.start();\n return { manager, adapter };\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -9,4 +9,3 @@ export { makeServiceBridgeSystem } from "./service-bridge-system.js";
9
9
  export type { ServiceBridgeSystemOptions } from "./service-bridge-system.js";
10
10
  export { startServiceRuntime } from "./bootstrap.js";
11
11
  export type { ServiceRuntime } from "./bootstrap.js";
12
- //# sourceMappingURL=index.d.ts.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAkB5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAGrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAkB5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAGrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["export { DEFAULT_CAPABILITIES } from \"./runtime-adapter.js\";\nexport type {\n AdapterCapabilities,\n CapabilitiesListener,\n FrameInfo,\n FrameListener,\n RuntimeAdapter,\n Unsubscribe,\n} from \"./runtime-adapter.js\";\n\nexport type {\n CreateSystemLike,\n IWSDKSignalLike,\n IWSDKSystemConstructor,\n IWSDKSystemLike,\n IWSDKWorldLike,\n} from \"./iwsdk-host.js\";\n\nexport { IWSDKAdapter } from \"./iwsdk-adapter.js\";\nexport { MockRuntimeAdapter } from \"./mock-runtime-adapter.js\";\n\nexport { SnapshotService } from \"./snapshot-service.js\";\nexport type { ServiceContext, SnapshotListener } from \"./snapshot-service.js\";\n\nexport { makeServiceBridgeSystem } from \"./service-bridge-system.js\";\nexport type { ServiceBridgeSystemOptions } from \"./service-bridge-system.js\";\n\nexport { startServiceRuntime } from \"./bootstrap.js\";\nexport type { ServiceRuntime } from \"./bootstrap.js\";\n"]}
@@ -19,7 +19,7 @@ export declare class IWSDKAdapter implements RuntimeAdapter {
19
19
  /**
20
20
  * The IWSDK `World` this adapter is bound to. Reserved for capability
21
21
  * derivation from the live XR session (see the package README "Capabilities"
22
- * section) the one piece still to be wired to the real IWSDK session API.
22
+ * section) - the one piece still to be wired to the real IWSDK session API.
23
23
  */
24
24
  getWorld(): IWSDKWorldLike;
25
25
  /** Refine capabilities once the XR session reports them; notifies subscribers. */
@@ -27,4 +27,3 @@ export declare class IWSDKAdapter implements RuntimeAdapter {
27
27
  /** Called once per frame by the ECS bridge system. */
28
28
  emitFrame(timestamp: number, delta: number): void;
29
29
  }
30
- //# sourceMappingURL=iwsdk-adapter.d.ts.map
@@ -32,7 +32,7 @@ export class IWSDKAdapter {
32
32
  /**
33
33
  * The IWSDK `World` this adapter is bound to. Reserved for capability
34
34
  * derivation from the live XR session (see the package README "Capabilities"
35
- * section) the one piece still to be wired to the real IWSDK session API.
35
+ * section) - the one piece still to be wired to the real IWSDK session API.
36
36
  */
37
37
  getWorld() {
38
38
  return this.world;
@@ -1 +1 @@
1
- {"version":3,"file":"iwsdk-adapter.js","sourceRoot":"","sources":["../src/iwsdk-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,oBAAoB,GAOrB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,OAAO,YAAY;IAKa;IAJnB,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC1C,qBAAqB,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjE,YAAY,GAAwB,oBAAoB,CAAC;IAEjE,YAAoC,KAAqB;QAArB,UAAK,GAAL,KAAK,CAAgB;IAAG,CAAC;IAEtD,OAAO,CAAC,QAAuB;QACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC,CAAC;IACJ,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEM,oBAAoB,CAAC,QAA8B;QACxD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,QAAQ;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,kFAAkF;IAC3E,eAAe,CAAC,YAA0C;QAC/D,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,YAAY,EAAE,CAAC;QAC9D,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,sDAAsD;IAC/C,SAAS,CAAC,SAAiB,EAAE,KAAa;QAC/C,MAAM,KAAK,GAAc,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC9C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;CACF"}
1
+ {"version":3,"file":"iwsdk-adapter.js","sourceRoot":"","sources":["../src/iwsdk-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,oBAAoB,GAOrB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,OAAO,YAAY;IAKa;IAJnB,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC1C,qBAAqB,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjE,YAAY,GAAwB,oBAAoB,CAAC;IAEjE,YAAoC,KAAqB;QAArB,UAAK,GAAL,KAAK,CAAgB;IAAG,CAAC;IAEtD,OAAO,CAAC,QAAuB;QACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC,CAAC;IACJ,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEM,oBAAoB,CAAC,QAA8B;QACxD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,QAAQ;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,kFAAkF;IAC3E,eAAe,CAAC,YAA0C;QAC/D,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,YAAY,EAAE,CAAC;QAC9D,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,sDAAsD;IAC/C,SAAS,CAAC,SAAiB,EAAE,KAAa;QAC/C,MAAM,KAAK,GAAc,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC9C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;CACF","sourcesContent":["/**\n * IWSDK implementation of {@link RuntimeAdapter}. IWSDK owns the render loop, so\n * the adapter is a passive fan-out: the `ServiceBridgeSystem` (a normal IWSDK\n * system) calls {@link IWSDKAdapter.emitFrame} once per frame and the adapter\n * notifies subscribed services. Capabilities are refined from the XR session via\n * {@link IWSDKAdapter.setCapabilities}.\n */\nimport {\n DEFAULT_CAPABILITIES,\n type AdapterCapabilities,\n type CapabilitiesListener,\n type FrameInfo,\n type FrameListener,\n type RuntimeAdapter,\n type Unsubscribe,\n} from \"./runtime-adapter.js\";\nimport type { IWSDKWorldLike } from \"./iwsdk-host.js\";\n\nexport class IWSDKAdapter implements RuntimeAdapter {\n private readonly frameListeners = new Set<FrameListener>();\n private readonly capabilitiesListeners = new Set<CapabilitiesListener>();\n private capabilities: AdapterCapabilities = DEFAULT_CAPABILITIES;\n\n public constructor(private readonly world: IWSDKWorldLike) {}\n\n public onFrame(listener: FrameListener): Unsubscribe {\n this.frameListeners.add(listener);\n return () => {\n this.frameListeners.delete(listener);\n };\n }\n\n public getCapabilities(): AdapterCapabilities {\n return this.capabilities;\n }\n\n public onCapabilitiesChange(listener: CapabilitiesListener): Unsubscribe {\n this.capabilitiesListeners.add(listener);\n return () => {\n this.capabilitiesListeners.delete(listener);\n };\n }\n\n /**\n * The IWSDK `World` this adapter is bound to. Reserved for capability\n * derivation from the live XR session (see the package README \"Capabilities\"\n * section) - the one piece still to be wired to the real IWSDK session API.\n */\n public getWorld(): IWSDKWorldLike {\n return this.world;\n }\n\n /** Refine capabilities once the XR session reports them; notifies subscribers. */\n public setCapabilities(capabilities: Partial<AdapterCapabilities>): void {\n this.capabilities = { ...this.capabilities, ...capabilities };\n this.capabilitiesListeners.forEach((listener) => listener(this.capabilities));\n }\n\n /** Called once per frame by the ECS bridge system. */\n public emitFrame(timestamp: number, delta: number): void {\n const frame: FrameInfo = { timestamp, delta };\n this.frameListeners.forEach((listener) => listener(frame));\n }\n}\n"]}
@@ -28,4 +28,3 @@ export type IWSDKSystemConstructor = new (...args: unknown[]) => IWSDKSystemLike
28
28
  * empty schema because it queries no ECS components.
29
29
  */
30
30
  export type CreateSystemLike = (schema?: Record<string, unknown>) => IWSDKSystemConstructor;
31
- //# sourceMappingURL=iwsdk-host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"iwsdk-host.js","sourceRoot":"","sources":["../src/iwsdk-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
1
+ {"version":3,"file":"iwsdk-host.js","sourceRoot":"","sources":["../src/iwsdk-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG","sourcesContent":["/**\n * Structural contracts for the slice of `@iwsdk/core` this shim touches.\n *\n * Mirrors the approach the three.js and Babylon.js bridges take with their\n * engine packages: the shim never imports `@iwsdk/core` directly, so it builds\n * and unit-tests with no IWSDK / WebXR / headset present, and any 0.4.x IWSDK\n * works without bumping this package. Consumers pass the real `World`,\n * `createSystem` and `VisibilityState.Visible` value through\n * {@link makeServiceBridgeSystem}.\n */\n\n/** IWSDK exposes reactive values as `{ value }` signals; the bridge only reads `.value`. */\nexport interface IWSDKSignalLike<TValue> {\n readonly value: TValue;\n}\n\n/** The slice of an IWSDK `World` the bridge reads: the visibility signal. */\nexport interface IWSDKWorldLike<TVisibility = unknown> {\n readonly visibilityState: IWSDKSignalLike<TVisibility>;\n}\n\n/** The per-frame entry point IWSDK invokes on a registered system. */\nexport interface IWSDKSystemLike {\n update(delta: number, time: number): void;\n}\n\n/** Constructor shape of the base class IWSDK's `createSystem` returns. */\nexport type IWSDKSystemConstructor = new (...args: unknown[]) => IWSDKSystemLike;\n\n/**\n * Structural shape of IWSDK's `createSystem` factory. `createSystem(schema)`\n * returns a base system class that the bridge extends; the bridge passes an\n * empty schema because it queries no ECS components.\n */\nexport type CreateSystemLike = (schema?: Record<string, unknown>) => IWSDKSystemConstructor;\n"]}
@@ -18,4 +18,3 @@ export declare class MockRuntimeAdapter implements RuntimeAdapter {
18
18
  /** Drive a frame in tests. */
19
19
  emitFrame(timestamp?: number, delta?: number): void;
20
20
  }
21
- //# sourceMappingURL=mock-runtime-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock-runtime-adapter.js","sourceRoot":"","sources":["../src/mock-runtime-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,oBAAoB,GAMrB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,OAAO,kBAAkB;IACZ,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC1C,qBAAqB,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjE,YAAY,CAAsB;IAE1C,YAAmB,eAA6C,EAAE;QAChE,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,YAAY,EAAE,CAAC;IACnE,CAAC;IAEM,OAAO,CAAC,QAAuB;QACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC,CAAC;IACJ,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEM,oBAAoB,CAAC,QAA8B;QACxD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC,CAAC;IACJ,CAAC;IAED,0DAA0D;IACnD,eAAe,CAAC,YAA0C;QAC/D,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,YAAY,EAAE,CAAC;QAC9D,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,8BAA8B;IACvB,SAAS,CAAC,SAAS,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE;QAC5C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;CACF"}
1
+ {"version":3,"file":"mock-runtime-adapter.js","sourceRoot":"","sources":["../src/mock-runtime-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,oBAAoB,GAMrB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,OAAO,kBAAkB;IACZ,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC1C,qBAAqB,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjE,YAAY,CAAsB;IAE1C,YAAmB,eAA6C,EAAE;QAChE,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,YAAY,EAAE,CAAC;IACnE,CAAC;IAEM,OAAO,CAAC,QAAuB;QACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC,CAAC;IACJ,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEM,oBAAoB,CAAC,QAA8B;QACxD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC,CAAC;IACJ,CAAC;IAED,0DAA0D;IACnD,eAAe,CAAC,YAA0C;QAC/D,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,YAAY,EAAE,CAAC;QAC9D,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,8BAA8B;IACvB,SAAS,CAAC,SAAS,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE;QAC5C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;CACF","sourcesContent":["/**\n * Headless {@link RuntimeAdapter} for tests. Services run against this with no\n * IWSDK / renderer / headset; tests drive the loop by calling\n * {@link MockRuntimeAdapter.emitFrame} and refine gating with\n * {@link MockRuntimeAdapter.setCapabilities}.\n */\nimport {\n DEFAULT_CAPABILITIES,\n type AdapterCapabilities,\n type CapabilitiesListener,\n type FrameListener,\n type RuntimeAdapter,\n type Unsubscribe,\n} from \"./runtime-adapter.js\";\n\nexport class MockRuntimeAdapter implements RuntimeAdapter {\n private readonly frameListeners = new Set<FrameListener>();\n private readonly capabilitiesListeners = new Set<CapabilitiesListener>();\n private capabilities: AdapterCapabilities;\n\n public constructor(capabilities: Partial<AdapterCapabilities> = {}) {\n this.capabilities = { ...DEFAULT_CAPABILITIES, ...capabilities };\n }\n\n public onFrame(listener: FrameListener): Unsubscribe {\n this.frameListeners.add(listener);\n return () => {\n this.frameListeners.delete(listener);\n };\n }\n\n public getCapabilities(): AdapterCapabilities {\n return this.capabilities;\n }\n\n public onCapabilitiesChange(listener: CapabilitiesListener): Unsubscribe {\n this.capabilitiesListeners.add(listener);\n return () => {\n this.capabilitiesListeners.delete(listener);\n };\n }\n\n /** Refine capabilities in tests; notifies subscribers. */\n public setCapabilities(capabilities: Partial<AdapterCapabilities>): void {\n this.capabilities = { ...this.capabilities, ...capabilities };\n this.capabilitiesListeners.forEach((listener) => listener(this.capabilities));\n }\n\n /** Drive a frame in tests. */\n public emitFrame(timestamp = 0, delta = 1 / 72): void {\n this.frameListeners.forEach((listener) => listener({ timestamp, delta }));\n }\n}\n"]}
@@ -36,4 +36,3 @@ export interface RuntimeAdapter {
36
36
  */
37
37
  onCapabilitiesChange(listener: CapabilitiesListener): Unsubscribe;
38
38
  }
39
- //# sourceMappingURL=runtime-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-adapter.js","sourceRoot":"","sources":["../src/runtime-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,MAAM,CAAC,MAAM,oBAAoB,GAAwB;IACvD,SAAS,EAAE,KAAK;IAChB,YAAY,EAAE,KAAK;IACnB,cAAc,EAAE,KAAK;IACrB,WAAW,EAAE,KAAK;CACnB,CAAC"}
1
+ {"version":3,"file":"runtime-adapter.js","sourceRoot":"","sources":["../src/runtime-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH,MAAM,CAAC,MAAM,oBAAoB,GAAwB;IACvD,SAAS,EAAE,KAAK;IAChB,YAAY,EAAE,KAAK;IACnB,cAAc,EAAE,KAAK;IACrB,WAAW,EAAE,KAAK;CACnB,CAAC","sourcesContent":["/**\n * Runtime adapter contract (IWSDK-only, minimal frame-source).\n *\n * Trimmed to what an IWSDK-only client needs: a per-frame fan-out and\n * capability flags. IWSDK already owns sessions, input and rendering, so the\n * adapter deliberately does NOT re-abstract those. {@link MockRuntimeAdapter}\n * implements this same interface so services can be unit-tested headless.\n */\n\nexport type Unsubscribe = () => void;\n\nexport interface FrameInfo {\n /** Frame timestamp in milliseconds (IWSDK system `time`). */\n readonly timestamp: number;\n /** Seconds elapsed since the previous frame (IWSDK system `delta`). */\n readonly delta: number;\n}\n\n/** XR capabilities services gate on (e.g. passthrough requires `immersive`). */\nexport interface AdapterCapabilities {\n readonly immersive: boolean;\n readonly handTracking: boolean;\n readonly planeDetection: boolean;\n readonly passthrough: boolean;\n}\n\nexport const DEFAULT_CAPABILITIES: AdapterCapabilities = {\n immersive: false,\n handTracking: false,\n planeDetection: false,\n passthrough: false,\n};\n\nexport type FrameListener = (frame: FrameInfo) => void;\nexport type CapabilitiesListener = (capabilities: AdapterCapabilities) => void;\n\nexport interface RuntimeAdapter {\n /** Subscribe to per-frame updates; returns an unsubscribe handle. */\n onFrame(listener: FrameListener): Unsubscribe;\n /** Current XR capabilities (may change once a session is established). */\n getCapabilities(): AdapterCapabilities;\n /**\n * Subscribe to capability changes; returns an unsubscribe handle. Mirrors\n * {@link RuntimeAdapter.onFrame} so gating services can react to a session\n * coming online instead of polling {@link RuntimeAdapter.getCapabilities}\n * every frame.\n */\n onCapabilitiesChange(listener: CapabilitiesListener): Unsubscribe;\n}\n"]}
@@ -11,7 +11,7 @@
11
11
  * This is the only place the engine loop touches the service layer; services
12
12
  * themselves never see IWSDK. The IWSDK primitives (`createSystem` and the
13
13
  * `VisibilityState.Visible` value) are injected so this package never imports
14
- * `@iwsdk/core` mirroring how the three.js / Babylon.js bridges keep their
14
+ * `@iwsdk/core` - mirroring how the three.js / Babylon.js bridges keep their
15
15
  * engine packages at arm's length.
16
16
  */
17
17
  import type { ServiceManager } from "@realitycollective/service-framework";
@@ -43,4 +43,3 @@ export declare function makeServiceBridgeSystem<TVisibility>(options: ServiceBri
43
43
  update(delta: number, time: number): void;
44
44
  };
45
45
  };
46
- //# sourceMappingURL=service-bridge-system.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-bridge-system.js","sourceRoot":"","sources":["../src/service-bridge-system.ts"],"names":[],"mappings":"AAqCA;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAgD;IAEhD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IACxE,IAAI,WAAgC,CAAC;IAErC,OAAO,MAAM,mBAAoB,SAAQ,YAAY,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,KAAa,EAAE,IAAY;YAChD,MAAM,OAAO,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,KAAK,YAAY,CAAC;YAE7D,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;gBAC5B,WAAW,GAAG,OAAO,CAAC;gBACtB,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBACjC,OAAO,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,CAAC;YAED,oEAAoE;YACpE,8DAA8D;YAC9D,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"service-bridge-system.js","sourceRoot":"","sources":["../src/service-bridge-system.ts"],"names":[],"mappings":"AAqCA;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAgD;IAEhD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IACxE,IAAI,WAAgC,CAAC;IAErC,OAAO,MAAM,mBAAoB,SAAQ,YAAY,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,KAAa,EAAE,IAAY;YAChD,MAAM,OAAO,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,KAAK,YAAY,CAAC;YAE7D,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;gBAC5B,WAAW,GAAG,OAAO,CAAC;gBACtB,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBACjC,OAAO,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,CAAC;YAED,oEAAoE;YACpE,8DAA8D;YAC9D,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/**\n * The single ECS-services bridge. A normal IWSDK system that, each frame:\n * - maps IWSDK `visibilityState` to manager focus/pause (auto-pause when the\n * headset is removed), and\n * - drives the adapter's per-frame fan-out via {@link IWSDKAdapter.emitFrame}.\n *\n * Game logic is only ticked while the session is visible/focused: in the\n * browser / 2D preview the host app shows its own gate (e.g. an \"Enter VR\"\n * overlay) and the services stay idle until the player enters VR.\n *\n * This is the only place the engine loop touches the service layer; services\n * themselves never see IWSDK. The IWSDK primitives (`createSystem` and the\n * `VisibilityState.Visible` value) are injected so this package never imports\n * `@iwsdk/core` - mirroring how the three.js / Babylon.js bridges keep their\n * engine packages at arm's length.\n */\nimport type { ServiceManager } from \"@realitycollective/service-framework\";\nimport type { IWSDKAdapter } from \"./iwsdk-adapter.js\";\nimport type { CreateSystemLike, IWSDKWorldLike } from \"./iwsdk-host.js\";\n\nexport interface ServiceBridgeSystemOptions<TVisibility = unknown> {\n /** The passive frame source fanned out to services. */\n readonly adapter: IWSDKAdapter;\n /** The service manager whose focus/pause signals are driven by visibility. */\n readonly manager: ServiceManager;\n /** The IWSDK world whose `visibilityState` is read each frame. */\n readonly world: IWSDKWorldLike<TVisibility>;\n /** IWSDK's `createSystem` factory (from `@iwsdk/core`). */\n readonly createSystem: CreateSystemLike;\n /**\n * The `VisibilityState` value that means the session is visible/focused\n * (IWSDK `VisibilityState.Visible`). The bridge ticks services only while\n * `world.visibilityState.value === visibleState`.\n */\n readonly visibleState: TVisibility;\n}\n\n/**\n * Builds the IWSDK `ServiceBridgeSystem` class. Register the returned class with\n * the world (`world.registerSystem(makeServiceBridgeSystem({ ... }))`); IWSDK\n * then calls its `update(delta, time)` once per frame.\n */\nexport function makeServiceBridgeSystem<TVisibility>(\n options: ServiceBridgeSystemOptions<TVisibility>,\n) {\n const { adapter, manager, world, createSystem, visibleState } = options;\n let lastFocused: boolean | undefined;\n\n return class ServiceBridgeSystem extends createSystem({}) {\n public override update(delta: number, time: number): void {\n const focused = world.visibilityState.value === visibleState;\n\n if (focused !== lastFocused) {\n lastFocused = focused;\n manager.emitFocusChange(focused);\n manager.emitPauseChange({ paused: !focused });\n }\n\n // Only run game logic while visible/focused; idle in the 2D/browser\n // preview and while the headset is removed (visible-blurred).\n if (focused) {\n adapter.emitFrame(time, delta);\n }\n }\n };\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  /**
2
- * `SnapshotService` base the "services own state" pattern. A snapshot service
2
+ * `SnapshotService` base - the "services own state" pattern. A snapshot service
3
3
  * owns one immutable state object and a pub/sub list: consumers (other services,
4
4
  * or the ECS presentation layer) subscribe and receive the current value
5
5
  * immediately, then every subsequent publish.
6
6
  *
7
- * It has no IWSDK dependency only `@realitycollective/service-framework` so
7
+ * It has no IWSDK dependency - only `@realitycollective/service-framework` - so
8
8
  * services that extend it stay unit-testable headless against
9
9
  * {@link MockRuntimeAdapter}.
10
10
  */
@@ -25,4 +25,3 @@ export declare abstract class SnapshotService<TConfig, TSnapshot> extends BaseSe
25
25
  protected publishSnapshot(snapshot: TSnapshot): void;
26
26
  protected updateSnapshot(partial: Partial<TSnapshot>): void;
27
27
  }
28
- //# sourceMappingURL=snapshot-service.d.ts.map
@@ -1,10 +1,10 @@
1
1
  /**
2
- * `SnapshotService` base the "services own state" pattern. A snapshot service
2
+ * `SnapshotService` base - the "services own state" pattern. A snapshot service
3
3
  * owns one immutable state object and a pub/sub list: consumers (other services,
4
4
  * or the ECS presentation layer) subscribe and receive the current value
5
5
  * immediately, then every subsequent publish.
6
6
  *
7
- * It has no IWSDK dependency only `@realitycollective/service-framework` so
7
+ * It has no IWSDK dependency - only `@realitycollective/service-framework` - so
8
8
  * services that extend it stay unit-testable headless against
9
9
  * {@link MockRuntimeAdapter}.
10
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-service.js","sourceRoot":"","sources":["../src/snapshot-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAYnE,MAAM,OAAgB,eAAoC,SAAQ,WAAoB;IAC1E,QAAQ,CAAY;IACb,SAAS,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEpE,YAAsB,OAAgC,EAAE,eAA0B;QAChF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC;IAClC,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAEM,SAAS,CAAC,QAAqC;QACpD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAES,eAAe,CAAC,QAAmB;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChE,CAAC;IAES,cAAc,CAAC,OAA2B;QAClD,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;CACF"}
1
+ {"version":3,"file":"snapshot-service.js","sourceRoot":"","sources":["../src/snapshot-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAYnE,MAAM,OAAgB,eAAoC,SAAQ,WAAoB;IAC1E,QAAQ,CAAY;IACb,SAAS,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEpE,YAAsB,OAAgC,EAAE,eAA0B;QAChF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC;IAClC,CAAC;IAEM,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAEM,SAAS,CAAC,QAAqC;QACpD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAES,eAAe,CAAC,QAAmB;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChE,CAAC;IAES,cAAc,CAAC,OAA2B;QAClD,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;CACF","sourcesContent":["/**\n * `SnapshotService` base - the \"services own state\" pattern. A snapshot service\n * owns one immutable state object and a pub/sub list: consumers (other services,\n * or the ECS presentation layer) subscribe and receive the current value\n * immediately, then every subsequent publish.\n *\n * It has no IWSDK dependency - only `@realitycollective/service-framework` - so\n * services that extend it stay unit-testable headless against\n * {@link MockRuntimeAdapter}.\n */\nimport { BaseService } from \"@realitycollective/service-framework\";\n\n/**\n * The activation-context type a service constructor receives. Aliased here so\n * every service uses one consistent, framework-correct shape (matches the\n * `useFactory(context)` parameter the ServiceManager passes).\n */\nexport type ServiceContext<TConfig = unknown> =\n ConstructorParameters<typeof BaseService<TConfig>>[0];\n\nexport type SnapshotListener<TSnapshot> = (snapshot: TSnapshot) => void;\n\nexport abstract class SnapshotService<TConfig, TSnapshot> extends BaseService<TConfig> {\n protected snapshot: TSnapshot;\n private readonly listeners = new Set<SnapshotListener<TSnapshot>>();\n\n protected constructor(context: ServiceContext<TConfig>, initialSnapshot: TSnapshot) {\n super(context);\n this.snapshot = initialSnapshot;\n }\n\n public getSnapshot(): TSnapshot {\n return this.snapshot;\n }\n\n public subscribe(listener: SnapshotListener<TSnapshot>): () => void {\n this.listeners.add(listener);\n listener(this.snapshot);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n protected publishSnapshot(snapshot: TSnapshot): void {\n this.snapshot = snapshot;\n this.listeners.forEach((listener) => listener(this.snapshot));\n }\n\n protected updateSnapshot(partial: Partial<TSnapshot>): void {\n this.publishSnapshot({ ...this.snapshot, ...partial });\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@realitycollective/service-framework-iwsdk",
3
- "version": "1.0.0",
3
+ "version": "1.0.1-preview.0",
4
4
  "description": "Meta IWSDK (WebXR) frame-source bindings for the Reality Collective TypeScript Service Framework.",
5
5
  "author": "Reality Collective",
6
6
  "license": "MIT",
@@ -16,7 +16,7 @@
16
16
  "files": [
17
17
  "dist",
18
18
  "Examples",
19
- "README.md"
19
+ "CHANGELOG.md"
20
20
  ],
21
21
  "keywords": [
22
22
  "service-framework",
@@ -44,7 +44,7 @@
44
44
  }
45
45
  },
46
46
  "dependencies": {
47
- "@realitycollective/service-framework": "^1.0.0"
47
+ "@realitycollective/service-framework": "^1.0.1-preview.0"
48
48
  },
49
49
  "scripts": {
50
50
  "build": "tsc -p tsconfig.build.json",
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,cAAc,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,cAAc,GACxD,cAAc,CAMhB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,SAAS,EACT,aAAa,EACb,cAAc,EACd,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,YAAY,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAE7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"iwsdk-adapter.d.ts","sourceRoot":"","sources":["../src/iwsdk-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAEzB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,qBAAa,YAAa,YAAW,cAAc;IAK9B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;IAC3D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAmC;IACzE,OAAO,CAAC,YAAY,CAA6C;gBAE7B,KAAK,EAAE,cAAc;IAElD,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,WAAW;IAO7C,eAAe,IAAI,mBAAmB;IAItC,oBAAoB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,WAAW;IAOxE;;;;OAIG;IACI,QAAQ,IAAI,cAAc;IAIjC,kFAAkF;IAC3E,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAKxE,sDAAsD;IAC/C,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CAIzD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"iwsdk-host.d.ts","sourceRoot":"","sources":["../src/iwsdk-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,4FAA4F;AAC5F,MAAM,WAAW,eAAe,CAAC,MAAM;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,6EAA6E;AAC7E,MAAM,WAAW,cAAc,CAAC,WAAW,GAAG,OAAO;IACnD,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;CACxD;AAED,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED,0EAA0E;AAC1E,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,eAAe,CAAC;AAEjF;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,sBAAsB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock-runtime-adapter.d.ts","sourceRoot":"","sources":["../src/mock-runtime-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAE9B,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;IAC3D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAmC;IACzE,OAAO,CAAC,YAAY,CAAsB;gBAEvB,YAAY,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAI3D,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,WAAW;IAO7C,eAAe,IAAI,mBAAmB;IAItC,oBAAoB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,WAAW;IAOxE,0DAA0D;IACnD,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAKxE,8BAA8B;IACvB,SAAS,CAAC,SAAS,SAAI,EAAE,KAAK,SAAS,GAAG,IAAI;CAGtD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime-adapter.d.ts","sourceRoot":"","sources":["../src/runtime-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,MAAM,WAAW,SAAS;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,eAAO,MAAM,oBAAoB,EAAE,mBAKlC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;AACvD,MAAM,MAAM,oBAAoB,GAAG,CAAC,YAAY,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAE/E,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,WAAW,CAAC;IAC9C,0EAA0E;IAC1E,eAAe,IAAI,mBAAmB,CAAC;IACvC;;;;;OAKG;IACH,oBAAoB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,WAAW,CAAC;CACnE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-bridge-system.d.ts","sourceRoot":"","sources":["../src/service-bridge-system.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAExE,MAAM,WAAW,0BAA0B,CAAC,WAAW,GAAG,OAAO;IAC/D,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IAC5C,2DAA2D;IAC3D,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EACjD,OAAO,EAAE,0BAA0B,CAAC,WAAW,CAAC;;sBAMhB,MAAM,QAAQ,MAAM,GAAG,IAAI;;EAgB5D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshot-service.d.ts","sourceRoot":"","sources":["../src/snapshot-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,OAAO,GAAG,OAAO,IAC1C,qBAAqB,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAExD,MAAM,MAAM,gBAAgB,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,SAAS,KAAK,IAAI,CAAC;AAExE,8BAAsB,eAAe,CAAC,OAAO,EAAE,SAAS,CAAE,SAAQ,WAAW,CAAC,OAAO,CAAC;IACpF,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;IAEpE,SAAS,aAAa,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,SAAS;IAK3E,WAAW,IAAI,SAAS;IAIxB,SAAS,CAAC,QAAQ,EAAE,gBAAgB,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI;IAQnE,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAKpD,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;CAG5D"}