@bitmagic/cli 0.1.83-dev.2 → 0.1.83-dev.4
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 +34 -3
- package/assets/metahuman/src/work/metahuman/MetaHumanMaterials.ts +4 -0
- package/assets/metahuman/src/work/metahuman/StudioEnvironment.ts +4 -0
- package/assets/optimizing-assets/SKILL.md +3 -2
- package/assets/optimizing-assets/references/tools.md +1 -1
- package/dist/assets/vxl-summary.js +1 -1
- package/dist/assets/vxl-summary.js.map +1 -1
- package/dist/cli.d.ts +9 -0
- package/dist/commands/steam-upload.js +6 -4
- package/dist/commands/steam-upload.js.map +1 -1
- package/dist/commands/steam.js +4 -2
- package/dist/commands/steam.js.map +1 -1
- package/dist/commands/upgrade.d.ts +18 -0
- package/dist/commands/upgrade.js +94 -1
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/config/environments.d.ts +1 -1
- package/dist/editor/animation-preview-page.js +20 -0
- package/dist/editor/animation-preview-page.js.map +1 -1
- package/dist/editor/asset-viewer.js +4 -0
- package/dist/editor/asset-viewer.js.map +1 -1
- package/dist/editor/design.d.ts +2 -2
- package/dist/editor/design.js +2 -2
- package/dist/editor/design.js.map +1 -1
- package/dist/editor/hud-replay-page.js +5 -0
- package/dist/editor/hud-replay-page.js.map +1 -1
- package/dist/editor/recording-sink.js +1 -1
- package/dist/editor/runtime-token.d.ts +61 -0
- package/dist/editor/runtime-token.js +74 -0
- package/dist/editor/runtime-token.js.map +1 -0
- package/dist/editor/save.d.ts +2 -2
- package/dist/editor/server.js +39 -12
- package/dist/editor/server.js.map +1 -1
- package/dist/editor/shell-page.d.ts +12 -8
- package/dist/editor/shell-page.js +69 -10
- package/dist/editor/shell-page.js.map +1 -1
- package/dist/forge/browser-host.d.ts +1 -1
- package/dist/forge/browser-host.js +14 -11
- package/dist/forge/browser-host.js.map +1 -1
- package/dist/generate/model.js +4 -1
- package/dist/generate/model.js.map +1 -1
- package/dist/generate/prop.js +4 -1
- package/dist/generate/prop.js.map +1 -1
- package/dist/http/signed-upload.d.ts +6 -4
- package/dist/http/signed-upload.js +37 -14
- package/dist/http/signed-upload.js.map +1 -1
- package/dist/mobile/rewrite-shim.js +1 -1
- package/dist/project/published-three.js +4 -6
- package/dist/project/published-three.js.map +1 -1
- package/dist/publish/game-exchange.js +9 -3
- package/dist/publish/game-exchange.js.map +1 -1
- package/dist/scaffold/blender-level-skill-files.js +2 -2
- package/dist/scaffold/game-migration.d.ts +88 -0
- package/dist/scaffold/game-migration.js +492 -0
- package/dist/scaffold/game-migration.js.map +1 -0
- package/dist/scaffold/import-codemod.d.ts +51 -0
- package/dist/scaffold/import-codemod.js +117 -0
- package/dist/scaffold/import-codemod.js.map +1 -0
- package/dist/scaffold/legacy-game-baselines.d.ts +14 -0
- package/dist/scaffold/legacy-game-baselines.js +218 -0
- package/dist/scaffold/legacy-game-baselines.js.map +1 -0
- package/dist/scaffold/project-files.d.ts +1 -1
- package/dist/scaffold/project-files.js +13 -47
- package/dist/scaffold/project-files.js.map +1 -1
- package/dist/scaffold/project.js +8 -17
- package/dist/scaffold/project.js.map +1 -1
- package/dist/smoke/run.js +8 -1
- package/dist/smoke/run.js.map +1 -1
- package/dist/steam/art-generate.js +2 -1
- package/dist/steam/art-generate.js.map +1 -1
- package/dist/steam/art-render.js.map +1 -1
- package/dist/steam/art.js +1 -1
- package/dist/steam/art.js.map +1 -1
- package/dist/steam/check.js.map +1 -1
- package/dist/steam/electron-cache.d.ts +1 -1
- package/dist/steam/electron-cache.js +2 -2
- package/dist/steam/electron-cache.js.map +1 -1
- package/dist/steam/fuses.js +1 -1
- package/dist/steam/fuses.js.map +1 -1
- package/dist/steam/media.js +6 -2
- package/dist/steam/media.js.map +1 -1
- package/dist/steam/package-windows.d.ts +1 -2
- package/dist/steam/package-windows.js +1 -2
- package/dist/steam/package-windows.js.map +1 -1
- package/dist/steam/paths.d.ts +0 -2
- package/dist/steam/paths.js +0 -1
- package/dist/steam/paths.js.map +1 -1
- package/dist/steam/portal.js +1 -1
- package/dist/steam/portal.js.map +1 -1
- package/dist/steam/raster.d.ts +0 -1
- package/dist/steam/raster.js +1 -1
- package/dist/steam/raster.js.map +1 -1
- package/dist/steam/store-copy.d.ts +0 -1
- package/dist/steam/store-copy.js +3 -10
- package/dist/steam/store-copy.js.map +1 -1
- package/dist/steam/tags.js +6 -3
- package/dist/steam/tags.js.map +1 -1
- package/dist/theme/kernel.d.ts +14 -0
- package/dist/theme/kernel.js +15 -0
- package/dist/theme/kernel.js.map +1 -0
- package/dist/theme/theme-io.js +11 -16
- package/dist/theme/theme-io.js.map +1 -1
- package/dist/trailer/record-session.d.ts +1 -1
- package/dist/trailer/record-session.js +5 -8
- package/dist/trailer/record-session.js.map +1 -1
- package/dist/trailer/vendored-recorder.d.ts +8 -0
- package/dist/trailer/vendored-recorder.js +26 -0
- package/dist/trailer/vendored-recorder.js.map +1 -0
- package/dist/vendor/hud-theme/catalog.js +71 -0
- package/dist/vendor/hud-theme/engine/hud/ThemeTokens.js +115 -0
- package/dist/{theme/theme-color-math.js → vendor/hud-theme/engine/hud/colorMath.js} +13 -14
- package/dist/vendor/hud-theme/engine/hud/decorations.js +179 -0
- package/dist/vendor/hud-theme/engine/hud/fonts.js +147 -0
- package/dist/vendor/hud-theme/engine/hud/presets.js +80 -0
- package/dist/vendor/hud-theme/engine/hud/resolveWorldTheme.js +66 -0
- package/dist/vendor/hud-theme/engine/hud/themes/bitmagic.js +29 -0
- package/dist/vendor/hud-theme/engine/hud/themes/nexus.js +69 -0
- package/dist/vendor/hud-theme/engine/hud/themes/racing.js +57 -0
- package/dist/vendor/hud-theme/engine/hud/themes/rift-raider.js +63 -0
- package/dist/vendor/hud-theme/engine/hud/themes/simulator.js +55 -0
- package/dist/vendor/hud-theme/engine/hud/themes/village-keep.js +108 -0
- package/dist/vendor/hud-theme/engine/hud/validateTheme.js +535 -0
- package/dist/vendor/hud-theme/index.js +26 -0
- package/dist/{theme/theme-merge.js → vendor/hud-theme/merge.js} +0 -1
- package/dist/{theme/theme-report.js → vendor/hud-theme/report.js} +8 -9
- package/dist/{theme/theme-stored.js → vendor/hud-theme/stored.js} +6 -9
- package/dist/{theme/theme-validate.js → vendor/hud-theme/validate-strict.js} +102 -164
- package/dist/verify/browser.d.ts +6 -0
- package/dist/verify/browser.js +30 -3
- package/dist/verify/browser.js.map +1 -1
- package/dist/verify/categories.d.ts +1 -1
- package/dist/verify/categories.js +1 -0
- package/dist/verify/categories.js.map +1 -1
- package/dist/verify/classify.d.ts +7 -0
- package/dist/verify/classify.js +7 -0
- package/dist/verify/classify.js.map +1 -1
- package/dist/verify/hud-theme.d.ts +19 -14
- package/dist/verify/hud-theme.js +23 -17
- package/dist/verify/hud-theme.js.map +1 -1
- package/dist/verify/mobile-parity.d.ts +1 -1
- package/dist/verify/mobile-parity.js +1 -1
- package/dist/verify/model-downloads.d.ts +47 -0
- package/dist/verify/model-downloads.js +127 -0
- package/dist/verify/model-downloads.js.map +1 -0
- package/dist/verify/start.d.ts +3 -2
- package/dist/verify/start.js +1 -1
- package/dist/verify/start.js.map +1 -1
- package/package.json +11 -7
- package/dist/theme/hud-theme-catalog.d.ts +0 -235
- package/dist/theme/hud-theme-catalog.js +0 -389
- package/dist/theme/hud-theme-catalog.js.map +0 -1
- package/dist/theme/theme-color-math.d.ts +0 -21
- package/dist/theme/theme-color-math.js.map +0 -1
- package/dist/theme/theme-merge.d.ts +0 -36
- package/dist/theme/theme-merge.js.map +0 -1
- package/dist/theme/theme-report.d.ts +0 -28
- package/dist/theme/theme-report.js.map +0 -1
- package/dist/theme/theme-stored.d.ts +0 -21
- package/dist/theme/theme-stored.js.map +0 -1
- package/dist/theme/theme-validate.d.ts +0 -41
- package/dist/theme/theme-validate.js.map +0 -1
|
@@ -8,7 +8,7 @@ export interface Environment {
|
|
|
8
8
|
* deployment and needs no token.
|
|
9
9
|
*
|
|
10
10
|
* The engine can pick this host itself, but only from the page's own hostname
|
|
11
|
-
* (`game/src/engine/environment.ts`), and localhost tells it nothing — it reads as
|
|
11
|
+
* (`game/src/engine/runtime/environment.ts`), and localhost tells it nothing — it reads as
|
|
12
12
|
* neither prod nor dev and so always resolves to the dev cluster. Here the project's
|
|
13
13
|
* pinned environment is known, so `bitmagic dev` hands the answer to the engine
|
|
14
14
|
* rather than letting it guess (see the LOAD_GAME `gameServerUrl` in editor/server.ts).
|
|
@@ -16,6 +16,11 @@
|
|
|
16
16
|
* An engine too old to carry `debug/AnimationPreview.js` fails the module import; the catch
|
|
17
17
|
* posts `ASSET_PREVIEW_FAILED`, and the shell shows the reason — same contract as the asset
|
|
18
18
|
* viewer, one handler on the shell side for both.
|
|
19
|
+
*
|
|
20
|
+
* The page runs against the PROJECT's vendored engine, whatever its version, so its engine
|
|
21
|
+
* imports keep the old paths (a pre-move engine resolves them natively, a newer one through its
|
|
22
|
+
* compat shim) and the move codemod leaves this file alone:
|
|
23
|
+
* engine-move: ignore-file
|
|
19
24
|
*/
|
|
20
25
|
import { CDN_IMPORTS } from '../scaffold/project-files.js';
|
|
21
26
|
import { importMapEntries } from '../scaffold/aliases.js';
|
|
@@ -254,6 +259,16 @@ async function ensureKtx2Support() {
|
|
|
254
259
|
}
|
|
255
260
|
}
|
|
256
261
|
|
|
262
|
+
/** The vendored baseline's block character factory, or undefined on an engine without one. */
|
|
263
|
+
async function baselineCharacterFactory() {
|
|
264
|
+
try {
|
|
265
|
+
return (await import('baseline/BitmagicPlayerCharacter.js')).bitmagicCharacterFactory;
|
|
266
|
+
} catch (error) {
|
|
267
|
+
console.warn('This engine has no baseline/BitmagicPlayerCharacter.js; its preview picks the character.', error);
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
257
272
|
try {
|
|
258
273
|
await ensureKtx2Support();
|
|
259
274
|
// A clip NAME resolves through the engine's table; an explicit url is an asset of the
|
|
@@ -265,6 +280,11 @@ try {
|
|
|
265
280
|
// below with the browser's own "failed to fetch" instead of a blank page.
|
|
266
281
|
var mod = await import('debug/AnimationPreview.js');
|
|
267
282
|
var handle = await mod.startAnimationPreview({
|
|
283
|
+
// The block mascot the clip plays on, handed in so the engine's preview need not reach up
|
|
284
|
+
// into the baseline itself (its deprecated fallback). An engine whose baseline still lives
|
|
285
|
+
// under genres/ has no such module: the import fails, and that engine's preview picks its
|
|
286
|
+
// own mascot, as it always did.
|
|
287
|
+
characterFactory: await baselineCharacterFactory(),
|
|
268
288
|
animationUrl: animationUrl,
|
|
269
289
|
container: document.getElementById('stage'),
|
|
270
290
|
characterHeight: mod.DEFAULT_ANIMATION_PREVIEW_OPTIONS.characterHeight,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animation-preview-page.js","sourceRoot":"","sources":["../../src/editor/animation-preview-page.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"animation-preview-page.js","sourceRoot":"","sources":["../../src/editor/animation-preview-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQtE,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,MAAM,GAAG,oBAAoB,QAAQ,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAC/B,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CACzF,CAAC;IACF,sFAAsF;IACtF,qFAAqF;IACrF,OAAO,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAoC;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACrF,OAAO;;;;;EAKP,kBAAkB;;EAElB,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2EnB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4MR,CAAC;AACF,CAAC"}
|
|
@@ -110,6 +110,10 @@ function countTriangles(root) {
|
|
|
110
110
|
/**
|
|
111
111
|
* Specifiers held in variables on purpose: a literal would make tsc try to resolve a module that
|
|
112
112
|
* only exists on the other origin at runtime. The import map on the page resolves them.
|
|
113
|
+
* `engine/VoxelObject.js` is the pre-move path on purpose: it is a shim in engines after the move
|
|
114
|
+
* (to `engine/voxel/object/`) and the module itself in every engine before it, so the viewer works
|
|
115
|
+
* against whichever engine the project vendors. The move codemod leaves this file alone:
|
|
116
|
+
* engine-move: ignore-file
|
|
113
117
|
*/
|
|
114
118
|
const VOXEL_OBJECT_MODULE = 'engine/VoxelObject.js';
|
|
115
119
|
const GLTF_LOADER_SUPPORT_MODULE = 'engine/loaders/GltfLoaderSupport.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-viewer.js","sourceRoot":"","sources":["../../src/editor/asset-viewer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"asset-viewer.js","sourceRoot":"","sources":["../../src/editor/asset-viewer.ts"],"names":[],"mappings":"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"}
|
package/dist/editor/design.d.ts
CHANGED
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
* look at — so it follows `creator/DESIGN.md` the way the Creator and the in-engine editor do.
|
|
6
6
|
* It cannot import the Creator's `BitmagicDesign.css`: this package ships on npm on its own, and
|
|
7
7
|
* both pages are strings assembled in TypeScript rather than bundled documents. So it re-declares
|
|
8
|
-
* the same tokens, exactly as `game/src/
|
|
8
|
+
* the same tokens, exactly as `game/src/engine/ui/theme/designTokens.ts` does for the engine's editor
|
|
9
9
|
* dialogs — three copies of the palette, one source of truth in DESIGN.md.
|
|
10
10
|
*
|
|
11
11
|
* **No backticks in anything exported here.** These constants are interpolated into the pages'
|
|
12
12
|
* template literals, and a backtick would end the literal somewhere else entirely (there is a test
|
|
13
13
|
* for it: `__tests__/shell-page.test.ts`).
|
|
14
14
|
*/
|
|
15
|
-
/** Hex tokens for TS-side use — the same set `game/src/
|
|
15
|
+
/** Hex tokens for TS-side use — the same set `game/src/engine/ui/theme/designTokens.ts` exposes. */
|
|
16
16
|
export declare const BM: {
|
|
17
17
|
readonly bg: "#0b0b0b";
|
|
18
18
|
readonly surface: "#181818";
|
package/dist/editor/design.js
CHANGED
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
* look at — so it follows `creator/DESIGN.md` the way the Creator and the in-engine editor do.
|
|
6
6
|
* It cannot import the Creator's `BitmagicDesign.css`: this package ships on npm on its own, and
|
|
7
7
|
* both pages are strings assembled in TypeScript rather than bundled documents. So it re-declares
|
|
8
|
-
* the same tokens, exactly as `game/src/
|
|
8
|
+
* the same tokens, exactly as `game/src/engine/ui/theme/designTokens.ts` does for the engine's editor
|
|
9
9
|
* dialogs — three copies of the palette, one source of truth in DESIGN.md.
|
|
10
10
|
*
|
|
11
11
|
* **No backticks in anything exported here.** These constants are interpolated into the pages'
|
|
12
12
|
* template literals, and a backtick would end the literal somewhere else entirely (there is a test
|
|
13
13
|
* for it: `__tests__/shell-page.test.ts`).
|
|
14
14
|
*/
|
|
15
|
-
/** Hex tokens for TS-side use — the same set `game/src/
|
|
15
|
+
/** Hex tokens for TS-side use — the same set `game/src/engine/ui/theme/designTokens.ts` exposes. */
|
|
16
16
|
export const BM = {
|
|
17
17
|
bg: '#0b0b0b',
|
|
18
18
|
surface: '#181818',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/editor/design.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,
|
|
1
|
+
{"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/editor/design.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,oGAAoG;AACpG,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,EAAE,EAAE,SAAS;IACb,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,SAAS;IAEtB,WAAW,EAAE,SAAS;IACtB,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,SAAS;IAEvB,MAAM,EAAE,SAAS;IACjB,WAAW,EAAE,SAAS;IAEtB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IAEjB,YAAY,EAAE,+BAA+B;IAC7C,UAAU,EAAE,8BAA8B;IAC1C,QAAQ,EAAE,oCAAoC;IAC9C;sGACkG;IAClG,SAAS,EAAE,qCAAqC;IAChD,QAAQ,EAAE,kCAAkC;IAC5C,cAAc,EAAE,yBAAyB;IACzC,gBAAgB,EAAE,8DAA8D;IAEhF,IAAI,EAAE,8EAA8E;IACpF,QAAQ,EAAE,gDAAgD;CAClD,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;0HAEwF,CAAC;AAE3H,uFAAuF;AACvF,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;eAGpB,EAAE,CAAC,EAAE;oBACA,EAAE,CAAC,OAAO;wBACN,EAAE,CAAC,UAAU;yBACZ,EAAE,CAAC,WAAW;iBACtB,EAAE,CAAC,WAAW;uBACR,EAAE,CAAC,SAAS;qBACd,EAAE,CAAC,OAAO;mBACZ,EAAE,CAAC,MAAM;yBACH,EAAE,CAAC,WAAW;iBACtB,EAAE,CAAC,IAAI;uBACD,EAAE,CAAC,SAAS;iBAClB,EAAE,CAAC,IAAI;uBACD,EAAE,CAAC,SAAS;oBACf,EAAE,CAAC,OAAO;mBACX,EAAE,CAAC,MAAM;;;;;;;0BAOF,EAAE,CAAC,YAAY;wBACjB,EAAE,CAAC,UAAU;sBACf,EAAE,CAAC,QAAQ;uBACV,EAAE,CAAC,SAAS;sBACb,EAAE,CAAC,QAAQ;iBAChB,EAAE,CAAC,IAAI;sBACF,EAAE,CAAC,QAAQ;;CAEhC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAqInB,EAAE,CAAC,cAAc;;;;;;;kCAOD,EAAE,CAAC,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDpD,CAAC"}
|
|
@@ -30,6 +30,11 @@
|
|
|
30
30
|
* and runs against whichever engine the project has vendored, so a named import of something that
|
|
31
31
|
* engine predates would fail the whole module load (and with it every overlay) rather than one
|
|
32
32
|
* optional nicety.
|
|
33
|
+
*
|
|
34
|
+
* For the same reason the engine paths here stay the OLD ones (`engine/GameHUD.js`): every engine
|
|
35
|
+
* resolves them, a pre-move one natively and a newer one through its compat shim, while a moved
|
|
36
|
+
* path fails on every project that vendored an engine from before the move.
|
|
37
|
+
* engine-move: ignore-file
|
|
33
38
|
*/
|
|
34
39
|
import { CDN_IMPORTS } from '../scaffold/project-files.js';
|
|
35
40
|
import { importMapEntries } from '../scaffold/aliases.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hud-replay-page.js","sourceRoot":"","sources":["../../src/editor/hud-replay-page.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hud-replay-page.js","sourceRoot":"","sources":["../../src/editor/hud-replay-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO1D,oGAAoG;AACpG,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,MAAM,GAAG,oBAAoB,QAAQ,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAC9B,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CACvF,CAAC;IACF,OAAO,EAAE,GAAG,WAAW,EAAE,GAAG,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrD,OAAO;;;;;;+BAMsB,OAAO,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;EAmB7C,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2brC,CAAC;AACF,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* The F9 recording sink: where the engine's ScreenRecorder streams gameplay frames when the dev
|
|
3
3
|
* view is the host.
|
|
4
4
|
*
|
|
5
|
-
* The recorder (`game/src/
|
|
5
|
+
* The recorder (`game/src/engine/recording/ScreenRecorder.ts`, vendored into every project) POSTs one PNG per
|
|
6
6
|
* frame to `/api/dev/save-frame` and, at stop, one JSON manifest to
|
|
7
7
|
* `/api/dev/save-recording-timeline`. Until the shell announced this sidecar as the sink, those
|
|
8
8
|
* POSTs went to `getAgentUrl()` — the upload proxy (which 404s them) or a dead `localhost:4111` —
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime tokens for the game the dev view is running (docs/runtime-ai-auth.md).
|
|
3
|
+
*
|
|
4
|
+
* game-server refuses runtime AI (NPC chat, decisions, images, meshes, speech) and screenshot
|
|
5
|
+
* uploads without a short-lived runtime token for the game. A game a creator is still building is
|
|
6
|
+
* not published, so the engine cannot mint one on its own at the hosted game-server. In creator
|
|
7
|
+
* mode it asks its parent frame instead (`BM_RUNTIME_TOKEN_REQUEST`), and in the dev view that
|
|
8
|
+
* parent is the shell page — the role the web Creator's `RuntimeTokenBridge` plays there.
|
|
9
|
+
*
|
|
10
|
+
* The shell page cannot mint: the creator's credential lives with the CLI, not in a browser. So it
|
|
11
|
+
* forwards the request here, and the sidecar mints at game-server's `POST /api/runtime-token` with
|
|
12
|
+
* the CLI's own Auth0 access token (`bitmagic login`). That is game-server's `creator` lane, the
|
|
13
|
+
* same one the web Creator uses: the token is the same tenant and audience game-server verifies,
|
|
14
|
+
* the caller is the account, and the caps are per account, per game and global. Only the runtime
|
|
15
|
+
* token goes back to the page. The Auth0 token never leaves this process.
|
|
16
|
+
*
|
|
17
|
+
* Guards, each mirroring the Creator's bridge:
|
|
18
|
+
* - The Auth0 token is sent only to the game-server this project's environment names, never to a
|
|
19
|
+
* URL the page supplies. A request for any other server (a game-server on 1666, which mints
|
|
20
|
+
* without a credential) is answered with no token, and the engine asks that server itself.
|
|
21
|
+
* - Only for this project's game. The `creator` lane would mint for any id; this sidecar does not
|
|
22
|
+
* need to.
|
|
23
|
+
* - Only for the shell page itself (`isShellRequest`). Every other sidecar route answers CORS `*`,
|
|
24
|
+
* and a page on some other site the creator has open must not be able to collect tokens charged
|
|
25
|
+
* to their account.
|
|
26
|
+
*
|
|
27
|
+
* Logged out, offline, or refused: the answer is "no token", quickly, so the engine moves on to
|
|
28
|
+
* minting directly — which still works for a published game — instead of waiting out its 5-second
|
|
29
|
+
* editor timeout.
|
|
30
|
+
*/
|
|
31
|
+
import type { IncomingHttpHeaders } from 'http';
|
|
32
|
+
export interface RuntimeTokenRequest {
|
|
33
|
+
gameId: string;
|
|
34
|
+
gameServerUrl: string;
|
|
35
|
+
}
|
|
36
|
+
export interface RuntimeTokenAnswer {
|
|
37
|
+
token: string | null;
|
|
38
|
+
expiresAt: number | null;
|
|
39
|
+
/** Why there is no token, for the sidecar's log and the tests. Never shown to the game. */
|
|
40
|
+
reason?: 'other_server' | 'other_game' | 'logged_out' | 'refused' | 'unreachable' | 'no_server';
|
|
41
|
+
}
|
|
42
|
+
export interface MintRuntimeTokenDeps {
|
|
43
|
+
/** The game-server this project's environment names, or null when it cannot be resolved. */
|
|
44
|
+
gameServerUrl: string | null;
|
|
45
|
+
/** The game this project owns (`bitmagic.json`). */
|
|
46
|
+
projectGameId: string;
|
|
47
|
+
/** The CLI's Auth0 access token, or null when nobody is logged in. Never starts a login. */
|
|
48
|
+
getAccessToken: () => Promise<string | null>;
|
|
49
|
+
fetch: typeof globalThis.fetch;
|
|
50
|
+
}
|
|
51
|
+
/** The body the shell forwards, or null when it is not one. */
|
|
52
|
+
export declare function parseRuntimeTokenRequest(body: unknown): RuntimeTokenRequest | null;
|
|
53
|
+
/**
|
|
54
|
+
* True when the request comes from the shell page on this sidecar's own origin.
|
|
55
|
+
*
|
|
56
|
+
* A browser sets `Origin` on every POST, same-origin included, and a page cannot forge it, so this
|
|
57
|
+
* is what separates the shell from any other tab. A local process could forge it, but a local
|
|
58
|
+
* process can read the CLI's credentials file directly, so there is nothing to protect from it.
|
|
59
|
+
*/
|
|
60
|
+
export declare function isShellRequest(headers: IncomingHttpHeaders, port: number): boolean;
|
|
61
|
+
export declare function mintRuntimeToken(request: RuntimeTokenRequest, deps: MintRuntimeTokenDeps): Promise<RuntimeTokenAnswer>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
const GAME_ID_RE = /^[A-Za-z0-9]{12}(?:-v\d+)?$/;
|
|
2
|
+
const MINT_TIMEOUT_MS = 8_000;
|
|
3
|
+
/** `ABCDEF123456-v3` and `ABCDEF123456` are one game, as game-server counts them. */
|
|
4
|
+
function baseGameId(gameId) {
|
|
5
|
+
return gameId.replace(/-v\d+$/, '');
|
|
6
|
+
}
|
|
7
|
+
function originOf(url) {
|
|
8
|
+
try {
|
|
9
|
+
return new URL(url).origin;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** The body the shell forwards, or null when it is not one. */
|
|
16
|
+
export function parseRuntimeTokenRequest(body) {
|
|
17
|
+
if (typeof body !== 'object' || body === null)
|
|
18
|
+
return null;
|
|
19
|
+
const { gameId, gameServerUrl } = body;
|
|
20
|
+
if (typeof gameId !== 'string' || !GAME_ID_RE.test(gameId))
|
|
21
|
+
return null;
|
|
22
|
+
if (typeof gameServerUrl !== 'string' || gameServerUrl.length > 2048)
|
|
23
|
+
return null;
|
|
24
|
+
return { gameId, gameServerUrl };
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* True when the request comes from the shell page on this sidecar's own origin.
|
|
28
|
+
*
|
|
29
|
+
* A browser sets `Origin` on every POST, same-origin included, and a page cannot forge it, so this
|
|
30
|
+
* is what separates the shell from any other tab. A local process could forge it, but a local
|
|
31
|
+
* process can read the CLI's credentials file directly, so there is nothing to protect from it.
|
|
32
|
+
*/
|
|
33
|
+
export function isShellRequest(headers, port) {
|
|
34
|
+
const origin = headers.origin;
|
|
35
|
+
return origin === `http://localhost:${port}` || origin === `http://127.0.0.1:${port}`;
|
|
36
|
+
}
|
|
37
|
+
export async function mintRuntimeToken(request, deps) {
|
|
38
|
+
const none = (reason) => ({ token: null, expiresAt: null, reason });
|
|
39
|
+
if (!deps.gameServerUrl)
|
|
40
|
+
return none('no_server');
|
|
41
|
+
const trusted = originOf(deps.gameServerUrl);
|
|
42
|
+
if (!trusted || originOf(request.gameServerUrl) !== trusted)
|
|
43
|
+
return none('other_server');
|
|
44
|
+
if (baseGameId(request.gameId) !== baseGameId(deps.projectGameId))
|
|
45
|
+
return none('other_game');
|
|
46
|
+
const accessToken = await deps.getAccessToken();
|
|
47
|
+
if (!accessToken)
|
|
48
|
+
return none('logged_out');
|
|
49
|
+
let response;
|
|
50
|
+
try {
|
|
51
|
+
response = await deps.fetch(`${trusted}/api/runtime-token`, {
|
|
52
|
+
method: 'POST',
|
|
53
|
+
headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` },
|
|
54
|
+
body: JSON.stringify({ gameId: request.gameId }),
|
|
55
|
+
signal: AbortSignal.timeout(MINT_TIMEOUT_MS),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return none('unreachable');
|
|
60
|
+
}
|
|
61
|
+
if (!response.ok)
|
|
62
|
+
return none('refused');
|
|
63
|
+
let data;
|
|
64
|
+
try {
|
|
65
|
+
data = (await response.json());
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return none('refused');
|
|
69
|
+
}
|
|
70
|
+
if (typeof data.token !== 'string' || !data.token)
|
|
71
|
+
return none('refused');
|
|
72
|
+
return { token: data.token, expiresAt: typeof data.expiresAt === 'number' ? data.expiresAt : null };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=runtime-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-token.js","sourceRoot":"","sources":["../../src/editor/runtime-token.ts"],"names":[],"mappings":"AAsDA,MAAM,UAAU,GAAG,6BAA6B,CAAC;AACjD,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B,qFAAqF;AACrF,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,wBAAwB,CAAC,IAAa;IACpD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAA+B,CAAC;IAClE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACxE,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,MAAM,GAAG,IAAI;QAAE,OAAO,IAAI,CAAC;IAClF,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAA4B,EAAE,IAAY;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,OAAO,MAAM,KAAK,oBAAoB,IAAI,EAAE,IAAI,MAAM,KAAK,oBAAoB,IAAI,EAAE,CAAC;AACxF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAA4B,EAC5B,IAA0B;IAE1B,MAAM,IAAI,GAAG,CAAC,MAAoC,EAAsB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAEtH,IAAI,CAAC,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC;IACzF,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC;IAE7F,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAChD,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,QAAsD,CAAC;IAC3D,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,oBAAoB,EAAE;YAC1D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE;YACvF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YAChD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,IAA8C,CAAC;IACnD,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA6C,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1E,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACtG,CAAC"}
|
package/dist/editor/save.d.ts
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* stays a dumb relay of `SCENE_HAS_CHANGES` and `SCENE_EDITING_STATUS`.
|
|
14
14
|
*/
|
|
15
15
|
import type { WorldJsonModification, WorldJsonShape } from '@bitmagic/world-forger/pipeline/index.js';
|
|
16
|
-
/** The engine's `SCENE_HAS_CHANGES` reply (`
|
|
16
|
+
/** The engine's `SCENE_HAS_CHANGES` reply (`CHECK_SCENE_CHANGES` in the creator bridge's `domains/scene.ts`). */
|
|
17
17
|
export interface SceneChangeReport {
|
|
18
18
|
hasChanges?: boolean;
|
|
19
19
|
modifiedObjectIds?: string[];
|
|
@@ -26,7 +26,7 @@ export interface SceneChangeReport {
|
|
|
26
26
|
} | null;
|
|
27
27
|
pendingSpawnPoints?: Array<Record<string, unknown>> | null;
|
|
28
28
|
}
|
|
29
|
-
/** The engine's `SCENE_EDITING_STATUS` reply (`
|
|
29
|
+
/** The engine's `SCENE_EDITING_STATUS` reply (`GET_SCENE_EDITING_STATUS` in the creator bridge's `domains/scene.ts`). */
|
|
30
30
|
export interface SceneEditingStatus {
|
|
31
31
|
unlocked?: boolean;
|
|
32
32
|
environmentObjects?: Array<Record<string, unknown>>;
|
package/dist/editor/server.js
CHANGED
|
@@ -25,6 +25,7 @@ import { applyModificationsToWorld } from '../forge/apply-modifications.js';
|
|
|
25
25
|
import { readProjectGameData } from '../forge/browser-host.js';
|
|
26
26
|
import { projectWorldJsonPath } from '../forge/run-pipeline.js';
|
|
27
27
|
import { renderEditorShell } from './shell-page.js';
|
|
28
|
+
import { readVendoredRecorderSource } from '../trailer/vendored-recorder.js';
|
|
28
29
|
import { readGameInfo, readGameInfoImage } from './game-info.js';
|
|
29
30
|
import { createCliUpdateReader } from './cli-update.js';
|
|
30
31
|
import { renderAssetPreviewPage } from './asset-preview-page.js';
|
|
@@ -52,6 +53,7 @@ import { writeDevViewRecord } from './tab-reuse.js';
|
|
|
52
53
|
import { RECORDING_BODY_LIMIT_BYTES, parseSaveFrameRequest, parseTimelineRequest, writeRecordingFrame, writeRecordingTimeline, } from './recording-sink.js';
|
|
53
54
|
import { renderHudReplayHtml } from './hud-replay-page.js';
|
|
54
55
|
import { attachRecordingStream } from './recording-stream.js';
|
|
56
|
+
import { isShellRequest, mintRuntimeToken, parseRuntimeTokenRequest } from './runtime-token.js';
|
|
55
57
|
/** A shell poll this recent counts as a tab being there, when its stream has not reconnected yet. */
|
|
56
58
|
const SHELL_POLL_RECENT_MS = 2_000;
|
|
57
59
|
/** Bodies are a scene snapshot, not an upload — a megabyte is already generous. */
|
|
@@ -95,20 +97,15 @@ function readBodyBuffer(req, maxBytes) {
|
|
|
95
97
|
});
|
|
96
98
|
}
|
|
97
99
|
/**
|
|
98
|
-
* Whether
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
100
|
+
* Whether the recorder the project vendors (`engine/engine/recording/ScreenRecorder.ts`, or
|
|
101
|
+
* `engine/debug/ScreenRecorder.ts` in a project vendored before it moved) understands the
|
|
102
|
+
* host-announced recording sink (`settings.sinkUrl`). An engine vendored before the field silently
|
|
103
|
+
* keeps its legacy save paths, and the settings message is fire-and-forget with F9
|
|
104
|
+
* engine-internal, so this static probe is the only detection there is; the recording panel uses
|
|
105
|
+
* it to say "run bitmagic upgrade" instead of letting F9 look broken.
|
|
103
106
|
*/
|
|
104
107
|
function vendoredRecorderSupportsSink(root) {
|
|
105
|
-
|
|
106
|
-
return fs.readFileSync(path.join(root, 'engine', 'debug', 'ScreenRecorder.ts'), 'utf-8')
|
|
107
|
-
.includes('sinkUrl');
|
|
108
|
-
}
|
|
109
|
-
catch {
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
108
|
+
return readVendoredRecorderSource(root)?.includes('sinkUrl') ?? false;
|
|
112
109
|
}
|
|
113
110
|
/** What a caught error says to a creator. Every handler below reports failures the same way. */
|
|
114
111
|
function messageOf(error) {
|
|
@@ -1030,6 +1027,36 @@ export async function startEditorServer(options) {
|
|
|
1030
1027
|
}
|
|
1031
1028
|
return;
|
|
1032
1029
|
}
|
|
1030
|
+
/**
|
|
1031
|
+
* The engine's runtime-token request, forwarded by the shell page (runtime-token.ts). The
|
|
1032
|
+
* shell answers the game frame's BM_RUNTIME_TOKEN_REQUEST with what this returns, so the
|
|
1033
|
+
* engine gets a `creator` token minted with the CLI login — and never the login itself.
|
|
1034
|
+
*/
|
|
1035
|
+
if (req.method === 'POST' && url === '/api/runtime-token') {
|
|
1036
|
+
if (!isShellRequest(req.headers, options.port)) {
|
|
1037
|
+
sendJson(res, 403, { ok: false, error: 'Only the dev view may ask for a runtime token' });
|
|
1038
|
+
return;
|
|
1039
|
+
}
|
|
1040
|
+
const payload = await readJsonBody(req, res);
|
|
1041
|
+
if (payload === undefined)
|
|
1042
|
+
return;
|
|
1043
|
+
const request = parseRuntimeTokenRequest(payload);
|
|
1044
|
+
if (!request) {
|
|
1045
|
+
sendJson(res, 400, { ok: false, error: 'Expected { gameId, gameServerUrl }' });
|
|
1046
|
+
return;
|
|
1047
|
+
}
|
|
1048
|
+
const answer = await mintRuntimeToken(request, {
|
|
1049
|
+
gameServerUrl: resolveGameServerUrl(),
|
|
1050
|
+
projectGameId: options.gameId,
|
|
1051
|
+
getAccessToken: async () => (await resolveAuth())?.token ?? null,
|
|
1052
|
+
fetch: globalThis.fetch,
|
|
1053
|
+
});
|
|
1054
|
+
if (answer.reason === 'refused' || answer.reason === 'unreachable') {
|
|
1055
|
+
log(`Runtime AI token: game-server ${answer.reason === 'refused' ? 'refused it' : 'unreachable'}; runtime AI works only if the game is published.`);
|
|
1056
|
+
}
|
|
1057
|
+
sendJson(res, 200, { ok: true, token: answer.token, expiresAt: answer.expiresAt });
|
|
1058
|
+
return;
|
|
1059
|
+
}
|
|
1033
1060
|
if (req.method === 'GET' && url === '/api/game-data') {
|
|
1034
1061
|
try {
|
|
1035
1062
|
// Resolved per boot rather than once at startup, so signing in and reloading the page is
|