@worldmesh/runtime 0.2.2 → 0.2.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.
package/README.md CHANGED
@@ -25,9 +25,9 @@ The package is ESM only and targets ES2022 browsers. It touches `window` and
25
25
  If you already have a scene, a camera and a renderer, this is the whole job:
26
26
 
27
27
  ```js
28
- import { createWorldMesh } from '@worldmesh/runtime';
28
+ import { loadWorldMesh } from '@worldmesh/runtime';
29
29
 
30
- const world = createWorldMesh({
30
+ const world = await loadWorldMesh({
31
31
  scene,
32
32
  camera,
33
33
  renderer,
@@ -43,13 +43,22 @@ person with a consistent toggle, pointer-lock handling, touch controls on touch
43
43
  devices, immersive VR through the shared Enter VR control when WebXR is
44
44
  available, the shared overlay and portals between worlds.
45
45
 
46
- Removing the `createWorldMesh` call leaves you with the Three.js project you
46
+ Removing the `loadWorldMesh` call leaves you with the Three.js project you
47
47
  started with.
48
48
 
49
+ ## Staying current
50
+
51
+ `loadWorldMesh` runs the current runtime from worldmesh.net, with your copy of
52
+ Three.js, so fixes and improvements reach your world without a rebuild. If it
53
+ cannot be loaded, the copy in this package runs instead (in its own chunk,
54
+ downloaded only then). `createWorldMesh` takes the same options and always
55
+ runs the copy in this package, synchronously. Details:
56
+ [Staying current](https://github.com/eliaswillnat/worldmesh/blob/main/docs/compatibility.md#staying-current-loadworldmesh-and-createworldmesh).
57
+
49
58
  ## Visitors' own avatars (optional)
50
59
 
51
60
  ```js
52
- createWorldMesh({ scene, camera, renderer, avatar: { source: 'worldmesh' } });
61
+ loadWorldMesh({ scene, camera, renderer, avatar: { source: 'worldmesh' } });
53
62
  ```
54
63
 
55
64
  Visitors who picked a character in their WorldMesh Avatar Wallet (Sketchfab,
@@ -94,7 +103,8 @@ open other pages, as the page around your world is the hub's.
94
103
 
95
104
  | | |
96
105
  | --- | --- |
97
- | `createWorldMesh` | the one call a world needs |
106
+ | `loadWorldMesh` | the one call a world needs, kept current |
107
+ | `createWorldMesh`, `HOSTED_RUNTIME_URL` | the same call on the copy in this package; where `loadWorldMesh` loads from |
98
108
  | `Input`, `TouchControls`, `DEFAULT_KEYMAP`, `resolveKeymap` | the control convention |
99
109
  | `MovementController`, `CollisionWorld`, `DEFAULT_TUNING` | movement and collision |
100
110
  | `CameraRig`, `Player`, `createDefaultAvatar`, `AVATAR_EXPRESSIONS` | camera and figure |
@@ -0,0 +1,3 @@
1
+ export { createWorldMesh } from './core/worldmesh.js';
2
+ export { WORLDMESH_PROTOCOL, WORLDMESH_VERSION } from './version.js';
3
+ //# sourceMappingURL=hosted.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted.d.ts","sourceRoot":"","sources":["../src/hosted.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
package/dist/hosted.js ADDED
@@ -0,0 +1,5 @@
1
+ // The entry of the runtime worldmesh.net serves for loadWorldMesh
2
+ // (src/load.ts, scripts/build-hosted.mjs). Not part of the npm entry.
3
+ export { createWorldMesh } from './core/worldmesh.js';
4
+ export { WORLDMESH_PROTOCOL, WORLDMESH_VERSION } from './version.js';
5
+ //# sourceMappingURL=hosted.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted.js","sourceRoot":"","sources":["../src/hosted.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,sEAAsE;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.d.ts CHANGED
@@ -27,8 +27,8 @@ export type { PresenceOptions, SharedAvatar } from './net/presence.js';
27
27
  export { SharedAvatarLink, createShareVerifier, shareableAvatar } from './avatar/share.js';
28
28
  export { isOverAllowanceSignal, isRoomFullSignal, occupancyIsFull, occupancyProbeUrl, probeRoom, probeRoomFull, roomFullLabel } from './net/roomFull.js';
29
29
  export type { RoomProbe } from './net/roomFull.js';
30
- export declare const WORLDMESH_VERSION = "0.2.2";
31
- /** Bumped when the world-facing contract changes in an incompatible way. */
32
- export declare const WORLDMESH_PROTOCOL = 1;
30
+ export { WORLDMESH_PROTOCOL, WORLDMESH_VERSION } from './version.js';
31
+ export { HOSTED_RUNTIME_URL, loadWorldMesh } from './load.js';
32
+ export type { LoadWorldMeshOptions } from './load.js';
33
33
  export type { Abilities, AvatarOptions, InputAction, Keymap, MovementTuning, MultiplayerOptions, NetworkAdapter, PeerBody, PlayerOptions, PlayerState, PortalMode, PortalOptions, UiOptions, Vec3Tuple, ViewMode, ViewOptions, WorldMeshEvents, WorldMeshHandle, WorldMeshOptions, } from './types.js';
34
34
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -22,7 +22,6 @@ export { DEFAULT_PRESENCE_SERVER, Presence, createNameTag, createSpeechBubble }
22
22
  export { easeYaw } from './net/follow.js';
23
23
  export { SharedAvatarLink, createShareVerifier, shareableAvatar } from './avatar/share.js';
24
24
  export { isOverAllowanceSignal, isRoomFullSignal, occupancyIsFull, occupancyProbeUrl, probeRoom, probeRoomFull, roomFullLabel } from './net/roomFull.js';
25
- export const WORLDMESH_VERSION = '0.2.2';
26
- /** Bumped when the world-facing contract changes in an incompatible way. */
27
- export const WORLDMESH_PROTOCOL = 1;
25
+ export { WORLDMESH_PROTOCOL, WORLDMESH_VERSION } from './version.js';
26
+ export { HOSTED_RUNTIME_URL, loadWorldMesh } from './load.js';
28
27
  //# 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,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnI,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEhG,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGzJ,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AACzC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnI,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEhG,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGzJ,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
package/dist/load.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import type { WorldMeshHandle, WorldMeshOptions } from './types.js';
2
+ /**
3
+ * The current runtime for this protocol, served by WorldMesh
4
+ * (scripts/build-hosted.mjs). `loadWorldMesh` runs it, so a fix reaches a
5
+ * world the next time it is opened, without the world rebuilding.
6
+ */
7
+ export declare const HOSTED_RUNTIME_URL = "https://worldmesh.net/runtime/1/index.js";
8
+ export interface LoadWorldMeshOptions {
9
+ /** Run the runtime from here instead: a preview or a self-hosted copy. */
10
+ url?: string;
11
+ /** Give up on it after this many milliseconds and use the bundled copy. Default 8000. */
12
+ timeoutMs?: number;
13
+ /** false: always use the copy bundled with the world, as `createWorldMesh` does. */
14
+ hosted?: boolean;
15
+ }
16
+ /**
17
+ * `createWorldMesh`, kept current: runs the latest runtime WorldMesh serves for
18
+ * this protocol, with the world's own Three.js. If that cannot be loaded in
19
+ * time, or does not start, the copy bundled with the world runs instead, so
20
+ * the world works as it did when it was built.
21
+ */
22
+ export declare function loadWorldMesh(options: WorldMeshOptions, load?: LoadWorldMeshOptions): Promise<WorldMeshHandle>;
23
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGpE;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,6CAAiE,CAAC;AAYjG,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAWD;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,eAAe,CAAC,CAYxH"}
package/dist/load.js ADDED
@@ -0,0 +1,83 @@
1
+ import * as THREE from 'three';
2
+ import { WORLDMESH_PROTOCOL, WORLDMESH_VERSION } from './version.js';
3
+ /**
4
+ * The current runtime for this protocol, served by WorldMesh
5
+ * (scripts/build-hosted.mjs). `loadWorldMesh` runs it, so a fix reaches a
6
+ * world the next time it is opened, without the world rebuilding.
7
+ */
8
+ export const HOSTED_RUNTIME_URL = `https://worldmesh.net/runtime/${WORLDMESH_PROTOCOL}/index.js`;
9
+ /** Where the hosted runtime picks up the world's own Three.js (scripts/build-hosted.mjs). */
10
+ const THREE_KEY = Symbol.for('worldmesh.three');
11
+ const DEFAULT_TIMEOUT_MS = 8000;
12
+ /**
13
+ * The runtime is asked for at a new URL this often, which bounds how long a
14
+ * browser keeps an old one. Cache headers can't: worldmesh.net's Browser
15
+ * Cache TTL stretches any shorter max-age on a .js file to 4 hours.
16
+ */
17
+ const REFRESH_MS = 5 * 60_000;
18
+ const loading = new Map();
19
+ /**
20
+ * `createWorldMesh`, kept current: runs the latest runtime WorldMesh serves for
21
+ * this protocol, with the world's own Three.js. If that cannot be loaded in
22
+ * time, or does not start, the copy bundled with the world runs instead, so
23
+ * the world works as it did when it was built.
24
+ */
25
+ export async function loadWorldMesh(options, load = {}) {
26
+ const useHosted = load.hosted !== false && typeof window !== 'undefined';
27
+ const hosted = useHosted ? await hostedRuntime(load.url ?? HOSTED_RUNTIME_URL, load.timeoutMs ?? DEFAULT_TIMEOUT_MS) : null;
28
+ if (hosted) {
29
+ try {
30
+ return hosted.createWorldMesh(options);
31
+ }
32
+ catch (error) {
33
+ console.warn(`[WorldMesh] Runtime ${hosted.WORLDMESH_VERSION} did not start; using the copy bundled with this world (${WORLDMESH_VERSION}).`, error);
34
+ }
35
+ }
36
+ const { createWorldMesh } = await import('./core/worldmesh.js');
37
+ return createWorldMesh(options);
38
+ }
39
+ function hostedRuntime(url, timeoutMs) {
40
+ let pending = loading.get(url);
41
+ if (!pending) {
42
+ pending = importHosted(url, timeoutMs);
43
+ loading.set(url, pending);
44
+ }
45
+ return pending;
46
+ }
47
+ async function importHosted(url, timeoutMs) {
48
+ const shared = globalThis;
49
+ shared[THREE_KEY] ??= THREE;
50
+ let timer;
51
+ const timeout = new Promise((resolve) => {
52
+ timer = setTimeout(() => resolve(null), timeoutMs);
53
+ });
54
+ const fallback = `using the copy bundled with this world (${WORLDMESH_VERSION})`;
55
+ try {
56
+ // Left to the browser: bundlers must not try to resolve or inline it.
57
+ const imported = import(/* webpackIgnore: true */ /* @vite-ignore */ refreshed(url));
58
+ const runtime = await Promise.race([imported, timeout]);
59
+ if (!runtime) {
60
+ console.info(`[WorldMesh] ${url} took longer than ${timeoutMs} ms; ${fallback}.`);
61
+ return null;
62
+ }
63
+ if (runtime.WORLDMESH_PROTOCOL !== WORLDMESH_PROTOCOL || typeof runtime.createWorldMesh !== 'function') {
64
+ console.warn(`[WorldMesh] ${url} is not a protocol ${WORLDMESH_PROTOCOL} runtime; ${fallback}.`);
65
+ return null;
66
+ }
67
+ return runtime;
68
+ }
69
+ catch (error) {
70
+ console.info(`[WorldMesh] Could not load ${url}; ${fallback}.`, error);
71
+ return null;
72
+ }
73
+ finally {
74
+ clearTimeout(timer);
75
+ }
76
+ }
77
+ /** `url` with `v` set to the current REFRESH_MS slot, e.g. `…/index.js?v=5867331`. */
78
+ function refreshed(url) {
79
+ const fresh = new URL(url, globalThis.location?.href);
80
+ fresh.searchParams.set('v', String(Math.floor(Date.now() / REFRESH_MS)));
81
+ return fresh.href;
82
+ }
83
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAErE;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,iCAAiC,kBAAkB,WAAW,CAAC;AAEjG,6FAA6F;AAC7F,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAChD,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC;;;;GAIG;AACH,MAAM,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC;AAkB9B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAyB,EAAE,OAA6B,EAAE;IAC5F,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,MAAM,KAAK,WAAW,CAAC;IACzE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,kBAAkB,EAAE,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5H,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,OAAO,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,iBAAiB,2DAA2D,iBAAiB,IAAI,EAAE,KAAK,CAAC,CAAC;QACvJ,CAAC;IACH,CAAC;IACD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAChE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,GAAW,EAAE,SAAiB;IACnD,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,SAAiB;IACxD,MAAM,MAAM,GAAG,UAAgD,CAAC;IAChE,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC;IAC5B,IAAI,KAAgD,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,2CAA2C,iBAAiB,GAAG,CAAC;IACjF,IAAI,CAAC;QACH,sEAAsE;QACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,yBAAyB,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,CAA2B,CAAC;QAC/G,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,qBAAqB,SAAS,QAAQ,QAAQ,GAAG,CAAC,CAAC;YAClF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,kBAAkB,KAAK,kBAAkB,IAAI,OAAO,OAAO,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;YACvG,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,sBAAsB,kBAAkB,aAAa,QAAQ,GAAG,CAAC,CAAC;YACjG,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,8BAA8B,GAAG,KAAK,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,sFAAsF;AACtF,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtD,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const WORLDMESH_VERSION = "0.2.3";
2
+ /** Bumped when the world-facing contract changes in an incompatible way. */
3
+ export declare const WORLDMESH_PROTOCOL = 1;
4
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,UAAU,CAAC;AACzC,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,IAAI,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const WORLDMESH_VERSION = '0.2.3';
2
+ /** Bumped when the world-facing contract changes in an incompatible way. */
3
+ export const WORLDMESH_PROTOCOL = 1;
4
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AACzC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@worldmesh/runtime",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "The shared WorldMesh navigation runtime: controls, movement, camera, player, abilities and portals.",
5
5
  "keywords": [
6
6
  "worldmesh",
package/src/hosted.ts ADDED
@@ -0,0 +1,4 @@
1
+ // The entry of the runtime worldmesh.net serves for loadWorldMesh
2
+ // (src/load.ts, scripts/build-hosted.mjs). Not part of the npm entry.
3
+ export { createWorldMesh } from './core/worldmesh.js';
4
+ export { WORLDMESH_PROTOCOL, WORLDMESH_VERSION } from './version.js';
package/src/index.ts CHANGED
@@ -46,9 +46,9 @@ export { SharedAvatarLink, createShareVerifier, shareableAvatar } from './avatar
46
46
  export { isOverAllowanceSignal, isRoomFullSignal, occupancyIsFull, occupancyProbeUrl, probeRoom, probeRoomFull, roomFullLabel } from './net/roomFull.js';
47
47
  export type { RoomProbe } from './net/roomFull.js';
48
48
 
49
- export const WORLDMESH_VERSION = '0.2.2';
50
- /** Bumped when the world-facing contract changes in an incompatible way. */
51
- export const WORLDMESH_PROTOCOL = 1;
49
+ export { WORLDMESH_PROTOCOL, WORLDMESH_VERSION } from './version.js';
50
+ export { HOSTED_RUNTIME_URL, loadWorldMesh } from './load.js';
51
+ export type { LoadWorldMeshOptions } from './load.js';
52
52
 
53
53
  export type {
54
54
  Abilities,
package/src/load.ts ADDED
@@ -0,0 +1,103 @@
1
+ import * as THREE from 'three';
2
+ import type { WorldMeshHandle, WorldMeshOptions } from './types.js';
3
+ import { WORLDMESH_PROTOCOL, WORLDMESH_VERSION } from './version.js';
4
+
5
+ /**
6
+ * The current runtime for this protocol, served by WorldMesh
7
+ * (scripts/build-hosted.mjs). `loadWorldMesh` runs it, so a fix reaches a
8
+ * world the next time it is opened, without the world rebuilding.
9
+ */
10
+ export const HOSTED_RUNTIME_URL = `https://worldmesh.net/runtime/${WORLDMESH_PROTOCOL}/index.js`;
11
+
12
+ /** Where the hosted runtime picks up the world's own Three.js (scripts/build-hosted.mjs). */
13
+ const THREE_KEY = Symbol.for('worldmesh.three');
14
+ const DEFAULT_TIMEOUT_MS = 8000;
15
+ /**
16
+ * The runtime is asked for at a new URL this often, which bounds how long a
17
+ * browser keeps an old one. Cache headers can't: worldmesh.net's Browser
18
+ * Cache TTL stretches any shorter max-age on a .js file to 4 hours.
19
+ */
20
+ const REFRESH_MS = 5 * 60_000;
21
+
22
+ export interface LoadWorldMeshOptions {
23
+ /** Run the runtime from here instead: a preview or a self-hosted copy. */
24
+ url?: string;
25
+ /** Give up on it after this many milliseconds and use the bundled copy. Default 8000. */
26
+ timeoutMs?: number;
27
+ /** false: always use the copy bundled with the world, as `createWorldMesh` does. */
28
+ hosted?: boolean;
29
+ }
30
+
31
+ /** What the hosted runtime exports (src/hosted.ts). */
32
+ interface HostedRuntime {
33
+ createWorldMesh(options: WorldMeshOptions): WorldMeshHandle;
34
+ WORLDMESH_PROTOCOL: number;
35
+ WORLDMESH_VERSION: string;
36
+ }
37
+
38
+ const loading = new Map<string, Promise<HostedRuntime | null>>();
39
+
40
+ /**
41
+ * `createWorldMesh`, kept current: runs the latest runtime WorldMesh serves for
42
+ * this protocol, with the world's own Three.js. If that cannot be loaded in
43
+ * time, or does not start, the copy bundled with the world runs instead, so
44
+ * the world works as it did when it was built.
45
+ */
46
+ export async function loadWorldMesh(options: WorldMeshOptions, load: LoadWorldMeshOptions = {}): Promise<WorldMeshHandle> {
47
+ const useHosted = load.hosted !== false && typeof window !== 'undefined';
48
+ const hosted = useHosted ? await hostedRuntime(load.url ?? HOSTED_RUNTIME_URL, load.timeoutMs ?? DEFAULT_TIMEOUT_MS) : null;
49
+ if (hosted) {
50
+ try {
51
+ return hosted.createWorldMesh(options);
52
+ } catch (error) {
53
+ console.warn(`[WorldMesh] Runtime ${hosted.WORLDMESH_VERSION} did not start; using the copy bundled with this world (${WORLDMESH_VERSION}).`, error);
54
+ }
55
+ }
56
+ const { createWorldMesh } = await import('./core/worldmesh.js');
57
+ return createWorldMesh(options);
58
+ }
59
+
60
+ function hostedRuntime(url: string, timeoutMs: number): Promise<HostedRuntime | null> {
61
+ let pending = loading.get(url);
62
+ if (!pending) {
63
+ pending = importHosted(url, timeoutMs);
64
+ loading.set(url, pending);
65
+ }
66
+ return pending;
67
+ }
68
+
69
+ async function importHosted(url: string, timeoutMs: number): Promise<HostedRuntime | null> {
70
+ const shared = globalThis as unknown as Record<symbol, unknown>;
71
+ shared[THREE_KEY] ??= THREE;
72
+ let timer: ReturnType<typeof setTimeout> | undefined;
73
+ const timeout = new Promise<null>((resolve) => {
74
+ timer = setTimeout(() => resolve(null), timeoutMs);
75
+ });
76
+ const fallback = `using the copy bundled with this world (${WORLDMESH_VERSION})`;
77
+ try {
78
+ // Left to the browser: bundlers must not try to resolve or inline it.
79
+ const imported = import(/* webpackIgnore: true */ /* @vite-ignore */ refreshed(url)) as Promise<HostedRuntime>;
80
+ const runtime = await Promise.race([imported, timeout]);
81
+ if (!runtime) {
82
+ console.info(`[WorldMesh] ${url} took longer than ${timeoutMs} ms; ${fallback}.`);
83
+ return null;
84
+ }
85
+ if (runtime.WORLDMESH_PROTOCOL !== WORLDMESH_PROTOCOL || typeof runtime.createWorldMesh !== 'function') {
86
+ console.warn(`[WorldMesh] ${url} is not a protocol ${WORLDMESH_PROTOCOL} runtime; ${fallback}.`);
87
+ return null;
88
+ }
89
+ return runtime;
90
+ } catch (error) {
91
+ console.info(`[WorldMesh] Could not load ${url}; ${fallback}.`, error);
92
+ return null;
93
+ } finally {
94
+ clearTimeout(timer);
95
+ }
96
+ }
97
+
98
+ /** `url` with `v` set to the current REFRESH_MS slot, e.g. `…/index.js?v=5867331`. */
99
+ function refreshed(url: string): string {
100
+ const fresh = new URL(url, globalThis.location?.href);
101
+ fresh.searchParams.set('v', String(Math.floor(Date.now() / REFRESH_MS)));
102
+ return fresh.href;
103
+ }
package/src/version.ts ADDED
@@ -0,0 +1,3 @@
1
+ export const WORLDMESH_VERSION = '0.2.3';
2
+ /** Bumped when the world-facing contract changes in an incompatible way. */
3
+ export const WORLDMESH_PROTOCOL = 1;