playcademy 0.28.1-beta.3 → 0.28.1-beta.5
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/dist/bucket.js +1 -1
- package/dist/cli.js +2 -2
- package/dist/constants.js +1 -1
- package/dist/db.js +1 -1
- package/dist/index.js +22 -6
- package/dist/runtime/dashboard-runtime/manifest.json +4 -4
- package/dist/runtime/game-runtime/index.js +209 -87
- package/dist/runtime/game-runtime/manifest.json +4 -4
- package/dist/templates/playcademy-env.d.ts.template +2 -1
- package/dist/utils.js +5 -6
- package/dist/version.js +1 -1
- package/package.json +2 -2
package/dist/bucket.js
CHANGED
|
@@ -44,7 +44,7 @@ var GAME_API_ROUTES_DIRECTORY = join2(GAME_SERVER_ROOT_DIRECTORY, "api");
|
|
|
44
44
|
// ../better-auth/package.json
|
|
45
45
|
var package_default = {
|
|
46
46
|
name: "@playcademy/better-auth",
|
|
47
|
-
version: "0.0.21-beta.
|
|
47
|
+
version: "0.0.21-beta.5",
|
|
48
48
|
type: "module",
|
|
49
49
|
exports: {
|
|
50
50
|
"./server": {
|
package/dist/cli.js
CHANGED
|
@@ -1207,7 +1207,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
|
|
|
1207
1207
|
// ../better-auth/package.json
|
|
1208
1208
|
var package_default = {
|
|
1209
1209
|
name: "@playcademy/better-auth",
|
|
1210
|
-
version: "0.0.21-beta.
|
|
1210
|
+
version: "0.0.21-beta.5",
|
|
1211
1211
|
type: "module",
|
|
1212
1212
|
exports: {
|
|
1213
1213
|
"./server": {
|
|
@@ -3009,7 +3009,7 @@ import { existsSync as existsSync11, mkdirSync as mkdirSync5, readFileSync as re
|
|
|
3009
3009
|
import { join as join13 } from "node:path";
|
|
3010
3010
|
|
|
3011
3011
|
// src/version.ts
|
|
3012
|
-
var cliVersion = false ? "0.0.0-dev" : "0.28.1-beta.
|
|
3012
|
+
var cliVersion = false ? "0.0.0-dev" : "0.28.1-beta.5";
|
|
3013
3013
|
|
|
3014
3014
|
// src/lib/init/database.ts
|
|
3015
3015
|
var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
|
package/dist/constants.js
CHANGED
package/dist/db.js
CHANGED
|
@@ -2335,7 +2335,7 @@ var GAME_API_ROUTES_DIRECTORY = join2(GAME_SERVER_ROOT_DIRECTORY, "api");
|
|
|
2335
2335
|
// ../better-auth/package.json
|
|
2336
2336
|
var package_default = {
|
|
2337
2337
|
name: "@playcademy/better-auth",
|
|
2338
|
-
version: "0.0.21-beta.
|
|
2338
|
+
version: "0.0.21-beta.5",
|
|
2339
2339
|
type: "module",
|
|
2340
2340
|
exports: {
|
|
2341
2341
|
"./server": {
|
package/dist/index.js
CHANGED
|
@@ -2346,7 +2346,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
|
|
|
2346
2346
|
// ../better-auth/package.json
|
|
2347
2347
|
var package_default = {
|
|
2348
2348
|
name: "@playcademy/better-auth",
|
|
2349
|
-
version: "0.0.21-beta.
|
|
2349
|
+
version: "0.0.21-beta.5",
|
|
2350
2350
|
type: "module",
|
|
2351
2351
|
exports: {
|
|
2352
2352
|
"./server": {
|
|
@@ -2612,6 +2612,7 @@ var GAME_MEMBER_ROLES = {
|
|
|
2612
2612
|
OWNER: "owner",
|
|
2613
2613
|
COLLABORATOR: "collaborator"
|
|
2614
2614
|
};
|
|
2615
|
+
var GAME_PERMISSIONS = ["microphone", "camera"];
|
|
2615
2616
|
|
|
2616
2617
|
// ../constants/src/timeback.ts
|
|
2617
2618
|
var TIMEBACK_GRADES = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
|
|
@@ -4357,7 +4358,6 @@ function buildQueueHandlerCode(queueHandlers) {
|
|
|
4357
4358
|
...queueHandlers.map((handler, index4) => ` '${handler.key}': queueHandler${index4},`),
|
|
4358
4359
|
"}",
|
|
4359
4360
|
"",
|
|
4360
|
-
"registerQueueIngressRoute(app, __queueHandlers)",
|
|
4361
4361
|
"const __queueRouter = createQueueRouter(__queueHandlers)",
|
|
4362
4362
|
""
|
|
4363
4363
|
].join("\n");
|
|
@@ -6396,7 +6396,7 @@ import { existsSync as existsSync10, mkdirSync as mkdirSync2, readFileSync as re
|
|
|
6396
6396
|
import { join as join13 } from "node:path";
|
|
6397
6397
|
|
|
6398
6398
|
// src/version.ts
|
|
6399
|
-
var cliVersion = false ? "0.0.0-dev" : "0.28.1-beta.
|
|
6399
|
+
var cliVersion = false ? "0.0.0-dev" : "0.28.1-beta.5";
|
|
6400
6400
|
|
|
6401
6401
|
// src/lib/init/database.ts
|
|
6402
6402
|
var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
|
|
@@ -13318,7 +13318,7 @@ function generateGameEntryCode(customRoutes, customRoutesDir, queueHandlers, opt
|
|
|
13318
13318
|
runtimeImports.push("registerHooks", "wrapHandler");
|
|
13319
13319
|
}
|
|
13320
13320
|
if (queueHandlers.length > 0) {
|
|
13321
|
-
runtimeImports.push("createQueueRouter"
|
|
13321
|
+
runtimeImports.push("createQueueRouter");
|
|
13322
13322
|
}
|
|
13323
13323
|
const importBlocks = [`import { ${runtimeImports.join(", ")} } from '@playcademy/game-runtime'`];
|
|
13324
13324
|
if (hasAuth) {
|
|
@@ -13338,7 +13338,8 @@ function generateGameEntryCode(customRoutes, customRoutesDir, queueHandlers, opt
|
|
|
13338
13338
|
}
|
|
13339
13339
|
const body = [
|
|
13340
13340
|
"// PLAYCADEMY_CONFIG is injected at bundle time via esbuild define",
|
|
13341
|
-
|
|
13341
|
+
buildQueueHandlerCode(queueHandlers),
|
|
13342
|
+
queueHandlers.length > 0 ? "const app = createBaseApp(PLAYCADEMY_CONFIG, __queueHandlers)" : "const app = createBaseApp(PLAYCADEMY_CONFIG)",
|
|
13342
13343
|
""
|
|
13343
13344
|
];
|
|
13344
13345
|
if (hasAuth) {
|
|
@@ -13354,7 +13355,6 @@ function generateGameEntryCode(customRoutes, customRoutesDir, queueHandlers, opt
|
|
|
13354
13355
|
buildCustomRouteModuleCode(customRoutes),
|
|
13355
13356
|
"registerCustomRouteModules(app, __customRoutes)",
|
|
13356
13357
|
"",
|
|
13357
|
-
buildQueueHandlerCode(queueHandlers),
|
|
13358
13358
|
"registerTerminalHandlers(app)",
|
|
13359
13359
|
""
|
|
13360
13360
|
);
|
|
@@ -22654,6 +22654,22 @@ async function validateDeployConfig(config) {
|
|
|
22654
22654
|
errors.push(result);
|
|
22655
22655
|
}
|
|
22656
22656
|
}
|
|
22657
|
+
if (config.permissions !== void 0) {
|
|
22658
|
+
if (!Array.isArray(config.permissions)) {
|
|
22659
|
+
errors.push(
|
|
22660
|
+
`permissions must be an array of ${GAME_PERMISSIONS.map((p) => `'${p}'`).join(" | ")}`
|
|
22661
|
+
);
|
|
22662
|
+
} else {
|
|
22663
|
+
const invalid = config.permissions.filter(
|
|
22664
|
+
(permission) => !GAME_PERMISSIONS.includes(permission)
|
|
22665
|
+
);
|
|
22666
|
+
if (invalid.length > 0) {
|
|
22667
|
+
errors.push(
|
|
22668
|
+
`permissions has unknown ${invalid.length === 1 ? "value" : "values"} ${invalid.map((p) => `'${String(p)}'`).join(", ")} (allowed: ${GAME_PERMISSIONS.map((p) => `'${p}'`).join(", ")})`
|
|
22669
|
+
);
|
|
22670
|
+
}
|
|
22671
|
+
}
|
|
22672
|
+
}
|
|
22657
22673
|
if (errors.length > 0) {
|
|
22658
22674
|
logger.error("Configuration validation failed:");
|
|
22659
22675
|
errors.forEach((error) => logger.error(`${error}`, 1));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"cliVersion": "0.28.1-beta.
|
|
3
|
-
"sdkVersion": "0.16.1-beta.
|
|
4
|
-
"runtimeBuildId": "
|
|
5
|
-
"inputFingerprint": "
|
|
2
|
+
"cliVersion": "0.28.1-beta.5",
|
|
3
|
+
"sdkVersion": "0.16.1-beta.5",
|
|
4
|
+
"runtimeBuildId": "d0e4e78d35dc",
|
|
5
|
+
"inputFingerprint": "d0e4e78d35dcf41f6d3b01ad3494d9cee07d6e462082ca35a8c29b760b0024f0",
|
|
6
6
|
"entry": "index.js"
|
|
7
7
|
}
|
|
@@ -367,10 +367,33 @@ var init_constants2 = __esm({
|
|
|
367
367
|
});
|
|
368
368
|
|
|
369
369
|
// ../sdk/src/messaging.ts
|
|
370
|
-
|
|
370
|
+
function isFromParentWindow(event) {
|
|
371
|
+
return globalThis.window.parent !== globalThis.window && event.source === globalThis.window.parent;
|
|
372
|
+
}
|
|
373
|
+
var MESSAGE_DIRECTION, PlaycademyMessaging, messaging;
|
|
371
374
|
var init_messaging = __esm({
|
|
372
375
|
"../sdk/src/messaging.ts"() {
|
|
373
376
|
"use strict";
|
|
377
|
+
MESSAGE_DIRECTION = {
|
|
378
|
+
["PLAYCADEMY_INIT" /* INIT */]: "launcher-to-game",
|
|
379
|
+
["PLAYCADEMY_TOKEN_REFRESH" /* TOKEN_REFRESH */]: "launcher-to-game",
|
|
380
|
+
["PLAYCADEMY_PAUSE" /* PAUSE */]: "launcher-to-game",
|
|
381
|
+
["PLAYCADEMY_RESUME" /* RESUME */]: "launcher-to-game",
|
|
382
|
+
["PLAYCADEMY_FORCE_EXIT" /* FORCE_EXIT */]: "launcher-to-game",
|
|
383
|
+
["PLAYCADEMY_OVERLAY" /* OVERLAY */]: "launcher-to-game",
|
|
384
|
+
["PLAYCADEMY_READY" /* READY */]: "game-to-launcher",
|
|
385
|
+
["PLAYCADEMY_INIT_ERROR" /* INIT_ERROR */]: "game-to-launcher",
|
|
386
|
+
["PLAYCADEMY_EXIT" /* EXIT */]: "game-to-launcher",
|
|
387
|
+
["PLAYCADEMY_TELEMETRY" /* TELEMETRY */]: "game-to-launcher",
|
|
388
|
+
["PLAYCADEMY_KEY_EVENT" /* KEY_EVENT */]: "game-to-launcher",
|
|
389
|
+
["PLAYCADEMY_DEMO_END" /* DEMO_END */]: "game-to-launcher",
|
|
390
|
+
["PLAYCADEMY_TIMEBACK_HEARTBEAT_RELAY" /* TIMEBACK_HEARTBEAT_RELAY */]: "game-to-launcher",
|
|
391
|
+
["PLAYCADEMY_TIMEBACK_ACTIVITY_START" /* TIMEBACK_ACTIVITY_START */]: "game-to-launcher",
|
|
392
|
+
["PLAYCADEMY_TIMEBACK_ACTIVITY_END" /* TIMEBACK_ACTIVITY_END */]: "game-to-launcher",
|
|
393
|
+
["PLAYCADEMY_CHECKPOINT" /* CHECKPOINT */]: "game-to-launcher",
|
|
394
|
+
["PLAYCADEMY_AUTH_STATE_CHANGE" /* AUTH_STATE_CHANGE */]: "unscoped",
|
|
395
|
+
["PLAYCADEMY_AUTH_CALLBACK" /* AUTH_CALLBACK */]: "unscoped"
|
|
396
|
+
};
|
|
374
397
|
PlaycademyMessaging = class {
|
|
375
398
|
/**
|
|
376
399
|
* Internal storage for message listeners.
|
|
@@ -480,12 +503,17 @@ var init_messaging = __esm({
|
|
|
480
503
|
* })
|
|
481
504
|
* ```
|
|
482
505
|
*/
|
|
483
|
-
listen(type, handler) {
|
|
506
|
+
listen(type, handler, options) {
|
|
507
|
+
const gateToParent = options?.fromParent ?? MESSAGE_DIRECTION[type] === "launcher-to-game";
|
|
484
508
|
function postMessageListener(event) {
|
|
485
509
|
const messageEvent = event;
|
|
486
|
-
if (messageEvent.data?.type
|
|
487
|
-
|
|
510
|
+
if (messageEvent.data?.type !== type) {
|
|
511
|
+
return;
|
|
488
512
|
}
|
|
513
|
+
if (gateToParent && !isFromParentWindow(messageEvent)) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
handler(messageEvent.data.payload || messageEvent.data);
|
|
489
517
|
}
|
|
490
518
|
function customEventListener(event) {
|
|
491
519
|
handler(event.detail);
|
|
@@ -599,23 +627,7 @@ var init_messaging = __esm({
|
|
|
599
627
|
*/
|
|
600
628
|
getMessagingContext(eventType) {
|
|
601
629
|
const isIframe = typeof globalThis.window !== "undefined" && globalThis.self !== window.top;
|
|
602
|
-
const
|
|
603
|
-
"PLAYCADEMY_READY" /* READY */,
|
|
604
|
-
// "I'm loaded and ready"
|
|
605
|
-
"PLAYCADEMY_INIT_ERROR" /* INIT_ERROR */,
|
|
606
|
-
// "SDK init failed"
|
|
607
|
-
"PLAYCADEMY_EXIT" /* EXIT */,
|
|
608
|
-
// "Please close me"
|
|
609
|
-
"PLAYCADEMY_TELEMETRY" /* TELEMETRY */,
|
|
610
|
-
// "Here's my performance data"
|
|
611
|
-
"PLAYCADEMY_KEY_EVENT" /* KEY_EVENT */,
|
|
612
|
-
// Key events like Escape pressed inside game
|
|
613
|
-
"PLAYCADEMY_DEMO_END" /* DEMO_END */,
|
|
614
|
-
// "The demo boundary has been reached"
|
|
615
|
-
"PLAYCADEMY_TIMEBACK_HEARTBEAT_RELAY" /* TIMEBACK_HEARTBEAT_RELAY */
|
|
616
|
-
// "Relay my latest TimeBack heartbeat"
|
|
617
|
-
];
|
|
618
|
-
const shouldUsePostMessage = isIframe && iframeToParentEvents.includes(eventType);
|
|
630
|
+
const shouldUsePostMessage = isIframe && MESSAGE_DIRECTION[eventType] === "game-to-launcher";
|
|
619
631
|
return {
|
|
620
632
|
shouldUsePostMessage,
|
|
621
633
|
target: shouldUsePostMessage ? window.parent : void 0,
|
|
@@ -731,11 +743,29 @@ var init_messaging = __esm({
|
|
|
731
743
|
}
|
|
732
744
|
});
|
|
733
745
|
|
|
746
|
+
// ../sdk/src/core/launch/handshake.ts
|
|
747
|
+
var init_handshake = __esm({
|
|
748
|
+
"../sdk/src/core/launch/handshake.ts"() {
|
|
749
|
+
"use strict";
|
|
750
|
+
init_messaging();
|
|
751
|
+
}
|
|
752
|
+
});
|
|
753
|
+
|
|
754
|
+
// ../sdk/src/core/launch/context.ts
|
|
755
|
+
var init_context = __esm({
|
|
756
|
+
"../sdk/src/core/launch/context.ts"() {
|
|
757
|
+
"use strict";
|
|
758
|
+
init_messaging();
|
|
759
|
+
init_handshake();
|
|
760
|
+
}
|
|
761
|
+
});
|
|
762
|
+
|
|
734
763
|
// ../sdk/src/core/static/init.ts
|
|
735
764
|
var init_init = __esm({
|
|
736
765
|
"../sdk/src/core/static/init.ts"() {
|
|
737
766
|
"use strict";
|
|
738
767
|
init_messaging();
|
|
768
|
+
init_context();
|
|
739
769
|
}
|
|
740
770
|
});
|
|
741
771
|
|
|
@@ -1034,6 +1064,101 @@ var init_demo = __esm({
|
|
|
1034
1064
|
}
|
|
1035
1065
|
});
|
|
1036
1066
|
|
|
1067
|
+
// ../utils/src/error.ts
|
|
1068
|
+
var init_error = __esm({
|
|
1069
|
+
"../utils/src/error.ts"() {
|
|
1070
|
+
}
|
|
1071
|
+
});
|
|
1072
|
+
|
|
1073
|
+
// ../sdk/src/core/launch/exclusivity.ts
|
|
1074
|
+
var init_exclusivity = __esm({
|
|
1075
|
+
"../sdk/src/core/launch/exclusivity.ts"() {
|
|
1076
|
+
"use strict";
|
|
1077
|
+
}
|
|
1078
|
+
});
|
|
1079
|
+
|
|
1080
|
+
// ../sdk/src/core/launch/guards.ts
|
|
1081
|
+
var init_guards2 = __esm({
|
|
1082
|
+
"../sdk/src/core/launch/guards.ts"() {
|
|
1083
|
+
"use strict";
|
|
1084
|
+
init_guards();
|
|
1085
|
+
}
|
|
1086
|
+
});
|
|
1087
|
+
|
|
1088
|
+
// ../sdk/src/core/launch/resume-store.ts
|
|
1089
|
+
var init_resume_store = __esm({
|
|
1090
|
+
"../sdk/src/core/launch/resume-store.ts"() {
|
|
1091
|
+
"use strict";
|
|
1092
|
+
init_error();
|
|
1093
|
+
}
|
|
1094
|
+
});
|
|
1095
|
+
|
|
1096
|
+
// ../sdk/src/core/launch/session.ts
|
|
1097
|
+
var init_session = __esm({
|
|
1098
|
+
"../sdk/src/core/launch/session.ts"() {
|
|
1099
|
+
"use strict";
|
|
1100
|
+
init_error();
|
|
1101
|
+
init_messaging();
|
|
1102
|
+
init_errors();
|
|
1103
|
+
init_handshake();
|
|
1104
|
+
}
|
|
1105
|
+
});
|
|
1106
|
+
|
|
1107
|
+
// ../utils/src/uuid.ts
|
|
1108
|
+
function isValidUUID(value) {
|
|
1109
|
+
if (!value || typeof value !== "string") {
|
|
1110
|
+
return false;
|
|
1111
|
+
}
|
|
1112
|
+
return UUID_REGEX.test(value);
|
|
1113
|
+
}
|
|
1114
|
+
var UUID_REGEX;
|
|
1115
|
+
var init_uuid = __esm({
|
|
1116
|
+
"../utils/src/uuid.ts"() {
|
|
1117
|
+
UUID_REGEX = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
|
|
1118
|
+
}
|
|
1119
|
+
});
|
|
1120
|
+
|
|
1121
|
+
// ../sdk/src/core/timeback/keepalive.ts
|
|
1122
|
+
var init_keepalive = __esm({
|
|
1123
|
+
"../sdk/src/core/timeback/keepalive.ts"() {
|
|
1124
|
+
"use strict";
|
|
1125
|
+
init_src();
|
|
1126
|
+
}
|
|
1127
|
+
});
|
|
1128
|
+
|
|
1129
|
+
// ../sdk/src/core/timeback/activity-tracker.ts
|
|
1130
|
+
var DEFAULT_PAUSED_HEARTBEAT_TIMEOUT_MS, DEFAULT_INACTIVITY_TIMEOUT_MS;
|
|
1131
|
+
var init_activity_tracker = __esm({
|
|
1132
|
+
"../sdk/src/core/timeback/activity-tracker.ts"() {
|
|
1133
|
+
"use strict";
|
|
1134
|
+
init_src();
|
|
1135
|
+
init_uuid();
|
|
1136
|
+
init_messaging();
|
|
1137
|
+
init_errors();
|
|
1138
|
+
init_exclusivity();
|
|
1139
|
+
init_keepalive();
|
|
1140
|
+
DEFAULT_PAUSED_HEARTBEAT_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
1141
|
+
DEFAULT_INACTIVITY_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
1142
|
+
}
|
|
1143
|
+
});
|
|
1144
|
+
|
|
1145
|
+
// ../sdk/src/namespaces/game/embed.ts
|
|
1146
|
+
var init_embed = __esm({
|
|
1147
|
+
"../sdk/src/namespaces/game/embed.ts"() {
|
|
1148
|
+
"use strict";
|
|
1149
|
+
init_src();
|
|
1150
|
+
init_error();
|
|
1151
|
+
init_assert();
|
|
1152
|
+
init_errors();
|
|
1153
|
+
init_exclusivity();
|
|
1154
|
+
init_guards2();
|
|
1155
|
+
init_resume_store();
|
|
1156
|
+
init_session();
|
|
1157
|
+
init_activity_tracker();
|
|
1158
|
+
init_keepalive();
|
|
1159
|
+
}
|
|
1160
|
+
});
|
|
1161
|
+
|
|
1037
1162
|
// ../sdk/src/core/auth/utils.ts
|
|
1038
1163
|
var init_utils = __esm({
|
|
1039
1164
|
"../sdk/src/core/auth/utils.ts"() {
|
|
@@ -1081,6 +1206,7 @@ var init_login2 = __esm({
|
|
|
1081
1206
|
var init_identity2 = __esm({
|
|
1082
1207
|
"../sdk/src/namespaces/game/identity.ts"() {
|
|
1083
1208
|
"use strict";
|
|
1209
|
+
init_assert();
|
|
1084
1210
|
init_login2();
|
|
1085
1211
|
init_errors();
|
|
1086
1212
|
}
|
|
@@ -1098,6 +1224,7 @@ var init_runtime = __esm({
|
|
|
1098
1224
|
var init_scores = __esm({
|
|
1099
1225
|
"../sdk/src/namespaces/game/scores.ts"() {
|
|
1100
1226
|
"use strict";
|
|
1227
|
+
init_assert();
|
|
1101
1228
|
}
|
|
1102
1229
|
});
|
|
1103
1230
|
|
|
@@ -1108,33 +1235,6 @@ var init_ttl_cache = __esm({
|
|
|
1108
1235
|
}
|
|
1109
1236
|
});
|
|
1110
1237
|
|
|
1111
|
-
// ../utils/src/uuid.ts
|
|
1112
|
-
function isValidUUID(value) {
|
|
1113
|
-
if (!value || typeof value !== "string") {
|
|
1114
|
-
return false;
|
|
1115
|
-
}
|
|
1116
|
-
return UUID_REGEX.test(value);
|
|
1117
|
-
}
|
|
1118
|
-
var UUID_REGEX;
|
|
1119
|
-
var init_uuid = __esm({
|
|
1120
|
-
"../utils/src/uuid.ts"() {
|
|
1121
|
-
UUID_REGEX = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
|
|
1122
|
-
}
|
|
1123
|
-
});
|
|
1124
|
-
|
|
1125
|
-
// ../sdk/src/core/timeback/activity-tracker.ts
|
|
1126
|
-
var DEFAULT_PAUSED_HEARTBEAT_TIMEOUT_MS, DEFAULT_INACTIVITY_TIMEOUT_MS;
|
|
1127
|
-
var init_activity_tracker = __esm({
|
|
1128
|
-
"../sdk/src/core/timeback/activity-tracker.ts"() {
|
|
1129
|
-
"use strict";
|
|
1130
|
-
init_src();
|
|
1131
|
-
init_uuid();
|
|
1132
|
-
init_messaging();
|
|
1133
|
-
DEFAULT_PAUSED_HEARTBEAT_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
1134
|
-
DEFAULT_INACTIVITY_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
1135
|
-
}
|
|
1136
|
-
});
|
|
1137
|
-
|
|
1138
1238
|
// ../sdk/src/core/timeback/user.ts
|
|
1139
1239
|
var init_user = __esm({
|
|
1140
1240
|
"../sdk/src/core/timeback/user.ts"() {
|
|
@@ -1161,6 +1261,7 @@ var init_timeback2 = __esm({
|
|
|
1161
1261
|
init_src();
|
|
1162
1262
|
init_assert();
|
|
1163
1263
|
init_guards();
|
|
1264
|
+
init_exclusivity();
|
|
1164
1265
|
init_engine();
|
|
1165
1266
|
ASSESSMENTS_ROUTE = TIMEBACK_ROUTES.ASSESSMENTS;
|
|
1166
1267
|
}
|
|
@@ -1180,6 +1281,7 @@ var init_game2 = __esm({
|
|
|
1180
1281
|
"use strict";
|
|
1181
1282
|
init_backend();
|
|
1182
1283
|
init_demo();
|
|
1284
|
+
init_embed();
|
|
1183
1285
|
init_identity2();
|
|
1184
1286
|
init_runtime();
|
|
1185
1287
|
init_scores();
|
|
@@ -1202,6 +1304,14 @@ var init_strategies = __esm({
|
|
|
1202
1304
|
}
|
|
1203
1305
|
});
|
|
1204
1306
|
|
|
1307
|
+
// ../sdk/src/core/launch/checkpoint.ts
|
|
1308
|
+
var init_checkpoint = __esm({
|
|
1309
|
+
"../sdk/src/core/launch/checkpoint.ts"() {
|
|
1310
|
+
"use strict";
|
|
1311
|
+
init_messaging();
|
|
1312
|
+
}
|
|
1313
|
+
});
|
|
1314
|
+
|
|
1205
1315
|
// ../sdk/src/core/transport/retry.ts
|
|
1206
1316
|
var init_retry = __esm({
|
|
1207
1317
|
"../sdk/src/core/transport/retry.ts"() {
|
|
@@ -1236,6 +1346,7 @@ var init_base = __esm({
|
|
|
1236
1346
|
init_strategies();
|
|
1237
1347
|
init_utils();
|
|
1238
1348
|
init_errors();
|
|
1349
|
+
init_checkpoint();
|
|
1239
1350
|
init_transport();
|
|
1240
1351
|
init_users();
|
|
1241
1352
|
init_version();
|
|
@@ -1693,15 +1804,15 @@ var init_parseUtil = __esm({
|
|
|
1693
1804
|
message: issueData.message
|
|
1694
1805
|
};
|
|
1695
1806
|
}
|
|
1696
|
-
let
|
|
1807
|
+
let errorMessage2 = "";
|
|
1697
1808
|
const maps = errorMaps.filter((m) => !!m).slice().reverse();
|
|
1698
1809
|
for (const map of maps) {
|
|
1699
|
-
|
|
1810
|
+
errorMessage2 = map(fullIssue, { data, defaultError: errorMessage2 }).message;
|
|
1700
1811
|
}
|
|
1701
1812
|
return {
|
|
1702
1813
|
...issueData,
|
|
1703
1814
|
path: fullPath,
|
|
1704
|
-
message:
|
|
1815
|
+
message: errorMessage2
|
|
1705
1816
|
};
|
|
1706
1817
|
};
|
|
1707
1818
|
EMPTY_PATH = [];
|
|
@@ -6510,9 +6621,9 @@ var init_list = __esm({
|
|
|
6510
6621
|
// ../edge-play/src/game/lib/metadata.ts
|
|
6511
6622
|
function getRuntimeMetadata() {
|
|
6512
6623
|
return {
|
|
6513
|
-
cliVersion: true ? "0.28.1-beta.
|
|
6514
|
-
sdkVersion: true ? "0.16.1-beta.
|
|
6515
|
-
buildId: true ? "
|
|
6624
|
+
cliVersion: true ? "0.28.1-beta.5" : "0.0.0-dev",
|
|
6625
|
+
sdkVersion: true ? "0.16.1-beta.5" : "0.0.0-dev",
|
|
6626
|
+
buildId: true ? "d0e4e78d35dc" : "dev-source"
|
|
6516
6627
|
};
|
|
6517
6628
|
}
|
|
6518
6629
|
var init_metadata = __esm({
|
|
@@ -9107,28 +9218,28 @@ async function verifyGameToken(gameToken, options) {
|
|
|
9107
9218
|
body: JSON.stringify({ token: gameToken })
|
|
9108
9219
|
});
|
|
9109
9220
|
if (!response.ok) {
|
|
9110
|
-
let
|
|
9221
|
+
let errorMessage2 = "Unknown error";
|
|
9111
9222
|
try {
|
|
9112
9223
|
const data = await response.json();
|
|
9113
9224
|
const errorField = data.error || data.message;
|
|
9114
9225
|
if (typeof errorField === "string") {
|
|
9115
|
-
|
|
9226
|
+
errorMessage2 = errorField;
|
|
9116
9227
|
} else if (errorField && typeof errorField === "object") {
|
|
9117
9228
|
const errorObj = errorField;
|
|
9118
9229
|
if ("message" in errorObj && typeof errorObj.message === "string") {
|
|
9119
|
-
|
|
9230
|
+
errorMessage2 = errorObj.message;
|
|
9120
9231
|
if ("code" in errorObj && typeof errorObj.code === "string") {
|
|
9121
|
-
|
|
9232
|
+
errorMessage2 = `[${errorObj.code}] ${errorMessage2}`;
|
|
9122
9233
|
}
|
|
9123
9234
|
} else {
|
|
9124
|
-
|
|
9235
|
+
errorMessage2 = JSON.stringify(errorField);
|
|
9125
9236
|
}
|
|
9126
9237
|
}
|
|
9127
9238
|
} catch {
|
|
9128
|
-
|
|
9239
|
+
errorMessage2 = response.statusText || "Unknown error";
|
|
9129
9240
|
}
|
|
9130
9241
|
throw new Error(
|
|
9131
|
-
`[Playcademy SDK] Token verification failed: ${response.status} ${
|
|
9242
|
+
`[Playcademy SDK] Token verification failed: ${response.status} ${errorMessage2}`
|
|
9132
9243
|
);
|
|
9133
9244
|
}
|
|
9134
9245
|
const result = await response.json();
|
|
@@ -9446,18 +9557,15 @@ function registerEnvSetup(app, config) {
|
|
|
9446
9557
|
});
|
|
9447
9558
|
}
|
|
9448
9559
|
function registerSdkInit(app, config) {
|
|
9449
|
-
let
|
|
9560
|
+
let sdkClient = null;
|
|
9450
9561
|
app.use("*", async (c, next) => {
|
|
9451
|
-
|
|
9452
|
-
|
|
9453
|
-
|
|
9454
|
-
|
|
9455
|
-
|
|
9456
|
-
|
|
9457
|
-
|
|
9458
|
-
}
|
|
9459
|
-
const sharedClient = await sdkPromise;
|
|
9460
|
-
const sdk = sharedClient.forRequest({
|
|
9562
|
+
sdkClient ??= await PlaycademyClient.init({
|
|
9563
|
+
apiKey: c.env.PLAYCADEMY_API_KEY,
|
|
9564
|
+
gameId: c.env.GAME_ID,
|
|
9565
|
+
baseUrl: c.env.PLAYCADEMY_BASE_URL,
|
|
9566
|
+
config
|
|
9567
|
+
});
|
|
9568
|
+
const sdk = sdkClient.forRequest({
|
|
9461
9569
|
launchId: c.req.header("x-playcademy-launch-id"),
|
|
9462
9570
|
gameOrigin: new URL(c.req.url).origin
|
|
9463
9571
|
});
|
|
@@ -11076,6 +11184,11 @@ function toMessageBatch(payload, fallbackQueueName) {
|
|
|
11076
11184
|
const payloadMessages = Array.isArray(payloadRecord?.messages) ? payloadRecord.messages : [];
|
|
11077
11185
|
const queueName = typeof payloadRecord?.queue === "string" ? payloadRecord.queue : fallbackQueueName;
|
|
11078
11186
|
const decisions = Array.from({ length: payloadMessages.length }, () => null);
|
|
11187
|
+
function decide(index, decision) {
|
|
11188
|
+
if (decisions[index] === null) {
|
|
11189
|
+
decisions[index] = decision;
|
|
11190
|
+
}
|
|
11191
|
+
}
|
|
11079
11192
|
const batch = {
|
|
11080
11193
|
queue: queueName,
|
|
11081
11194
|
messages: payloadMessages.map((message2, index) => {
|
|
@@ -11085,18 +11198,23 @@ function toMessageBatch(payload, fallbackQueueName) {
|
|
|
11085
11198
|
timestamp: msg.timestamp ? new Date(String(msg.timestamp)) : /* @__PURE__ */ new Date(),
|
|
11086
11199
|
body: msg.body,
|
|
11087
11200
|
attempts: Number(msg.attempts ?? 1),
|
|
11088
|
-
ack: () =>
|
|
11089
|
-
|
|
11090
|
-
|
|
11091
|
-
|
|
11092
|
-
},
|
|
11093
|
-
retry: () => {
|
|
11094
|
-
if (decisions[index] === null) {
|
|
11095
|
-
decisions[index] = "retry";
|
|
11096
|
-
}
|
|
11097
|
-
}
|
|
11201
|
+
ack: () => decide(index, "ack"),
|
|
11202
|
+
// Retry options (delaySeconds) have no channel in the
|
|
11203
|
+
// decisions protocol yet and are ignored.
|
|
11204
|
+
retry: () => decide(index, "retry")
|
|
11098
11205
|
};
|
|
11099
|
-
})
|
|
11206
|
+
}),
|
|
11207
|
+
// First decision wins per message, matching the per-message methods.
|
|
11208
|
+
ackAll: () => {
|
|
11209
|
+
for (let index = 0; index < decisions.length; index += 1) {
|
|
11210
|
+
decide(index, "ack");
|
|
11211
|
+
}
|
|
11212
|
+
},
|
|
11213
|
+
retryAll: () => {
|
|
11214
|
+
for (let index = 0; index < decisions.length; index += 1) {
|
|
11215
|
+
decide(index, "retry");
|
|
11216
|
+
}
|
|
11217
|
+
}
|
|
11100
11218
|
};
|
|
11101
11219
|
return {
|
|
11102
11220
|
batch,
|
|
@@ -11105,7 +11223,9 @@ function toMessageBatch(payload, fallbackQueueName) {
|
|
|
11105
11223
|
}
|
|
11106
11224
|
function registerQueueIngressRoute(app, queueHandlers) {
|
|
11107
11225
|
app.post("/__playcademy/queue/:name", async (c) => {
|
|
11108
|
-
const
|
|
11226
|
+
const env = prepareEnv(c.env);
|
|
11227
|
+
delete env.SELF;
|
|
11228
|
+
const expectedSecret = env.QUEUE_INGRESS_SECRET;
|
|
11109
11229
|
if (expectedSecret) {
|
|
11110
11230
|
const provided = c.req.header(QUEUE_INGRESS_AUTH_HEADER);
|
|
11111
11231
|
if (provided !== expectedSecret) {
|
|
@@ -11119,7 +11239,7 @@ function registerQueueIngressRoute(app, queueHandlers) {
|
|
|
11119
11239
|
}
|
|
11120
11240
|
const payload = await c.req.json().catch(() => null);
|
|
11121
11241
|
const { batch, decisions } = toMessageBatch(payload, name);
|
|
11122
|
-
await handler.queue(batch,
|
|
11242
|
+
await handler.queue(batch, env, c.executionCtx);
|
|
11123
11243
|
return c.json({ ok: true, decisions });
|
|
11124
11244
|
});
|
|
11125
11245
|
}
|
|
@@ -11211,10 +11331,13 @@ function wrapHandler(baseHandler, createHandler) {
|
|
|
11211
11331
|
}
|
|
11212
11332
|
|
|
11213
11333
|
// ../edge-play/src/game/entry.ts
|
|
11214
|
-
function createBaseApp(config) {
|
|
11334
|
+
function createBaseApp(config, queueHandlers) {
|
|
11215
11335
|
setupProcessGlobal();
|
|
11216
11336
|
const app = new Hono2();
|
|
11217
11337
|
registerBodyDisposal(app);
|
|
11338
|
+
if (queueHandlers) {
|
|
11339
|
+
registerQueueIngressRoute(app, queueHandlers);
|
|
11340
|
+
}
|
|
11218
11341
|
registerCors(app);
|
|
11219
11342
|
registerEnvSetup(app, config);
|
|
11220
11343
|
registerSdkInit(app, config);
|
|
@@ -11237,7 +11360,6 @@ export {
|
|
|
11237
11360
|
registerCustomRouteModules,
|
|
11238
11361
|
registerHooks,
|
|
11239
11362
|
registerMetricsRoute,
|
|
11240
|
-
registerQueueIngressRoute,
|
|
11241
11363
|
registerTerminalHandlers,
|
|
11242
11364
|
wrapHandler
|
|
11243
11365
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"cliVersion": "0.28.1-beta.
|
|
3
|
-
"sdkVersion": "0.16.1-beta.
|
|
4
|
-
"runtimeBuildId": "
|
|
5
|
-
"inputFingerprint": "
|
|
2
|
+
"cliVersion": "0.28.1-beta.5",
|
|
3
|
+
"sdkVersion": "0.16.1-beta.5",
|
|
4
|
+
"runtimeBuildId": "d0e4e78d35dc",
|
|
5
|
+
"inputFingerprint": "d0e4e78d35dcf41f6d3b01ad3494d9cee07d6e462082ca35a8c29b760b0024f0",
|
|
6
6
|
"entry": "index.js"
|
|
7
7
|
}
|
|
@@ -32,7 +32,8 @@ declare global {
|
|
|
32
32
|
type QueueHandler = {
|
|
33
33
|
queue(
|
|
34
34
|
batch: MessageBatch<unknown>,
|
|
35
|
-
|
|
35
|
+
/** No SELF loopback: queue deliveries have no originating request. */
|
|
36
|
+
env: Omit<PlaycademyEnv, 'SELF'>,
|
|
36
37
|
ctx: ExecutionContext,
|
|
37
38
|
): Promise<void> | void
|
|
38
39
|
}
|
package/dist/utils.js
CHANGED
|
@@ -383,7 +383,7 @@ var DASHBOARD_API_ROUTES_DIRECTORY = "api";
|
|
|
383
383
|
// ../better-auth/package.json
|
|
384
384
|
var package_default = {
|
|
385
385
|
name: "@playcademy/better-auth",
|
|
386
|
-
version: "0.0.21-beta.
|
|
386
|
+
version: "0.0.21-beta.5",
|
|
387
387
|
type: "module",
|
|
388
388
|
exports: {
|
|
389
389
|
"./server": {
|
|
@@ -1672,7 +1672,6 @@ function buildQueueHandlerCode(queueHandlers) {
|
|
|
1672
1672
|
...queueHandlers.map((handler, index) => ` '${handler.key}': queueHandler${index},`),
|
|
1673
1673
|
"}",
|
|
1674
1674
|
"",
|
|
1675
|
-
"registerQueueIngressRoute(app, __queueHandlers)",
|
|
1676
1675
|
"const __queueRouter = createQueueRouter(__queueHandlers)",
|
|
1677
1676
|
""
|
|
1678
1677
|
].join("\n");
|
|
@@ -2795,7 +2794,7 @@ import { existsSync as existsSync9, mkdirSync as mkdirSync2, writeFileSync as wr
|
|
|
2795
2794
|
import { dirname as dirname4, join as join14 } from "node:path";
|
|
2796
2795
|
|
|
2797
2796
|
// src/version.ts
|
|
2798
|
-
var cliVersion = false ? "0.0.0-dev" : "0.28.1-beta.
|
|
2797
|
+
var cliVersion = false ? "0.0.0-dev" : "0.28.1-beta.5";
|
|
2799
2798
|
|
|
2800
2799
|
// src/lib/build/binary-resource.ts
|
|
2801
2800
|
function writeFileTree(baseDir, files) {
|
|
@@ -5630,7 +5629,7 @@ function generateGameEntryCode(customRoutes, customRoutesDir, queueHandlers, opt
|
|
|
5630
5629
|
runtimeImports.push("registerHooks", "wrapHandler");
|
|
5631
5630
|
}
|
|
5632
5631
|
if (queueHandlers.length > 0) {
|
|
5633
|
-
runtimeImports.push("createQueueRouter"
|
|
5632
|
+
runtimeImports.push("createQueueRouter");
|
|
5634
5633
|
}
|
|
5635
5634
|
const importBlocks = [`import { ${runtimeImports.join(", ")} } from '@playcademy/game-runtime'`];
|
|
5636
5635
|
if (hasAuth) {
|
|
@@ -5650,7 +5649,8 @@ function generateGameEntryCode(customRoutes, customRoutesDir, queueHandlers, opt
|
|
|
5650
5649
|
}
|
|
5651
5650
|
const body = [
|
|
5652
5651
|
"// PLAYCADEMY_CONFIG is injected at bundle time via esbuild define",
|
|
5653
|
-
|
|
5652
|
+
buildQueueHandlerCode(queueHandlers),
|
|
5653
|
+
queueHandlers.length > 0 ? "const app = createBaseApp(PLAYCADEMY_CONFIG, __queueHandlers)" : "const app = createBaseApp(PLAYCADEMY_CONFIG)",
|
|
5654
5654
|
""
|
|
5655
5655
|
];
|
|
5656
5656
|
if (hasAuth) {
|
|
@@ -5666,7 +5666,6 @@ function generateGameEntryCode(customRoutes, customRoutesDir, queueHandlers, opt
|
|
|
5666
5666
|
buildCustomRouteModuleCode(customRoutes),
|
|
5667
5667
|
"registerCustomRouteModules(app, __customRoutes)",
|
|
5668
5668
|
"",
|
|
5669
|
-
buildQueueHandlerCode(queueHandlers),
|
|
5670
5669
|
"registerTerminalHandlers(app)",
|
|
5671
5670
|
""
|
|
5672
5671
|
);
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "playcademy",
|
|
3
|
-
"version": "0.28.1-beta.
|
|
3
|
+
"version": "0.28.1-beta.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"@inquirer/prompts": "^7.8.6",
|
|
58
|
-
"@playcademy/sdk": "0.16.1-beta.
|
|
58
|
+
"@playcademy/sdk": "0.16.1-beta.5",
|
|
59
59
|
"chokidar": "^4.0.3",
|
|
60
60
|
"colorette": "^2.0.20",
|
|
61
61
|
"commander": "^14.0.1",
|