@playcademy/sandbox 0.3.17-beta.19 → 0.3.17-beta.20
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/cli.js +37 -10
- package/dist/constants.d.ts +90 -90
- package/dist/constants.js +2 -2
- package/dist/infrastructure/api/providers/auth.provider.d.ts +15 -15
- package/dist/server.js +37 -10
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -314,10 +314,10 @@ var init_typescript = __esm(() => {
|
|
|
314
314
|
TypeScriptPackages = {
|
|
315
315
|
tsc: "tsc",
|
|
316
316
|
nativePreview: "@typescript/native-preview",
|
|
317
|
-
|
|
317
|
+
nativePreviewBeta: "@typescript/native-preview@beta"
|
|
318
318
|
};
|
|
319
319
|
TYPESCRIPT_RUNNER = {
|
|
320
|
-
package: TypeScriptPackages.
|
|
320
|
+
package: TypeScriptPackages.nativePreviewBeta,
|
|
321
321
|
bin: "tsgo"
|
|
322
322
|
};
|
|
323
323
|
});
|
|
@@ -1330,7 +1330,7 @@ var package_default;
|
|
|
1330
1330
|
var init_package = __esm(() => {
|
|
1331
1331
|
package_default = {
|
|
1332
1332
|
name: "@playcademy/sandbox",
|
|
1333
|
-
version: "0.3.17-beta.
|
|
1333
|
+
version: "0.3.17-beta.20",
|
|
1334
1334
|
description: "Local development server for Playcademy game development",
|
|
1335
1335
|
type: "module",
|
|
1336
1336
|
exports: {
|
|
@@ -1665,7 +1665,7 @@ function formatJSONSingleLine(level, message, context, scope) {
|
|
|
1665
1665
|
...context && Object.keys(context).length > 0 && { context }
|
|
1666
1666
|
};
|
|
1667
1667
|
const consoleMethod = getConsoleMethod(level);
|
|
1668
|
-
consoleMethod(
|
|
1668
|
+
consoleMethod(safeJSONStringify(logEntry));
|
|
1669
1669
|
}
|
|
1670
1670
|
function formatJSONPretty(level, message, context, scope) {
|
|
1671
1671
|
const timestamp = new Date().toISOString();
|
|
@@ -1677,7 +1677,30 @@ function formatJSONPretty(level, message, context, scope) {
|
|
|
1677
1677
|
...context && Object.keys(context).length > 0 && { context }
|
|
1678
1678
|
};
|
|
1679
1679
|
const consoleMethod = getConsoleMethod(level);
|
|
1680
|
-
consoleMethod(
|
|
1680
|
+
consoleMethod(safeJSONStringify(logEntry, 2));
|
|
1681
|
+
}
|
|
1682
|
+
function safeJSONStringify(value, space) {
|
|
1683
|
+
const seen = new WeakSet;
|
|
1684
|
+
try {
|
|
1685
|
+
return JSON.stringify(value, (_key, currentValue) => {
|
|
1686
|
+
if (typeof currentValue === "bigint") {
|
|
1687
|
+
return currentValue.toString();
|
|
1688
|
+
}
|
|
1689
|
+
if (typeof currentValue === "object" && currentValue !== null) {
|
|
1690
|
+
if (seen.has(currentValue)) {
|
|
1691
|
+
return "[Circular]";
|
|
1692
|
+
}
|
|
1693
|
+
seen.add(currentValue);
|
|
1694
|
+
}
|
|
1695
|
+
return currentValue;
|
|
1696
|
+
}, space);
|
|
1697
|
+
} catch {
|
|
1698
|
+
return JSON.stringify({
|
|
1699
|
+
timestamp: new Date().toISOString(),
|
|
1700
|
+
level: "ERROR",
|
|
1701
|
+
message: "[Logger] Failed to serialize log entry"
|
|
1702
|
+
});
|
|
1703
|
+
}
|
|
1681
1704
|
}
|
|
1682
1705
|
function getConsoleMethod(level) {
|
|
1683
1706
|
switch (level) {
|
|
@@ -35250,7 +35273,6 @@ async function request({
|
|
|
35250
35273
|
method,
|
|
35251
35274
|
headers,
|
|
35252
35275
|
body: payload,
|
|
35253
|
-
credentials: "omit",
|
|
35254
35276
|
signal: controller.signal
|
|
35255
35277
|
});
|
|
35256
35278
|
clearTimeout(timeoutId);
|
|
@@ -35834,10 +35856,11 @@ function createOneRosterNamespace(client) {
|
|
|
35834
35856
|
const url = `${ONEROSTER_ENDPOINTS4.assessmentResults}?filter=${encodeURIComponent(filter)}`;
|
|
35835
35857
|
const response = await client["request"](url, "GET");
|
|
35836
35858
|
const results = response.assessmentResults || [];
|
|
35837
|
-
|
|
35859
|
+
const firstResult = results[0];
|
|
35860
|
+
if (!firstResult) {
|
|
35838
35861
|
return null;
|
|
35839
35862
|
}
|
|
35840
|
-
let maxAttemptResult =
|
|
35863
|
+
let maxAttemptResult = firstResult;
|
|
35841
35864
|
let maxAttemptNumber = maxAttemptResult.metadata?.attemptNumber || 0;
|
|
35842
35865
|
let activeAttemptCount = 0;
|
|
35843
35866
|
for (const result of results) {
|
|
@@ -35871,10 +35894,11 @@ function createOneRosterNamespace(client) {
|
|
|
35871
35894
|
if (!response || !response.users || !Array.isArray(response.users)) {
|
|
35872
35895
|
throw new Error(`Invalid response format from OneRoster API when searching for user with email: ${email}. ` + `Expected { users: [...] } but received: ${JSON.stringify(response)}`);
|
|
35873
35896
|
}
|
|
35874
|
-
|
|
35897
|
+
const user = response.users[0];
|
|
35898
|
+
if (!user) {
|
|
35875
35899
|
throw new Error(`User not found with email: ${email}. ` + `Ensure the user exists in OneRoster and has a valid email address. ` + `If this is a new user, they must be created in OneRoster first.`);
|
|
35876
35900
|
}
|
|
35877
|
-
return
|
|
35901
|
+
return user;
|
|
35878
35902
|
},
|
|
35879
35903
|
listBySourcedIds: async (sourcedIds, batchSize = 50) => {
|
|
35880
35904
|
if (sourcedIds.length === 0) {
|
|
@@ -36156,6 +36180,9 @@ class TimebackCache {
|
|
|
36156
36180
|
return;
|
|
36157
36181
|
}
|
|
36158
36182
|
const oldestKey = this.accessOrder[0];
|
|
36183
|
+
if (!oldestKey) {
|
|
36184
|
+
return;
|
|
36185
|
+
}
|
|
36159
36186
|
this.delete(oldestKey);
|
|
36160
36187
|
log.debug(`[${this.name}] Evicted LRU entry`, { key: oldestKey });
|
|
36161
36188
|
}
|
package/dist/constants.d.ts
CHANGED
|
@@ -5,97 +5,97 @@ import { ItemRow } from '@playcademy/data/types';
|
|
|
5
5
|
* Demo user data for sandbox testing
|
|
6
6
|
*/
|
|
7
7
|
declare const DEMO_USER_IDS: {
|
|
8
|
-
readonly player:
|
|
9
|
-
readonly developer:
|
|
10
|
-
readonly admin:
|
|
11
|
-
readonly pendingDeveloper:
|
|
12
|
-
readonly unverifiedPlayer:
|
|
13
|
-
readonly anonymousPlayer:
|
|
8
|
+
readonly player: '00000000-0000-0000-0000-000000000001';
|
|
9
|
+
readonly developer: '00000000-0000-0000-0000-000000000002';
|
|
10
|
+
readonly admin: '00000000-0000-0000-0000-000000000003';
|
|
11
|
+
readonly pendingDeveloper: '00000000-0000-0000-0000-000000000004';
|
|
12
|
+
readonly unverifiedPlayer: '00000000-0000-0000-0000-000000000005';
|
|
13
|
+
readonly anonymousPlayer: '00000000-0000-0000-0000-000000000006';
|
|
14
14
|
};
|
|
15
15
|
declare const DEMO_USERS: {
|
|
16
16
|
readonly admin: {
|
|
17
17
|
readonly id: "00000000-0000-0000-0000-000000000003";
|
|
18
|
-
readonly name:
|
|
19
|
-
readonly username:
|
|
20
|
-
readonly email:
|
|
18
|
+
readonly name: 'Admin User';
|
|
19
|
+
readonly username: 'admin_user';
|
|
20
|
+
readonly email: 'admin@playcademy.com';
|
|
21
21
|
readonly emailVerified: true;
|
|
22
22
|
readonly image: null;
|
|
23
|
-
readonly role:
|
|
24
|
-
readonly developerStatus:
|
|
23
|
+
readonly role: 'admin';
|
|
24
|
+
readonly developerStatus: 'approved';
|
|
25
25
|
readonly createdAt: Date;
|
|
26
26
|
readonly updatedAt: Date;
|
|
27
27
|
};
|
|
28
28
|
readonly player: {
|
|
29
29
|
readonly id: "00000000-0000-0000-0000-000000000001";
|
|
30
|
-
readonly name:
|
|
31
|
-
readonly username:
|
|
32
|
-
readonly email:
|
|
30
|
+
readonly name: 'Player User';
|
|
31
|
+
readonly username: 'player_user';
|
|
32
|
+
readonly email: 'player@playcademy.com';
|
|
33
33
|
readonly emailVerified: true;
|
|
34
34
|
readonly image: null;
|
|
35
|
-
readonly role:
|
|
36
|
-
readonly developerStatus:
|
|
35
|
+
readonly role: 'player';
|
|
36
|
+
readonly developerStatus: 'none';
|
|
37
37
|
readonly createdAt: Date;
|
|
38
38
|
readonly updatedAt: Date;
|
|
39
39
|
};
|
|
40
40
|
readonly developer: {
|
|
41
41
|
readonly id: "00000000-0000-0000-0000-000000000002";
|
|
42
|
-
readonly name:
|
|
43
|
-
readonly username:
|
|
44
|
-
readonly email:
|
|
42
|
+
readonly name: 'Developer User';
|
|
43
|
+
readonly username: 'developer_user';
|
|
44
|
+
readonly email: 'developer@playcademy.com';
|
|
45
45
|
readonly emailVerified: true;
|
|
46
46
|
readonly image: null;
|
|
47
|
-
readonly role:
|
|
48
|
-
readonly developerStatus:
|
|
47
|
+
readonly role: 'developer';
|
|
48
|
+
readonly developerStatus: 'approved';
|
|
49
49
|
readonly createdAt: Date;
|
|
50
50
|
readonly updatedAt: Date;
|
|
51
51
|
};
|
|
52
52
|
readonly pendingDeveloper: {
|
|
53
53
|
readonly id: "00000000-0000-0000-0000-000000000004";
|
|
54
|
-
readonly name:
|
|
55
|
-
readonly username:
|
|
56
|
-
readonly email:
|
|
54
|
+
readonly name: 'Pending Developer';
|
|
55
|
+
readonly username: 'pending_dev';
|
|
56
|
+
readonly email: 'pending@playcademy.com';
|
|
57
57
|
readonly emailVerified: true;
|
|
58
58
|
readonly image: null;
|
|
59
|
-
readonly role:
|
|
60
|
-
readonly developerStatus:
|
|
59
|
+
readonly role: 'developer';
|
|
60
|
+
readonly developerStatus: 'pending';
|
|
61
61
|
readonly createdAt: Date;
|
|
62
62
|
readonly updatedAt: Date;
|
|
63
63
|
};
|
|
64
64
|
readonly unverifiedPlayer: {
|
|
65
65
|
readonly id: "00000000-0000-0000-0000-000000000005";
|
|
66
|
-
readonly name:
|
|
67
|
-
readonly username:
|
|
68
|
-
readonly email:
|
|
66
|
+
readonly name: 'Unverified Player';
|
|
67
|
+
readonly username: 'unverified_player';
|
|
68
|
+
readonly email: 'unverified@playcademy.com';
|
|
69
69
|
readonly emailVerified: false;
|
|
70
70
|
readonly image: null;
|
|
71
|
-
readonly role:
|
|
72
|
-
readonly developerStatus:
|
|
71
|
+
readonly role: 'player';
|
|
72
|
+
readonly developerStatus: 'none';
|
|
73
73
|
readonly createdAt: Date;
|
|
74
74
|
readonly updatedAt: Date;
|
|
75
75
|
};
|
|
76
76
|
readonly anonymousPlayer: {
|
|
77
77
|
readonly id: "00000000-0000-0000-0000-000000000006";
|
|
78
78
|
readonly name: "Demo Player";
|
|
79
|
-
readonly username:
|
|
80
|
-
readonly email:
|
|
79
|
+
readonly username: 'anonymous_demo_player';
|
|
80
|
+
readonly email: 'player@anon.demo.playcademy.gg';
|
|
81
81
|
readonly emailVerified: false;
|
|
82
82
|
readonly image: null;
|
|
83
83
|
readonly isAnonymous: true;
|
|
84
|
-
readonly role:
|
|
85
|
-
readonly developerStatus:
|
|
84
|
+
readonly role: 'player';
|
|
85
|
+
readonly developerStatus: 'none';
|
|
86
86
|
readonly createdAt: Date;
|
|
87
87
|
readonly updatedAt: Date;
|
|
88
88
|
};
|
|
89
89
|
};
|
|
90
90
|
declare const DEMO_USER: {
|
|
91
91
|
readonly id: "00000000-0000-0000-0000-000000000001";
|
|
92
|
-
readonly name:
|
|
93
|
-
readonly username:
|
|
94
|
-
readonly email:
|
|
92
|
+
readonly name: 'Player User';
|
|
93
|
+
readonly username: 'player_user';
|
|
94
|
+
readonly email: 'player@playcademy.com';
|
|
95
95
|
readonly emailVerified: true;
|
|
96
96
|
readonly image: null;
|
|
97
|
-
readonly role:
|
|
98
|
-
readonly developerStatus:
|
|
97
|
+
readonly role: 'player';
|
|
98
|
+
readonly developerStatus: 'none';
|
|
99
99
|
readonly createdAt: Date;
|
|
100
100
|
readonly updatedAt: Date;
|
|
101
101
|
};
|
|
@@ -107,122 +107,122 @@ declare const DEMO_USER: {
|
|
|
107
107
|
declare const DEMO_TOKENS: {
|
|
108
108
|
readonly 'sandbox-demo-token': {
|
|
109
109
|
readonly id: "00000000-0000-0000-0000-000000000001";
|
|
110
|
-
readonly name:
|
|
111
|
-
readonly username:
|
|
112
|
-
readonly email:
|
|
110
|
+
readonly name: 'Player User';
|
|
111
|
+
readonly username: 'player_user';
|
|
112
|
+
readonly email: 'player@playcademy.com';
|
|
113
113
|
readonly emailVerified: true;
|
|
114
114
|
readonly image: null;
|
|
115
|
-
readonly role:
|
|
116
|
-
readonly developerStatus:
|
|
115
|
+
readonly role: 'player';
|
|
116
|
+
readonly developerStatus: 'none';
|
|
117
117
|
readonly createdAt: Date;
|
|
118
118
|
readonly updatedAt: Date;
|
|
119
119
|
};
|
|
120
120
|
readonly 'sandbox-admin-token': {
|
|
121
121
|
readonly id: "00000000-0000-0000-0000-000000000003";
|
|
122
|
-
readonly name:
|
|
123
|
-
readonly username:
|
|
124
|
-
readonly email:
|
|
122
|
+
readonly name: 'Admin User';
|
|
123
|
+
readonly username: 'admin_user';
|
|
124
|
+
readonly email: 'admin@playcademy.com';
|
|
125
125
|
readonly emailVerified: true;
|
|
126
126
|
readonly image: null;
|
|
127
|
-
readonly role:
|
|
128
|
-
readonly developerStatus:
|
|
127
|
+
readonly role: 'admin';
|
|
128
|
+
readonly developerStatus: 'approved';
|
|
129
129
|
readonly createdAt: Date;
|
|
130
130
|
readonly updatedAt: Date;
|
|
131
131
|
};
|
|
132
132
|
readonly 'sandbox-player-token': {
|
|
133
133
|
readonly id: "00000000-0000-0000-0000-000000000001";
|
|
134
|
-
readonly name:
|
|
135
|
-
readonly username:
|
|
136
|
-
readonly email:
|
|
134
|
+
readonly name: 'Player User';
|
|
135
|
+
readonly username: 'player_user';
|
|
136
|
+
readonly email: 'player@playcademy.com';
|
|
137
137
|
readonly emailVerified: true;
|
|
138
138
|
readonly image: null;
|
|
139
|
-
readonly role:
|
|
140
|
-
readonly developerStatus:
|
|
139
|
+
readonly role: 'player';
|
|
140
|
+
readonly developerStatus: 'none';
|
|
141
141
|
readonly createdAt: Date;
|
|
142
142
|
readonly updatedAt: Date;
|
|
143
143
|
};
|
|
144
144
|
readonly 'sandbox-anonymous-token': {
|
|
145
145
|
readonly id: "00000000-0000-0000-0000-000000000006";
|
|
146
146
|
readonly name: "Demo Player";
|
|
147
|
-
readonly username:
|
|
148
|
-
readonly email:
|
|
147
|
+
readonly username: 'anonymous_demo_player';
|
|
148
|
+
readonly email: 'player@anon.demo.playcademy.gg';
|
|
149
149
|
readonly emailVerified: false;
|
|
150
150
|
readonly image: null;
|
|
151
151
|
readonly isAnonymous: true;
|
|
152
|
-
readonly role:
|
|
153
|
-
readonly developerStatus:
|
|
152
|
+
readonly role: 'player';
|
|
153
|
+
readonly developerStatus: 'none';
|
|
154
154
|
readonly createdAt: Date;
|
|
155
155
|
readonly updatedAt: Date;
|
|
156
156
|
};
|
|
157
157
|
readonly 'sandbox-developer-token': {
|
|
158
158
|
readonly id: "00000000-0000-0000-0000-000000000002";
|
|
159
|
-
readonly name:
|
|
160
|
-
readonly username:
|
|
161
|
-
readonly email:
|
|
159
|
+
readonly name: 'Developer User';
|
|
160
|
+
readonly username: 'developer_user';
|
|
161
|
+
readonly email: 'developer@playcademy.com';
|
|
162
162
|
readonly emailVerified: true;
|
|
163
163
|
readonly image: null;
|
|
164
|
-
readonly role:
|
|
165
|
-
readonly developerStatus:
|
|
164
|
+
readonly role: 'developer';
|
|
165
|
+
readonly developerStatus: 'approved';
|
|
166
166
|
readonly createdAt: Date;
|
|
167
167
|
readonly updatedAt: Date;
|
|
168
168
|
};
|
|
169
169
|
readonly 'sandbox-pending-dev-token': {
|
|
170
170
|
readonly id: "00000000-0000-0000-0000-000000000004";
|
|
171
|
-
readonly name:
|
|
172
|
-
readonly username:
|
|
173
|
-
readonly email:
|
|
171
|
+
readonly name: 'Pending Developer';
|
|
172
|
+
readonly username: 'pending_dev';
|
|
173
|
+
readonly email: 'pending@playcademy.com';
|
|
174
174
|
readonly emailVerified: true;
|
|
175
175
|
readonly image: null;
|
|
176
|
-
readonly role:
|
|
177
|
-
readonly developerStatus:
|
|
176
|
+
readonly role: 'developer';
|
|
177
|
+
readonly developerStatus: 'pending';
|
|
178
178
|
readonly createdAt: Date;
|
|
179
179
|
readonly updatedAt: Date;
|
|
180
180
|
};
|
|
181
181
|
readonly 'sandbox-unverified-token': {
|
|
182
182
|
readonly id: "00000000-0000-0000-0000-000000000005";
|
|
183
|
-
readonly name:
|
|
184
|
-
readonly username:
|
|
185
|
-
readonly email:
|
|
183
|
+
readonly name: 'Unverified Player';
|
|
184
|
+
readonly username: 'unverified_player';
|
|
185
|
+
readonly email: 'unverified@playcademy.com';
|
|
186
186
|
readonly emailVerified: false;
|
|
187
187
|
readonly image: null;
|
|
188
|
-
readonly role:
|
|
189
|
-
readonly developerStatus:
|
|
188
|
+
readonly role: 'player';
|
|
189
|
+
readonly developerStatus: 'none';
|
|
190
190
|
readonly createdAt: Date;
|
|
191
191
|
readonly updatedAt: Date;
|
|
192
192
|
};
|
|
193
193
|
readonly 'mock-game-token-for-local-dev': {
|
|
194
194
|
readonly id: "00000000-0000-0000-0000-000000000001";
|
|
195
|
-
readonly name:
|
|
196
|
-
readonly username:
|
|
197
|
-
readonly email:
|
|
195
|
+
readonly name: 'Player User';
|
|
196
|
+
readonly username: 'player_user';
|
|
197
|
+
readonly email: 'player@playcademy.com';
|
|
198
198
|
readonly emailVerified: true;
|
|
199
199
|
readonly image: null;
|
|
200
|
-
readonly role:
|
|
201
|
-
readonly developerStatus:
|
|
200
|
+
readonly role: 'player';
|
|
201
|
+
readonly developerStatus: 'none';
|
|
202
202
|
readonly createdAt: Date;
|
|
203
203
|
readonly updatedAt: Date;
|
|
204
204
|
};
|
|
205
205
|
readonly 'sandbox-game-backend-token': {
|
|
206
206
|
readonly id: "00000000-0000-0000-0000-000000000002";
|
|
207
|
-
readonly name:
|
|
208
|
-
readonly username:
|
|
209
|
-
readonly email:
|
|
207
|
+
readonly name: 'Developer User';
|
|
208
|
+
readonly username: 'developer_user';
|
|
209
|
+
readonly email: 'developer@playcademy.com';
|
|
210
210
|
readonly emailVerified: true;
|
|
211
211
|
readonly image: null;
|
|
212
|
-
readonly role:
|
|
213
|
-
readonly developerStatus:
|
|
212
|
+
readonly role: 'developer';
|
|
213
|
+
readonly developerStatus: 'approved';
|
|
214
214
|
readonly createdAt: Date;
|
|
215
215
|
readonly updatedAt: Date;
|
|
216
216
|
};
|
|
217
217
|
};
|
|
218
218
|
/** Well-known token strings by role (for use in tests) */
|
|
219
219
|
declare const SANDBOX_TOKENS: {
|
|
220
|
-
readonly player:
|
|
221
|
-
readonly anonymous:
|
|
222
|
-
readonly developer:
|
|
223
|
-
readonly admin:
|
|
224
|
-
readonly pendingDeveloper:
|
|
225
|
-
readonly unverified:
|
|
220
|
+
readonly player: 'sandbox-player-token';
|
|
221
|
+
readonly anonymous: 'sandbox-anonymous-token';
|
|
222
|
+
readonly developer: 'sandbox-developer-token';
|
|
223
|
+
readonly admin: 'sandbox-admin-token';
|
|
224
|
+
readonly pendingDeveloper: 'sandbox-pending-dev-token';
|
|
225
|
+
readonly unverified: 'sandbox-unverified-token';
|
|
226
226
|
};
|
|
227
227
|
declare const DEMO_TOKEN = "sandbox-demo-token";
|
|
228
228
|
declare const MOCK_GAME_ID = "mock-game-id-from-template";
|
package/dist/constants.js
CHANGED
|
@@ -149,10 +149,10 @@ var init_typescript = __esm(() => {
|
|
|
149
149
|
TypeScriptPackages = {
|
|
150
150
|
tsc: "tsc",
|
|
151
151
|
nativePreview: "@typescript/native-preview",
|
|
152
|
-
|
|
152
|
+
nativePreviewBeta: "@typescript/native-preview@beta"
|
|
153
153
|
};
|
|
154
154
|
TYPESCRIPT_RUNNER = {
|
|
155
|
-
package: TypeScriptPackages.
|
|
155
|
+
package: TypeScriptPackages.nativePreviewBeta,
|
|
156
156
|
bin: "tsgo"
|
|
157
157
|
};
|
|
158
158
|
});
|
|
@@ -18,35 +18,35 @@ export declare function createSandboxAuthProvider(): AuthProvider;
|
|
|
18
18
|
*/
|
|
19
19
|
export declare function getDemoUser(role?: 'admin' | 'developer' | 'player'): {
|
|
20
20
|
readonly id: "00000000-0000-0000-0000-000000000003";
|
|
21
|
-
readonly name:
|
|
22
|
-
readonly username:
|
|
23
|
-
readonly email:
|
|
21
|
+
readonly name: 'Admin User';
|
|
22
|
+
readonly username: 'admin_user';
|
|
23
|
+
readonly email: 'admin@playcademy.com';
|
|
24
24
|
readonly emailVerified: true;
|
|
25
25
|
readonly image: null;
|
|
26
|
-
readonly role:
|
|
27
|
-
readonly developerStatus:
|
|
26
|
+
readonly role: 'admin';
|
|
27
|
+
readonly developerStatus: 'approved';
|
|
28
28
|
readonly createdAt: Date;
|
|
29
29
|
readonly updatedAt: Date;
|
|
30
30
|
} | {
|
|
31
31
|
readonly id: "00000000-0000-0000-0000-000000000001";
|
|
32
|
-
readonly name:
|
|
33
|
-
readonly username:
|
|
34
|
-
readonly email:
|
|
32
|
+
readonly name: 'Player User';
|
|
33
|
+
readonly username: 'player_user';
|
|
34
|
+
readonly email: 'player@playcademy.com';
|
|
35
35
|
readonly emailVerified: true;
|
|
36
36
|
readonly image: null;
|
|
37
|
-
readonly role:
|
|
38
|
-
readonly developerStatus:
|
|
37
|
+
readonly role: 'player';
|
|
38
|
+
readonly developerStatus: 'none';
|
|
39
39
|
readonly createdAt: Date;
|
|
40
40
|
readonly updatedAt: Date;
|
|
41
41
|
} | {
|
|
42
42
|
readonly id: "00000000-0000-0000-0000-000000000002";
|
|
43
|
-
readonly name:
|
|
44
|
-
readonly username:
|
|
45
|
-
readonly email:
|
|
43
|
+
readonly name: 'Developer User';
|
|
44
|
+
readonly username: 'developer_user';
|
|
45
|
+
readonly email: 'developer@playcademy.com';
|
|
46
46
|
readonly emailVerified: true;
|
|
47
47
|
readonly image: null;
|
|
48
|
-
readonly role:
|
|
49
|
-
readonly developerStatus:
|
|
48
|
+
readonly role: 'developer';
|
|
49
|
+
readonly developerStatus: 'approved';
|
|
50
50
|
readonly createdAt: Date;
|
|
51
51
|
readonly updatedAt: Date;
|
|
52
52
|
};
|
package/dist/server.js
CHANGED
|
@@ -313,10 +313,10 @@ var init_typescript = __esm(() => {
|
|
|
313
313
|
TypeScriptPackages = {
|
|
314
314
|
tsc: "tsc",
|
|
315
315
|
nativePreview: "@typescript/native-preview",
|
|
316
|
-
|
|
316
|
+
nativePreviewBeta: "@typescript/native-preview@beta"
|
|
317
317
|
};
|
|
318
318
|
TYPESCRIPT_RUNNER = {
|
|
319
|
-
package: TypeScriptPackages.
|
|
319
|
+
package: TypeScriptPackages.nativePreviewBeta,
|
|
320
320
|
bin: "tsgo"
|
|
321
321
|
};
|
|
322
322
|
});
|
|
@@ -1329,7 +1329,7 @@ var package_default;
|
|
|
1329
1329
|
var init_package = __esm(() => {
|
|
1330
1330
|
package_default = {
|
|
1331
1331
|
name: "@playcademy/sandbox",
|
|
1332
|
-
version: "0.3.17-beta.
|
|
1332
|
+
version: "0.3.17-beta.20",
|
|
1333
1333
|
description: "Local development server for Playcademy game development",
|
|
1334
1334
|
type: "module",
|
|
1335
1335
|
exports: {
|
|
@@ -1664,7 +1664,7 @@ function formatJSONSingleLine(level, message, context, scope) {
|
|
|
1664
1664
|
...context && Object.keys(context).length > 0 && { context }
|
|
1665
1665
|
};
|
|
1666
1666
|
const consoleMethod = getConsoleMethod(level);
|
|
1667
|
-
consoleMethod(
|
|
1667
|
+
consoleMethod(safeJSONStringify(logEntry));
|
|
1668
1668
|
}
|
|
1669
1669
|
function formatJSONPretty(level, message, context, scope) {
|
|
1670
1670
|
const timestamp = new Date().toISOString();
|
|
@@ -1676,7 +1676,30 @@ function formatJSONPretty(level, message, context, scope) {
|
|
|
1676
1676
|
...context && Object.keys(context).length > 0 && { context }
|
|
1677
1677
|
};
|
|
1678
1678
|
const consoleMethod = getConsoleMethod(level);
|
|
1679
|
-
consoleMethod(
|
|
1679
|
+
consoleMethod(safeJSONStringify(logEntry, 2));
|
|
1680
|
+
}
|
|
1681
|
+
function safeJSONStringify(value, space) {
|
|
1682
|
+
const seen = new WeakSet;
|
|
1683
|
+
try {
|
|
1684
|
+
return JSON.stringify(value, (_key, currentValue) => {
|
|
1685
|
+
if (typeof currentValue === "bigint") {
|
|
1686
|
+
return currentValue.toString();
|
|
1687
|
+
}
|
|
1688
|
+
if (typeof currentValue === "object" && currentValue !== null) {
|
|
1689
|
+
if (seen.has(currentValue)) {
|
|
1690
|
+
return "[Circular]";
|
|
1691
|
+
}
|
|
1692
|
+
seen.add(currentValue);
|
|
1693
|
+
}
|
|
1694
|
+
return currentValue;
|
|
1695
|
+
}, space);
|
|
1696
|
+
} catch {
|
|
1697
|
+
return JSON.stringify({
|
|
1698
|
+
timestamp: new Date().toISOString(),
|
|
1699
|
+
level: "ERROR",
|
|
1700
|
+
message: "[Logger] Failed to serialize log entry"
|
|
1701
|
+
});
|
|
1702
|
+
}
|
|
1680
1703
|
}
|
|
1681
1704
|
function getConsoleMethod(level) {
|
|
1682
1705
|
switch (level) {
|
|
@@ -35249,7 +35272,6 @@ async function request({
|
|
|
35249
35272
|
method,
|
|
35250
35273
|
headers,
|
|
35251
35274
|
body: payload,
|
|
35252
|
-
credentials: "omit",
|
|
35253
35275
|
signal: controller.signal
|
|
35254
35276
|
});
|
|
35255
35277
|
clearTimeout(timeoutId);
|
|
@@ -35833,10 +35855,11 @@ function createOneRosterNamespace(client) {
|
|
|
35833
35855
|
const url = `${ONEROSTER_ENDPOINTS4.assessmentResults}?filter=${encodeURIComponent(filter)}`;
|
|
35834
35856
|
const response = await client["request"](url, "GET");
|
|
35835
35857
|
const results = response.assessmentResults || [];
|
|
35836
|
-
|
|
35858
|
+
const firstResult = results[0];
|
|
35859
|
+
if (!firstResult) {
|
|
35837
35860
|
return null;
|
|
35838
35861
|
}
|
|
35839
|
-
let maxAttemptResult =
|
|
35862
|
+
let maxAttemptResult = firstResult;
|
|
35840
35863
|
let maxAttemptNumber = maxAttemptResult.metadata?.attemptNumber || 0;
|
|
35841
35864
|
let activeAttemptCount = 0;
|
|
35842
35865
|
for (const result of results) {
|
|
@@ -35870,10 +35893,11 @@ function createOneRosterNamespace(client) {
|
|
|
35870
35893
|
if (!response || !response.users || !Array.isArray(response.users)) {
|
|
35871
35894
|
throw new Error(`Invalid response format from OneRoster API when searching for user with email: ${email}. ` + `Expected { users: [...] } but received: ${JSON.stringify(response)}`);
|
|
35872
35895
|
}
|
|
35873
|
-
|
|
35896
|
+
const user = response.users[0];
|
|
35897
|
+
if (!user) {
|
|
35874
35898
|
throw new Error(`User not found with email: ${email}. ` + `Ensure the user exists in OneRoster and has a valid email address. ` + `If this is a new user, they must be created in OneRoster first.`);
|
|
35875
35899
|
}
|
|
35876
|
-
return
|
|
35900
|
+
return user;
|
|
35877
35901
|
},
|
|
35878
35902
|
listBySourcedIds: async (sourcedIds, batchSize = 50) => {
|
|
35879
35903
|
if (sourcedIds.length === 0) {
|
|
@@ -36155,6 +36179,9 @@ class TimebackCache {
|
|
|
36155
36179
|
return;
|
|
36156
36180
|
}
|
|
36157
36181
|
const oldestKey = this.accessOrder[0];
|
|
36182
|
+
if (!oldestKey) {
|
|
36183
|
+
return;
|
|
36184
|
+
}
|
|
36158
36185
|
this.delete(oldestKey);
|
|
36159
36186
|
log.debug(`[${this.name}] Evicted LRU entry`, { key: oldestKey });
|
|
36160
36187
|
}
|