oriverse-engine 0.1.9 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,33 +1,41 @@
1
1
 
2
- export function webRtcReadIndexedDbValue(dbName, storeName, key) {
3
- return new Promise((resolve, reject) => {
4
- const open = indexedDB.open(dbName);
5
- open.onupgradeneeded = () => {
6
- try {
7
- const db = open.result;
8
- if (!db.objectStoreNames.contains(storeName)) db.createObjectStore(storeName);
9
- } catch (error) {
10
- reject(error);
11
- }
12
- };
13
- open.onerror = () => reject(open.error || new Error('indexedDB open error'));
14
- open.onblocked = () => reject(new Error('indexedDB open blocked'));
15
- open.onsuccess = () => {
16
- const db = open.result;
17
- const close = () => { try { db.close(); } catch (_) {} };
18
- try {
19
- if (!db.objectStoreNames.contains(storeName)) {
20
- close();
21
- resolve(undefined);
22
- return;
23
- }
24
- const get = db.transaction(storeName, 'readonly').objectStore(storeName).get(key);
25
- get.onsuccess = () => { const value = get.result; close(); resolve(value); };
26
- get.onerror = () => { const error = get.error || new Error('indexedDB get error'); close(); reject(error); };
27
- } catch (error) {
28
- close();
29
- reject(error);
30
- }
31
- };
32
- });
33
- }
2
+ // relay candidates: relayProtocol is the TURN transport (udp/tcp/tls); protocol is always udp.
3
+ export function get_candidate_pairs(stats) {
4
+ const reports = Array.from(stats.values());
5
+ const byId = new Map(reports.map(s => [s.id, s]));
6
+ return reports.filter(s => s.type === 'candidate-pair').map(pair => {
7
+ const local = byId.get(pair.localCandidateId) || {};
8
+ const remote = byId.get(pair.remoteCandidateId) || {};
9
+ return {
10
+ state: pair.state || '', nominated: !!pair.nominated,
11
+ localType: local.candidateType || '', localProtocol: (local.candidateType === 'relay' && local.relayProtocol) || local.protocol || '',
12
+ remoteType: remote.candidateType || '', remoteProtocol: remote.protocol || '',
13
+ remoteIp: remote.address || remote.ip || '', remotePort: remote.port || 0,
14
+ requestsSent: pair.requestsSent || 0, requestsReceived: pair.requestsReceived || 0,
15
+ responsesSent: pair.responsesSent || 0, responsesReceived: pair.responsesReceived || 0,
16
+ bytesSent: pair.bytesSent || 0, bytesReceived: pair.bytesReceived || 0,
17
+ rttMs: pair.currentRoundTripTime != null ? pair.currentRoundTripTime * 1000 : -1
18
+ };
19
+ });
20
+ }
21
+ export function get_selected_candidate_info(stats) {
22
+ const reports = Array.from(stats.values());
23
+ const pair = reports.find(s => s.type === 'candidate-pair' && s.nominated);
24
+ if (!pair) return null;
25
+ const local = reports.find(s => s.type === 'local-candidate' && s.id === pair.localCandidateId);
26
+ const remote = reports.find(s => s.type === 'remote-candidate' && s.id === pair.remoteCandidateId);
27
+ if (!local || !remote) return null;
28
+ return {
29
+ state: pair.state || '',
30
+ localType: local.candidateType || '',
31
+ localAddr: `${local.address || local.ip || 'unknown'}:${local.port || 0}`,
32
+ localProtocol: (local.candidateType === 'relay' && local.relayProtocol) || local.protocol || '',
33
+ remoteType: remote.candidateType || '',
34
+ remoteAddr: `${remote.address || remote.ip || 'unknown'}:${remote.port || 0}`,
35
+ remoteProtocol: remote.protocol || '',
36
+ rttMs: pair.currentRoundTripTime != null ? pair.currentRoundTripTime * 1000 : -1,
37
+ txBytes: pair.bytesSent || 0,
38
+ rxBytes: pair.bytesReceived || 0,
39
+ availOutBps: pair.availableOutgoingBitrate != null ? pair.availableOutgoingBitrate : -1
40
+ };
41
+ }
@@ -1,22 +1,33 @@
1
1
 
2
- export function get_selected_candidate_info(stats) {
3
- const reports = Array.from(stats.values());
4
- const pair = reports.find(s => s.type === 'candidate-pair' && s.nominated);
5
- if (!pair) return null;
6
- const local = reports.find(s => s.type === 'local-candidate' && s.id === pair.localCandidateId);
7
- const remote = reports.find(s => s.type === 'remote-candidate' && s.id === pair.remoteCandidateId);
8
- if (!local || !remote) return null;
9
- return {
10
- state: pair.state || '',
11
- localType: local.candidateType || '',
12
- localAddr: `${local.address || local.ip || 'unknown'}:${local.port || 0}`,
13
- localProtocol: local.protocol || '',
14
- remoteType: remote.candidateType || '',
15
- remoteAddr: `${remote.address || remote.ip || 'unknown'}:${remote.port || 0}`,
16
- remoteProtocol: remote.protocol || '',
17
- rttMs: pair.currentRoundTripTime != null ? pair.currentRoundTripTime * 1000 : -1,
18
- txBytes: pair.bytesSent || 0,
19
- rxBytes: pair.bytesReceived || 0,
20
- availOutBps: pair.availableOutgoingBitrate != null ? pair.availableOutgoingBitrate : -1
21
- };
22
- }
2
+ export function webRtcReadIndexedDbValue(dbName, storeName, key) {
3
+ return new Promise((resolve, reject) => {
4
+ const open = indexedDB.open(dbName);
5
+ open.onupgradeneeded = () => {
6
+ try {
7
+ const db = open.result;
8
+ if (!db.objectStoreNames.contains(storeName)) db.createObjectStore(storeName);
9
+ } catch (error) {
10
+ reject(error);
11
+ }
12
+ };
13
+ open.onerror = () => reject(open.error || new Error('indexedDB open error'));
14
+ open.onblocked = () => reject(new Error('indexedDB open blocked'));
15
+ open.onsuccess = () => {
16
+ const db = open.result;
17
+ const close = () => { try { db.close(); } catch (_) {} };
18
+ try {
19
+ if (!db.objectStoreNames.contains(storeName)) {
20
+ close();
21
+ resolve(undefined);
22
+ return;
23
+ }
24
+ const get = db.transaction(storeName, 'readonly').objectStore(storeName).get(key);
25
+ get.onsuccess = () => { const value = get.result; close(); resolve(value); };
26
+ get.onerror = () => { const error = get.error || new Error('indexedDB get error'); close(); reject(error); };
27
+ } catch (error) {
28
+ close();
29
+ reject(error);
30
+ }
31
+ };
32
+ });
33
+ }
@@ -0,0 +1,54 @@
1
+ // Storage adapter only: eligibility, capacities, leases and retries are Rust-owned.
2
+ const empty = () => ({format:1,revision:0,batches:{},jobs:{},cooldowns:{}});
3
+ export function libraryQueueIo(command) {
4
+ const c = JSON.parse(command);
5
+ return new Promise((resolve,reject) => {
6
+ const open = indexedDB.open('oriverse_library_capture',1);
7
+ let cancelled = false;
8
+ const fail = e => { cancelled = true; reject(String(e?.message || e || 'library storage failed')); };
9
+ open.onupgradeneeded = () => {
10
+ open.result.createObjectStore('meta');
11
+ open.result.createObjectStore('blobs');
12
+ };
13
+ open.onblocked = () => fail('library storage upgrade blocked; close older editor tabs');
14
+ open.onerror = () => fail(open.error);
15
+ open.onsuccess = () => {
16
+ const db = open.result;
17
+ if(cancelled) { db.close(); return; }
18
+ db.onversionchange = () => db.close();
19
+ let tx, result;
20
+ try { tx = db.transaction(['meta','blobs'],c.op==='commit'?'readwrite':'readonly',c.op==='commit'?{durability:'strict'}:{}); }
21
+ catch(e) { db.close(); fail(e); return; }
22
+ tx.onabort = () => { db.close(); fail(tx.error || 'library transaction aborted'); };
23
+ tx.onerror = () => {}; // abort owns the result; request success is not commit.
24
+ tx.oncomplete = () => { db.close(); resolve(result); };
25
+ const meta=tx.objectStore('meta'),blobs=tx.objectStore('blobs');
26
+ if(c.op==='blob') {
27
+ const get=blobs.get(c.id);
28
+ get.onsuccess=()=>{ if(typeof get.result!=='string') { tx.abort(); return; } result=get.result; };
29
+ return;
30
+ }
31
+ const get=meta.get('index');
32
+ get.onsuccess=()=>{
33
+ try {
34
+ const old=get.result || empty();
35
+ if(c.op==='read') { result=JSON.stringify(old); return; }
36
+ if(c.op!=='commit' || old.format!==1) throw Error('unsupported library queue operation/schema');
37
+ if(old.revision!==c.expected) { result='false'; return; }
38
+ const live=new Set(c.live);
39
+ for(const [id,text] of Object.entries(c.writes)) if(live.has(id)) blobs.put(text,id);
40
+ // Old missing blobs must not block claiming/rejecting their own
41
+ // damaged records. Every newly admitted reference must exist.
42
+ const previous=new Set([...Object.values(old.jobs),...Object.values(old.batches)].map(r=>r.blob||r.source).filter(Boolean));
43
+ for(const id of live) { if(previous.has(id)) continue;
44
+ const check=blobs.getKey(id);
45
+ check.onsuccess=()=>{if(check.result===undefined) tx.abort();};
46
+ }
47
+ const cursor=c.collect===false?null:blobs.openKeyCursor();
48
+ if(cursor) cursor.onsuccess=()=>{const row=cursor.result;if(row){if(!live.has(row.key)) blobs.delete(row.key);row.continue();}};
49
+ meta.put(c.index,'index');result='true';
50
+ } catch(e) { tx.abort(); }
51
+ };
52
+ };
53
+ });
54
+ }
@@ -11,9 +11,9 @@ loader scripts or engine URLs.
11
11
 
12
12
  ## Before writing Weave, read the guide
13
13
 
14
- - https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/GAME_AUTHORING.md — authoring patterns + 3 complete tested
14
+ - https://unpkg.com/oriverse-engine@0.1.11/dist/GAME_AUTHORING.md — authoring patterns + 3 complete tested
15
15
  example games (coin collector, dodge blocks, target range) to pattern-match from.
16
- - https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/weave_documentation.txt — full language + API reference.
16
+ - https://unpkg.com/oriverse-engine@0.1.11/dist/weave_documentation.txt — full language + API reference.
17
17
 
18
18
  Key constraints: content must be fully procedural (primitive models `"cube"`,
19
19
  `"sphere"`, ..., `#mesh`, `#texture` — no market/network assets); units are cm with Z
@@ -11,9 +11,9 @@ loader scripts or engine URLs.
11
11
 
12
12
  ## Before writing Weave, read the guide
13
13
 
14
- - https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/GAME_AUTHORING.md — authoring patterns + 3 complete tested
14
+ - https://unpkg.com/oriverse-engine@0.1.11/dist/GAME_AUTHORING.md — authoring patterns + 3 complete tested
15
15
  example games (coin collector, dodge blocks, target range) to pattern-match from.
16
- - https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/weave_documentation.txt — full language + API reference.
16
+ - https://unpkg.com/oriverse-engine@0.1.11/dist/weave_documentation.txt — full language + API reference.
17
17
 
18
18
  Key constraints: content must be fully procedural (primitive models `"cube"`,
19
19
  `"sphere"`, ..., `#mesh`, `#texture` — no market/network assets); units are cm with Z
@@ -2,7 +2,7 @@
2
2
  This single small file IS the whole game: engine js/wasm come from the npm CDN, your game is
3
3
  the inline Weave source below. Serve from any static host (no COOP/COEP headers) or a
4
4
  plain `python -m http.server`; open in a WebGPU browser (Chrome/Edge).
5
- The engine version is pinned in the https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist urls below (injected from
5
+ The engine version is pinned in the https://unpkg.com/oriverse-engine@0.1.11/dist urls below (injected from
6
6
  npm_package/package.json at packaging time) — bump the @version with engine releases.
7
7
  Content must be fully procedural: primitives ("cube", "sphere", ...), #mesh, #texture,
8
8
  #particles. Market/network assets are unavailable and will hard-error. Google Fonts
@@ -46,18 +46,18 @@ object BlueCube {
46
46
 
47
47
  <!-- Shader prewarm: replays the build's pipeline manifest on a throwaway device during
48
48
  engine download dead-time (kills the first-view compile freeze). Fail-open. -->
49
- <script src="https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/prewarm.js"></script>
49
+ <script src="https://unpkg.com/oriverse-engine@0.1.11/dist/prewarm.js"></script>
50
50
  <!-- KTX2 texture transcoder sidecar (classic scripts; ktx_lib.wasm resolves relative to the script url). -->
51
- <script src="https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/ktx_lib.js"></script>
52
- <script src="https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/ktx_bridge.js"></script>
51
+ <script src="https://unpkg.com/oriverse-engine@0.1.11/dist/ktx_lib.js"></script>
52
+ <script src="https://unpkg.com/oriverse-engine@0.1.11/dist/ktx_bridge.js"></script>
53
53
  <script type="module">
54
- import initOriverse from "https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/oriverse_wgpu.js";
54
+ import initOriverse from "https://unpkg.com/oriverse-engine@0.1.11/dist/oriverse_wgpu.js";
55
55
  const setBoot = (t) => { const b = document.getElementById('oriverse-status-banner'); if (b) b.textContent = t; };
56
56
  (async () => {
57
57
  try {
58
58
  setBoot('starting engine…');
59
59
  // Artifact build: wasm-bindgen owns a private (non-shared) memory; no COOP/COEP needed.
60
- await initOriverse({ module_or_path: "https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/oriverse_wgpu_bg.wasm" });
60
+ await initOriverse({ module_or_path: "https://unpkg.com/oriverse-engine@0.1.11/dist/oriverse_wgpu_bg.wasm" });
61
61
  } catch (e) {
62
62
  const msg = (e && e.stack) ? e.stack : String(e);
63
63
  setBoot('WASM init failed:\n' + msg);
@@ -2,7 +2,7 @@
2
2
  This single small file IS the whole game: engine js/wasm come from the npm CDN, your game is
3
3
  the inline Weave source below. Serve from any static host (no COOP/COEP headers) or a
4
4
  plain `python -m http.server`; open in a WebGPU browser (Chrome/Edge).
5
- The engine version is pinned in the https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist urls below (injected from
5
+ The engine version is pinned in the https://unpkg.com/oriverse-engine@0.1.11/dist urls below (injected from
6
6
  npm_package/package.json at packaging time) — bump the @version with engine releases.
7
7
  Content must be fully procedural: primitives ("cube", "sphere", ...), #mesh, #texture,
8
8
  #particles. Market/network assets are unavailable and will hard-error. Google Fonts
@@ -46,18 +46,18 @@ object BlueCube {
46
46
 
47
47
  <!-- Shader prewarm: replays the build's pipeline manifest on a throwaway device during
48
48
  engine download dead-time (kills the first-view compile freeze). Fail-open. -->
49
- <script src="https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/prewarm.js"></script>
49
+ <script src="https://unpkg.com/oriverse-engine@0.1.11/dist/prewarm.js"></script>
50
50
  <!-- KTX2 texture transcoder sidecar (classic scripts; ktx_lib.wasm resolves relative to the script url). -->
51
- <script src="https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/ktx_lib.js"></script>
52
- <script src="https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/ktx_bridge.js"></script>
51
+ <script src="https://unpkg.com/oriverse-engine@0.1.11/dist/ktx_lib.js"></script>
52
+ <script src="https://unpkg.com/oriverse-engine@0.1.11/dist/ktx_bridge.js"></script>
53
53
  <script type="module">
54
- import initOriverse from "https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/oriverse_wgpu.js";
54
+ import initOriverse from "https://unpkg.com/oriverse-engine@0.1.11/dist/oriverse_wgpu.js";
55
55
  const setBoot = (t) => { const b = document.getElementById('oriverse-status-banner'); if (b) b.textContent = t; };
56
56
  (async () => {
57
57
  try {
58
58
  setBoot('starting engine…');
59
59
  // Artifact build: wasm-bindgen owns a private (non-shared) memory; no COOP/COEP needed.
60
- await initOriverse({ module_or_path: "https://cdn.jsdelivr.net/npm/oriverse-engine@0.1.9/dist/oriverse_wgpu_bg.wasm" });
60
+ await initOriverse({ module_or_path: "https://unpkg.com/oriverse-engine@0.1.11/dist/oriverse_wgpu_bg.wasm" });
61
61
  } catch (e) {
62
62
  const msg = (e && e.stack) ? e.stack : String(e);
63
63
  setBoot('WASM init failed:\n' + msg);