@fastybird/smart-panel-backend 1.1.0-alpha.5 → 1.1.0-alpha.7

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 (131) hide show
  1. package/dist/app.module.js +7 -0
  2. package/dist/app.module.js.map +1 -1
  3. package/dist/modules/devices/controllers/channels.properties.controller.js +16 -4
  4. package/dist/modules/devices/controllers/channels.properties.controller.js.map +1 -1
  5. package/dist/modules/devices/controllers/devices.channels.properties.controller.js +16 -4
  6. package/dist/modules/devices/controllers/devices.channels.properties.controller.js.map +1 -1
  7. package/dist/modules/devices/devices.module.js +12 -0
  8. package/dist/modules/devices/devices.module.js.map +1 -1
  9. package/dist/modules/devices/services/channels.properties.service.d.ts +27 -3
  10. package/dist/modules/devices/services/channels.properties.service.js +304 -28
  11. package/dist/modules/devices/services/channels.properties.service.js.map +1 -1
  12. package/dist/modules/devices/services/channels.service.js +42 -38
  13. package/dist/modules/devices/services/channels.service.js.map +1 -1
  14. package/dist/modules/devices/services/command-latency-trace-collector.service.d.ts +100 -0
  15. package/dist/modules/devices/services/command-latency-trace-collector.service.js +438 -0
  16. package/dist/modules/devices/services/command-latency-trace-collector.service.js.map +1 -0
  17. package/dist/modules/devices/services/device-structure-lock.service.d.ts +10 -2
  18. package/dist/modules/devices/services/device-structure-lock.service.js +86 -7
  19. package/dist/modules/devices/services/device-structure-lock.service.js.map +1 -1
  20. package/dist/modules/devices/services/devices.service.js +37 -33
  21. package/dist/modules/devices/services/devices.service.js.map +1 -1
  22. package/dist/modules/devices/services/module-reset.service.d.ts +3 -1
  23. package/dist/modules/devices/services/module-reset.service.js +21 -16
  24. package/dist/modules/devices/services/module-reset.service.js.map +1 -1
  25. package/dist/modules/devices/services/property-command-dispatch.service.d.ts +45 -0
  26. package/dist/modules/devices/services/property-command-dispatch.service.js +227 -0
  27. package/dist/modules/devices/services/property-command-dispatch.service.js.map +1 -0
  28. package/dist/modules/devices/services/property-command-window.service.d.ts +71 -0
  29. package/dist/modules/devices/services/property-command-window.service.js +204 -0
  30. package/dist/modules/devices/services/property-command-window.service.js.map +1 -0
  31. package/dist/modules/devices/services/property-command.service.d.ts +20 -3
  32. package/dist/modules/devices/services/property-command.service.js +56 -10
  33. package/dist/modules/devices/services/property-command.service.js.map +1 -1
  34. package/dist/modules/devices/services/property-state-coordinator.service.d.ts +4 -0
  35. package/dist/modules/devices/services/property-state-coordinator.service.js +35 -0
  36. package/dist/modules/devices/services/property-state-coordinator.service.js.map +1 -0
  37. package/dist/modules/devices/services/property-value.service.d.ts +1 -0
  38. package/dist/modules/devices/services/property-value.service.js +4 -0
  39. package/dist/modules/devices/services/property-value.service.js.map +1 -1
  40. package/dist/plugins/devices-home-assistant/services/home-assistant.ws.service.js +2 -1
  41. package/dist/plugins/devices-home-assistant/services/home-assistant.ws.service.js.map +1 -1
  42. package/dist/plugins/devices-home-assistant/services/state-changed.event.service.js +2 -3
  43. package/dist/plugins/devices-home-assistant/services/state-changed.event.service.js.map +1 -1
  44. package/dist/plugins/devices-homekit/listeners/homekit-event.listener.js +6 -1
  45. package/dist/plugins/devices-homekit/listeners/homekit-event.listener.js.map +1 -1
  46. package/dist/plugins/devices-homekit/mappers/base.mapper.js +27 -4
  47. package/dist/plugins/devices-homekit/mappers/base.mapper.js.map +1 -1
  48. package/dist/plugins/devices-homekit/mappers/homekit-mapper.interface.d.ts +8 -0
  49. package/dist/plugins/devices-homekit/mappers/thermostat-coordinator.d.ts +7 -0
  50. package/dist/plugins/devices-homekit/mappers/thermostat-coordinator.js +84 -73
  51. package/dist/plugins/devices-homekit/mappers/thermostat-coordinator.js.map +1 -1
  52. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.d.ts +16 -1
  53. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js +194 -17
  54. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js.map +1 -1
  55. package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.d.ts +9 -1
  56. package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.js +92 -10
  57. package/dist/plugins/devices-shelly-ng/delegates/shelly-device.delegate.js.map +1 -1
  58. package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.d.ts +9 -1
  59. package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js +59 -24
  60. package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js.map +1 -1
  61. package/dist/plugins/devices-shelly-ng/services/shelly-ws-server.service.js +1 -3
  62. package/dist/plugins/devices-shelly-ng/services/shelly-ws-server.service.js.map +1 -1
  63. package/dist/plugins/remote-access-cloudflare-tunnel/controllers/setup.controller.d.ts +17 -0
  64. package/dist/plugins/remote-access-cloudflare-tunnel/controllers/setup.controller.js +147 -0
  65. package/dist/plugins/remote-access-cloudflare-tunnel/controllers/setup.controller.js.map +1 -0
  66. package/dist/plugins/remote-access-cloudflare-tunnel/controllers/status.controller.d.ts +15 -0
  67. package/dist/plugins/remote-access-cloudflare-tunnel/controllers/status.controller.js +98 -0
  68. package/dist/plugins/remote-access-cloudflare-tunnel/controllers/status.controller.js.map +1 -0
  69. package/dist/plugins/remote-access-cloudflare-tunnel/dto/update-config.dto.d.ts +9 -0
  70. package/dist/plugins/remote-access-cloudflare-tunnel/dto/update-config.dto.js +94 -0
  71. package/dist/plugins/remote-access-cloudflare-tunnel/dto/update-config.dto.js.map +1 -0
  72. package/dist/plugins/remote-access-cloudflare-tunnel/models/config.model.d.ts +9 -0
  73. package/dist/plugins/remote-access-cloudflare-tunnel/models/config.model.js +92 -0
  74. package/dist/plugins/remote-access-cloudflare-tunnel/models/config.model.js.map +1 -0
  75. package/dist/plugins/remote-access-cloudflare-tunnel/models/install.model.d.ts +7 -0
  76. package/dist/plugins/remote-access-cloudflare-tunnel/models/install.model.js +48 -0
  77. package/dist/plugins/remote-access-cloudflare-tunnel/models/install.model.js.map +1 -0
  78. package/dist/plugins/remote-access-cloudflare-tunnel/models/status.model.d.ts +42 -0
  79. package/dist/plugins/remote-access-cloudflare-tunnel/models/status.model.js +352 -0
  80. package/dist/plugins/remote-access-cloudflare-tunnel/models/status.model.js.map +1 -0
  81. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.constants.d.ts +24 -0
  82. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.constants.js +27 -0
  83. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.constants.js.map +1 -0
  84. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.exceptions.d.ts +8 -0
  85. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.exceptions.js +19 -0
  86. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.exceptions.js.map +1 -0
  87. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.openapi.d.ts +4 -0
  88. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.openapi.js +20 -0
  89. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.openapi.js.map +1 -0
  90. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.plugin.d.ts +21 -0
  91. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.plugin.js +135 -0
  92. package/dist/plugins/remote-access-cloudflare-tunnel/remote-access-cloudflare-tunnel.plugin.js.map +1 -0
  93. package/dist/plugins/remote-access-cloudflare-tunnel/scripts/cloudflared-setup.sh +185 -0
  94. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-managed.service.d.ts +82 -0
  95. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-managed.service.js +507 -0
  96. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-managed.service.js.map +1 -0
  97. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-provider.service.d.ts +10 -0
  98. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-provider.service.js +37 -0
  99. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-provider.service.js.map +1 -0
  100. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-setup.service.d.ts +38 -0
  101. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-setup.service.js +147 -0
  102. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-setup.service.js.map +1 -0
  103. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-cli.service.d.ts +15 -0
  104. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-cli.service.js +67 -0
  105. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-cli.service.js.map +1 -0
  106. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-metrics.service.d.ts +8 -0
  107. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-metrics.service.js +46 -0
  108. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-metrics.service.js.map +1 -0
  109. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-process.service.d.ts +27 -0
  110. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-process.service.js +139 -0
  111. package/dist/plugins/remote-access-cloudflare-tunnel/services/cloudflared-process.service.js.map +1 -0
  112. package/dist/plugins/scenes-local/platforms/local-scene.platform.d.ts +3 -1
  113. package/dist/plugins/scenes-local/platforms/local-scene.platform.js +12 -7
  114. package/dist/plugins/scenes-local/platforms/local-scene.platform.js.map +1 -1
  115. package/dist/plugins/spaces-home-control/services/climate-intent.service.d.ts +3 -1
  116. package/dist/plugins/spaces-home-control/services/climate-intent.service.js +6 -3
  117. package/dist/plugins/spaces-home-control/services/climate-intent.service.js.map +1 -1
  118. package/dist/plugins/spaces-home-control/services/covers-intent.service.d.ts +3 -1
  119. package/dist/plugins/spaces-home-control/services/covers-intent.service.js +6 -3
  120. package/dist/plugins/spaces-home-control/services/covers-intent.service.js.map +1 -1
  121. package/dist/plugins/spaces-home-control/services/lighting-intent.service.d.ts +3 -1
  122. package/dist/plugins/spaces-home-control/services/lighting-intent.service.js +7 -4
  123. package/dist/plugins/spaces-home-control/services/lighting-intent.service.js.map +1 -1
  124. package/dist/plugins/spaces-home-control/services/space-media-activity.service.d.ts +3 -1
  125. package/dist/plugins/spaces-home-control/services/space-media-activity.service.js +11 -5
  126. package/dist/plugins/spaces-home-control/services/space-media-activity.service.js.map +1 -1
  127. package/dist/plugins/spaces-home-control/services/space-undo-history.service.d.ts +3 -1
  128. package/dist/plugins/spaces-home-control/services/space-undo-history.service.js +8 -5
  129. package/dist/plugins/spaces-home-control/services/space-undo-history.service.js.map +1 -1
  130. package/dist/tsconfig.build.tsbuildinfo +1 -1
  131. package/package.json +2 -2
@@ -0,0 +1,507 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CloudflareTunnelManagedService = void 0;
13
+ exports.compareCloudflaredVersions = compareCloudflaredVersions;
14
+ const node_child_process_1 = require("node:child_process");
15
+ const path_1 = require("path");
16
+ const common_1 = require("@nestjs/common");
17
+ const config_1 = require("@nestjs/config");
18
+ const event_emitter_1 = require("@nestjs/event-emitter");
19
+ const logger_1 = require("../../../common/logger");
20
+ const config_utils_1 = require("../../../common/utils/config.utils");
21
+ const config_service_1 = require("../../../modules/config/services/config.service");
22
+ const base_managed_extension_service_1 = require("../../../modules/extensions/services/base-managed-extension.service");
23
+ const platform_constants_1 = require("../../../modules/platform/platform.constants");
24
+ const platform_service_1 = require("../../../modules/platform/services/platform.service");
25
+ const remote_access_constants_1 = require("../../../modules/remote-access/remote-access.constants");
26
+ const config_model_1 = require("../models/config.model");
27
+ const remote_access_cloudflare_tunnel_constants_1 = require("../remote-access-cloudflare-tunnel.constants");
28
+ const remote_access_cloudflare_tunnel_exceptions_1 = require("../remote-access-cloudflare-tunnel.exceptions");
29
+ const cloudflared_cli_service_1 = require("./cloudflared-cli.service");
30
+ const cloudflared_metrics_service_1 = require("./cloudflared-metrics.service");
31
+ const cloudflared_process_service_1 = require("./cloudflared-process.service");
32
+ const UNEVALUATED_MESSAGE = 'Not evaluated: the platform requirement is not satisfied.';
33
+ const BLOCKING_ORDER = [
34
+ 'platform-supported',
35
+ 'binary-installed',
36
+ 'version-supported',
37
+ 'token-configured',
38
+ ];
39
+ function compareCloudflaredVersions(a, b) {
40
+ const toParts = (v) => v.split('.').map((segment) => parseInt(segment, 10) || 0);
41
+ const partsA = toParts(a);
42
+ const partsB = toParts(b);
43
+ for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {
44
+ const diff = (partsA[i] ?? 0) - (partsB[i] ?? 0);
45
+ if (diff !== 0) {
46
+ return diff;
47
+ }
48
+ }
49
+ return 0;
50
+ }
51
+ let CloudflareTunnelManagedService = class CloudflareTunnelManagedService extends base_managed_extension_service_1.BaseManagedExtensionService {
52
+ constructor(cliService, processService, metricsService, configService, nestConfigService, platformService, eventEmitter) {
53
+ super();
54
+ this.cliService = cliService;
55
+ this.processService = processService;
56
+ this.metricsService = metricsService;
57
+ this.configService = configService;
58
+ this.nestConfigService = nestConfigService;
59
+ this.platformService = platformService;
60
+ this.eventEmitter = eventEmitter;
61
+ this.logger = (0, logger_1.createExtensionLogger)(remote_access_cloudflare_tunnel_constants_1.REMOTE_ACCESS_CLOUDFLARE_TUNNEL_PLUGIN_NAME, 'CloudflareTunnelManagedService');
62
+ this.owner = { kind: 'plugin', type: remote_access_cloudflare_tunnel_constants_1.REMOTE_ACCESS_CLOUDFLARE_TUNNEL_PLUGIN_NAME };
63
+ this.serviceId = 'tunnel';
64
+ this.activationPolicy = 'owner-enabled';
65
+ this.pollTimer = null;
66
+ this.lastStatus = null;
67
+ this.lastError = null;
68
+ this.pluginConfig = null;
69
+ this.requirementsCache = null;
70
+ this.lastKnownVersion = null;
71
+ }
72
+ async start() {
73
+ await this.withLock(async () => {
74
+ if (this.state === 'started') {
75
+ return;
76
+ }
77
+ this.state = 'starting';
78
+ this.pluginConfig = null;
79
+ const config = this.getPluginConfig();
80
+ this.logger.log('Starting Cloudflare Tunnel service');
81
+ try {
82
+ const requirements = await this.refreshRequirements();
83
+ if (this.requirementsSatisfied(requirements)) {
84
+ this.processService.start({
85
+ token: config.tunnelToken ?? '',
86
+ protocol: config.protocol,
87
+ metricsAddress: this.getMetricsAddress(),
88
+ });
89
+ }
90
+ }
91
+ catch (error) {
92
+ this.logger.warn('Failed to evaluate Cloudflare Tunnel requirements during start', {
93
+ message: error instanceof Error ? error.message : String(error),
94
+ });
95
+ }
96
+ this.schedulePoll(0);
97
+ this.state = 'started';
98
+ this.logger.log('Cloudflare Tunnel service started');
99
+ });
100
+ }
101
+ async stop() {
102
+ await this.withLock(async () => {
103
+ if (this.state === 'stopped') {
104
+ return;
105
+ }
106
+ this.state = 'stopping';
107
+ this.clearPoll();
108
+ try {
109
+ await this.processService.stop();
110
+ this.state = 'stopped';
111
+ }
112
+ catch (error) {
113
+ const message = error instanceof Error ? error.message : String(error);
114
+ this.state = 'error';
115
+ this.lastError = message;
116
+ this.logger.error('Failed to stop the Cloudflare Tunnel process', { message });
117
+ await this.emitStatus();
118
+ throw new remote_access_cloudflare_tunnel_exceptions_1.CloudflareTunnelStopFailedException(message);
119
+ }
120
+ await this.emitStatus();
121
+ this.logger.log('Cloudflare Tunnel service stopped');
122
+ });
123
+ }
124
+ async emitStatus() {
125
+ const status = await this.computeStatus();
126
+ this.lastStatus = status;
127
+ this.eventEmitter.emit(remote_access_constants_1.EventType.PROVIDER_STATUS, status);
128
+ }
129
+ async onConfigChanged() {
130
+ const previous = this.pluginConfig;
131
+ this.pluginConfig = null;
132
+ const next = this.getPluginConfig();
133
+ const tokenChanged = !previous || previous.tunnelToken !== next.tunnelToken;
134
+ const protocolChanged = !previous || previous.protocol !== next.protocol;
135
+ if (tokenChanged || protocolChanged) {
136
+ this.logger.log('Cloudflare Tunnel token or protocol changed, restart required');
137
+ return { restartRequired: true };
138
+ }
139
+ await this.emitStatus().catch((error) => {
140
+ this.logger.debug('Failed to emit status after a Cloudflare Tunnel config change', {
141
+ message: error instanceof Error ? error.message : String(error),
142
+ });
143
+ });
144
+ return { restartRequired: false };
145
+ }
146
+ async isHealthy() {
147
+ if (!this.processService.isRunning()) {
148
+ return false;
149
+ }
150
+ const ready = await this.metricsService.fetchReady(this.getMetricsAddress());
151
+ return ready !== null;
152
+ }
153
+ async factoryReset() {
154
+ try {
155
+ await this.stop();
156
+ return { success: true };
157
+ }
158
+ catch (error) {
159
+ return { success: false, reason: error instanceof Error ? error.message : 'Unknown error' };
160
+ }
161
+ }
162
+ getRequirements() {
163
+ return this.requirementsCache ?? [];
164
+ }
165
+ async refreshRequirements() {
166
+ const requirements = await this.evaluateRequirementsLive();
167
+ this.requirementsCache = requirements;
168
+ return requirements;
169
+ }
170
+ requirementsSatisfied(requirements) {
171
+ return requirements.length > 0 && requirements.every((requirement) => requirement.satisfied);
172
+ }
173
+ async evaluateRequirementsLive() {
174
+ const platform = await this.evaluatePlatformSupported();
175
+ if (!platform.satisfied) {
176
+ return this.attachRemedies([
177
+ platform,
178
+ this.unevaluatedRequirement('binary-installed'),
179
+ this.unevaluatedRequirement('version-supported'),
180
+ this.unevaluatedRequirement('token-configured'),
181
+ ]);
182
+ }
183
+ const { binary, version } = await this.evaluateBinaryAndVersion();
184
+ const token = this.evaluateTokenConfigured();
185
+ return this.attachRemedies([platform, binary, version, token]);
186
+ }
187
+ unevaluatedRequirement(code) {
188
+ return { code, satisfied: false, message: UNEVALUATED_MESSAGE };
189
+ }
190
+ async attachRemedies(requirements) {
191
+ let installRemedyPromise = null;
192
+ const getInstallRemedy = () => {
193
+ installRemedyPromise ??= this.buildInstallRemedy();
194
+ return installRemedyPromise;
195
+ };
196
+ return Promise.all(requirements.map((requirement) => this.finalizeRequirement(requirement, getInstallRemedy)));
197
+ }
198
+ async finalizeRequirement(requirement, getInstallRemedy) {
199
+ if (requirement.satisfied) {
200
+ return { ...requirement, remedy: null };
201
+ }
202
+ const remedy = requirement.code === 'binary-installed' || requirement.code === 'version-supported'
203
+ ? await getInstallRemedy()
204
+ : this.buildFixedRemedy(requirement.code);
205
+ return { ...requirement, remedy };
206
+ }
207
+ buildFixedRemedy(code) {
208
+ switch (code) {
209
+ case 'token-configured':
210
+ return { commands: [], note: 'Paste the tunnel token in the setup wizard' };
211
+ case 'platform-supported':
212
+ default:
213
+ return { commands: [], note: remote_access_cloudflare_tunnel_constants_1.CLOUDFLARE_TUNNEL_DOCUMENTATION_URL };
214
+ }
215
+ }
216
+ async buildInstallRemedy() {
217
+ try {
218
+ const stdout = await this.runSetupScriptPrintPlan();
219
+ const lines = stdout
220
+ .split('\n')
221
+ .map((line) => line.trim())
222
+ .filter((line) => line.length > 0);
223
+ if (lines.length === 0) {
224
+ return { commands: [], note: remote_access_cloudflare_tunnel_constants_1.CLOUDFLARE_TUNNEL_VENDOR_DOWNLOAD_URL };
225
+ }
226
+ return {
227
+ commands: lines.map((line) => (line.includes('|') ? line : `sudo ${line}`)),
228
+ note: null,
229
+ };
230
+ }
231
+ catch (error) {
232
+ this.logger.debug('Failed to build the install remedy from cloudflared-setup.sh --print-plan', {
233
+ message: error instanceof Error ? error.message : String(error),
234
+ });
235
+ return { commands: [], note: remote_access_cloudflare_tunnel_constants_1.CLOUDFLARE_TUNNEL_VENDOR_DOWNLOAD_URL };
236
+ }
237
+ }
238
+ runSetupScriptPrintPlan() {
239
+ const script = (0, path_1.join)(__dirname, '..', 'scripts', 'cloudflared-setup.sh');
240
+ return new Promise((resolve, reject) => {
241
+ (0, node_child_process_1.execFile)('bash', [script, '--print-plan'], { timeout: remote_access_cloudflare_tunnel_constants_1.CLOUDFLARE_TUNNEL_PRINT_PLAN_TIMEOUT_MS }, (error, stdout) => {
242
+ if (error) {
243
+ reject(error);
244
+ return;
245
+ }
246
+ resolve(stdout ?? '');
247
+ });
248
+ });
249
+ }
250
+ async evaluatePlatformSupported() {
251
+ const platformType = await this.platformService.getPlatformTypeAsync();
252
+ if (platformType === platform_constants_1.PlatformType.RASPBERRY || platformType === platform_constants_1.PlatformType.GENERIC) {
253
+ return { code: 'platform-supported', satisfied: true, message: `Platform '${platformType}' is supported.` };
254
+ }
255
+ return {
256
+ code: 'platform-supported',
257
+ satisfied: false,
258
+ message: `Cloudflare Tunnel is not supported on the '${platformType}' platform.`,
259
+ };
260
+ }
261
+ async evaluateBinaryAndVersion() {
262
+ try {
263
+ const info = await this.cliService.getVersion();
264
+ this.lastKnownVersion = info.version;
265
+ const supported = compareCloudflaredVersions(info.version, remote_access_cloudflare_tunnel_constants_1.CLOUDFLARED_MIN_VERSION) >= 0;
266
+ return {
267
+ binary: { code: 'binary-installed', satisfied: true, message: `cloudflared ${info.version} is installed.` },
268
+ version: {
269
+ code: 'version-supported',
270
+ satisfied: supported,
271
+ message: supported
272
+ ? `cloudflared ${info.version} meets the minimum supported version ${remote_access_cloudflare_tunnel_constants_1.CLOUDFLARED_MIN_VERSION}.`
273
+ : `cloudflared ${info.version} is older than the minimum supported version ${remote_access_cloudflare_tunnel_constants_1.CLOUDFLARED_MIN_VERSION}.`,
274
+ },
275
+ };
276
+ }
277
+ catch (error) {
278
+ const notInstalled = error instanceof cloudflared_cli_service_1.CloudflaredCliError && error.kind === 'not-installed';
279
+ return {
280
+ binary: {
281
+ code: 'binary-installed',
282
+ satisfied: false,
283
+ message: notInstalled
284
+ ? 'cloudflared is not installed.'
285
+ : 'Failed to determine whether cloudflared is installed.',
286
+ },
287
+ version: {
288
+ code: 'version-supported',
289
+ satisfied: false,
290
+ message: 'Cannot verify the cloudflared version before it is installed.',
291
+ },
292
+ };
293
+ }
294
+ }
295
+ evaluateTokenConfigured() {
296
+ const config = this.getPluginConfig();
297
+ const satisfied = typeof config.tunnelToken === 'string' && config.tunnelToken.trim().length > 0;
298
+ return {
299
+ code: 'token-configured',
300
+ satisfied,
301
+ message: satisfied
302
+ ? 'A Cloudflare tunnel token is configured.'
303
+ : 'Paste the tunnel token from the Cloudflare Zero Trust dashboard',
304
+ };
305
+ }
306
+ firstBlockingRequirement(requirements) {
307
+ for (const code of BLOCKING_ORDER) {
308
+ const requirement = requirements.find((candidate) => candidate.code === code);
309
+ if (requirement && !requirement.satisfied) {
310
+ return requirement;
311
+ }
312
+ }
313
+ return null;
314
+ }
315
+ stateForRequirementCode(code) {
316
+ switch (code) {
317
+ case 'platform-supported':
318
+ return 'unsupported';
319
+ case 'token-configured':
320
+ return 'setup-required';
321
+ case 'binary-installed':
322
+ case 'version-supported':
323
+ default:
324
+ return 'not-installed';
325
+ }
326
+ }
327
+ async computeStatus() {
328
+ if (this.state === 'stopped' || this.state === 'stopping') {
329
+ return this.buildStatus('disconnected', 'The tunnel service is stopped.');
330
+ }
331
+ if (this.state === 'error') {
332
+ return this.buildStatus('error', this.lastError ?? 'The Cloudflare Tunnel service failed.');
333
+ }
334
+ const requirements = await this.refreshRequirements();
335
+ const blocking = this.firstBlockingRequirement(requirements);
336
+ if (blocking) {
337
+ return this.buildStatus(this.stateForRequirementCode(blocking.code), blocking.message);
338
+ }
339
+ if (!this.processService.isRunning()) {
340
+ const lastLine = this.processService.getLastStderrLine();
341
+ const exit = this.processService.getLastExit();
342
+ const message = lastLine ??
343
+ (exit
344
+ ? `cloudflared exited unexpectedly${exit.code !== null ? ` (code ${exit.code})` : ''}.`
345
+ : 'cloudflared is not running.');
346
+ return this.buildStatus('error', message);
347
+ }
348
+ const ready = await this.metricsService.fetchReady(this.getMetricsAddress());
349
+ if (ready) {
350
+ return this.buildStatus('connected', undefined, ready);
351
+ }
352
+ const startedAt = this.processService.getStartedAt();
353
+ const withinGrace = startedAt !== null && Date.now() - startedAt < remote_access_cloudflare_tunnel_constants_1.CLOUDFLARED_READY_GRACE_MS;
354
+ if (withinGrace) {
355
+ return this.buildStatus('connecting', 'Waiting for the tunnel to become ready.');
356
+ }
357
+ const message = this.processService.getLastStderrLine() ?? 'Cloudflared did not become ready in time.';
358
+ return this.buildStatus('error', message);
359
+ }
360
+ isPollable() {
361
+ return this.state === 'starting' || this.state === 'started';
362
+ }
363
+ schedulePoll(delayMs) {
364
+ this.clearPoll();
365
+ if (!this.isPollable()) {
366
+ return;
367
+ }
368
+ this.pollTimer = setTimeout(() => {
369
+ void this.pollTick();
370
+ }, delayMs);
371
+ this.pollTimer.unref?.();
372
+ }
373
+ clearPoll() {
374
+ if (this.pollTimer) {
375
+ clearTimeout(this.pollTimer);
376
+ this.pollTimer = null;
377
+ }
378
+ }
379
+ async pollTick() {
380
+ try {
381
+ if (this.state === 'started' && !this.processService.isRunning()) {
382
+ const requirements = await this.refreshRequirements();
383
+ if (this.requirementsSatisfied(requirements) && this.isPollable()) {
384
+ const config = this.getPluginConfig();
385
+ this.processService.start({
386
+ token: config.tunnelToken ?? '',
387
+ protocol: config.protocol,
388
+ metricsAddress: this.getMetricsAddress(),
389
+ });
390
+ }
391
+ }
392
+ const status = await this.computeStatus();
393
+ if (!this.isPollable()) {
394
+ return;
395
+ }
396
+ if (this.hasStatusChanged(this.lastStatus, status)) {
397
+ this.lastStatus = status;
398
+ this.eventEmitter.emit(remote_access_constants_1.EventType.PROVIDER_STATUS, status);
399
+ }
400
+ this.schedulePoll(status.state === 'connecting'
401
+ ? remote_access_cloudflare_tunnel_constants_1.CLOUDFLARED_POLL_INTERVAL_TRANSITIONING_MS
402
+ : remote_access_cloudflare_tunnel_constants_1.CLOUDFLARED_POLL_INTERVAL_STABLE_MS);
403
+ }
404
+ catch (error) {
405
+ if (!this.isPollable()) {
406
+ return;
407
+ }
408
+ this.logger.error('Cloudflare Tunnel status poll failed', {
409
+ message: error instanceof Error ? error.message : String(error),
410
+ });
411
+ this.schedulePoll(remote_access_cloudflare_tunnel_constants_1.CLOUDFLARED_POLL_INTERVAL_STABLE_MS);
412
+ }
413
+ }
414
+ hasStatusChanged(previous, next) {
415
+ if (!previous) {
416
+ return true;
417
+ }
418
+ return (previous.state !== next.state ||
419
+ previous.message !== next.message ||
420
+ JSON.stringify(previous.endpoints) !== JSON.stringify(next.endpoints) ||
421
+ JSON.stringify(previous.details) !== JSON.stringify(next.details) ||
422
+ JSON.stringify(previous.proxyAddresses) !== JSON.stringify(next.proxyAddresses) ||
423
+ JSON.stringify(previous.advisories) !== JSON.stringify(next.advisories));
424
+ }
425
+ buildStatus(state, message, ready = null) {
426
+ const config = this.getPluginConfig();
427
+ const connected = state === 'connected';
428
+ return {
429
+ type: remote_access_cloudflare_tunnel_constants_1.REMOTE_ACCESS_CLOUDFLARE_TUNNEL_PLUGIN_NAME,
430
+ state,
431
+ endpoints: connected ? this.buildEndpoints(config) : [],
432
+ message,
433
+ details: this.buildDetails(config, ready),
434
+ proxyAddresses: connected ? ['127.0.0.1', '::1'] : [],
435
+ advisories: this.buildAdvisories(state, config),
436
+ updatedAt: new Date().toISOString(),
437
+ };
438
+ }
439
+ buildEndpoints(config) {
440
+ if (!config.publicHostname) {
441
+ return [];
442
+ }
443
+ return [{ url: `https://${config.publicHostname}`, scope: 'public', https: true, label: 'Cloudflare Tunnel' }];
444
+ }
445
+ buildDetails(config, ready) {
446
+ return {
447
+ hostname: config.publicHostname,
448
+ connector_id: ready?.connectorId ?? null,
449
+ ready_connections: ready?.readyConnections ?? null,
450
+ version: this.lastKnownVersion,
451
+ };
452
+ }
453
+ buildAdvisories(state, config) {
454
+ const advisories = [];
455
+ if (this.lastKnownVersion && compareCloudflaredVersions(this.lastKnownVersion, remote_access_cloudflare_tunnel_constants_1.CLOUDFLARED_MIN_VERSION) < 0) {
456
+ advisories.push({
457
+ code: 'version-unsupported',
458
+ severity: 'warning',
459
+ message: `cloudflared ${this.lastKnownVersion} is older than the minimum supported version ${remote_access_cloudflare_tunnel_constants_1.CLOUDFLARED_MIN_VERSION}. Upgrade the cloudflared package.`,
460
+ });
461
+ }
462
+ if (state === 'connected') {
463
+ advisories.push({
464
+ code: 'public-exposure',
465
+ severity: 'warning',
466
+ message: 'This installation is reachable from the internet; only the Smart Panel login protects it unless Cloudflare Access is configured.',
467
+ });
468
+ if (!config.publicHostname) {
469
+ advisories.push({
470
+ code: 'hostname-not-configured',
471
+ severity: 'info',
472
+ message: 'The tunnel is connected, but no public hostname is configured yet — no endpoint is published.',
473
+ });
474
+ }
475
+ }
476
+ return advisories;
477
+ }
478
+ getMetricsAddress() {
479
+ return (0, config_utils_1.getEnvValue)(this.nestConfigService, remote_access_cloudflare_tunnel_constants_1.REMOTE_ACCESS_CLOUDFLARE_METRICS_ADDRESS_ENV, remote_access_cloudflare_tunnel_constants_1.CLOUDFLARED_METRICS_ADDRESS);
480
+ }
481
+ getPluginConfig() {
482
+ if (!this.pluginConfig) {
483
+ try {
484
+ this.pluginConfig = this.configService.getPluginConfig(remote_access_cloudflare_tunnel_constants_1.REMOTE_ACCESS_CLOUDFLARE_TUNNEL_PLUGIN_NAME);
485
+ }
486
+ catch (error) {
487
+ this.logger.warn('Failed to load the Cloudflare Tunnel plugin configuration, using defaults', {
488
+ message: error instanceof Error ? error.message : String(error),
489
+ });
490
+ this.pluginConfig = new config_model_1.RemoteAccessCloudflareTunnelPluginConfigModel();
491
+ }
492
+ }
493
+ return this.pluginConfig;
494
+ }
495
+ };
496
+ exports.CloudflareTunnelManagedService = CloudflareTunnelManagedService;
497
+ exports.CloudflareTunnelManagedService = CloudflareTunnelManagedService = __decorate([
498
+ (0, common_1.Injectable)(),
499
+ __metadata("design:paramtypes", [cloudflared_cli_service_1.CloudflaredCliService,
500
+ cloudflared_process_service_1.CloudflaredProcessService,
501
+ cloudflared_metrics_service_1.CloudflaredMetricsService,
502
+ config_service_1.ConfigService,
503
+ config_1.ConfigService,
504
+ platform_service_1.PlatformService,
505
+ event_emitter_1.EventEmitter2])
506
+ ], CloudflareTunnelManagedService);
507
+ //# sourceMappingURL=cloudflare-tunnel-managed.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-tunnel-managed.service.js","sourceRoot":"","sources":["../../../../src/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-managed.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { IRemoteAccessProvider, RemoteAccessProviderCapabilities, RemoteAccessProviderKind, RemoteAccessProviderStatus } from '../../../modules/remote-access/platforms/remote-access-provider.platform';
2
+ import { CloudflareTunnelManagedService } from './cloudflare-tunnel-managed.service';
3
+ export declare class CloudflareTunnelProviderService implements IRemoteAccessProvider {
4
+ private readonly tunnelManagedService;
5
+ readonly type = "remote-access-cloudflare-tunnel-plugin";
6
+ readonly kind: RemoteAccessProviderKind;
7
+ readonly capabilities: RemoteAccessProviderCapabilities;
8
+ constructor(tunnelManagedService: CloudflareTunnelManagedService);
9
+ getStatus(): Promise<RemoteAccessProviderStatus>;
10
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CloudflareTunnelProviderService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const remote_access_cloudflare_tunnel_constants_1 = require("../remote-access-cloudflare-tunnel.constants");
15
+ const cloudflare_tunnel_managed_service_1 = require("./cloudflare-tunnel-managed.service");
16
+ let CloudflareTunnelProviderService = class CloudflareTunnelProviderService {
17
+ constructor(tunnelManagedService) {
18
+ this.tunnelManagedService = tunnelManagedService;
19
+ this.type = remote_access_cloudflare_tunnel_constants_1.REMOTE_ACCESS_CLOUDFLARE_TUNNEL_PLUGIN_NAME;
20
+ this.kind = 'tunnel';
21
+ this.capabilities = {
22
+ https: true,
23
+ publicUrl: true,
24
+ identityHeaders: false,
25
+ ssh: false,
26
+ };
27
+ }
28
+ getStatus() {
29
+ return this.tunnelManagedService.computeStatus();
30
+ }
31
+ };
32
+ exports.CloudflareTunnelProviderService = CloudflareTunnelProviderService;
33
+ exports.CloudflareTunnelProviderService = CloudflareTunnelProviderService = __decorate([
34
+ (0, common_1.Injectable)(),
35
+ __metadata("design:paramtypes", [cloudflare_tunnel_managed_service_1.CloudflareTunnelManagedService])
36
+ ], CloudflareTunnelProviderService);
37
+ //# sourceMappingURL=cloudflare-tunnel-provider.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-tunnel-provider.service.js","sourceRoot":"","sources":["../../../../src/plugins/remote-access-cloudflare-tunnel/services/cloudflare-tunnel-provider.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAQ5C,4GAA2G;AAE3G,2FAAqF;AAQ9E,IAAM,+BAA+B,GAArC,MAAM,+BAA+B;IAU3C,YAA6B,oBAAoD;QAApD,yBAAoB,GAApB,oBAAoB,CAAgC;QATxE,SAAI,GAAG,uFAA2C,CAAC;QACnD,SAAI,GAA6B,QAAQ,CAAC;QAC1C,iBAAY,GAAqC;YACzD,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI;YACf,eAAe,EAAE,KAAK;YACtB,GAAG,EAAE,KAAK;SACV,CAAC;IAEkF,CAAC;IAErF,SAAS;QACR,OAAO,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,CAAC;IAClD,CAAC;CACD,CAAA;AAfY,0EAA+B;0CAA/B,+BAA+B;IAD3C,IAAA,mBAAU,GAAE;qCAWuC,kEAA8B;GAVrE,+BAA+B,CAe3C"}
@@ -0,0 +1,38 @@
1
+ import { ConfigService as NestConfigService } from '@nestjs/config';
2
+ import { EventEmitter2 } from '@nestjs/event-emitter';
3
+ import { ConfigService } from '../../../modules/config/services/config.service';
4
+ import { ManagedServiceManagerService } from '../../../modules/extensions/services/managed-service-manager.service';
5
+ import { PlatformService } from '../../../modules/platform/services/platform.service';
6
+ import { PrivilegedJobStatus, PrivilegedWorkerService } from '../../../modules/system/services/privileged-worker.service';
7
+ import { CloudflareTunnelSetupUnavailableException } from '../remote-access-cloudflare-tunnel.exceptions';
8
+ import { CloudflareTunnelManagedService } from './cloudflare-tunnel-managed.service';
9
+ export { CloudflareTunnelSetupUnavailableException };
10
+ export interface CloudflareTunnelSetupProgressEvent {
11
+ type: string;
12
+ job: string;
13
+ step?: string;
14
+ state: PrivilegedJobStatus['state'];
15
+ message?: string;
16
+ }
17
+ export declare class CloudflareTunnelSetupService {
18
+ private readonly privilegedWorker;
19
+ private readonly nestConfigService;
20
+ private readonly tunnelManagedService;
21
+ private readonly eventEmitter;
22
+ private readonly platformService;
23
+ private readonly configService;
24
+ private readonly managedServiceManager;
25
+ private readonly logger;
26
+ private lastJob;
27
+ constructor(privilegedWorker: PrivilegedWorkerService, nestConfigService: NestConfigService, tunnelManagedService: CloudflareTunnelManagedService, eventEmitter: EventEmitter2, platformService: PlatformService, configService: ConfigService, managedServiceManager: ManagedServiceManagerService);
28
+ install(): Promise<{
29
+ id: string;
30
+ }>;
31
+ getLastJob(): {
32
+ id: string;
33
+ status: PrivilegedJobStatus;
34
+ } | null;
35
+ private watchJob;
36
+ private onSetupComplete;
37
+ private ensureDir;
38
+ }