@phystack/cli 4.5.41-dev → 4.5.42-dev

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.
@@ -0,0 +1,379 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessageRouter = void 0;
4
+ /* eslint-disable import/prefer-default-export */
5
+ const crypto_1 = require("crypto");
6
+ const uuid_1 = require("uuid");
7
+ const types_1 = require("./types");
8
+ const logger_1 = require("./logger");
9
+ // Methods unsupported in simulator
10
+ const UNSUPPORTED_METHODS = new Set([
11
+ 'setWirelessNetwork',
12
+ 'setLanNetwork',
13
+ 'reboot',
14
+ 'setEnv',
15
+ ]);
16
+ // Signal methods — logged but no-op in local mode
17
+ const SIGNAL_METHODS = new Set(['sendEventSignal', 'sendSessionSignal', 'sendClientSignal']);
18
+ class MessageRouter {
19
+ constructor(twinCache, io) {
20
+ this.twinSubscriptions = new Map();
21
+ this.messageDeliveryTracker = new Map();
22
+ this.MAX_TRACKED_MESSAGES = 1000;
23
+ this.twinCache = twinCache;
24
+ this.io = io;
25
+ }
26
+ async handleMessage(socket, callerTwinId, payload, callback) {
27
+ const { method } = payload;
28
+ logger_1.simulatorLog.dim(`← ${callerTwinId} ${method || '(no method)'} ${payload.twinId ? `→ ${payload.twinId}` : ''}`);
29
+ if (!method) {
30
+ logger_1.simulatorLog.warn(`Received event without method from ${callerTwinId}, ignoring`);
31
+ if (callback)
32
+ callback({ status: 'error', message: 'No method specified' });
33
+ return undefined;
34
+ }
35
+ if (UNSUPPORTED_METHODS.has(method)) {
36
+ const result = {
37
+ status: 'error',
38
+ message: `${method} is not supported in simulator mode`,
39
+ };
40
+ if (callback)
41
+ callback(result);
42
+ return result;
43
+ }
44
+ if (SIGNAL_METHODS.has(method)) {
45
+ const signalData = payload.data || {};
46
+ logger_1.simulatorLog.info(`Signal [${method}] from ${callerTwinId}: ${JSON.stringify(signalData)}`);
47
+ const result = { status: 'success' };
48
+ if (callback)
49
+ callback(result);
50
+ return result;
51
+ }
52
+ switch (method) {
53
+ case 'getDeviceStatus':
54
+ return this.respond(callback, this.handleGetDeviceStatus());
55
+ case 'getInstance':
56
+ case 'getDeviceInstance':
57
+ return this.respond(callback, this.handleGetDeviceInstance());
58
+ case 'getTwinById':
59
+ return this.respond(callback, this.handleGetTwinById(payload));
60
+ case 'ping':
61
+ return this.respond(callback, { status: 'success', message: 'pong' });
62
+ case 'twinMessage':
63
+ this.deliverTwinMessageLocally(callerTwinId, payload, callback);
64
+ return undefined;
65
+ case 'twinSubscribe':
66
+ if (payload.twinId) {
67
+ this.handleTwinSubscribe(socket, callerTwinId, payload.twinId);
68
+ logger_1.simulatorLog.info(`twinSubscribe: ${callerTwinId} now listening to ${payload.twinId}`);
69
+ }
70
+ if (callback)
71
+ callback({ status: 'success' });
72
+ return undefined;
73
+ case 'twinUnsubscribe':
74
+ if (payload.twinId) {
75
+ this.handleTwinUnsubscribe(callerTwinId, payload.twinId);
76
+ }
77
+ if (callback)
78
+ callback({ status: 'success' });
79
+ return undefined;
80
+ case 'createInstanceTwin':
81
+ return this.respond(callback, this.handleCreateInstanceTwin(payload));
82
+ case 'createPeripheralTwin':
83
+ return this.respond(callback, this.handleCreatePeripheralTwin(payload));
84
+ case 'deletePeripheralTwin':
85
+ return this.respond(callback, this.handleDeletePeripheralTwin(payload));
86
+ case 'getPeripheralTwins':
87
+ return this.respond(callback, this.handleGetPeripheralTwins(payload));
88
+ case 'reportScreenTwinProperties':
89
+ case 'reportEdgeTwinProperties':
90
+ case 'reportPeripheralTwinProperties':
91
+ return this.respond(callback, this.handleReportProperties(method, payload));
92
+ case 'reportDeviceTwinProperties':
93
+ return this.respond(callback, this.handleReportDeviceProperties(payload));
94
+ case 'reportDeviceJob':
95
+ logger_1.simulatorLog.dim('Device job reported (local mode, no-op)');
96
+ return this.respond(callback, { status: 'success' });
97
+ default:
98
+ logger_1.simulatorLog.warn(`Unknown method: ${method}`);
99
+ return this.respond(callback, {
100
+ status: 'error',
101
+ message: `Unknown method: ${method}`,
102
+ });
103
+ }
104
+ }
105
+ /** Handle incoming twinMessage for local delivery (used internally) */
106
+ handleIncomingTwinMessage(payload) {
107
+ this.deliverTwinMessageLocally('', payload);
108
+ }
109
+ /** Handle twinUpdated for local delivery */
110
+ handleIncomingTwinUpdated(twin) {
111
+ this.twinCache.updateTwin(twin);
112
+ this.io.to(twin.id).emit('twinMessage', {
113
+ method: 'twinUpdated',
114
+ twinId: twin.id,
115
+ data: twin,
116
+ });
117
+ }
118
+ respond(callback, result) {
119
+ if (callback)
120
+ callback(result);
121
+ return result;
122
+ }
123
+ handleGetDeviceStatus() {
124
+ const deviceTwin = this.twinCache.getDeviceTwin();
125
+ const desired = deviceTwin?.properties?.desired || {};
126
+ const reported = deviceTwin?.properties?.reported || {};
127
+ return {
128
+ status: 'success',
129
+ socketConnected: true,
130
+ socketAuthenticated: true,
131
+ twins: this.twinCache.getGroupedByType(),
132
+ deviceId: deviceTwin?.deviceId,
133
+ tenantId: deviceTwin?.tenantId,
134
+ displayName: desired.displayName || 'Simulator',
135
+ spaceId: desired.spaceId || '',
136
+ gridEnv: desired.env || 'development',
137
+ dataResidency: 'DEV',
138
+ accessKey: desired.accessKey || 'simulator-local-key',
139
+ deviceSerial: desired.deviceSerial || 'SIM-LOCAL',
140
+ osVersion: reported.os?.osVersion || 'Simulator',
141
+ deviceEnv: desired.env || 'development',
142
+ ip: reported.ip || [{ interface: 'lo', ipv4: '127.0.0.1', ipv6: '::1' }],
143
+ isConnected: 'true',
144
+ provisioningCode: '',
145
+ };
146
+ }
147
+ handleGetDeviceInstance() {
148
+ const deviceTwin = this.twinCache.getDeviceTwin();
149
+ if (deviceTwin) {
150
+ return { status: 'success', twin: deviceTwin };
151
+ }
152
+ return { status: 'error', message: 'Device twin not found' };
153
+ }
154
+ handleGetTwinById(payload) {
155
+ const twinId = payload.data?.twinId;
156
+ if (!twinId) {
157
+ return { status: 'error', message: 'Twin ID is required' };
158
+ }
159
+ const twin = this.twinCache.getTwin(twinId);
160
+ if (twin) {
161
+ return { status: 'success', twin };
162
+ }
163
+ return { status: 'error', message: 'Twin not found' };
164
+ }
165
+ handleCreateInstanceTwin(payload) {
166
+ const { type, desiredProperties, id } = payload.data || {};
167
+ const deviceTwin = this.twinCache.getDeviceTwin();
168
+ const twin = this.createLocalTwin(type || types_1.TwinTypeEnum.Screen, desiredProperties || {}, deviceTwin, id);
169
+ this.twinCache.addTwin(twin);
170
+ this.io.emit('twinCreated', { data: twin });
171
+ logger_1.simulatorLog.info(`Twin created: ${JSON.stringify(twin)}`);
172
+ return { status: 'success', twin };
173
+ }
174
+ handleCreatePeripheralTwin(payload) {
175
+ const { instanceId, name, hardwareId, desiredProperties } = payload.data || {};
176
+ const deviceTwin = this.twinCache.getDeviceTwin();
177
+ const twin = {
178
+ id: (0, uuid_1.v4)(),
179
+ deviceId: deviceTwin?.deviceId || (0, uuid_1.v4)(),
180
+ tenantId: deviceTwin?.tenantId || (0, uuid_1.v4)(),
181
+ type: types_1.TwinTypeEnum.Peripheral,
182
+ properties: {
183
+ desired: { ...desiredProperties, instanceId, name, hardwareId },
184
+ reported: {},
185
+ },
186
+ descriptors: { instanceId, name, hardwareId },
187
+ };
188
+ this.twinCache.addTwin(twin);
189
+ this.io.emit('twinCreated', { data: twin });
190
+ return { status: 'success', twin };
191
+ }
192
+ handleDeletePeripheralTwin(payload) {
193
+ const twinId = payload.data?.twinId || payload.twinId;
194
+ if (!twinId) {
195
+ return { status: 'error', message: 'Twin ID is required' };
196
+ }
197
+ const twin = this.twinCache.getTwin(twinId);
198
+ if (!twin) {
199
+ return { status: 'error', message: 'Twin not found' };
200
+ }
201
+ this.twinCache.removeTwin(twinId);
202
+ this.io.emit('twinDeleted', { data: twin });
203
+ return { status: 'success' };
204
+ }
205
+ handleGetPeripheralTwins(payload) {
206
+ const instanceId = payload.data?.instanceId;
207
+ let peripherals = this.twinCache.getTwinsByType(types_1.TwinTypeEnum.Peripheral);
208
+ if (instanceId) {
209
+ peripherals = peripherals.filter((t) => t.descriptors?.instanceId === instanceId);
210
+ }
211
+ return { status: 'success', twins: peripherals };
212
+ }
213
+ handleReportProperties(method, payload) {
214
+ const twinId = payload.twinId;
215
+ const properties = payload.data;
216
+ if (!twinId) {
217
+ return { status: 'error', message: 'Twin ID is required' };
218
+ }
219
+ const twin = this.twinCache.getTwin(twinId);
220
+ if (!twin) {
221
+ return { status: 'error', message: 'Twin not found' };
222
+ }
223
+ if (properties) {
224
+ twin.properties.reported = { ...twin.properties.reported, ...properties };
225
+ this.twinCache.updateTwin(twin);
226
+ this.handleIncomingTwinUpdated(twin);
227
+ }
228
+ return { status: 'success', twin };
229
+ }
230
+ handleReportDeviceProperties(payload) {
231
+ const properties = payload.data?.properties || payload.data?.reported;
232
+ const deviceTwin = this.twinCache.getDeviceTwin();
233
+ if (deviceTwin && properties) {
234
+ deviceTwin.properties.reported = { ...deviceTwin.properties.reported, ...properties };
235
+ this.twinCache.updateTwin(deviceTwin);
236
+ logger_1.simulatorLog.dim('Device twin properties reported');
237
+ this.handleIncomingTwinUpdated(deviceTwin);
238
+ }
239
+ return { status: 'success' };
240
+ }
241
+ handleTwinSubscribe(socket, subscriberTwinId, targetTwinId) {
242
+ if (!this.twinSubscriptions.has(subscriberTwinId)) {
243
+ this.twinSubscriptions.set(subscriberTwinId, new Set());
244
+ }
245
+ this.twinSubscriptions.get(subscriberTwinId).add(targetTwinId);
246
+ socket.join(targetTwinId);
247
+ logger_1.simulatorLog.dim(`Twin ${subscriberTwinId} subscribed to ${targetTwinId}`);
248
+ }
249
+ handleTwinUnsubscribe(subscriberTwinId, targetTwinId) {
250
+ const subscriptions = this.twinSubscriptions.get(subscriberTwinId);
251
+ if (subscriptions) {
252
+ subscriptions.delete(targetTwinId);
253
+ if (subscriptions.size === 0) {
254
+ this.twinSubscriptions.delete(subscriberTwinId);
255
+ }
256
+ }
257
+ logger_1.simulatorLog.dim(`Twin ${subscriberTwinId} unsubscribed from ${targetTwinId}`);
258
+ }
259
+ getSocketsFromARoom(roomName) {
260
+ const sockets = [];
261
+ const socketIds = this.io.sockets?.adapter?.rooms?.get(roomName);
262
+ socketIds?.forEach((socketId) => {
263
+ const socket = this.io.sockets?.sockets?.get(socketId);
264
+ if (socket)
265
+ sockets.push(socket);
266
+ });
267
+ return sockets;
268
+ }
269
+ generateMessageId(payload) {
270
+ const { twinId, sourceTwinId, method, data } = payload;
271
+ const timestamp = Math.floor(Date.now() / 3000) * 3; // Round to nearest 3 seconds
272
+ const dataString = data ? JSON.stringify(data, (_, value) => Buffer.isBuffer(value) ? value.toString('base64') : value) : '';
273
+ const hash = (0, crypto_1.createHash)('sha256')
274
+ .update(`${twinId}-${sourceTwinId}-${method}-${dataString}-${timestamp}`)
275
+ .digest('hex');
276
+ return hash;
277
+ }
278
+ trackMessageDelivery(messageId, recipientId) {
279
+ if (!this.messageDeliveryTracker.has(messageId)) {
280
+ this.messageDeliveryTracker.set(messageId, new Set());
281
+ if (this.messageDeliveryTracker.size > this.MAX_TRACKED_MESSAGES) {
282
+ const oldestKey = this.messageDeliveryTracker.keys().next().value;
283
+ if (oldestKey) {
284
+ this.messageDeliveryTracker.delete(oldestKey);
285
+ }
286
+ }
287
+ }
288
+ this.messageDeliveryTracker.get(messageId).add(recipientId);
289
+ }
290
+ hasMessageBeenDelivered(messageId, recipientId) {
291
+ return this.messageDeliveryTracker.get(messageId)?.has(recipientId) || false;
292
+ }
293
+ handleTwinMessageFromSubscription(subscriberTwinId, payload, callback) {
294
+ const { twinId } = payload;
295
+ const roomSockets = this.getSocketsFromARoom(subscriberTwinId);
296
+ roomSockets.forEach((roomSocket) => {
297
+ roomSocket.emit('twinMessage', payload, (response) => {
298
+ // Response broadcasting: notify other sockets in the target twin's room
299
+ if (twinId && payload.data?.type) {
300
+ roomSocket.to(twinId).emit(payload.data.type, response);
301
+ }
302
+ if (callback)
303
+ callback(response);
304
+ });
305
+ });
306
+ }
307
+ deliverTwinMessageLocally(callerTwinId, payload, callback) {
308
+ const { twinId, sourceTwinId } = payload;
309
+ if (!twinId) {
310
+ logger_1.simulatorLog.warn('twinMessage: no target twinId, dropping');
311
+ return;
312
+ }
313
+ const dataType = payload.data?.type || '(no type)';
314
+ // Detect WebRTC signaling messages
315
+ const webrtcMatch = dataType.match(/^(.+):(offer|answer|ice)$/);
316
+ if (webrtcMatch) {
317
+ const [, channelPrefix, signalType] = webrtcMatch;
318
+ const isData = channelPrefix.startsWith('dc-');
319
+ const kind = isData ? 'DataChannel' : 'MediaStream';
320
+ logger_1.simulatorLog.info(`⚡ WebRTC ${signalType} (${kind}): ${sourceTwinId || '?'} → ${twinId}`);
321
+ }
322
+ else {
323
+ logger_1.simulatorLog.info(`twinMessage: ${sourceTwinId || '?'} → ${twinId} [${dataType}]`);
324
+ }
325
+ const messageId = this.generateMessageId(payload);
326
+ // Layer 1: Subscription-based delivery (with dedup)
327
+ this.twinSubscriptions.forEach((subscribedTwins, subscriberTwinId) => {
328
+ if (subscribedTwins.has(twinId) && !this.hasMessageBeenDelivered(messageId, subscriberTwinId)) {
329
+ this.handleTwinMessageFromSubscription(subscriberTwinId, payload, callback);
330
+ this.trackMessageDelivery(messageId, subscriberTwinId);
331
+ }
332
+ });
333
+ // Layer 2: Type-based direct routing for Edge and Screen twins
334
+ const deviceTwins = this.twinCache.getGroupedByType();
335
+ if (deviceTwins[types_1.TwinTypeEnum.Edge]) {
336
+ for (const edgeTwinId of deviceTwins[types_1.TwinTypeEnum.Edge]) {
337
+ const edgeTwin = this.twinCache.getTwin(edgeTwinId);
338
+ if (edgeTwin && edgeTwin.id === twinId && !this.hasMessageBeenDelivered(messageId, edgeTwin.id)) {
339
+ this.io.to(edgeTwin.id).emit('twinMessage', payload, callback);
340
+ this.trackMessageDelivery(messageId, edgeTwin.id);
341
+ }
342
+ }
343
+ }
344
+ if (deviceTwins[types_1.TwinTypeEnum.Screen]) {
345
+ for (const screenTwinId of deviceTwins[types_1.TwinTypeEnum.Screen]) {
346
+ const screenTwin = this.twinCache.getTwin(screenTwinId);
347
+ if (screenTwin && screenTwin.id === twinId && !this.hasMessageBeenDelivered(messageId, screenTwin.id)) {
348
+ this.io.to(screenTwin.id).emit('twinMessage', payload, callback);
349
+ this.trackMessageDelivery(messageId, screenTwin.id);
350
+ }
351
+ }
352
+ }
353
+ // Layer 3: Peripheral → parent Edge routing
354
+ if (deviceTwins[types_1.TwinTypeEnum.Peripheral] && deviceTwins[types_1.TwinTypeEnum.Edge]) {
355
+ for (const peripheralTwinId of deviceTwins[types_1.TwinTypeEnum.Peripheral]) {
356
+ const peripheralTwin = this.twinCache.getTwin(peripheralTwinId);
357
+ const instanceId = peripheralTwin?.properties?.desired?.instanceId;
358
+ if (instanceId && deviceTwins[types_1.TwinTypeEnum.Edge].includes(instanceId) && !this.hasMessageBeenDelivered(messageId, instanceId)) {
359
+ this.io.to(instanceId).emit('twinMessage', payload);
360
+ this.trackMessageDelivery(messageId, instanceId);
361
+ }
362
+ }
363
+ }
364
+ }
365
+ createLocalTwin(type, desiredProperties, deviceTwin, reuseId) {
366
+ return {
367
+ id: reuseId || (0, uuid_1.v4)(),
368
+ deviceId: deviceTwin?.deviceId || (0, uuid_1.v4)(),
369
+ tenantId: deviceTwin?.tenantId || (0, uuid_1.v4)(),
370
+ type,
371
+ properties: {
372
+ desired: desiredProperties,
373
+ reported: {},
374
+ },
375
+ };
376
+ }
377
+ }
378
+ exports.MessageRouter = MessageRouter;
379
+ //# sourceMappingURL=message-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-router.js","sourceRoot":"","sources":["../../src/simulator/message-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TwinCache = void 0;
4
+ /* eslint-disable import/prefer-default-export */
5
+ const types_1 = require("./types");
6
+ class TwinCache {
7
+ constructor() {
8
+ this.twins = new Map();
9
+ }
10
+ populate(twins) {
11
+ for (const twin of twins) {
12
+ this.twins.set(twin.id, twin);
13
+ }
14
+ }
15
+ getTwin(id) {
16
+ return this.twins.get(id);
17
+ }
18
+ getDeviceTwin() {
19
+ for (const twin of this.twins.values()) {
20
+ if (twin.type === types_1.TwinTypeEnum.Device)
21
+ return twin;
22
+ }
23
+ return undefined;
24
+ }
25
+ getAllTwins() {
26
+ return Array.from(this.twins.values());
27
+ }
28
+ getAllTwinIds() {
29
+ return Array.from(this.twins.keys());
30
+ }
31
+ hasTwin(id) {
32
+ return this.twins.has(id);
33
+ }
34
+ updateTwin(twin) {
35
+ this.twins.set(twin.id, twin);
36
+ }
37
+ addTwin(twin) {
38
+ this.twins.set(twin.id, twin);
39
+ }
40
+ removeTwin(id) {
41
+ this.twins.delete(id);
42
+ }
43
+ getTwinsByType(type) {
44
+ return Array.from(this.twins.values()).filter((t) => t.type === type);
45
+ }
46
+ /** Returns twins grouped by type as { [type]: [twinId, ...] } — matching hub-device getCachedTwins format */
47
+ getGroupedByType() {
48
+ const grouped = {};
49
+ for (const twin of this.twins.values()) {
50
+ if (!grouped[twin.type])
51
+ grouped[twin.type] = [];
52
+ grouped[twin.type].push(twin.id);
53
+ }
54
+ return grouped;
55
+ }
56
+ }
57
+ exports.TwinCache = TwinCache;
58
+ //# sourceMappingURL=twin-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twin-cache.js","sourceRoot":"","sources":["../../src/simulator/twin-cache.ts"],"names":[],"mappings":";;;AAAA,iDAAiD;AACjD,mCAAqD;AAErD,MAAa,SAAS;IAAtB;QACU,UAAK,GAA8B,IAAI,GAAG,EAAE,CAAC;IAwDvD,CAAC;IAtDC,QAAQ,CAAC,KAAqB;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,aAAa;QACX,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAY,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;QACrD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,WAAW;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,UAAU,CAAC,IAAkB;QAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,IAAkB;QACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,cAAc,CAAC,IAAY;QACzB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,6GAA6G;IAC7G,gBAAgB;QACd,MAAM,OAAO,GAA6B,EAAE,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAzDD,8BAyDC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TwinTypeEnum = exports.AppTypeEnum = void 0;
4
+ var AppTypeEnum;
5
+ (function (AppTypeEnum) {
6
+ AppTypeEnum["Screen"] = "screen";
7
+ AppTypeEnum["Edge"] = "edge";
8
+ })(AppTypeEnum || (exports.AppTypeEnum = AppTypeEnum = {}));
9
+ var TwinTypeEnum;
10
+ (function (TwinTypeEnum) {
11
+ TwinTypeEnum["Device"] = "Device";
12
+ TwinTypeEnum["Screen"] = "Screen";
13
+ TwinTypeEnum["Edge"] = "Edge";
14
+ TwinTypeEnum["Peripheral"] = "Peripheral";
15
+ })(TwinTypeEnum || (exports.TwinTypeEnum = TwinTypeEnum = {}));
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/simulator/types.ts"],"names":[],"mappings":";;;AAWA,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,4BAAa,CAAA;AACf,CAAC,EAHW,WAAW,2BAAX,WAAW,QAGtB;AAUD,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,iCAAiB,CAAA;IACjB,iCAAiB,CAAA;IACjB,6BAAa,CAAA;IACb,yCAAyB,CAAA;AAC3B,CAAC,EALW,YAAY,4BAAZ,YAAY,QAKvB"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getDeviceConfig = getDeviceConfig;
7
+ exports.saveDeviceConfig = saveDeviceConfig;
8
+ exports.getAppConfig = getAppConfig;
9
+ exports.saveAppConfig = saveAppConfig;
10
+ exports.listApps = listApps;
11
+ exports.getAppConfigByPath = getAppConfigByPath;
12
+ exports.updateAppTwinId = updateAppTwinId;
13
+ const fs_extra_1 = __importDefault(require("fs-extra"));
14
+ const path_1 = __importDefault(require("path"));
15
+ const os_1 = __importDefault(require("os"));
16
+ const SIMULATOR_DIR = path_1.default.join(os_1.default.homedir(), '.config', 'phystack-cli', 'simulator');
17
+ function deviceConfigPath(tenantId) {
18
+ return path_1.default.join(tenantDir(tenantId), 'device.json');
19
+ }
20
+ async function getDeviceConfig(tenantId) {
21
+ const filePath = deviceConfigPath(tenantId);
22
+ try {
23
+ if (await fs_extra_1.default.pathExists(filePath)) {
24
+ const data = await fs_extra_1.default.readFile(filePath, 'utf8');
25
+ return JSON.parse(data);
26
+ }
27
+ return undefined;
28
+ }
29
+ catch (err) {
30
+ console.log(`[simulator] Failed to read device config: ${err.message}`);
31
+ return undefined;
32
+ }
33
+ }
34
+ async function saveDeviceConfig(tenantId, config) {
35
+ const dir = tenantDir(tenantId);
36
+ await fs_extra_1.default.ensureDir(dir);
37
+ await fs_extra_1.default.writeFile(deviceConfigPath(tenantId), JSON.stringify(config, null, 2));
38
+ }
39
+ function tenantsDir() {
40
+ return path_1.default.join(SIMULATOR_DIR, 'tenants');
41
+ }
42
+ function tenantDir(tenantId) {
43
+ return path_1.default.join(tenantsDir(), tenantId);
44
+ }
45
+ function appConfigPath(tenantId, appName) {
46
+ return path_1.default.join(tenantDir(tenantId), `${appName}.json`);
47
+ }
48
+ async function getAppConfig(tenantId, appName) {
49
+ const filePath = appConfigPath(tenantId, appName);
50
+ try {
51
+ if (await fs_extra_1.default.pathExists(filePath)) {
52
+ const data = await fs_extra_1.default.readFile(filePath, 'utf8');
53
+ return JSON.parse(data);
54
+ }
55
+ return undefined;
56
+ }
57
+ catch (err) {
58
+ console.log(`[simulator] Failed to read app config for ${appName}: ${err.message}`);
59
+ return undefined;
60
+ }
61
+ }
62
+ async function saveAppConfig(tenantId, config) {
63
+ const dir = tenantDir(tenantId);
64
+ await fs_extra_1.default.ensureDir(dir);
65
+ const filePath = appConfigPath(tenantId, config.name);
66
+ await fs_extra_1.default.writeFile(filePath, JSON.stringify(config, null, 2));
67
+ }
68
+ async function listApps(tenantId) {
69
+ const dir = tenantDir(tenantId);
70
+ try {
71
+ if (!(await fs_extra_1.default.pathExists(dir)))
72
+ return [];
73
+ const files = await fs_extra_1.default.readdir(dir);
74
+ const apps = [];
75
+ for (const file of files) {
76
+ if (file.endsWith('.json')) {
77
+ const data = await fs_extra_1.default.readFile(path_1.default.join(dir, file), 'utf8');
78
+ apps.push(JSON.parse(data));
79
+ }
80
+ }
81
+ return apps;
82
+ }
83
+ catch (err) {
84
+ console.log(`[simulator] Failed to list apps for tenant ${tenantId}: ${err.message}`);
85
+ return [];
86
+ }
87
+ }
88
+ async function getAppConfigByPath(tenantId, appPath) {
89
+ const apps = await listApps(tenantId);
90
+ return apps.find((a) => a.path === appPath);
91
+ }
92
+ async function updateAppTwinId(tenantId, appName, newTwinId) {
93
+ const config = await getAppConfig(tenantId, appName);
94
+ if (config) {
95
+ config.twinId = newTwinId;
96
+ await saveAppConfig(tenantId, config);
97
+ }
98
+ }
99
+ //# sourceMappingURL=simulator-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulator-config.js","sourceRoot":"","sources":["../../src/utils/simulator-config.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phystack/cli",
3
- "version": "4.5.41-dev",
3
+ "version": "4.5.42-dev",
4
4
  "description": "Phygrid CLI.",
5
5
  "main": "index.js",
6
6
  "homepage": "./",
@@ -60,6 +60,7 @@
60
60
  "utf-8-validate": "^5.0.9"
61
61
  },
62
62
  "dependencies": {
63
+ "@phystack/socket.io-proxy": "4.4.64",
63
64
  "@types/cheerio": "^0.22.35",
64
65
  "@types/mkdirp": "^1.0.0",
65
66
  "ajv": "^6.10.2",
@@ -89,6 +90,8 @@
89
90
  "open": "7.4.2",
90
91
  "openid-client": "^5.6.5",
91
92
  "rimraf": "^6.0.1",
93
+ "socket.io": "^4.7.5",
94
+ "socket.io-client": "^4.7.5",
92
95
  "tar": "^5.0.5",
93
96
  "typescript": "^5.4.5",
94
97
  "uuid": "^11.0.5",
@@ -99,5 +102,5 @@
99
102
  "string-width": "^4.2.3",
100
103
  "strip-ansi": "^6.0.1"
101
104
  },
102
- "gitHead": "ef42c60c357a9dac0cab3cbc4a30b6a31fbe26fc"
105
+ "gitHead": "7e9c01f38c4cea0f51f159123b16081d4aac0d9c"
103
106
  }