@phystack/device-simulator 6.3.4 → 6.3.6

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.
Files changed (101) hide show
  1. package/dist/command.d.ts +6 -0
  2. package/dist/command.d.ts.map +1 -0
  3. package/dist/command.js +44 -0
  4. package/dist/command.js.map +1 -0
  5. package/dist/commands/list.d.ts +2 -0
  6. package/dist/commands/list.d.ts.map +1 -0
  7. package/dist/commands/list.js +20 -0
  8. package/dist/commands/list.js.map +1 -0
  9. package/dist/commands/remove.d.ts +2 -0
  10. package/dist/commands/remove.d.ts.map +1 -0
  11. package/dist/commands/remove.js +19 -0
  12. package/dist/commands/remove.js.map +1 -0
  13. package/dist/commands/run.d.ts +13 -0
  14. package/dist/commands/run.d.ts.map +1 -0
  15. package/dist/commands/run.js +353 -0
  16. package/dist/commands/run.js.map +1 -0
  17. package/dist/commands/start.d.ts +6 -0
  18. package/dist/commands/start.d.ts.map +1 -0
  19. package/dist/commands/start.js +216 -0
  20. package/dist/commands/start.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +1 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/services/dev-token.d.ts +2 -0
  26. package/dist/services/dev-token.d.ts.map +1 -0
  27. package/dist/services/dev-token.js +36 -0
  28. package/dist/services/dev-token.js.map +1 -0
  29. package/dist/services/env.d.ts +2 -0
  30. package/dist/services/env.d.ts.map +1 -0
  31. package/dist/services/env.js +14 -0
  32. package/dist/services/env.js.map +1 -0
  33. package/dist/simulator/index.d.ts +19 -0
  34. package/dist/simulator/index.d.ts.map +1 -0
  35. package/dist/simulator/index.js +153 -0
  36. package/dist/simulator/index.js.map +1 -0
  37. package/dist/simulator/local-server.d.ts +24 -0
  38. package/dist/simulator/local-server.d.ts.map +1 -0
  39. package/dist/simulator/local-server.js +125 -0
  40. package/dist/simulator/local-server.js.map +1 -0
  41. package/dist/simulator/logger.d.ts +11 -0
  42. package/dist/simulator/logger.d.ts.map +1 -0
  43. package/dist/simulator/logger.js +42 -0
  44. package/dist/simulator/logger.js.map +1 -0
  45. package/dist/simulator/message-router.d.ts +34 -0
  46. package/dist/simulator/message-router.d.ts.map +1 -0
  47. package/dist/simulator/message-router.js +388 -0
  48. package/dist/simulator/message-router.js.map +1 -0
  49. package/dist/simulator/twin-cache.d.ts +16 -0
  50. package/dist/simulator/twin-cache.d.ts.map +1 -0
  51. package/dist/simulator/twin-cache.js +54 -0
  52. package/dist/simulator/twin-cache.js.map +1 -0
  53. package/dist/simulator/types.d.ts +48 -0
  54. package/dist/simulator/types.d.ts.map +1 -0
  55. package/dist/simulator/types.js +16 -0
  56. package/dist/simulator/types.js.map +1 -0
  57. package/dist/utils/config-paths.d.ts +12 -0
  58. package/dist/utils/config-paths.d.ts.map +1 -0
  59. package/dist/utils/config-paths.js +33 -0
  60. package/dist/utils/config-paths.js.map +1 -0
  61. package/dist/utils/index.d.ts +3 -0
  62. package/dist/utils/index.d.ts.map +1 -0
  63. package/dist/utils/index.js +37 -0
  64. package/dist/utils/index.js.map +1 -0
  65. package/dist/utils/simulator-config.d.ts +25 -0
  66. package/dist/utils/simulator-config.d.ts.map +1 -0
  67. package/dist/utils/simulator-config.js +140 -0
  68. package/dist/utils/simulator-config.js.map +1 -0
  69. package/dist/utils/tenant-storage.d.ts +14 -0
  70. package/dist/utils/tenant-storage.d.ts.map +1 -0
  71. package/dist/utils/tenant-storage.js +65 -0
  72. package/dist/utils/tenant-storage.js.map +1 -0
  73. package/package.json +5 -2
  74. package/CHANGELOG.md +0 -42
  75. package/build-binary.sh +0 -37
  76. package/src/__tests__/e2e/binary.e2e.test.ts +0 -394
  77. package/src/__tests__/preload.ts +0 -44
  78. package/src/command.ts +0 -66
  79. package/src/commands/__tests__/run-helpers.test.ts +0 -181
  80. package/src/commands/list.ts +0 -25
  81. package/src/commands/remove.ts +0 -16
  82. package/src/commands/run.ts +0 -518
  83. package/src/commands/start.ts +0 -309
  84. package/src/index.ts +0 -45
  85. package/src/services/__tests__/dev-token.test.ts +0 -156
  86. package/src/services/dev-token.ts +0 -52
  87. package/src/services/env.ts +0 -10
  88. package/src/simulator/__tests__/message-router.test.ts +0 -782
  89. package/src/simulator/__tests__/twin-cache.test.ts +0 -129
  90. package/src/simulator/index.ts +0 -200
  91. package/src/simulator/local-server.ts +0 -184
  92. package/src/simulator/logger.ts +0 -44
  93. package/src/simulator/message-router.ts +0 -525
  94. package/src/simulator/twin-cache.ts +0 -61
  95. package/src/simulator/types.ts +0 -53
  96. package/src/utils/__tests__/simulator-config.test.ts +0 -230
  97. package/src/utils/config-paths.ts +0 -38
  98. package/src/utils/index.ts +0 -41
  99. package/src/utils/simulator-config.ts +0 -185
  100. package/src/utils/tenant-storage.ts +0 -106
  101. package/tsconfig.json +0 -12
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const chalk_1 = __importDefault(require("chalk"));
40
+ const crypto_1 = __importDefault(require("crypto"));
41
+ const simulator_1 = require("../simulator");
42
+ const env_1 = require("../services/env");
43
+ const dev_token_1 = require("../services/dev-token");
44
+ const tenant_storage_1 = require("../utils/tenant-storage");
45
+ const simulator_config_1 = require("../utils/simulator-config");
46
+ async function resolveAuth() {
47
+ const headers = {
48
+ "Content-Type": "application/json",
49
+ };
50
+ const sessionCookie = process.env.PHYSTACK_SESSION_COOKIE;
51
+ const apiKey = process.env.PHYSTACK_API_KEY;
52
+ if (sessionCookie) {
53
+ headers["Cookie"] = `GRIDSESSION=${sessionCookie}`;
54
+ }
55
+ else if (apiKey) {
56
+ headers["Authorization"] = `ApiKey ${apiKey}`;
57
+ }
58
+ else {
59
+ try {
60
+ const token = (0, dev_token_1.getAccessToken)();
61
+ if (!token)
62
+ throw new Error("not logged in");
63
+ headers["Authorization"] = `Bearer ${token}`;
64
+ }
65
+ catch {
66
+ throw new Error('No auth available. Set PHYSTACK_SESSION_COOKIE, PHYSTACK_API_KEY, or run "phy login".');
67
+ }
68
+ }
69
+ return headers;
70
+ }
71
+ async function provisionDevice(name, apiUrl) {
72
+ const serialNumber = `SIM-${crypto_1.default.randomBytes(4).toString("hex")}`;
73
+ const environment = (process.env.PHYSTACK_CLI_ENV || "PROD").toLowerCase();
74
+ const spaceId = process.env.PHYSTACK_SPACE_ID || "";
75
+ const envTenantId = process.env.PHYSTACK_TENANT_ID;
76
+ const envPhyhubUrl = process.env.PHYSTACK_SIMULATOR_PHYHUB_URL;
77
+ if (envTenantId && !envPhyhubUrl) {
78
+ throw new Error("PHYSTACK_TENANT_ID is set without PHYSTACK_SIMULATOR_PHYHUB_URL. " +
79
+ "These env vars are paired — supply both to override the active tenant " +
80
+ "(e.g. monorepo `make local` or CI flows), or unset PHYSTACK_TENANT_ID " +
81
+ "to use the active tenant from `phy tenant select`.");
82
+ }
83
+ const activeTenant = envTenantId ? null : await (0, tenant_storage_1.getTenant)();
84
+ const tenantId = envTenantId || activeTenant?.id;
85
+ if (!tenantId) {
86
+ throw new Error("No tenant available. Either run `phy tenant select` first, or set both " +
87
+ "PHYSTACK_TENANT_ID and PHYSTACK_SIMULATOR_PHYHUB_URL.");
88
+ }
89
+ const provisionUrl = `${apiUrl}/2026-03/devices`;
90
+ console.log(chalk_1.default.cyan(`Provisioning "${name}" via ${provisionUrl}...`));
91
+ const headers = await resolveAuth();
92
+ const response = await fetch(provisionUrl, {
93
+ method: "POST",
94
+ headers,
95
+ body: JSON.stringify({
96
+ tenantId,
97
+ displayName: name,
98
+ deviceSerial: serialNumber,
99
+ spaceId: spaceId || undefined,
100
+ env: environment === "local" ? "LOCAL" : undefined,
101
+ }),
102
+ });
103
+ if (!response.ok) {
104
+ const text = await response.text();
105
+ throw new Error(`Device provisioning failed (${response.status}): ${text}`);
106
+ }
107
+ const data = (await response.json());
108
+ const deviceData = data.data || data;
109
+ const deviceId = deviceData.deviceId || deviceData.id || deviceData.uuid;
110
+ const accessKey = deviceData.accessKey;
111
+ if (!deviceId || !accessKey) {
112
+ throw new Error(`Provisioning response missing required fields. Got: ${JSON.stringify(deviceData)}`);
113
+ }
114
+ const dataResidency = activeTenant?.dataResidency ||
115
+ (environment ? environment.toUpperCase() : undefined);
116
+ const config = {
117
+ name,
118
+ deviceId,
119
+ accessKey,
120
+ serialNumber,
121
+ phyhubUrl: envPhyhubUrl || undefined,
122
+ environment,
123
+ dataResidency,
124
+ provisionedAt: new Date().toISOString(),
125
+ tenantId: deviceData.tenantId || deviceData.organizationId || tenantId,
126
+ spaceId: deviceData.spaceId || spaceId,
127
+ };
128
+ (0, simulator_config_1.saveSimulator)(config);
129
+ console.log(chalk_1.default.green(`Device "${name}" provisioned: ${config.deviceId}`));
130
+ return config;
131
+ }
132
+ async function startConnected(name) {
133
+ let config = (0, simulator_config_1.getSimulator)(name);
134
+ if (!config) {
135
+ config = await provisionDevice(name, (0, env_1.resolveApiUrl)());
136
+ }
137
+ else {
138
+ console.log(chalk_1.default.cyan(`Reconnecting "${name}" (${config.deviceId})...`));
139
+ }
140
+ const hubDeviceModule = (await Promise.resolve().then(() => __importStar(require("@phystack/hub-device")))).default;
141
+ const region = config.dataResidency ||
142
+ (config.environment ? config.environment.toUpperCase() : "PROD");
143
+ console.log(chalk_1.default.cyan(`Connecting (region=${region}${config.phyhubUrl ? `, phyhubUrl=${config.phyhubUrl}` : ", URL resolved by hub-device"})...`));
144
+ const connectionStatus = await hubDeviceModule.connectToPhyHub(config.environment === "local" ? "LOCAL" : "PROD", "simulator", {
145
+ deviceId: config.deviceId,
146
+ accessKey: config.accessKey,
147
+ deviceSerial: config.serialNumber,
148
+ phyhubUrl: config.phyhubUrl,
149
+ region,
150
+ }, `simulator-${name}`);
151
+ const phyHub = connectionStatus?.phyHub;
152
+ if (!phyHub) {
153
+ throw new Error(`connectToPhyHub() returned no HubDevice instance for "${name}"`);
154
+ }
155
+ await phyHub.connect();
156
+ let deviceTwinId;
157
+ phyHub.connectDevice((response) => {
158
+ if (response?.error) {
159
+ console.warn(chalk_1.default.yellow(`connectDevice rejected: ${response.error}`));
160
+ return;
161
+ }
162
+ const deviceTwin = response?.twins?.find((twin) => twin?.type === "Device");
163
+ if (deviceTwin?.id) {
164
+ deviceTwinId = deviceTwin.id;
165
+ console.log(chalk_1.default.green(`Device "${name}" connected to phyhub (twinId=${deviceTwinId})`));
166
+ }
167
+ else {
168
+ console.warn(chalk_1.default.yellow(`connectDevice() returned no Device-type twin — heartbeat will be skipped`));
169
+ }
170
+ });
171
+ const heartbeat = setInterval(() => {
172
+ if (!deviceTwinId)
173
+ return;
174
+ phyHub.reportDeviceTwinProperties(deviceTwinId, {
175
+ time: {
176
+ current: Date.now(),
177
+ uptime: process.uptime(),
178
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
179
+ },
180
+ }, (response) => {
181
+ if (response?.error) {
182
+ console.warn(chalk_1.default.yellow(`reportDeviceTwinProperties rejected: ${response.error}`));
183
+ }
184
+ });
185
+ }, 30_000);
186
+ const shutdown = () => {
187
+ clearInterval(heartbeat);
188
+ console.log(chalk_1.default.yellow(`\nDevice "${name}" disconnecting...`));
189
+ process.exit(0);
190
+ };
191
+ process.on("SIGINT", shutdown);
192
+ process.on("SIGTERM", shutdown);
193
+ await new Promise(() => { });
194
+ }
195
+ exports.default = async (options = {}) => {
196
+ const port = parseInt(options.port || "55000", 10);
197
+ if (options.connect) {
198
+ return startConnected(options.connect);
199
+ }
200
+ const simulator = new simulator_1.DeviceSimulator(port);
201
+ const shutdown = async () => {
202
+ await simulator.stop();
203
+ process.exit(0);
204
+ };
205
+ process.on("SIGINT", shutdown);
206
+ process.on("SIGTERM", shutdown);
207
+ try {
208
+ await simulator.start();
209
+ }
210
+ catch (error) {
211
+ console.error(chalk_1.default.red(`Failed to start simulator: ${error.message}`));
212
+ process.exit(1);
213
+ }
214
+ await new Promise(() => { });
215
+ };
216
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,oDAA4B;AAC5B,4CAA+C;AAC/C,yCAAgD;AAChD,qDAAuD;AACvD,4DAAoD;AACpD,gEAImC;AAEnC,KAAK,UAAU,WAAW;IACxB,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IACF,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAE5C,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,QAAQ,CAAC,GAAG,eAAe,aAAa,EAAE,CAAC;IACrD,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;IAChD,CAAC;SAAM,CAAC;QAMN,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAA,0BAAc,GAAE,CAAC;YAC/B,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YAC7C,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,IAAY,EACZ,MAAc;IAEd,MAAM,YAAY,GAAG,OAAO,gBAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IAGpE,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAqBpD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACnD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;IAE/D,IAAI,WAAW,IAAI,CAAC,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,mEAAmE;YACjE,wEAAwE;YACxE,wEAAwE;YACxE,oDAAoD,CACvD,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAA,0BAAS,GAAE,CAAC;IAC5D,MAAM,QAAQ,GAAG,WAAW,IAAI,YAAY,EAAE,EAAE,CAAC;IAEjD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,yEAAyE;YACvE,uDAAuD,CAC1D,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,MAAM,kBAAkB,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC;IAEzE,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;QACzC,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ;YACR,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,YAAY;YAC1B,OAAO,EAAE,OAAO,IAAI,SAAS;YAC7B,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SACnD,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAErC,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC;IACzE,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACvC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,uDAAuD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CACpF,CAAC;IACJ,CAAC;IAMD,MAAM,aAAa,GACjB,YAAY,EAAE,aAAa;QAC3B,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAQxD,MAAM,MAAM,GAA2B;QACrC,IAAI;QACJ,QAAQ;QACR,SAAS;QACT,YAAY;QACZ,SAAS,EAAE,YAAY,IAAI,SAAS;QACpC,WAAW;QACX,aAAa;QACb,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACvC,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,cAAc,IAAI,QAAQ;QACtE,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,OAAO;KACvC,CAAC;IAEF,IAAA,gCAAa,EAAC,MAAM,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,WAAW,IAAI,kBAAkB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC7E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,IAAI,MAAM,GAAG,IAAA,+BAAY,EAAC,IAAI,CAAC,CAAC;IAEhC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,IAAA,mBAAa,GAAE,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,MAAM,MAAM,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,eAAe,GAAG,CAAC,wDAAa,sBAAsB,GAAC,CAAC,CAAC,OAAO,CAAC;IAOvE,MAAM,MAAM,GACV,MAAM,CAAC,aAAa;QACpB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEnE,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CACR,sBAAsB,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,8BAA8B,MAAM,CAC3H,CACF,CAAC;IAMF,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,eAAe,CAC5D,MAAM,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EACjD,WAAW,EACX;QACE,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,MAAM;KACP,EACD,aAAa,IAAI,EAAE,CACpB,CAAC;IAKF,MAAM,MAAM,GAAG,gBAAgB,EAAE,MAAM,CAAC;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,yDAAyD,IAAI,GAAG,CACjE,CAAC;IACJ,CAAC;IAID,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IAMvB,IAAI,YAAgC,CAAC;IACrC,MAAM,CAAC,aAAa,CAAC,CAAC,QAAa,EAAE,EAAE;QACrC,IAAI,QAAQ,EAAE,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,MAAM,CAAC,2BAA2B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACxE,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,QAAQ,EAAE,KAAK,EAAE,IAAI,CACtC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,CACvC,CAAC;QACF,IAAI,UAAU,EAAE,EAAE,EAAE,CAAC;YACnB,YAAY,GAAG,UAAU,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CACT,WAAW,IAAI,iCAAiC,YAAY,GAAG,CAChE,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CACV,eAAK,CAAC,MAAM,CACV,0EAA0E,CAC3E,CACF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAMH,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,IAAI,CAAC,YAAY;YAAE,OAAO;QAC1B,MAAM,CAAC,0BAA0B,CAC/B,YAAY,EACZ;YACE,IAAI,EAAE;gBACJ,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;gBACnB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;gBACxB,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ;aAC3D;SACF,EACD,CAAC,QAAa,EAAE,EAAE;YAChB,IAAI,QAAQ,EAAE,KAAK,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CACV,eAAK,CAAC,MAAM,CACV,wCAAwC,QAAQ,CAAC,KAAK,EAAE,CACzD,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC,EAAE,MAAM,CAAC,CAAC;IAEX,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,aAAa,CAAC,SAAS,CAAC,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,aAAa,IAAI,oBAAoB,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,kBAAe,KAAK,EAClB,UAA+C,EAAE,EAClC,EAAE;IACjB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;IAEnD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAGD,MAAM,SAAS,GAAG,IAAI,2BAAe,CAAC,IAAI,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ #!/usr/bin/env node
1
2
  "use strict";
2
3
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AACA,yCAAoC;AACpC,mCAAyD;AACzD,6DAAqC;AACrC,yDAAiC;AACjC,2DAA4C;AAC5C,+DAAgD;AAEhD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAC9B,OAAO,CAAC,OAAO,CAAC,IAAA,yBAAiB,GAAE,CAAC,CAAC;AACrC,OAAO,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC;AAElE,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,OAAO,CAAC;KACzD,MAAM,CAAC,kBAAkB,EAAE,2CAA2C,CAAC;KACvE,MAAM,CAAC,IAAA,mBAAW,EAAC,eAAK,CAAC,CAAC,CAAC;AAE9B,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CACV,4EAA4E,CAC7E;KACA,MAAM,CAAC,eAAe,EAAE,8CAA8C,CAAC;KACvE,MAAM,CACL,yBAAyB,EACzB,6CAA6C,CAC9C;KACA,MAAM,CACL,uBAAuB,EACvB,iDAAiD,CAClD;KACA,MAAM,CAAC,IAAA,mBAAW,EAAC,aAAG,CAAC,CAAC,CAAC;AAE5B,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,cAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,gBAAe,CAAC,CAAC;AAE3B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getAccessToken(): string | null;
2
+ //# sourceMappingURL=dev-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-token.d.ts","sourceRoot":"","sources":["../../src/services/dev-token.ts"],"names":[],"mappings":"AAeA,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAoC9C"}
@@ -0,0 +1,36 @@
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.getAccessToken = getAccessToken;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const config_paths_1 = require("../utils/config-paths");
9
+ function getAccessToken() {
10
+ const envToken = process.env.PHYSTACK_DEVELOPER_TOKEN?.trim();
11
+ if (envToken) {
12
+ return envToken;
13
+ }
14
+ if (fs_1.default.existsSync(config_paths_1.DEVELOPER_TOKEN_FILE)) {
15
+ try {
16
+ const data = JSON.parse(fs_1.default.readFileSync(config_paths_1.DEVELOPER_TOKEN_FILE, "utf8"));
17
+ return data.token;
18
+ }
19
+ catch (error) {
20
+ console.error(`Failed to read developer token: ${error?.message ?? String(error)}`);
21
+ }
22
+ }
23
+ const tokensPath = process.env.PHYSTACK_CLI_AUTH_FILE_PATH ||
24
+ (0, config_paths_1.getAuthFilePath)(process.env.PHYSTACK_CLI_ENV);
25
+ try {
26
+ if (fs_1.default.existsSync(tokensPath)) {
27
+ const tokens = JSON.parse(fs_1.default.readFileSync(tokensPath, "utf8"));
28
+ return tokens ? tokens.access_token : null;
29
+ }
30
+ }
31
+ catch (error) {
32
+ console.error(`Failed to read tokens at ${tokensPath}: ${error?.message ?? String(error)}`);
33
+ }
34
+ return null;
35
+ }
36
+ //# sourceMappingURL=dev-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-token.js","sourceRoot":"","sources":["../../src/services/dev-token.ts"],"names":[],"mappings":";;;;;AAeA,wCAoCC;AAnDD,4CAAoB;AACpB,wDAA8E;AAc9E,SAAgB,cAAc;IAE5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE,CAAC;IAC9D,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAGD,IAAI,YAAE,CAAC,UAAU,CAAC,mCAAoB,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,mCAAoB,EAAE,MAAM,CAAC,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,mCAAmC,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;IAKD,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,2BAA2B;QACvC,IAAA,8BAAe,EAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,IAAI,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAC/D,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7C,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,4BAA4B,UAAU,KAAK,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAC7E,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function resolveApiUrl(): string;
2
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/services/env.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,IAAI,MAAM,CAOtC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveApiUrl = resolveApiUrl;
4
+ const DEFAULT_API_URL = "https://api.phystack.com";
5
+ function resolveApiUrl() {
6
+ const { PHYSTACK_CLI_ENV } = process.env;
7
+ if (PHYSTACK_CLI_ENV) {
8
+ const url = process.env[`${PHYSTACK_CLI_ENV}_PHYSTACK_API`];
9
+ if (url)
10
+ return url;
11
+ }
12
+ return process.env.PHYSTACK_API || DEFAULT_API_URL;
13
+ }
14
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/services/env.ts"],"names":[],"mappings":";;AAEA,sCAOC;AATD,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAEnD,SAAgB,aAAa;IAC3B,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IACzC,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,gBAAgB,eAAe,CAAC,CAAC;QAC5D,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,eAAe,CAAC;AACrD,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { TwinResponse, TwinTypeEnum } from "./types";
2
+ export declare class DeviceSimulator {
3
+ private twinCache;
4
+ private localServer;
5
+ private router;
6
+ private port;
7
+ private deviceDisplayName;
8
+ private deviceId;
9
+ private tenantId;
10
+ constructor(port?: number, deviceDisplayName?: string);
11
+ start(): Promise<void>;
12
+ stop(): Promise<void>;
13
+ createTwinForApp(type: TwinTypeEnum.Screen | TwinTypeEnum.Edge, desiredProperties?: Record<string, any>, reuseId?: string): Promise<TwinResponse>;
14
+ createPeripheralTwin(instanceId: string, name: string, hardwareId: string, desiredProperties?: Record<string, any>): TwinResponse;
15
+ verifyTwinExists(twinId: string): boolean;
16
+ getDeviceId(): string;
17
+ private printBanner;
18
+ }
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/simulator/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAgBrD,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAY;IAE7B,OAAO,CAAC,WAAW,CAAc;IAEjC,OAAO,CAAC,MAAM,CAA8B;IAE5C,OAAO,CAAC,IAAI,CAAS;IAErB,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,QAAQ,CAAc;IAE9B,OAAO,CAAC,QAAQ,CAAc;gBAElB,IAAI,SAAQ,EAAE,iBAAiB,SAAoB;IAOzD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsFtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,gBAAgB,CACpB,IAAI,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,IAAI,EAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACvC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC;IAexB,oBAAoB,CAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACtC,YAAY;IAgBf,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIzC,WAAW,IAAI,MAAM;IAIrB,OAAO,CAAC,WAAW;CAiBpB"}
@@ -0,0 +1,153 @@
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.DeviceSimulator = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const uuid_1 = require("uuid");
10
+ const types_1 = require("./types");
11
+ const twin_cache_1 = require("./twin-cache");
12
+ const local_server_1 = require("./local-server");
13
+ const message_router_1 = require("./message-router");
14
+ const logger_1 = require("./logger");
15
+ const simulator_config_1 = require("../utils/simulator-config");
16
+ const utils_1 = require("../utils");
17
+ function mockObjectId(name) {
18
+ return crypto_1.default.createHash("sha256").update(name).digest("hex").slice(0, 24);
19
+ }
20
+ class DeviceSimulator {
21
+ twinCache;
22
+ localServer;
23
+ router = null;
24
+ port;
25
+ deviceDisplayName;
26
+ deviceId = "";
27
+ tenantId = "";
28
+ constructor(port = 55000, deviceDisplayName = "Local Simulator") {
29
+ this.port = port;
30
+ this.deviceDisplayName = deviceDisplayName;
31
+ this.twinCache = new twin_cache_1.TwinCache();
32
+ this.localServer = new local_server_1.LocalServer(port);
33
+ }
34
+ async start() {
35
+ const tenantLabel = "local";
36
+ const tenantObjectId = mockObjectId(tenantLabel);
37
+ this.tenantId = tenantObjectId;
38
+ const existingConfig = await (0, simulator_config_1.getDeviceConfig)(tenantLabel);
39
+ let deviceTwinId;
40
+ if (existingConfig) {
41
+ this.deviceId = existingConfig.deviceId;
42
+ deviceTwinId = existingConfig.deviceTwinId;
43
+ }
44
+ else {
45
+ this.deviceId = (0, uuid_1.v4)();
46
+ deviceTwinId = (0, uuid_1.v4)();
47
+ await (0, simulator_config_1.saveDeviceConfig)(tenantLabel, {
48
+ deviceId: this.deviceId,
49
+ tenantId: this.tenantId,
50
+ deviceTwinId,
51
+ });
52
+ }
53
+ const deviceTwin = {
54
+ id: deviceTwinId,
55
+ deviceId: this.deviceId,
56
+ tenantId: this.tenantId,
57
+ type: types_1.TwinTypeEnum.Device,
58
+ properties: {
59
+ desired: {
60
+ displayName: this.deviceDisplayName,
61
+ spaceId: tenantObjectId,
62
+ env: "development",
63
+ deviceSerial: `SIM-${this.deviceId.slice(0, 8)}`,
64
+ accessKey: "simulator-local-key",
65
+ },
66
+ reported: {
67
+ ip: [{ interface: "lo", ipv4: "127.0.0.1", ipv6: "::1" }],
68
+ os: { osVersion: "Simulator" },
69
+ env: { gridEnv: "development" },
70
+ },
71
+ },
72
+ };
73
+ this.twinCache.addTwin(deviceTwin);
74
+ await this.localServer.start();
75
+ const io = this.localServer.getIO();
76
+ this.localServer.on("instanceConnected", (event) => {
77
+ const twin = this.twinCache.getTwin(event.twinId);
78
+ const label = twin?.properties?.desired?.appName || "unknown";
79
+ logger_1.simulatorLog.success(`Instance connected: ${label} (${event.twinId}) — ${event.activeCount} active`);
80
+ });
81
+ this.localServer.on("instanceDisconnected", (event) => {
82
+ const twin = this.twinCache.getTwin(event.twinId);
83
+ const label = twin?.properties?.desired?.appName || "unknown";
84
+ logger_1.simulatorLog.warn(`Instance disconnected: ${label} (${event.twinId}) — ${event.activeCount} active`);
85
+ });
86
+ this.router = new message_router_1.MessageRouter(this.twinCache, io);
87
+ this.localServer.setRouter(this.router);
88
+ this.printBanner();
89
+ if (existingConfig) {
90
+ logger_1.simulatorLog.dim(`Reusing device identity ${this.deviceId}`);
91
+ }
92
+ logger_1.simulatorLog.dim(`Apps connect to http://localhost:${this.port}`);
93
+ }
94
+ async stop() {
95
+ logger_1.simulatorLog.dim("Shutting down simulator...");
96
+ await this.localServer.stop();
97
+ logger_1.simulatorLog.dim("Simulator stopped.");
98
+ }
99
+ async createTwinForApp(type, desiredProperties, reuseId) {
100
+ const twin = {
101
+ id: reuseId || (0, uuid_1.v4)(),
102
+ deviceId: this.deviceId,
103
+ tenantId: this.tenantId,
104
+ type,
105
+ properties: {
106
+ desired: desiredProperties || {},
107
+ reported: {},
108
+ },
109
+ };
110
+ this.twinCache.addTwin(twin);
111
+ return twin;
112
+ }
113
+ createPeripheralTwin(instanceId, name, hardwareId, desiredProperties) {
114
+ const twin = {
115
+ id: (0, uuid_1.v4)(),
116
+ deviceId: this.deviceId,
117
+ tenantId: this.tenantId,
118
+ type: types_1.TwinTypeEnum.Peripheral,
119
+ properties: {
120
+ desired: { ...desiredProperties, instanceId, name, hardwareId },
121
+ reported: {},
122
+ },
123
+ descriptors: { instanceId, name, hardwareId },
124
+ };
125
+ this.twinCache.addTwin(twin);
126
+ return twin;
127
+ }
128
+ verifyTwinExists(twinId) {
129
+ return this.twinCache.hasTwin(twinId);
130
+ }
131
+ getDeviceId() {
132
+ return this.deviceId;
133
+ }
134
+ printBanner() {
135
+ logger_1.simulatorLog.printBanner([
136
+ "",
137
+ chalk_1.default.hex("#00e676")(" ██▀▀▄ █ █ █ █ ▄▀▀▀ ▀▀█▀▀ ▄▀▀█ ▄▀▀▀ █ ▄▀"),
138
+ chalk_1.default.hex("#00c853")(" █▄▄▀ █▄▄█ ▀█ ▀▀▄ █ █▄▄█ █ █▀▄ "),
139
+ chalk_1.default.hex("#00a846")(" █ █ █ █ ▀▄▄▀ █ █ █ ▀▄▄▀ █ ▀▄"),
140
+ chalk_1.default.dim(` Device Simulator v${(0, utils_1.getPackageVersion)()}`),
141
+ chalk_1.default.dim("─".repeat(50)),
142
+ ` ${chalk_1.default.cyan("Mode:")} ${chalk_1.default.yellow("local")}`,
143
+ ` ${chalk_1.default.cyan("Port:")} ${this.port}`,
144
+ ` ${chalk_1.default.cyan("Device:")} ${this.deviceDisplayName}`,
145
+ ` ${chalk_1.default.cyan("Device ID:")} ${chalk_1.default.dim(this.deviceId)} ${chalk_1.default.yellow("(local)")}`,
146
+ ` ${chalk_1.default.cyan("Tenant:")} ${chalk_1.default.dim(this.tenantId)} ${chalk_1.default.yellow("(local)")}`,
147
+ chalk_1.default.dim("─".repeat(50)),
148
+ "",
149
+ ]);
150
+ }
151
+ }
152
+ exports.DeviceSimulator = DeviceSimulator;
153
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/simulator/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { EventEmitter } from "events";
2
+ import { Server as SocketIOServer } from "socket.io";
3
+ import { MessageRouter } from "./message-router";
4
+ export interface InstanceConnectionEvent {
5
+ twinId: string;
6
+ activeCount: number;
7
+ }
8
+ export declare class LocalServer extends EventEmitter {
9
+ private httpServer;
10
+ private io;
11
+ private port;
12
+ private router;
13
+ private connectedClients;
14
+ private eventDebounceTimers;
15
+ constructor(port?: number);
16
+ getIO(): SocketIOServer | null;
17
+ setRouter(router: MessageRouter): void;
18
+ start(): Promise<void>;
19
+ private setupSocketHandlers;
20
+ stop(): Promise<void>;
21
+ getConnectedClients(): string[];
22
+ private emitDebounced;
23
+ }
24
+ //# sourceMappingURL=local-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-server.d.ts","sourceRoot":"","sources":["../../src/simulator/local-server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,MAAM,IAAI,cAAc,EAAU,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,UAAU,CAAgD;IAElE,OAAO,CAAC,EAAE,CAA+B;IAEzC,OAAO,CAAC,IAAI,CAAS;IAErB,OAAO,CAAC,MAAM,CAA8B;IAE5C,OAAO,CAAC,gBAAgB,CAAoC;IAE5D,OAAO,CAAC,mBAAmB,CAA0C;gBAEzD,IAAI,SAAQ;IAKxB,KAAK,IAAI,cAAc,GAAG,IAAI;IAI9B,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAItC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBtB,OAAO,CAAC,mBAAmB;IAsE3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAcrB,mBAAmB,IAAI,MAAM,EAAE;IAuB/B,OAAO,CAAC,aAAa;CAatB"}