@uns-kit/core 0.0.35 → 0.0.36

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 (71) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +55 -55
  3. package/dist/app-config.d.ts.map +1 -0
  4. package/dist/app-config.js.map +1 -0
  5. package/dist/base-path.js.map +1 -1
  6. package/dist/config/app-config.js.map +1 -1
  7. package/dist/config/project.config.extension.js.map +1 -1
  8. package/dist/config-file.d.ts.map +1 -1
  9. package/dist/config-file.js +1 -4
  10. package/dist/config-file.js.map +1 -1
  11. package/dist/graphql/schema.js.map +1 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/logger.js.map +1 -1
  14. package/dist/tools/auth/auth-client.js.map +1 -1
  15. package/dist/tools/auth/index.js.map +1 -1
  16. package/dist/tools/auth/secure-store.js.map +1 -1
  17. package/dist/tools/base-path.js.map +1 -1
  18. package/dist/tools/generate-config-schema.js.map +1 -1
  19. package/dist/tools/initialize.d.ts +1 -1
  20. package/dist/tools/initialize.js +103 -103
  21. package/dist/tools/make.d.ts +1 -1
  22. package/dist/tools/make.js +27 -27
  23. package/dist/tools/pull-request.js.map +1 -1
  24. package/dist/tools/refresh-uns.js +35 -35
  25. package/dist/tools/refresh-uns.js.map +1 -1
  26. package/dist/tools/schema.js.map +1 -1
  27. package/dist/tools/update-rtt.d.ts +1 -1
  28. package/dist/tools/update-rtt.js +169 -169
  29. package/dist/tools/update-tools.d.ts +1 -1
  30. package/dist/tools/update-tools.js +72 -72
  31. package/dist/uns/handover-manager-event-emitter.js.map +1 -1
  32. package/dist/uns/handover-manager.js.map +1 -1
  33. package/dist/uns/process-config.js.map +1 -1
  34. package/dist/uns/process-name-service.js.map +1 -1
  35. package/dist/uns/status-monitor.js.map +1 -1
  36. package/dist/uns/uns-event-emitter.js.map +1 -1
  37. package/dist/uns/uns-interfaces.js.map +1 -1
  38. package/dist/uns/uns-measurements.js.map +1 -1
  39. package/dist/uns/uns-packet.js.map +1 -1
  40. package/dist/uns/uns-proxy-process.js.map +1 -1
  41. package/dist/uns/uns-proxy.js.map +1 -1
  42. package/dist/uns/uns-tags.js.map +1 -1
  43. package/dist/uns/uns-topic-matcher.js.map +1 -1
  44. package/dist/uns/uns-topics.js.map +1 -1
  45. package/dist/uns-config/config-schema.js.map +1 -1
  46. package/dist/uns-config/host-placeholders.js.map +1 -1
  47. package/dist/uns-config/schema-tolls.js.map +1 -1
  48. package/dist/uns-config/schema-tools.js.map +1 -1
  49. package/dist/uns-config/secret-placeholders.js.map +1 -1
  50. package/dist/uns-config/secret-resolver.js.map +1 -1
  51. package/dist/uns-config/uns-core-schema.js.map +1 -1
  52. package/dist/uns-grpc/uns-gateway-cli.js.map +1 -1
  53. package/dist/uns-grpc/uns-gateway-server.js.map +1 -1
  54. package/dist/uns-grpc/uns-gateway.proto +102 -102
  55. package/dist/uns-mqtt/mqtt-interfaces.js.map +1 -1
  56. package/dist/uns-mqtt/mqtt-proxy.js.map +1 -1
  57. package/dist/uns-mqtt/mqtt-topic-builder.js.map +1 -1
  58. package/dist/uns-mqtt/mqtt-worker-init.js.map +1 -1
  59. package/dist/uns-mqtt/mqtt-worker.js.map +1 -1
  60. package/dist/uns-mqtt/throttled-queue.js.map +1 -1
  61. package/dist/uns-mqtt/uns-mqtt-proxy.js.map +1 -1
  62. package/dist/uns-mqtt/ws-proxy.js.map +1 -1
  63. package/package.json +1 -1
  64. package/dist/tools/initialize.d.ts.map +0 -1
  65. package/dist/tools/initialize.js.map +0 -1
  66. package/dist/tools/make.d.ts.map +0 -1
  67. package/dist/tools/make.js.map +0 -1
  68. package/dist/tools/update-rtt.d.ts.map +0 -1
  69. package/dist/tools/update-rtt.js.map +0 -1
  70. package/dist/tools/update-tools.d.ts.map +0 -1
  71. package/dist/tools/update-tools.js.map +0 -1
@@ -1,170 +1,170 @@
1
- import { basePath } from "./base-path.js";
2
- import readline from "node:readline";
3
- import * as path from "path";
4
- import chalk from "chalk";
5
- import { readFile } from "fs/promises";
6
- import fs from "fs-extra";
7
- import * as prettier from "prettier";
8
- const rl = readline.createInterface({
9
- input: process.stdin,
10
- output: process.stdout,
11
- });
12
- const packageJsonPath = path.join(basePath, "package.json");
13
- const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8"));
14
- // Flags
15
- const argv = new Set(process.argv.slice(2));
16
- const DRY_RUN = argv.has("--dry-run") || process.env.DRY_RUN === "1";
17
- function logAction(action) {
18
- if (DRY_RUN)
19
- console.log(`[dry-run] ${action}`);
20
- else
21
- console.log(action);
22
- }
23
- function writeJson(file, obj) {
24
- return prettier.format(JSON.stringify(obj), { parser: "json" }).then((s) => {
25
- if (DRY_RUN) {
26
- console.log(`[dry-run] write ${file} (${s.length} bytes)`);
27
- }
28
- else {
29
- fs.writeFileSync(file, s, "utf8");
30
- }
31
- });
32
- }
33
- function copyDir(src, dest, options) {
34
- if (DRY_RUN) {
35
- console.log(`[dry-run] copy ${src} -> ${dest}`);
36
- return;
37
- }
38
- fs.copySync(src, dest, { overwrite: true, ...options });
39
- }
40
- function removePath(p, opts) {
41
- if (DRY_RUN) {
42
- console.log(`[dry-run] rm ${p}`);
43
- return;
44
- }
45
- fs.rmSync(p, { force: true, recursive: true, ...opts });
46
- }
47
- try {
48
- await main();
49
- rl.close();
50
- }
51
- catch (error) {
52
- console.log(chalk.red.bold(`\n${error}`));
53
- rl.close();
54
- }
55
- async function main() {
56
- const tmpRtt = path.join(basePath, "/tmp-rtt");
57
- try {
58
- logAction(`Overwrite examples`);
59
- copyDir(path.join(tmpRtt, "/src/examples"), path.join(basePath, "/src/examples"));
60
- logAction(`Overwrite uns`);
61
- copyDir(path.join(tmpRtt, "/src/uns"), path.join(basePath, "/src/uns"));
62
- logAction(`Overwrite uns-config`);
63
- copyDir(path.join(tmpRtt, "/src/uns-config"), path.join(basePath, "/src/uns-config"));
64
- // Python: copy template but preserve local project area(s) and environments
65
- // Preserved by default: python/rtt, python/venv, python/.venv, python/__pycache__
66
- const pythonSrc = path.join(tmpRtt, "/python");
67
- const pythonDst = path.join(basePath, "/python");
68
- logAction(`Overwrite python (preserve local, rtt, venv/.venv, __pycache__)`);
69
- copyDir(pythonSrc, pythonDst, {
70
- filter: (src) => {
71
- // Only filter relative to template python root
72
- const rel = path.relative(pythonSrc, src);
73
- if (!rel || rel === "")
74
- return true;
75
- const top = rel.split(path.sep)[0];
76
- const preserved = new Set(["local", "rtt", "venv", ".venv", "__pycache__"]);
77
- return !preserved.has(top);
78
- },
79
- });
80
- logAction(`Overwrite uns-grpc`);
81
- copyDir(path.join(tmpRtt, "/src/uns-grpc"), path.join(basePath, "/packages/uns-core/src/uns-grpc"));
82
- logAction(`Overwrite uns-cron`);
83
- copyDir(path.join(tmpRtt, "/src/uns-cron"), path.join(basePath, "/packages/uns-cron/src"));
84
- logAction(`Overwrite uns-api`);
85
- copyDir(path.join(tmpRtt, "/src/uns-api"), path.join(basePath, "/packages/uns-api/src"));
86
- logAction(`Overwrite uns-mqtt`);
87
- copyDir(path.join(tmpRtt, "/src/uns-mqtt"), path.join(basePath, "/packages/uns-core/src/uns-mqtt"));
88
- logAction(`Overwrite uns-temporal`);
89
- copyDir(path.join(tmpRtt, "/src/uns-temporal"), path.join(basePath, "/packages/uns-temporal/src"));
90
- logAction(`Overwrite eslint.config.mjs`);
91
- copyDir(path.join(tmpRtt, "/eslint.config.mjs"), path.join(basePath, "/eslint.config.mjs"));
92
- logAction(`Overwrite schema.ts`);
93
- copyDir(path.join(tmpRtt, "/src/graphql/schema.ts"), path.join(basePath, "/src/graphql/schema.ts"));
94
- logAction(`Overwrite config-template.json`);
95
- copyDir(path.join(tmpRtt, "/config-template.json"), path.join(basePath, "/config-template.json"));
96
- logAction(`Overwrite vite.config.js`);
97
- copyDir(path.join(tmpRtt, "/vite.config.js"), path.join(basePath, "/vite.config.js"));
98
- logAction(`Overwrite codegen.ts`);
99
- copyDir(path.join(tmpRtt, "/codegen.ts"), path.join(basePath, "/codegen.ts"));
100
- logAction(`Overwrite logger.ts`);
101
- copyDir(path.join(tmpRtt, "/src/logger.ts"), path.join(basePath, "/src/logger.ts"));
102
- }
103
- catch (error) {
104
- console.error(chalk.red.bold(`exec error: ${error}`));
105
- return;
106
- }
107
- try {
108
- logAction(`Merge package.json scripts (template overrides existing keys, preserves extras)`);
109
- const tmpPackageJson = JSON.parse(await readFile(path.join(tmpRtt, 'package.json'), "utf8"));
110
- const currentScripts = packageJson.scripts || {};
111
- const templateScripts = tmpPackageJson.scripts || {};
112
- packageJson.scripts = { ...currentScripts, ...templateScripts };
113
- await writeJson('package.json', packageJson);
114
- }
115
- catch (error) {
116
- console.error(chalk.red.bold(`exec error: ${error}`));
117
- return;
118
- }
119
- try {
120
- console.log(chalk.red(`Update devDependencies: overwrite versions for existing, add missing; preserve extras.`));
121
- const tmpPackageJson = JSON.parse(await readFile(path.join(tmpRtt, 'package.json'), "utf8"));
122
- packageJson.devDependencies = packageJson.devDependencies || {};
123
- for (const [dep, version] of Object.entries(tmpPackageJson.devDependencies || {})) {
124
- packageJson.devDependencies[dep] = version;
125
- }
126
- await writeJson('package.json', packageJson);
127
- }
128
- catch (error) {
129
- console.error(chalk.red.bold(`exec error: ${error}`));
130
- return;
131
- }
132
- try {
133
- console.log(chalk.red(`Update dependencies: keep existing versions; add missing from template.`));
134
- const tmpPackageJson = JSON.parse(await readFile(path.join(tmpRtt, 'package.json'), "utf8"));
135
- packageJson.dependencies = packageJson.dependencies || {};
136
- for (const [dep, version] of Object.entries(tmpPackageJson.dependencies || {})) {
137
- if (!(dep in packageJson.dependencies)) {
138
- packageJson.dependencies[dep] = version;
139
- }
140
- }
141
- await writeJson('package.json', packageJson);
142
- }
143
- catch (error) {
144
- console.error(chalk.red.bold(`exec error: ${error}`));
145
- return;
146
- }
147
- try {
148
- logAction(`Remove obsolete directories and files`);
149
- removePath(path.join(basePath, "/src/mqtt-rtt"));
150
- removePath(path.join(basePath, "/src/uns-rtt"));
151
- removePath(path.join(basePath, "/.eslintignore"));
152
- removePath(path.join(basePath, "/.eslintrc.json"));
153
- removePath(path.join(basePath, "/src/update-rtt.ts"));
154
- removePath(path.join(basePath, "/src/demo"));
155
- }
156
- catch (error) {
157
- console.error(chalk.red.bold(`exec error: ${error}`));
158
- return;
159
- }
160
- try {
161
- logAction(`Remove tmp-rtt`);
162
- removePath(tmpRtt);
163
- }
164
- catch (error) {
165
- console.error(chalk.red.bold(`exec error: ${error}`));
166
- return;
167
- }
168
- console.log(chalk.green.bold("\nRun npm run build to rebuild the project, and remove obsolete directories and files."));
169
- }
1
+ import { basePath } from "./base-path.js";
2
+ import readline from "node:readline";
3
+ import * as path from "path";
4
+ import chalk from "chalk";
5
+ import { readFile } from "fs/promises";
6
+ import fs from "fs-extra";
7
+ import * as prettier from "prettier";
8
+ const rl = readline.createInterface({
9
+ input: process.stdin,
10
+ output: process.stdout,
11
+ });
12
+ const packageJsonPath = path.join(basePath, "package.json");
13
+ const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8"));
14
+ // Flags
15
+ const argv = new Set(process.argv.slice(2));
16
+ const DRY_RUN = argv.has("--dry-run") || process.env.DRY_RUN === "1";
17
+ function logAction(action) {
18
+ if (DRY_RUN)
19
+ console.log(`[dry-run] ${action}`);
20
+ else
21
+ console.log(action);
22
+ }
23
+ function writeJson(file, obj) {
24
+ return prettier.format(JSON.stringify(obj), { parser: "json" }).then((s) => {
25
+ if (DRY_RUN) {
26
+ console.log(`[dry-run] write ${file} (${s.length} bytes)`);
27
+ }
28
+ else {
29
+ fs.writeFileSync(file, s, "utf8");
30
+ }
31
+ });
32
+ }
33
+ function copyDir(src, dest, options) {
34
+ if (DRY_RUN) {
35
+ console.log(`[dry-run] copy ${src} -> ${dest}`);
36
+ return;
37
+ }
38
+ fs.copySync(src, dest, { overwrite: true, ...options });
39
+ }
40
+ function removePath(p, opts) {
41
+ if (DRY_RUN) {
42
+ console.log(`[dry-run] rm ${p}`);
43
+ return;
44
+ }
45
+ fs.rmSync(p, { force: true, recursive: true, ...opts });
46
+ }
47
+ try {
48
+ await main();
49
+ rl.close();
50
+ }
51
+ catch (error) {
52
+ console.log(chalk.red.bold(`\n${error}`));
53
+ rl.close();
54
+ }
55
+ async function main() {
56
+ const tmpRtt = path.join(basePath, "/tmp-rtt");
57
+ try {
58
+ logAction(`Overwrite examples`);
59
+ copyDir(path.join(tmpRtt, "/src/examples"), path.join(basePath, "/src/examples"));
60
+ logAction(`Overwrite uns`);
61
+ copyDir(path.join(tmpRtt, "/src/uns"), path.join(basePath, "/src/uns"));
62
+ logAction(`Overwrite uns-config`);
63
+ copyDir(path.join(tmpRtt, "/src/uns-config"), path.join(basePath, "/src/uns-config"));
64
+ // Python: copy template but preserve local project area(s) and environments
65
+ // Preserved by default: python/rtt, python/venv, python/.venv, python/__pycache__
66
+ const pythonSrc = path.join(tmpRtt, "/python");
67
+ const pythonDst = path.join(basePath, "/python");
68
+ logAction(`Overwrite python (preserve local, rtt, venv/.venv, __pycache__)`);
69
+ copyDir(pythonSrc, pythonDst, {
70
+ filter: (src) => {
71
+ // Only filter relative to template python root
72
+ const rel = path.relative(pythonSrc, src);
73
+ if (!rel || rel === "")
74
+ return true;
75
+ const top = rel.split(path.sep)[0];
76
+ const preserved = new Set(["local", "rtt", "venv", ".venv", "__pycache__"]);
77
+ return !preserved.has(top);
78
+ },
79
+ });
80
+ logAction(`Overwrite uns-grpc`);
81
+ copyDir(path.join(tmpRtt, "/src/uns-grpc"), path.join(basePath, "/packages/uns-core/src/uns-grpc"));
82
+ logAction(`Overwrite uns-cron`);
83
+ copyDir(path.join(tmpRtt, "/src/uns-cron"), path.join(basePath, "/packages/uns-cron/src"));
84
+ logAction(`Overwrite uns-api`);
85
+ copyDir(path.join(tmpRtt, "/src/uns-api"), path.join(basePath, "/packages/uns-api/src"));
86
+ logAction(`Overwrite uns-mqtt`);
87
+ copyDir(path.join(tmpRtt, "/src/uns-mqtt"), path.join(basePath, "/packages/uns-core/src/uns-mqtt"));
88
+ logAction(`Overwrite uns-temporal`);
89
+ copyDir(path.join(tmpRtt, "/src/uns-temporal"), path.join(basePath, "/packages/uns-temporal/src"));
90
+ logAction(`Overwrite eslint.config.mjs`);
91
+ copyDir(path.join(tmpRtt, "/eslint.config.mjs"), path.join(basePath, "/eslint.config.mjs"));
92
+ logAction(`Overwrite schema.ts`);
93
+ copyDir(path.join(tmpRtt, "/src/graphql/schema.ts"), path.join(basePath, "/src/graphql/schema.ts"));
94
+ logAction(`Overwrite config-template.json`);
95
+ copyDir(path.join(tmpRtt, "/config-template.json"), path.join(basePath, "/config-template.json"));
96
+ logAction(`Overwrite vite.config.js`);
97
+ copyDir(path.join(tmpRtt, "/vite.config.js"), path.join(basePath, "/vite.config.js"));
98
+ logAction(`Overwrite codegen.ts`);
99
+ copyDir(path.join(tmpRtt, "/codegen.ts"), path.join(basePath, "/codegen.ts"));
100
+ logAction(`Overwrite logger.ts`);
101
+ copyDir(path.join(tmpRtt, "/src/logger.ts"), path.join(basePath, "/src/logger.ts"));
102
+ }
103
+ catch (error) {
104
+ console.error(chalk.red.bold(`exec error: ${error}`));
105
+ return;
106
+ }
107
+ try {
108
+ logAction(`Merge package.json scripts (template overrides existing keys, preserves extras)`);
109
+ const tmpPackageJson = JSON.parse(await readFile(path.join(tmpRtt, 'package.json'), "utf8"));
110
+ const currentScripts = packageJson.scripts || {};
111
+ const templateScripts = tmpPackageJson.scripts || {};
112
+ packageJson.scripts = { ...currentScripts, ...templateScripts };
113
+ await writeJson('package.json', packageJson);
114
+ }
115
+ catch (error) {
116
+ console.error(chalk.red.bold(`exec error: ${error}`));
117
+ return;
118
+ }
119
+ try {
120
+ console.log(chalk.red(`Update devDependencies: overwrite versions for existing, add missing; preserve extras.`));
121
+ const tmpPackageJson = JSON.parse(await readFile(path.join(tmpRtt, 'package.json'), "utf8"));
122
+ packageJson.devDependencies = packageJson.devDependencies || {};
123
+ for (const [dep, version] of Object.entries(tmpPackageJson.devDependencies || {})) {
124
+ packageJson.devDependencies[dep] = version;
125
+ }
126
+ await writeJson('package.json', packageJson);
127
+ }
128
+ catch (error) {
129
+ console.error(chalk.red.bold(`exec error: ${error}`));
130
+ return;
131
+ }
132
+ try {
133
+ console.log(chalk.red(`Update dependencies: keep existing versions; add missing from template.`));
134
+ const tmpPackageJson = JSON.parse(await readFile(path.join(tmpRtt, 'package.json'), "utf8"));
135
+ packageJson.dependencies = packageJson.dependencies || {};
136
+ for (const [dep, version] of Object.entries(tmpPackageJson.dependencies || {})) {
137
+ if (!(dep in packageJson.dependencies)) {
138
+ packageJson.dependencies[dep] = version;
139
+ }
140
+ }
141
+ await writeJson('package.json', packageJson);
142
+ }
143
+ catch (error) {
144
+ console.error(chalk.red.bold(`exec error: ${error}`));
145
+ return;
146
+ }
147
+ try {
148
+ logAction(`Remove obsolete directories and files`);
149
+ removePath(path.join(basePath, "/src/mqtt-rtt"));
150
+ removePath(path.join(basePath, "/src/uns-rtt"));
151
+ removePath(path.join(basePath, "/.eslintignore"));
152
+ removePath(path.join(basePath, "/.eslintrc.json"));
153
+ removePath(path.join(basePath, "/src/update-rtt.ts"));
154
+ removePath(path.join(basePath, "/src/demo"));
155
+ }
156
+ catch (error) {
157
+ console.error(chalk.red.bold(`exec error: ${error}`));
158
+ return;
159
+ }
160
+ try {
161
+ logAction(`Remove tmp-rtt`);
162
+ removePath(tmpRtt);
163
+ }
164
+ catch (error) {
165
+ console.error(chalk.red.bold(`exec error: ${error}`));
166
+ return;
167
+ }
168
+ console.log(chalk.green.bold("\nRun npm run build to rebuild the project, and remove obsolete directories and files."));
169
+ }
170
170
  //# sourceMappingURL=update-rtt.js.map
@@ -1,2 +1,2 @@
1
- export {};
1
+ export {};
2
2
  //# sourceMappingURL=update-tools.d.ts.map
@@ -1,73 +1,73 @@
1
- import { CleanOptions, simpleGit } from "simple-git";
2
- import { basePath } from "./base-path.js";
3
- import readline from "node:readline";
4
- import * as path from "path";
5
- import chalk from "chalk";
6
- import fs from "fs-extra";
7
- import { execSync } from "child_process";
8
- const rl = readline.createInterface({
9
- input: process.stdin,
10
- output: process.stdout,
11
- });
12
- const git = simpleGit("./").clean(CleanOptions.FORCE);
13
- try {
14
- await main();
15
- rl.close();
16
- }
17
- catch (error) {
18
- console.log(chalk.red.bold(`\n${error}`));
19
- rl.close();
20
- }
21
- async function main() {
22
- const tmpRtt = path.join(basePath, "/tmp-rtt");
23
- try {
24
- console.log(`Pull template-ts-nodejs into tmp-rtt`);
25
- await git.clone("git@ssh.dev.azure.com:v3/example-org/example-project/template-uns-rtt", tmpRtt);
26
- }
27
- catch (error) {
28
- console.error(chalk.red.bold(`exec error: ${error}`));
29
- return;
30
- }
31
- try {
32
- console.log(`Overwrite tools`);
33
- fs.copySync(path.join(tmpRtt, "/src/tools"), path.join(basePath, "/src/tools"), { overwrite: true });
34
- }
35
- catch (error) {
36
- console.error(chalk.red.bold(`exec error: ${error}`));
37
- return;
38
- }
39
- // Update library version JSON at repo root from template
40
- try {
41
- const srcJson = path.join(tmpRtt, 'uns-library.json');
42
- const dstJson = path.join(basePath, 'uns-library.json');
43
- if (fs.existsSync(srcJson)) {
44
- fs.copyFileSync(srcJson, dstJson);
45
- const ver = JSON.parse(fs.readFileSync(srcJson, 'utf8')).version;
46
- console.log(`Updated uns-library.json -> ${ver}`);
47
- }
48
- else {
49
- // Fallback for older templates: synthesize from package.json
50
- const tmpPackageJsonPath = path.join(tmpRtt, 'package.json');
51
- const tmpPackageJson = JSON.parse(fs.readFileSync(tmpPackageJsonPath, 'utf8'));
52
- const payload = JSON.stringify({ name: tmpPackageJson.name, version: tmpPackageJson.version }, null, 2);
53
- fs.writeFileSync(dstJson, payload + "\n", 'utf8');
54
- console.log(`Updated uns-library.json -> ${tmpPackageJson.version}`);
55
- }
56
- }
57
- catch (error) {
58
- console.error(chalk.red.bold(`exec error: ${error}`));
59
- return;
60
- }
61
- try {
62
- console.log(`Running update-rtt from tools`);
63
- // Propagate any CLI args to update-rtt (e.g., --dry-run)
64
- const args = process.argv.slice(2).join(" ");
65
- // Run the TypeScript tool directly to avoid relying on a successful build
66
- execSync(`tsx ./src/tools/update-rtt.ts ${args}`.trim(), { stdio: 'inherit' });
67
- }
68
- catch (error) {
69
- console.error(chalk.red.bold(`exec error: ${error}`));
70
- return;
71
- }
72
- }
1
+ import { CleanOptions, simpleGit } from "simple-git";
2
+ import { basePath } from "./base-path.js";
3
+ import readline from "node:readline";
4
+ import * as path from "path";
5
+ import chalk from "chalk";
6
+ import fs from "fs-extra";
7
+ import { execSync } from "child_process";
8
+ const rl = readline.createInterface({
9
+ input: process.stdin,
10
+ output: process.stdout,
11
+ });
12
+ const git = simpleGit("./").clean(CleanOptions.FORCE);
13
+ try {
14
+ await main();
15
+ rl.close();
16
+ }
17
+ catch (error) {
18
+ console.log(chalk.red.bold(`\n${error}`));
19
+ rl.close();
20
+ }
21
+ async function main() {
22
+ const tmpRtt = path.join(basePath, "/tmp-rtt");
23
+ try {
24
+ console.log(`Pull template-ts-nodejs into tmp-rtt`);
25
+ await git.clone("git@ssh.dev.azure.com:v3/example-org/example-project/template-uns-rtt", tmpRtt);
26
+ }
27
+ catch (error) {
28
+ console.error(chalk.red.bold(`exec error: ${error}`));
29
+ return;
30
+ }
31
+ try {
32
+ console.log(`Overwrite tools`);
33
+ fs.copySync(path.join(tmpRtt, "/src/tools"), path.join(basePath, "/src/tools"), { overwrite: true });
34
+ }
35
+ catch (error) {
36
+ console.error(chalk.red.bold(`exec error: ${error}`));
37
+ return;
38
+ }
39
+ // Update library version JSON at repo root from template
40
+ try {
41
+ const srcJson = path.join(tmpRtt, 'uns-library.json');
42
+ const dstJson = path.join(basePath, 'uns-library.json');
43
+ if (fs.existsSync(srcJson)) {
44
+ fs.copyFileSync(srcJson, dstJson);
45
+ const ver = JSON.parse(fs.readFileSync(srcJson, 'utf8')).version;
46
+ console.log(`Updated uns-library.json -> ${ver}`);
47
+ }
48
+ else {
49
+ // Fallback for older templates: synthesize from package.json
50
+ const tmpPackageJsonPath = path.join(tmpRtt, 'package.json');
51
+ const tmpPackageJson = JSON.parse(fs.readFileSync(tmpPackageJsonPath, 'utf8'));
52
+ const payload = JSON.stringify({ name: tmpPackageJson.name, version: tmpPackageJson.version }, null, 2);
53
+ fs.writeFileSync(dstJson, payload + "\n", 'utf8');
54
+ console.log(`Updated uns-library.json -> ${tmpPackageJson.version}`);
55
+ }
56
+ }
57
+ catch (error) {
58
+ console.error(chalk.red.bold(`exec error: ${error}`));
59
+ return;
60
+ }
61
+ try {
62
+ console.log(`Running update-rtt from tools`);
63
+ // Propagate any CLI args to update-rtt (e.g., --dry-run)
64
+ const args = process.argv.slice(2).join(" ");
65
+ // Run the TypeScript tool directly to avoid relying on a successful build
66
+ execSync(`tsx ./src/tools/update-rtt.ts ${args}`.trim(), { stdio: 'inherit' });
67
+ }
68
+ catch (error) {
69
+ console.error(chalk.red.bold(`exec error: ${error}`));
70
+ return;
71
+ }
72
+ }
73
73
  //# sourceMappingURL=update-tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handover-manager-event-emitter.js","sourceRoot":"","sources":["../../src/uns/handover-manager-event-emitter.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,2BAA2B;IAC9B,SAAS,GAEb,EAAE,CAAC;IAEP,EAAE,CACA,SAAY,EACZ,QAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CACD,SAAY,EACZ,QAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,MAAM,CAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CACtB,CAAC;IACJ,CAAC;IAED,IAAI,CAAyB,SAAY,EAAE,KAAgB;QACzD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;CACF","sourcesContent":["export class HandoverManagerEventEmitter<Events extends Record<string, any>> {\n private listeners: {\n [K in keyof Events]?: Array<(event: Events[K]) => void>;\n } = {};\n\n on<K extends keyof Events>(\n eventName: K,\n listener: (event: Events[K]) => void,\n ): void {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = [];\n }\n this.listeners[eventName]!.push(listener);\n }\n\n off<K extends keyof Events>(\n eventName: K,\n listener: (event: Events[K]) => void,\n ): void {\n if (!this.listeners[eventName]) return;\n this.listeners[eventName] = this.listeners[eventName]!.filter(\n (l) => l !== listener,\n );\n }\n\n emit<K extends keyof Events>(eventName: K, event: Events[K]): void {\n if (!this.listeners[eventName]) return;\n this.listeners[eventName]!.forEach((listener) => listener(event));\n }\n}"]}
1
+ {"version":3,"file":"handover-manager-event-emitter.js","sourceRoot":"","sources":["../../src/uns/handover-manager-event-emitter.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,2BAA2B;IAC9B,SAAS,GAEb,EAAE,CAAC;IAEP,EAAE,CACA,SAAY,EACZ,QAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CACD,SAAY,EACZ,QAAoC;QAEpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,MAAM,CAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CACtB,CAAC;IACJ,CAAC;IAED,IAAI,CAAyB,SAAY,EAAE,KAAgB;QACzD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;CACF","sourcesContent":["export class HandoverManagerEventEmitter<Events extends Record<string, any>> {\r\n private listeners: {\r\n [K in keyof Events]?: Array<(event: Events[K]) => void>;\r\n } = {};\r\n\r\n on<K extends keyof Events>(\r\n eventName: K,\r\n listener: (event: Events[K]) => void,\r\n ): void {\r\n if (!this.listeners[eventName]) {\r\n this.listeners[eventName] = [];\r\n }\r\n this.listeners[eventName]!.push(listener);\r\n }\r\n\r\n off<K extends keyof Events>(\r\n eventName: K,\r\n listener: (event: Events[K]) => void,\r\n ): void {\r\n if (!this.listeners[eventName]) return;\r\n this.listeners[eventName] = this.listeners[eventName]!.filter(\r\n (l) => l !== listener,\r\n );\r\n }\r\n\r\n emit<K extends keyof Events>(eventName: K, event: Events[K]): void {\r\n if (!this.listeners[eventName]) return;\r\n this.listeners[eventName]!.forEach((listener) => listener(event));\r\n }\r\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"handover-manager.js","sourceRoot":"","sources":["../../src/uns/handover-manager.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAGlF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnE;;;;GAIG;AACH,MAAM,OAAO,eAAe;IACnB,KAAK,GAAuD,IAAI,2BAA2B,EAAyB,CAAC;IACpH,WAAW,CAAS;IACpB,SAAS,CAAY;IACrB,cAAc,CAAiB;IAC/B,kBAAkB,GAAY,KAAK,CAAC;IACpC,kBAAkB,GAAY,KAAK,CAAC;IACpC,YAAY,CAAmB;IAC/B,aAAa,CAA6B;IAC1C,MAAM,GAAY,KAAK,CAAC;IACzB,sBAAsB,GAAY,KAAK,CAAC;IACxC,eAAe,GAAY,IAAI,CAAC;IAChC,iBAAiB,GAAY,KAAK,CAAC;IAE1C,YAAY,WAAmB,EAAE,SAAoB,EAAE,cAA8B,EAAE,sBAA+B,EAAE,eAAwB,EAAE,iBAA0B;QAC1K,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;QACrD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAE3C,iCAAiC;QACjC,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;QACtC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,IAAI,gBAAgB,CAAC,aAAa,gBAAgB,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEjN,gFAAgF;QAChF,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,qFAAqF,CAAC,CAAC;YACtH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5D,8DAA8D;YAC9D,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACvC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;gBAC9B,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YACjC,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,cAAc,CAAC,CAAC;IACrB,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,iBAAiB,CAAC,KAAyB;QACtD,IAAI,CAAC;YACH,8FAA8F;YAC9F,IACE,IAAI,CAAC,kBAAkB,KAAK,KAAK;gBACjC,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,KAAK,KAAK,CAAC,KAAK;gBAClD,IAAI,CAAC,MAAM,KAAK,KAAK;gBACrB,IAAI,CAAC,kBAAkB,KAAK,KAAK,EACjC,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,mCAAmC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;gBAElF,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;oBAChC,oBAAoB;oBACpB,6EAA6E;oBAC7E,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,qGAAqG;oBACvI,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;oBAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC5D,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,uCAAuC,CAAC,CAAC;oBACxE,UAAU,CAAC,KAAK,IAAI,EAAE;wBACpB,MAAM,kBAAkB,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;wBACnH,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,0BAA0B,kBAAkB,GAAG,CAAC,CAAC;wBAChF,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;wBAC/B,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,EAAE;4BAC7F,MAAM,EAAE,KAAK;4BACb,UAAU,EAAE;gCACV,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;gCACnD,cAAc,EAAE;oCACd,WAAW,EAAE,IAAI,CAAC,WAAW;iCAC9B;6BACF;yBACF,CAAC,CAAC;oBACL,CAAC,EAAE,KAAK,CAAC,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBAC3B,6DAA6D;wBAC7D,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,gCAAgC,CAAC,CAAC;wBACjE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,mFAAmF,CAAC,CAAC;wBACpH,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,qGAAqG;wBACvI,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;wBAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;wBACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;wBAC5D,8DAA8D;wBAC9D,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;4BACvC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;4BAC9B,QAAQ,CAAC,mBAAmB,EAAE,CAAC;wBACjC,CAAC,CACA,CAAC;oBACJ,CAAC;yBACI,CAAC;wBACJ,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,6CAA6C,KAAK,CAAC,KAAK,qBAAqB,CAAC,CAAC;wBAC9G,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,wEAAwE;YACxE,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACjF,IAAI,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrI,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,qCAAqC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,KAAyB;QACpD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtD,oBAAoB;YACpB,+FAA+F;YAC/F,IAAI,QAAQ,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACzC,MAAM,CAAC,IAAI,CACT,GAAG,IAAI,CAAC,WAAW,qCAAqC,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,uBAAuB,CACrI,CAAC;gBAEF,yEAAyE;gBACzE,MAAM,cAAc,GAA8B,EAAE,CAAC;gBACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;oBACxC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,iCAAiC,EAAE,CAAC;oBACtE,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClC,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,qEAAqE,CAAC,CAAC;gBAEtG,uFAAuF;gBACvF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC/C,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;oBACrC,IAAI,UAAU,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;wBAC7B,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAC1B,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,IAAI,EAAE,EAC5C,IAAI,CAAC,SAAS,CAAC;4BACb,IAAI,EAAE,qBAAqB;4BAC3B,SAAS,EAAE,UAAU,CAAC,SAAS;4BAC/B,aAAa,EAAE,UAAU,CAAC,aAAa;4BACvC,YAAY,EAAE,UAAU,CAAC,YAAY;yBACtC,CAAC,EACF;4BACE,MAAM,EAAE,KAAK;4BACb,UAAU,EAAE;gCACV,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;gCACnD,cAAc,EAAE;oCACd,WAAW,EAAE,IAAI,CAAC,WAAW;iCAC9B;6BACF;yBACF,CACF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,uCAAuC,CAAC,CAAC;gBAExE,yDAAyD;gBACzD,8CAA8C;gBAC9C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;gBACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5D,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAC1B,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,IAAI,EAAE,EAC5C,IAAI,CAAC,SAAS,CAAC;oBACb,IAAI,EAAE,cAAc;iBACrB,CAAC,EACF;oBACE,MAAM,EAAE,KAAK;oBACb,UAAU,EAAE;wBACV,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;wBACnD,cAAc,EAAE;4BACd,WAAW,EAAE,IAAI,CAAC,WAAW;yBAC9B;qBACF;iBACF,CACF,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,+BAA+B,CAAC,CAAC;gBAEhE,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAEhC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,QAAsB,EAAE,EAAE;oBACrD,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAClB,CAAC,CAAC,CAAC;YACL,CAAC;YAED,oBAAoB;YACpB,iGAAiG;YACjG,qCAAqC;YACrC,IAAI,QAAQ,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gBAC5C,2EAA2E;gBAC3E,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,QAAsB,EAAE,EAAE;oBACrD,IAAI,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC,YAAY,EAAE,CAAC;wBACpD,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;oBAC3E,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAED,oBAAoB;YACpB,oFAAoF;YACpF,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,iCAAiC,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,GAAG,CAAC,CAAC;gBAE1H,2EAA2E;gBAC3E,mCAAmC;gBACnC,mCAAmC;gBAEnC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,wBAAwB,CAAC,CAAC;gBACzD,8DAA8D;gBAC9D,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACvC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;oBAC9B,QAAQ,CAAC,mBAAmB,EAAE,CAAC;gBACjC,CAAC,CAAC,CAAC;gBAEH,2CAA2C;gBAC3C,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAC1B,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,IAAI,EAAE,EAC5C,IAAI,CAAC,SAAS,CAAC;oBACb,IAAI,EAAE,cAAc;iBACrB,CAAC,EACF;oBACE,MAAM,EAAE,KAAK;oBACb,UAAU,EAAE;wBACV,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;wBACnD,cAAc,EAAE;4BACd,WAAW,EAAE,IAAI,CAAC,WAAW;yBAC9B;qBACF;iBACF,CACF,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,+BAA+B,CAAC,CAAC;YAClE,CAAC;YAED,oBAAoB;YACpB,6EAA6E;YAC7E,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,iCAAiC,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,GAAG,CAAC,CAAC;gBAC1H,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAChC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAEhC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,yCAAyC,CAAC,CAAC;gBAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,0CAA0C,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;CACF","sourcesContent":["import { UnsEvents } from \"./uns-interfaces.js\";\nimport logger from \"../logger.js\";\nimport { HandoverManagerEventEmitter } from \"./handover-manager-event-emitter.js\";\nimport { HandoverManagerEvents } from \"../uns-mqtt/mqtt-interfaces.js\";\nimport MqttProxy from \"../uns-mqtt/mqtt-proxy.js\";\nimport { MqttTopicBuilder } from \"../uns-mqtt/mqtt-topic-builder.js\";\nimport { ACTIVE_TIMEOUT, PACKAGE_INFO } from \"./process-config.js\";\nimport UnsMqttProxy from \"../uns-mqtt/uns-mqtt-proxy.js\";\n\n/**\n * HandoverManager is responsible for all handover-related logic,\n * including handling incoming MQTT messages, issuing handover requests,\n * and processing handover responses.\n */\nexport class HandoverManager {\n public event: HandoverManagerEventEmitter<HandoverManagerEvents> = new HandoverManagerEventEmitter<HandoverManagerEvents>();\n private processName: string;\n private mqttProxy: MqttProxy;\n private unsMqttProxies: UnsMqttProxy[];\n private requestingHandover: boolean = false;\n private handoverInProgress: boolean = false;\n private topicBuilder: MqttTopicBuilder;\n private activeTimeout: NodeJS.Timeout | undefined;\n private active: boolean = false;\n public handoverRequestEnabled: boolean = false;\n public handoverEnabled: boolean = true;\n public forceStartEnabled: boolean = false;\n\n constructor(processName: string, mqttProxy: MqttProxy, unsMqttProxies: UnsMqttProxy[], handoverRequestEnabled: boolean, handoverEnabled: boolean, forceStartEnabled: boolean) {\n this.processName = processName;\n this.mqttProxy = mqttProxy;\n this.unsMqttProxies = unsMqttProxies;\n this.handoverRequestEnabled = handoverRequestEnabled;\n this.handoverEnabled = handoverEnabled;\n this.forceStartEnabled = forceStartEnabled;\n\n // Instantiate the topic builder.\n const packageName = PACKAGE_INFO.name;\n const version = PACKAGE_INFO.version;\n this.topicBuilder = new MqttTopicBuilder(`uns-infra/${MqttTopicBuilder.sanitizeTopicPart(packageName)}/${MqttTopicBuilder.sanitizeTopicPart(version)}/${MqttTopicBuilder.sanitizeTopicPart(this.processName)}/`);\n\n // Set status as active after a timeout if no other active process are detected.\n this.activeTimeout = setTimeout(() => {\n logger.info(`${this.processName} - No active message received within timeout. Assuming no other process is running.`);\n this.active = true;\n this.event.emit(\"handoverManager\", { active: this.active });\n // Activate all UNS proxy instance publishers and subscribers.\n this.unsMqttProxies.forEach((unsProxy) => {\n unsProxy.setPublisherActive();\n unsProxy.setSubscriberActive();\n });\n }, ACTIVE_TIMEOUT);\n }\n\n /**\n * Main entry point for handling incoming MQTT messages.\n * It checks the topic and delegates to the corresponding handler.\n */\n public async handleMqttMessage(event: UnsEvents[\"input\"]): Promise<void> {\n try {\n // Check if the packet is active messages from other processes and this process is not active.\n if (\n this.requestingHandover === false &&\n this.topicBuilder.getActiveTopic() !== event.topic &&\n this.active === false &&\n this.handoverInProgress === false\n ) {\n logger.info(`${this.processName} - Another process is active on ${event.topic}.`);\n\n if (this.handoverRequestEnabled) {\n // Requester process\n // Publish a handover request message after 10 seconds to the handover topic.\n clearTimeout(this.activeTimeout); // Clear the active timeout if it exists - prevent this process from becoming active after a timeout.\n this.activeTimeout = undefined;\n this.event.emit(\"handoverManager\", { active: this.active });\n this.requestingHandover = true;\n logger.info(`${this.processName} - Requesting handover in 10 seconds.`);\n setTimeout(async () => {\n const eventHandoverTopic = new MqttTopicBuilder(MqttTopicBuilder.extractBaseTopic(event.topic)).getHandoverTopic();\n logger.info(`${this.processName} - Requesting handover ${eventHandoverTopic}.`);\n this.handoverInProgress = true;\n await this.mqttProxy.publish(eventHandoverTopic, JSON.stringify({ type: \"handover_request\" }), {\n retain: false,\n properties: {\n responseTopic: this.topicBuilder.getHandoverTopic(),\n userProperties: {\n processName: this.processName,\n },\n },\n });\n }, 10000);\n } else {\n if (this.forceStartEnabled) {\n // Force start the process even if another process is active.\n logger.info(`${this.processName} - Force starting the process.`);\n logger.warn(`${this.processName} - Warning: Source and destination being the same may lead to duplicate messages.`);\n clearTimeout(this.activeTimeout); // Clear the active timeout if it exists - prevent this process from becoming active after a timeout.\n this.activeTimeout = undefined;\n this.active = true;\n this.event.emit(\"handoverManager\", { active: this.active });\n // Activate all UNS proxy instance publishers and subscribers.\n this.unsMqttProxies.forEach((unsProxy) => {\n unsProxy.setPublisherActive();\n unsProxy.setSubscriberActive();\n }\n );\n }\n else {\n logger.info(`${this.processName} - Waiting for the other process on topic ${event.topic} to become passive.`);\n this.activeTimeout.refresh();\n }\n }\n }\n\n // Check if the packet is an handover message, sent to a handover topic.\n if (event.topic === this.topicBuilder.getHandoverTopic() && this.handoverEnabled) {\n if (event.packet?.properties?.userProperties?.processName && event.packet.properties.userProperties.processName !== this.processName) {\n await this.handleHandover(event);\n }\n }\n } catch (error) {\n logger.error(`${this.processName} - Error processing MQTT message: ${error.message}`);\n return;\n }\n }\n\n /**\n * Handles handovers.\n */\n private async handleHandover(event: UnsEvents[\"input\"]): Promise<void> {\n try {\n const response = JSON.parse(event.message.toString());\n // Responder process\n // Check if the message is a handover request and publish MULTIPLE handover_subscriber messages\n if (response.type === \"handover_request\") {\n logger.info(\n `${this.processName} - Received handover request from ${event.packet?.properties?.userProperties?.processName}. Accepting handover.`,\n );\n\n // Set all UNS proxy instance subscribers to passive and drain the queue.\n const mqttWorkerData: UnsEvents[\"mqttWorker\"][] = [];\n for (let i = 0; i < this.unsMqttProxies.length; i++) {\n const unsProxy = this.unsMqttProxies[i];\n const workerData = await unsProxy.setSubscriberPassiveAndDrainQueue();\n mqttWorkerData.push(workerData);\n }\n logger.info(`${this.processName} - Handover request accepted. Sending handover_subscriber messages.`);\n\n // Publish handover_subscriber messages for each instance that has processed some data.\n for (let i = 0; i < mqttWorkerData.length; i++) {\n const workerData = mqttWorkerData[i];\n if (workerData.batchSize > 0) {\n await this.mqttProxy.publish(\n event.packet.properties?.responseTopic ?? \"\",\n JSON.stringify({\n type: \"handover_subscriber\",\n batchSize: workerData.batchSize,\n referenceHash: workerData.referenceHash,\n instanceName: workerData.instanceName,\n }),\n {\n retain: false,\n properties: {\n responseTopic: this.topicBuilder.getHandoverTopic(),\n userProperties: {\n processName: this.processName,\n },\n },\n },\n );\n }\n }\n logger.info(`${this.processName} - Handover subscriber messages sent.`);\n\n // Publish a single handover acknowledgment only when all\n // handover_subscriber messages have been sent\n this.active = false;\n this.event.emit(\"handoverManager\", { active: this.active });\n await this.mqttProxy.publish(\n event.packet.properties?.responseTopic ?? \"\",\n JSON.stringify({\n type: \"handover_fin\",\n }),\n {\n retain: false,\n properties: {\n responseTopic: this.topicBuilder.getHandoverTopic(),\n userProperties: {\n processName: this.processName,\n },\n },\n },\n );\n logger.info(`${this.processName} - Handover fin message sent.`);\n\n this.handoverInProgress = false;\n this.requestingHandover = false;\n\n this.unsMqttProxies.forEach((unsProxy: UnsMqttProxy) => {\n unsProxy.stop();\n });\n }\n\n // Requestor process\n // Check if the message is one of the handover_subscriber message in response to handover_request\n // and publish a handover_ack message\n if (response.type === \"handover_subscriber\") {\n // Find correct unsProxy instance for handover_subscriber and set it active\n this.unsMqttProxies.forEach((unsProxy: UnsMqttProxy) => {\n if (unsProxy.instanceName === response.instanceName) {\n unsProxy.setSubscriberActive(response.batchSize, response.referenceHash);\n }\n });\n }\n\n // Requestor process\n // Check if the message is a handover_fin at the end of handover_subscriber messages\n if (response.type === \"handover_fin\") {\n logger.info(`${this.processName} - Received handover fin from ${event.packet?.properties?.userProperties?.processName}.`);\n\n // Maybe we should count the number of requests that were allrady made TODO\n // this.handoverInProgress = false;\n // this.requestingHandover = false;\n\n this.active = true;\n this.event.emit(\"handoverManager\", { active: this.active });\n logger.info(`${this.processName} - Handover completed.`);\n // Activate all UNS proxy instance publishers and subscribers.\n this.unsMqttProxies.forEach((unsProxy) => {\n unsProxy.setPublisherActive();\n unsProxy.setSubscriberActive();\n });\n\n // Maybe we should reply with handover_ack.\n await this.mqttProxy.publish(\n event.packet.properties?.responseTopic ?? \"\",\n JSON.stringify({\n type: \"handover_ack\",\n }),\n {\n retain: false,\n properties: {\n responseTopic: this.topicBuilder.getHandoverTopic(),\n userProperties: {\n processName: this.processName,\n },\n },\n },\n );\n logger.info(`${this.processName} - Handover ack message sent.`);\n }\n\n // Responder process\n // Check if the message is a handover_ack at the end of handover_fin messages\n if (response.type === \"handover_ack\") {\n logger.info(`${this.processName} - Received handover ack from ${event.packet?.properties?.userProperties?.processName}.`);\n this.handoverInProgress = false;\n this.requestingHandover = false;\n\n logger.info(`${this.processName} - Handover completed. Exiting process.`);\n process.exit(0);\n }\n } catch (error) {\n logger.error(`${this.processName} - Error processing handover response: ${error.message}`);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"handover-manager.js","sourceRoot":"","sources":["../../src/uns/handover-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { UnsEvents } from \"./uns-interfaces.js\";\r\nimport logger from \"../logger.js\";\r\nimport { HandoverManagerEventEmitter } from \"./handover-manager-event-emitter.js\";\r\nimport { HandoverManagerEvents } from \"../uns-mqtt/mqtt-interfaces.js\";\r\nimport MqttProxy from \"../uns-mqtt/mqtt-proxy.js\";\r\nimport { MqttTopicBuilder } from \"../uns-mqtt/mqtt-topic-builder.js\";\r\nimport { ACTIVE_TIMEOUT, PACKAGE_INFO } from \"./process-config.js\";\r\nimport UnsMqttProxy from \"../uns-mqtt/uns-mqtt-proxy.js\";\r\n\r\n/**\r\n * HandoverManager is responsible for all handover-related logic,\r\n * including handling incoming MQTT messages, issuing handover requests,\r\n * and processing handover responses.\r\n */\r\nexport class HandoverManager {\r\n public event: HandoverManagerEventEmitter<HandoverManagerEvents> = new HandoverManagerEventEmitter<HandoverManagerEvents>();\r\n private processName: string;\r\n private mqttProxy: MqttProxy;\r\n private unsMqttProxies: UnsMqttProxy[];\r\n private requestingHandover: boolean = false;\r\n private handoverInProgress: boolean = false;\r\n private topicBuilder: MqttTopicBuilder;\r\n private activeTimeout: NodeJS.Timeout | undefined;\r\n private active: boolean = false;\r\n public handoverRequestEnabled: boolean = false;\r\n public handoverEnabled: boolean = true;\r\n public forceStartEnabled: boolean = false;\r\n\r\n constructor(processName: string, mqttProxy: MqttProxy, unsMqttProxies: UnsMqttProxy[], handoverRequestEnabled: boolean, handoverEnabled: boolean, forceStartEnabled: boolean) {\r\n this.processName = processName;\r\n this.mqttProxy = mqttProxy;\r\n this.unsMqttProxies = unsMqttProxies;\r\n this.handoverRequestEnabled = handoverRequestEnabled;\r\n this.handoverEnabled = handoverEnabled;\r\n this.forceStartEnabled = forceStartEnabled;\r\n\r\n // Instantiate the topic builder.\r\n const packageName = PACKAGE_INFO.name;\r\n const version = PACKAGE_INFO.version;\r\n this.topicBuilder = new MqttTopicBuilder(`uns-infra/${MqttTopicBuilder.sanitizeTopicPart(packageName)}/${MqttTopicBuilder.sanitizeTopicPart(version)}/${MqttTopicBuilder.sanitizeTopicPart(this.processName)}/`);\r\n\r\n // Set status as active after a timeout if no other active process are detected.\r\n this.activeTimeout = setTimeout(() => {\r\n logger.info(`${this.processName} - No active message received within timeout. Assuming no other process is running.`);\r\n this.active = true;\r\n this.event.emit(\"handoverManager\", { active: this.active });\r\n // Activate all UNS proxy instance publishers and subscribers.\r\n this.unsMqttProxies.forEach((unsProxy) => {\r\n unsProxy.setPublisherActive();\r\n unsProxy.setSubscriberActive();\r\n });\r\n }, ACTIVE_TIMEOUT);\r\n }\r\n\r\n /**\r\n * Main entry point for handling incoming MQTT messages.\r\n * It checks the topic and delegates to the corresponding handler.\r\n */\r\n public async handleMqttMessage(event: UnsEvents[\"input\"]): Promise<void> {\r\n try {\r\n // Check if the packet is active messages from other processes and this process is not active.\r\n if (\r\n this.requestingHandover === false &&\r\n this.topicBuilder.getActiveTopic() !== event.topic &&\r\n this.active === false &&\r\n this.handoverInProgress === false\r\n ) {\r\n logger.info(`${this.processName} - Another process is active on ${event.topic}.`);\r\n\r\n if (this.handoverRequestEnabled) {\r\n // Requester process\r\n // Publish a handover request message after 10 seconds to the handover topic.\r\n clearTimeout(this.activeTimeout); // Clear the active timeout if it exists - prevent this process from becoming active after a timeout.\r\n this.activeTimeout = undefined;\r\n this.event.emit(\"handoverManager\", { active: this.active });\r\n this.requestingHandover = true;\r\n logger.info(`${this.processName} - Requesting handover in 10 seconds.`);\r\n setTimeout(async () => {\r\n const eventHandoverTopic = new MqttTopicBuilder(MqttTopicBuilder.extractBaseTopic(event.topic)).getHandoverTopic();\r\n logger.info(`${this.processName} - Requesting handover ${eventHandoverTopic}.`);\r\n this.handoverInProgress = true;\r\n await this.mqttProxy.publish(eventHandoverTopic, JSON.stringify({ type: \"handover_request\" }), {\r\n retain: false,\r\n properties: {\r\n responseTopic: this.topicBuilder.getHandoverTopic(),\r\n userProperties: {\r\n processName: this.processName,\r\n },\r\n },\r\n });\r\n }, 10000);\r\n } else {\r\n if (this.forceStartEnabled) {\r\n // Force start the process even if another process is active.\r\n logger.info(`${this.processName} - Force starting the process.`);\r\n logger.warn(`${this.processName} - Warning: Source and destination being the same may lead to duplicate messages.`);\r\n clearTimeout(this.activeTimeout); // Clear the active timeout if it exists - prevent this process from becoming active after a timeout.\r\n this.activeTimeout = undefined;\r\n this.active = true;\r\n this.event.emit(\"handoverManager\", { active: this.active });\r\n // Activate all UNS proxy instance publishers and subscribers.\r\n this.unsMqttProxies.forEach((unsProxy) => {\r\n unsProxy.setPublisherActive();\r\n unsProxy.setSubscriberActive();\r\n }\r\n );\r\n }\r\n else {\r\n logger.info(`${this.processName} - Waiting for the other process on topic ${event.topic} to become passive.`);\r\n this.activeTimeout.refresh();\r\n }\r\n }\r\n }\r\n\r\n // Check if the packet is an handover message, sent to a handover topic.\r\n if (event.topic === this.topicBuilder.getHandoverTopic() && this.handoverEnabled) {\r\n if (event.packet?.properties?.userProperties?.processName && event.packet.properties.userProperties.processName !== this.processName) {\r\n await this.handleHandover(event);\r\n }\r\n }\r\n } catch (error) {\r\n logger.error(`${this.processName} - Error processing MQTT message: ${error.message}`);\r\n return;\r\n }\r\n }\r\n\r\n /**\r\n * Handles handovers.\r\n */\r\n private async handleHandover(event: UnsEvents[\"input\"]): Promise<void> {\r\n try {\r\n const response = JSON.parse(event.message.toString());\r\n // Responder process\r\n // Check if the message is a handover request and publish MULTIPLE handover_subscriber messages\r\n if (response.type === \"handover_request\") {\r\n logger.info(\r\n `${this.processName} - Received handover request from ${event.packet?.properties?.userProperties?.processName}. Accepting handover.`,\r\n );\r\n\r\n // Set all UNS proxy instance subscribers to passive and drain the queue.\r\n const mqttWorkerData: UnsEvents[\"mqttWorker\"][] = [];\r\n for (let i = 0; i < this.unsMqttProxies.length; i++) {\r\n const unsProxy = this.unsMqttProxies[i];\r\n const workerData = await unsProxy.setSubscriberPassiveAndDrainQueue();\r\n mqttWorkerData.push(workerData);\r\n }\r\n logger.info(`${this.processName} - Handover request accepted. Sending handover_subscriber messages.`);\r\n\r\n // Publish handover_subscriber messages for each instance that has processed some data.\r\n for (let i = 0; i < mqttWorkerData.length; i++) {\r\n const workerData = mqttWorkerData[i];\r\n if (workerData.batchSize > 0) {\r\n await this.mqttProxy.publish(\r\n event.packet.properties?.responseTopic ?? \"\",\r\n JSON.stringify({\r\n type: \"handover_subscriber\",\r\n batchSize: workerData.batchSize,\r\n referenceHash: workerData.referenceHash,\r\n instanceName: workerData.instanceName,\r\n }),\r\n {\r\n retain: false,\r\n properties: {\r\n responseTopic: this.topicBuilder.getHandoverTopic(),\r\n userProperties: {\r\n processName: this.processName,\r\n },\r\n },\r\n },\r\n );\r\n }\r\n }\r\n logger.info(`${this.processName} - Handover subscriber messages sent.`);\r\n\r\n // Publish a single handover acknowledgment only when all\r\n // handover_subscriber messages have been sent\r\n this.active = false;\r\n this.event.emit(\"handoverManager\", { active: this.active });\r\n await this.mqttProxy.publish(\r\n event.packet.properties?.responseTopic ?? \"\",\r\n JSON.stringify({\r\n type: \"handover_fin\",\r\n }),\r\n {\r\n retain: false,\r\n properties: {\r\n responseTopic: this.topicBuilder.getHandoverTopic(),\r\n userProperties: {\r\n processName: this.processName,\r\n },\r\n },\r\n },\r\n );\r\n logger.info(`${this.processName} - Handover fin message sent.`);\r\n\r\n this.handoverInProgress = false;\r\n this.requestingHandover = false;\r\n\r\n this.unsMqttProxies.forEach((unsProxy: UnsMqttProxy) => {\r\n unsProxy.stop();\r\n });\r\n }\r\n\r\n // Requestor process\r\n // Check if the message is one of the handover_subscriber message in response to handover_request\r\n // and publish a handover_ack message\r\n if (response.type === \"handover_subscriber\") {\r\n // Find correct unsProxy instance for handover_subscriber and set it active\r\n this.unsMqttProxies.forEach((unsProxy: UnsMqttProxy) => {\r\n if (unsProxy.instanceName === response.instanceName) {\r\n unsProxy.setSubscriberActive(response.batchSize, response.referenceHash);\r\n }\r\n });\r\n }\r\n\r\n // Requestor process\r\n // Check if the message is a handover_fin at the end of handover_subscriber messages\r\n if (response.type === \"handover_fin\") {\r\n logger.info(`${this.processName} - Received handover fin from ${event.packet?.properties?.userProperties?.processName}.`);\r\n\r\n // Maybe we should count the number of requests that were allrady made TODO\r\n // this.handoverInProgress = false;\r\n // this.requestingHandover = false;\r\n\r\n this.active = true;\r\n this.event.emit(\"handoverManager\", { active: this.active });\r\n logger.info(`${this.processName} - Handover completed.`);\r\n // Activate all UNS proxy instance publishers and subscribers.\r\n this.unsMqttProxies.forEach((unsProxy) => {\r\n unsProxy.setPublisherActive();\r\n unsProxy.setSubscriberActive();\r\n });\r\n\r\n // Maybe we should reply with handover_ack.\r\n await this.mqttProxy.publish(\r\n event.packet.properties?.responseTopic ?? \"\",\r\n JSON.stringify({\r\n type: \"handover_ack\",\r\n }),\r\n {\r\n retain: false,\r\n properties: {\r\n responseTopic: this.topicBuilder.getHandoverTopic(),\r\n userProperties: {\r\n processName: this.processName,\r\n },\r\n },\r\n },\r\n );\r\n logger.info(`${this.processName} - Handover ack message sent.`);\r\n }\r\n\r\n // Responder process\r\n // Check if the message is a handover_ack at the end of handover_fin messages\r\n if (response.type === \"handover_ack\") {\r\n logger.info(`${this.processName} - Received handover ack from ${event.packet?.properties?.userProperties?.processName}.`);\r\n this.handoverInProgress = false;\r\n this.requestingHandover = false;\r\n\r\n logger.info(`${this.processName} - Handover completed. Exiting process.`);\r\n process.exit(0);\r\n }\r\n } catch (error) {\r\n logger.error(`${this.processName} - Error processing handover response: ${error.message}`);\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"process-config.js","sourceRoot":"","sources":["../../src/uns/process-config.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,gCAAgC;AAChC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;AAE9E,4DAA4D;AAC5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAQrE,MAAM,cAAc,GAAgB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;AAExF,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,GAAG,cAAc;IACjB,IAAI,EAAE,cAAc,CAAC,IAAI;CAC1B,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,CAAC,kBAAkB;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,kBAAkB","sourcesContent":["// process-config.ts\nimport * as path from \"path\";\nimport { readFileSync } from \"fs\";\nimport { basePath } from \"../base-path.js\";\n\n// Path to the process name file\nexport const PROCESS_NAME_FILE = path.join(basePath, \"uns-process-name.conf\");\n\n// Path to package.json to retrieve package name and version\nexport const PACKAGE_JSON_PATH = path.join(basePath, \"package.json\");\n\n// Read package.json and export as an object\ninterface PackageInfo {\n name: string;\n version: string;\n}\n\nconst rawPackageInfo: PackageInfo = JSON.parse(readFileSync(PACKAGE_JSON_PATH, \"utf8\"));\n\nexport const PACKAGE_INFO: PackageInfo = {\n ...rawPackageInfo,\n name: rawPackageInfo.name\n};\n\n// Other configuration values (update intervals, timeouts, etc.)\nexport const MQTT_UPDATE_INTERVAL = 10000; // in milliseconds\nexport const ACTIVE_TIMEOUT = 10000; // in milliseconds\n"]}
1
+ {"version":3,"file":"process-config.js","sourceRoot":"","sources":["../../src/uns/process-config.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,gCAAgC;AAChC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;AAE9E,4DAA4D;AAC5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;AAQrE,MAAM,cAAc,GAAgB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;AAExF,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,GAAG,cAAc;IACjB,IAAI,EAAE,cAAc,CAAC,IAAI;CAC1B,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,CAAC,kBAAkB;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,kBAAkB","sourcesContent":["// process-config.ts\r\nimport * as path from \"path\";\r\nimport { readFileSync } from \"fs\";\r\nimport { basePath } from \"../base-path.js\";\r\n\r\n// Path to the process name file\r\nexport const PROCESS_NAME_FILE = path.join(basePath, \"uns-process-name.conf\");\r\n\r\n// Path to package.json to retrieve package name and version\r\nexport const PACKAGE_JSON_PATH = path.join(basePath, \"package.json\");\r\n\r\n// Read package.json and export as an object\r\ninterface PackageInfo {\r\n name: string;\r\n version: string;\r\n}\r\n\r\nconst rawPackageInfo: PackageInfo = JSON.parse(readFileSync(PACKAGE_JSON_PATH, \"utf8\"));\r\n\r\nexport const PACKAGE_INFO: PackageInfo = {\r\n ...rawPackageInfo,\r\n name: rawPackageInfo.name\r\n};\r\n\r\n// Other configuration values (update intervals, timeouts, etc.)\r\nexport const MQTT_UPDATE_INTERVAL = 10000; // in milliseconds\r\nexport const ACTIVE_TIMEOUT = 10000; // in milliseconds\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"process-name-service.js","sourceRoot":"","sources":["../../src/uns/process-name-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,MAAM,MAAM,cAAc,CAAC;AAElC;;;;;GAKG;AACH,MAAM,UAAU,cAAc;IAC5B,4DAA4D;IAC5D,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;QAC/C,MAAM,KAAK,GAAG,sCAAsC,CAAC;QACrD,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CACpD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CACvD,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEX,yDAAyD;QACzD,IAAI,CAAC;YACH,aAAa,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC","sourcesContent":["import { readFileSync, writeFileSync } from \"fs\";\nimport { PROCESS_NAME_FILE } from \"./process-config.js\";\nimport logger from \"../logger.js\";\n\n/**\n * Retrieves a persistent process name.\n * - Checks if a process name is provided via command-line args.\n * - Otherwise, reads the process name from a file.\n * - If the file does not exist, generates a new name and stores it.\n */\nexport function getProcessName(): string {\n // Try to read the process name from the configuration file.\n try {\n return readFileSync(PROCESS_NAME_FILE, \"utf8\").trim();\n } catch {\n // Generate a new process name if reading fails\n const chars = \"abcdefghijklmnopqrstuvwxyz0123456789\";\n const newProcessName = Array.from({ length: 6 }, () =>\n chars.charAt(Math.floor(Math.random() * chars.length))\n ).join(\"\");\n\n // Write the new process name to the file for persistence\n try {\n writeFileSync(PROCESS_NAME_FILE, newProcessName, \"utf8\");\n } catch (err) {\n logger.error(\"Failed to write process name file:\", err);\n }\n\n return newProcessName;\n }\n}\n"]}
1
+ {"version":3,"file":"process-name-service.js","sourceRoot":"","sources":["../../src/uns/process-name-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,MAAM,MAAM,cAAc,CAAC;AAElC;;;;;GAKG;AACH,MAAM,UAAU,cAAc;IAC5B,4DAA4D;IAC5D,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;QAC/C,MAAM,KAAK,GAAG,sCAAsC,CAAC;QACrD,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CACpD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CACvD,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEX,yDAAyD;QACzD,IAAI,CAAC;YACH,aAAa,CAAC,iBAAiB,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC","sourcesContent":["import { readFileSync, writeFileSync } from \"fs\";\r\nimport { PROCESS_NAME_FILE } from \"./process-config.js\";\r\nimport logger from \"../logger.js\";\r\n\r\n/**\r\n * Retrieves a persistent process name.\r\n * - Checks if a process name is provided via command-line args.\r\n * - Otherwise, reads the process name from a file.\r\n * - If the file does not exist, generates a new name and stores it.\r\n */\r\nexport function getProcessName(): string {\r\n // Try to read the process name from the configuration file.\r\n try {\r\n return readFileSync(PROCESS_NAME_FILE, \"utf8\").trim();\r\n } catch {\r\n // Generate a new process name if reading fails\r\n const chars = \"abcdefghijklmnopqrstuvwxyz0123456789\";\r\n const newProcessName = Array.from({ length: 6 }, () =>\r\n chars.charAt(Math.floor(Math.random() * chars.length))\r\n ).join(\"\");\r\n\r\n // Write the new process name to the file for persistence\r\n try {\r\n writeFileSync(PROCESS_NAME_FILE, newProcessName, \"utf8\");\r\n } catch (err) {\r\n logger.error(\"Failed to write process name file:\", err);\r\n }\r\n\r\n return newProcessName;\r\n }\r\n}\r\n"]}