@camera.ui/browser 0.0.2 → 0.0.4

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 (158) hide show
  1. package/package.json +3 -3
  2. package/dist/client/node/src/api.js +0 -27
  3. package/dist/client/node/src/api.js.map +0 -1
  4. package/dist/client/node/src/client.js +0 -106
  5. package/dist/client/node/src/client.js.map +0 -1
  6. package/dist/client/node/src/index.js +0 -19
  7. package/dist/client/node/src/index.js.map +0 -1
  8. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.browser.js +0 -176
  9. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.browser.js.map +0 -1
  10. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.mock.js +0 -3
  11. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.mock.js.map +0 -1
  12. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.node.js +0 -51
  13. package/dist/client/node/src/proxy/cameraDevice/cameraDevice.node.js.map +0 -1
  14. package/dist/client/node/src/proxy/cameraDevice/index.js +0 -11
  15. package/dist/client/node/src/proxy/cameraDevice/index.js.map +0 -1
  16. package/dist/client/node/src/proxy/deviceManager.js +0 -67
  17. package/dist/client/node/src/proxy/deviceManager.js.map +0 -1
  18. package/dist/client/node/src/proxy/index.js +0 -21
  19. package/dist/client/node/src/proxy/index.js.map +0 -1
  20. package/dist/client/node/src/proxy/pluginsManager.js +0 -25
  21. package/dist/client/node/src/proxy/pluginsManager.js.map +0 -1
  22. package/dist/client/node/src/proxy/systemManager.js +0 -25
  23. package/dist/client/node/src/proxy/systemManager.js.map +0 -1
  24. package/dist/client/node/src/socket.js +0 -45
  25. package/dist/client/node/src/socket.js.map +0 -1
  26. package/dist/client/node/src/types.js +0 -3
  27. package/dist/client/node/src/types.js.map +0 -1
  28. package/dist/package.json +0 -149
  29. package/dist/shared/common/utils.js +0 -66
  30. package/dist/shared/common/utils.js.map +0 -1
  31. package/dist/shared/types/index.js +0 -23
  32. package/dist/shared/types/index.js.map +0 -1
  33. package/dist/src/api/database/index.js +0 -203
  34. package/dist/src/api/database/index.js.map +0 -1
  35. package/dist/src/api/database/types.js +0 -3
  36. package/dist/src/api/database/types.js.map +0 -1
  37. package/dist/src/api/go2rtc/api/application.js +0 -32
  38. package/dist/src/api/go2rtc/api/application.js.map +0 -1
  39. package/dist/src/api/go2rtc/api/index.js +0 -33
  40. package/dist/src/api/go2rtc/api/index.js.map +0 -1
  41. package/dist/src/api/go2rtc/api/snapshot.js +0 -22
  42. package/dist/src/api/go2rtc/api/snapshot.js.map +0 -1
  43. package/dist/src/api/go2rtc/api/streams.js +0 -32
  44. package/dist/src/api/go2rtc/api/streams.js.map +0 -1
  45. package/dist/src/api/go2rtc/index.js +0 -13
  46. package/dist/src/api/go2rtc/index.js.map +0 -1
  47. package/dist/src/api/go2rtc/types.js +0 -3
  48. package/dist/src/api/go2rtc/types.js.map +0 -1
  49. package/dist/src/api/middlewares/socketAuth.middleware.js +0 -90
  50. package/dist/src/api/middlewares/socketAuth.middleware.js.map +0 -1
  51. package/dist/src/api/schemas/backup.schema.js +0 -94
  52. package/dist/src/api/schemas/backup.schema.js.map +0 -1
  53. package/dist/src/api/schemas/cameras.schema.js +0 -124
  54. package/dist/src/api/schemas/cameras.schema.js.map +0 -1
  55. package/dist/src/api/schemas/config.schema.js +0 -94
  56. package/dist/src/api/schemas/config.schema.js.map +0 -1
  57. package/dist/src/api/schemas/go2rtc.schema.js +0 -204
  58. package/dist/src/api/schemas/go2rtc.schema.js.map +0 -1
  59. package/dist/src/api/schemas/users.schema.js +0 -131
  60. package/dist/src/api/schemas/users.schema.js.map +0 -1
  61. package/dist/src/api/services/auth.service.js +0 -104
  62. package/dist/src/api/services/auth.service.js.map +0 -1
  63. package/dist/src/api/services/cameras.service.js +0 -535
  64. package/dist/src/api/services/cameras.service.js.map +0 -1
  65. package/dist/src/api/services/plugins.service.js +0 -115
  66. package/dist/src/api/services/plugins.service.js.map +0 -1
  67. package/dist/src/api/services/users.service.js +0 -54
  68. package/dist/src/api/services/users.service.js.map +0 -1
  69. package/dist/src/api/types/index.js +0 -12
  70. package/dist/src/api/types/index.js.map +0 -1
  71. package/dist/src/api/utils/cert.js +0 -437
  72. package/dist/src/api/utils/cert.js.map +0 -1
  73. package/dist/src/api/ws/index.js +0 -89
  74. package/dist/src/api/ws/index.js.map +0 -1
  75. package/dist/src/api/ws/nsp/logs.js +0 -121
  76. package/dist/src/api/ws/nsp/logs.js.map +0 -1
  77. package/dist/src/api/ws/nsp/main.js +0 -49
  78. package/dist/src/api/ws/nsp/main.js.map +0 -1
  79. package/dist/src/api/ws/nsp/metrics.js +0 -225
  80. package/dist/src/api/ws/nsp/metrics.js.map +0 -1
  81. package/dist/src/api/ws/nsp/notifications.js +0 -39
  82. package/dist/src/api/ws/nsp/notifications.js.map +0 -1
  83. package/dist/src/api/ws/nsp/plugins.js +0 -33
  84. package/dist/src/api/ws/nsp/plugins.js.map +0 -1
  85. package/dist/src/api/ws/nsp/status.js +0 -41
  86. package/dist/src/api/ws/nsp/status.js.map +0 -1
  87. package/dist/src/api/ws/nsp/streams.js +0 -140
  88. package/dist/src/api/ws/nsp/streams.js.map +0 -1
  89. package/dist/src/api/ws/types.js +0 -3
  90. package/dist/src/api/ws/types.js.map +0 -1
  91. package/dist/src/api.js +0 -66
  92. package/dist/src/api.js.map +0 -1
  93. package/dist/src/camera/index.js +0 -210
  94. package/dist/src/camera/index.js.map +0 -1
  95. package/dist/src/camera/streaming/peer-connection.js +0 -157
  96. package/dist/src/camera/streaming/peer-connection.js.map +0 -1
  97. package/dist/src/camera/streaming/streaming-session.js +0 -172
  98. package/dist/src/camera/streaming/streaming-session.js.map +0 -1
  99. package/dist/src/camera/streaming/webrtc-connection.js +0 -156
  100. package/dist/src/camera/streaming/webrtc-connection.js.map +0 -1
  101. package/dist/src/camera/subscribed.js +0 -14
  102. package/dist/src/camera/subscribed.js.map +0 -1
  103. package/dist/src/camera/types.js +0 -3
  104. package/dist/src/camera/types.js.map +0 -1
  105. package/dist/src/go2rtc/index.js +0 -220
  106. package/dist/src/go2rtc/index.js.map +0 -1
  107. package/dist/src/go2rtc/types.js +0 -76
  108. package/dist/src/go2rtc/types.js.map +0 -1
  109. package/dist/src/plugins/base.js +0 -26
  110. package/dist/src/plugins/base.js.map +0 -1
  111. package/dist/src/plugins/cameraStorage.js +0 -290
  112. package/dist/src/plugins/cameraStorage.js.map +0 -1
  113. package/dist/src/plugins/child.js +0 -140
  114. package/dist/src/plugins/child.js.map +0 -1
  115. package/dist/src/plugins/config.js +0 -234
  116. package/dist/src/plugins/config.js.map +0 -1
  117. package/dist/src/plugins/index.js +0 -328
  118. package/dist/src/plugins/index.js.map +0 -1
  119. package/dist/src/plugins/plugin.js +0 -215
  120. package/dist/src/plugins/plugin.js.map +0 -1
  121. package/dist/src/plugins/schema.js +0 -717
  122. package/dist/src/plugins/schema.js.map +0 -1
  123. package/dist/src/plugins/storage.js +0 -45
  124. package/dist/src/plugins/storage.js.map +0 -1
  125. package/dist/src/plugins/types.js +0 -21
  126. package/dist/src/plugins/types.js.map +0 -1
  127. package/dist/src/plugins/worker.js +0 -236
  128. package/dist/src/plugins/worker.js.map +0 -1
  129. package/dist/src/proxy/client/cameraDevice.js +0 -171
  130. package/dist/src/proxy/client/cameraDevice.js.map +0 -1
  131. package/dist/src/proxy/client/deviceManager.js +0 -239
  132. package/dist/src/proxy/client/deviceManager.js.map +0 -1
  133. package/dist/src/proxy/client/index.js +0 -21
  134. package/dist/src/proxy/client/index.js.map +0 -1
  135. package/dist/src/proxy/client/pluginsManager.js +0 -237
  136. package/dist/src/proxy/client/pluginsManager.js.map +0 -1
  137. package/dist/src/proxy/client/systemManager.js +0 -163
  138. package/dist/src/proxy/client/systemManager.js.map +0 -1
  139. package/dist/src/proxy/index.js +0 -98
  140. package/dist/src/proxy/index.js.map +0 -1
  141. package/dist/src/proxy/proxies/camera.js +0 -72
  142. package/dist/src/proxy/proxies/camera.js.map +0 -1
  143. package/dist/src/proxy/proxies/plugin.js +0 -110
  144. package/dist/src/proxy/proxies/plugin.js.map +0 -1
  145. package/dist/src/proxy/proxies/server.js +0 -92
  146. package/dist/src/proxy/proxies/server.js.map +0 -1
  147. package/dist/src/proxy/types.js +0 -3
  148. package/dist/src/proxy/types.js.map +0 -1
  149. package/dist/src/proxy/utils/generateKeys.js +0 -13
  150. package/dist/src/proxy/utils/generateKeys.js.map +0 -1
  151. package/dist/src/proxy/ws/index.js +0 -75
  152. package/dist/src/proxy/ws/index.js.map +0 -1
  153. package/dist/src/services/config/index.js +0 -319
  154. package/dist/src/services/config/index.js.map +0 -1
  155. package/dist/src/services/config/types.js +0 -13
  156. package/dist/src/services/config/types.js.map +0 -1
  157. package/dist/src/services/logger/index.js +0 -181
  158. package/dist/src/services/logger/index.js.map +0 -1
@@ -1,234 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.PluginConfigService = void 0;
7
- const fs_extra_1 = __importDefault(require("fs-extra"));
8
- const object_path_1 = __importDefault(require("object-path"));
9
- const lodash_clonedeep_1 = __importDefault(require("lodash.clonedeep"));
10
- class PluginConfigService {
11
- config = {};
12
- configFile;
13
- constructor(configFile) {
14
- this.configFile = configFile;
15
- this.init();
16
- }
17
- get(key, defaultValue, validate, refresh, writeIfNotValid) {
18
- if (refresh) {
19
- this.read();
20
- }
21
- const val = object_path_1.default.get(this.config, key, defaultValue);
22
- if (validate && defaultValue !== undefined) {
23
- const isValid = validate(val);
24
- if (!isValid) {
25
- this.set(key, defaultValue, writeIfNotValid);
26
- }
27
- }
28
- return (0, lodash_clonedeep_1.default)(val);
29
- }
30
- /**
31
- * Test key (Path) existence
32
- *
33
- * @param key - Key to lookup for
34
- * @param refresh - Re-Read config.json before lookup for the `key`
35
- */
36
- has(key, refresh) {
37
- if (refresh) {
38
- this.read();
39
- }
40
- return object_path_1.default.has(this.config, key);
41
- }
42
- /**
43
- * Set a value if it doesn't exist, do nothing if it does
44
- *
45
- * @param key - Key whose existence is to be checked
46
- * @param defaultValue - Default value if `key` not exist
47
- * @param write - Optional parameter, if true, the changes will be written to the file.
48
- */
49
- ensureExists(key, defaultValue, write) {
50
- const exists = this.has(key);
51
- object_path_1.default.ensureExists(this.config, key, defaultValue);
52
- this.config = this.config;
53
- if (write && !exists) {
54
- this.write();
55
- }
56
- }
57
- /**
58
- * Set a key (Path) to a value
59
- *
60
- * @param key - Key
61
- * @param value - Value to set for they given `key`
62
- * @param write - Optional parameter, if true, the changes will be written to the file.
63
- */
64
- set(key, value, write) {
65
- object_path_1.default.set(this.config, key, value);
66
- this.config = this.config;
67
- if (write) {
68
- this.write();
69
- }
70
- }
71
- /**
72
- * Insert an item in an array path
73
- *
74
- * @param key - Key to the array
75
- * @param value - Value to insert in the array
76
- * @param at - Index
77
- * @param write - Optional parameter, if true, the changes will be written to the file.
78
- */
79
- insert(key, value, at, write) {
80
- object_path_1.default.insert(this.config, key, value, at);
81
- this.config = this.config;
82
- if (write) {
83
- this.write();
84
- }
85
- }
86
- /**
87
- * Create (if path isn't an array) and push the value to it. Can push unlimited number of values
88
- *
89
- * @param key - Key to the array
90
- * @param write - Optional parameter, if true, the changes will be written to the file.
91
- * @param items - Values to push in to the array
92
- */
93
- push(key, write, ...items) {
94
- object_path_1.default.push(this.config, key, items);
95
- this.config = this.config;
96
- if (write) {
97
- this.write();
98
- }
99
- }
100
- /**
101
- * Deletes a member from object or array
102
- *
103
- * @param key - Key to lookup for
104
- * @param write - Optional parameter, if true, the changes will be written to the file.
105
- */
106
- delete(key, write) {
107
- object_path_1.default.del(this.config, key);
108
- this.config = this.config;
109
- if (write) {
110
- this.write();
111
- }
112
- }
113
- /**
114
- * @param refresh - Re-Read config.json
115
- *
116
- * @returns config.json
117
- */
118
- all(refresh) {
119
- if (refresh) {
120
- this.read();
121
- }
122
- return (0, lodash_clonedeep_1.default)(this.config);
123
- }
124
- /**
125
- * @param config - New config.json
126
- * @param write - Optional parameter, if true, the changes will be written to the file.
127
- */
128
- replace(config, write) {
129
- this.config = config;
130
- if (write) {
131
- this.write();
132
- }
133
- }
134
- /**
135
- * Updates a specific value in a nested object structure by a given path and key.
136
- *
137
- * @param path - The path to the nested object.
138
- * @param searchKey - The key to search for.
139
- * @param searchValue - The value to match the searchKey.
140
- * @param targetKey - The key of the value to be updated.
141
- * @param newValue - The new value to be set.
142
- * @param write - Optional parameter, if true, the changes will be written to the file.
143
- */
144
- updateValue(path, searchKey, searchValue, targetKey, newValue, write) {
145
- const pathSegments = path.split('.');
146
- const updateRecursive = (obj, index) => {
147
- if (index === pathSegments.length) {
148
- if (obj[searchKey] === searchValue) {
149
- obj[targetKey] = newValue;
150
- }
151
- return;
152
- }
153
- const currentPath = pathSegments[index];
154
- if (Array.isArray(obj[currentPath])) {
155
- obj[currentPath].forEach((element) => updateRecursive(element, index + 1));
156
- }
157
- else if (obj[currentPath] !== undefined) {
158
- updateRecursive(obj[currentPath], index + 1);
159
- }
160
- };
161
- updateRecursive(this.config, 0);
162
- this.set(pathSegments[0], this.config[pathSegments[0]], write);
163
- }
164
- /**
165
- * Replaces a specific item in a nested object structure by a given path and key.
166
- * If the item does not exist, it will be added.
167
- * If the path does not exist, it will be created.
168
- *
169
- * @param path - The path to the nested object.
170
- * @param searchKey - The key to search for.
171
- * @param searchValue - The value to match the searchKey.
172
- * @param newItem - The new item to replace the old one. If the item does not exist, it will be added.
173
- * @param write - Optional parameter, if true, the changes will be written to the file.
174
- */
175
- replaceOrAddItem(path, searchKey, searchValue, newItem, write) {
176
- const pathSegments = path.split('.');
177
- const ensurePathExists = (obj, pathSegments, index) => {
178
- if (index >= pathSegments.length)
179
- return;
180
- const currentPath = pathSegments[index];
181
- if (obj[currentPath] === undefined) {
182
- obj[currentPath] = index === pathSegments.length - 1 ? [] : {};
183
- }
184
- ensurePathExists(obj[currentPath], pathSegments, index + 1);
185
- };
186
- const findAndReplaceOrAddRecursive = (obj, pathIndex) => {
187
- if (Array.isArray(obj)) {
188
- obj.forEach((subObj) => findAndReplaceOrAddRecursive(subObj, pathIndex));
189
- }
190
- else {
191
- const currentPath = pathSegments[pathIndex];
192
- if (pathIndex === pathSegments.length - 1) {
193
- if (Array.isArray(obj[currentPath])) {
194
- const itemIndex = obj[currentPath].findIndex((item) => item[searchKey] === searchValue);
195
- if (itemIndex !== -1) {
196
- obj[currentPath][itemIndex] = newItem;
197
- }
198
- else {
199
- obj[currentPath].push(newItem);
200
- }
201
- }
202
- }
203
- else if (obj[currentPath] !== undefined) {
204
- findAndReplaceOrAddRecursive(obj[currentPath], pathIndex + 1);
205
- }
206
- }
207
- };
208
- ensurePathExists(this.config, pathSegments, 0);
209
- findAndReplaceOrAddRecursive(this.config, 0);
210
- this.set(pathSegments[0], this.config[pathSegments[0]], write);
211
- }
212
- /**
213
- * Initialize config.json
214
- */
215
- init() {
216
- fs_extra_1.default.ensureFileSync(this.configFile);
217
- this.read();
218
- }
219
- /**
220
- * Read config.json
221
- */
222
- read() {
223
- const config = fs_extra_1.default.readJsonSync(this.configFile, { throws: false }) || this.config || {};
224
- this.config = config;
225
- }
226
- /**
227
- * Write config.json
228
- */
229
- write() {
230
- fs_extra_1.default.writeJsonSync(this.configFile, this.config, { spaces: 2 });
231
- }
232
- }
233
- exports.PluginConfigService = PluginConfigService;
234
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../src/plugins/config.ts"],"names":[],"mappings":"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"}
@@ -1,328 +0,0 @@
1
- "use strict";
2
- /**
3
- *
4
- * @url https://github.com/homebridge/homebridge/blob/src/pluginManager.ts
5
- * (c) Homebridge <https://github.com/homebridge>
6
- *
7
- **/
8
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
9
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
10
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
11
- 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;
12
- return c > 3 && r && Object.defineProperty(target, key, r), r;
13
- };
14
- var __metadata = (this && this.__metadata) || function (k, v) {
15
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
16
- };
17
- var __importDefault = (this && this.__importDefault) || function (mod) {
18
- return (mod && mod.__esModule) ? mod : { "default": mod };
19
- };
20
- var PluginManager_1;
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.PluginManager = void 0;
23
- const fs_extra_1 = __importDefault(require("fs-extra"));
24
- const path_1 = __importDefault(require("path"));
25
- const child_process_1 = require("child_process");
26
- const tsyringe_1 = require("tsyringe");
27
- const plugin_1 = require("./plugin");
28
- const worker_1 = require("./worker");
29
- const config_1 = require("../services/config");
30
- const plugins_service_1 = __importDefault(require("../api/services/plugins.service"));
31
- const types_1 = require("./types");
32
- let PluginManager = PluginManager_1 = class PluginManager {
33
- logger;
34
- plugins = new Map();
35
- pluginWorkers = new Map();
36
- searchPaths = new Set();
37
- api;
38
- configService;
39
- currentInitializingPlugin;
40
- constructor() {
41
- this.api = tsyringe_1.container.resolve('api');
42
- this.logger = tsyringe_1.container.resolve('logger');
43
- this.configService = tsyringe_1.container.resolve('configService');
44
- this.api.on("registerPlugin" /* INTERNAL_API_EVENT.REGISTER_PLUGIN */, this.handlePluginRegistration.bind(this));
45
- tsyringe_1.container.register('pluginManager', { useValue: this });
46
- }
47
- static isQualifiedPluginIdentifier(pluginName) {
48
- return types_1.PLUGIN_IDENTIFIER_PATTERN.test(pluginName);
49
- }
50
- static extractPluginScope(pluginName) {
51
- return pluginName.match(types_1.PLUGIN_IDENTIFIER_PATTERN)[2];
52
- }
53
- static extractPluginName(pluginName) {
54
- return pluginName.match(types_1.PLUGIN_IDENTIFIER_PATTERN)[3];
55
- }
56
- static transformDisplaName(pluginName) {
57
- const extractedPkgName = this.extractPluginName(pluginName).replace('camera-ui-', '').replaceAll('-', ' ');
58
- return extractedPkgName
59
- .toLowerCase()
60
- .split(' ')
61
- .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
62
- .join(' ');
63
- }
64
- static loadPackageJSON(installPath) {
65
- const packageJsonPath = path_1.default.join(installPath, 'package.json');
66
- let packageJson;
67
- if (!fs_extra_1.default.existsSync(packageJsonPath)) {
68
- throw new Error(`Plugin ${installPath} does not contain a package.json.`);
69
- }
70
- try {
71
- packageJson = JSON.parse(fs_extra_1.default.readFileSync(packageJsonPath, { encoding: 'utf8' }));
72
- }
73
- catch (error) {
74
- throw new Error(`Plugin ${installPath} contains an invalid package.json. Error: ${error}`);
75
- }
76
- if (!PluginManager_1.isQualifiedPluginIdentifier(packageJson.name)) {
77
- throw new Error(`Plugin ${installPath} does not have a package name that begins with 'camera-ui-' or '@scope/camera-ui-.`);
78
- }
79
- // verify that it's tagged with the correct keyword
80
- if (!packageJson.keywords?.includes('camera-ui-plugin')) {
81
- throw new Error(`Plugin ${installPath}/package.json does not contain the keyword 'camera-ui-plugin'.`);
82
- }
83
- return packageJson;
84
- }
85
- async initializeInstalledPlugins() {
86
- this.logger.log('---');
87
- this.loadDefaultPaths();
88
- this.logger.debug(`Looking for plugins at: Path: ${Array.from(this.searchPaths).join(', Path: ')}`);
89
- await this.loadInstalledPlugins();
90
- await this.removeOrphanedPlugins();
91
- await Promise.all(Array.from(this.plugins).map(([, plugin]) => this.initializeInstalledPlugin(plugin)));
92
- }
93
- async initializeInstalledPlugin(plugin, insertDb) {
94
- try {
95
- await plugin.load();
96
- }
97
- catch (error) {
98
- this.logger.error(`Error loading plugin: ${plugin.pluginName}:`, error);
99
- this.plugins.delete(plugin.pluginName);
100
- }
101
- if (this.configService.config.plugins.disabledPlugins?.includes(plugin.pluginName)) {
102
- plugin.disabled = true;
103
- plugin.info.disabled = true;
104
- }
105
- if (plugin.disabled) {
106
- this.logger.warn(`Disabled plugin: ${plugin.displayName} (${plugin.pluginName}@${plugin.info.installedVersion})`);
107
- }
108
- else {
109
- this.logger.log(`Initializing plugin: ${plugin.displayName} (${plugin.pluginName}@${plugin.info.installedVersion})`);
110
- }
111
- await this.initializePlugin(plugin, plugin.pluginName);
112
- }
113
- async initializePlugin(plugin, pluginName) {
114
- try {
115
- this.currentInitializingPlugin = plugin;
116
- await plugin.initialize(this.api);
117
- }
118
- catch (error) {
119
- this.logger.error(`Error initializing plugin: ${plugin.pluginName}:`, error);
120
- this.plugins.delete(pluginName);
121
- return;
122
- }
123
- }
124
- async loadPlugin(absolutePath, pluginId, storagePath) {
125
- let init = false;
126
- const packageJson = PluginManager_1.loadPackageJSON(absolutePath);
127
- const pluginName = packageJson.name;
128
- const scope = PluginManager_1.extractPluginScope(pluginName);
129
- const alreadyInstalled = this.plugins.get(pluginName);
130
- if (alreadyInstalled) {
131
- throw new Error(`Warning: skipping plugin found at '${absolutePath}' since we already loaded the same plugin from '${alreadyInstalled.installPath}'.`);
132
- }
133
- if (!pluginId) {
134
- init = true;
135
- const pluginsService = new plugins_service_1.default();
136
- const { _id } = await pluginsService.insertPluginDb(pluginName);
137
- pluginId = _id;
138
- }
139
- const plugin = new plugin_1.Plugin(pluginName, absolutePath, packageJson, pluginId, scope, storagePath);
140
- if (init) {
141
- const db = tsyringe_1.container.resolve('dbs');
142
- await db.createPluginDatabase(plugin);
143
- }
144
- this.plugins.set(pluginName, plugin);
145
- return plugin;
146
- }
147
- async removePlugin(plugin, removeFromDb, removeStorage) {
148
- const pluginProcess = this.pluginWorkers.get(plugin.pluginName);
149
- await pluginProcess?.teardown();
150
- if (removeFromDb) {
151
- const pluginsService = new plugins_service_1.default();
152
- await pluginsService.removePluginDbByName(plugin.pluginName);
153
- }
154
- if (removeStorage) {
155
- await fs_extra_1.default.remove(plugin.storagePath);
156
- }
157
- this.pluginWorkers.delete(plugin.pluginName);
158
- this.plugins.delete(plugin.pluginName);
159
- }
160
- async startPluginChild(pluginName) {
161
- let pluginWorker = this.pluginWorkers.get(pluginName);
162
- const plugin = this.plugins.get(pluginName);
163
- if (!pluginWorker && plugin) {
164
- pluginWorker = new worker_1.PluginWorker(plugin);
165
- this.pluginWorkers.set(pluginName, pluginWorker);
166
- }
167
- if (pluginWorker) {
168
- await pluginWorker.start();
169
- }
170
- }
171
- async startPluginChilds() {
172
- if (this.plugins.size) {
173
- this.logger.log('---');
174
- for (const [pluginName, plugin] of this.plugins) {
175
- const pluginWorker = new worker_1.PluginWorker(plugin);
176
- this.pluginWorkers.set(pluginName, pluginWorker);
177
- }
178
- await Promise.all(Array.from(this.pluginWorkers)
179
- .filter(([_, pluginWorker]) => !pluginWorker.plugin.disabled)
180
- .map(([, pluginWorker]) => pluginWorker.start()));
181
- this.logger.log('---');
182
- }
183
- }
184
- async loadInstalledPlugins() {
185
- // search for plugins among all known paths
186
- for (const searchPath of this.searchPaths) {
187
- if (!fs_extra_1.default.existsSync(searchPath)) {
188
- continue;
189
- }
190
- if (fs_extra_1.default.existsSync(path_1.default.join(searchPath, 'package.json'))) {
191
- try {
192
- await this.loadPlugin(searchPath);
193
- }
194
- catch (error) {
195
- this.logger.warn(error.message);
196
- continue;
197
- }
198
- }
199
- else {
200
- // read through each directory in this node_modules folder
201
- const relativeinstallPaths = fs_extra_1.default.readdirSync(searchPath).filter((relativePath) => {
202
- // search for directories only
203
- try {
204
- return fs_extra_1.default.statSync(path_1.default.resolve(searchPath, relativePath)).isDirectory();
205
- }
206
- catch (error) {
207
- this.logger.debug(`Ignoring path ${path_1.default.resolve(searchPath, relativePath)} - ${error.message}`);
208
- return;
209
- }
210
- });
211
- // expand out @scoped plugins
212
- for (const scopeDirectory of [...relativeinstallPaths].filter((path) => path.charAt(0) === '@')) {
213
- // is it a scope directory?
214
- const index = relativeinstallPaths.indexOf(scopeDirectory);
215
- relativeinstallPaths.splice(index, 1);
216
- const absolutePath = path_1.default.join(searchPath, scopeDirectory);
217
- for (const name of fs_extra_1.default
218
- .readdirSync(absolutePath)
219
- .filter((name) => PluginManager_1.isQualifiedPluginIdentifier(name))
220
- .filter((name) => {
221
- try {
222
- return fs_extra_1.default.statSync(path_1.default.resolve(absolutePath, name)).isDirectory();
223
- }
224
- catch (error) {
225
- this.logger.debug(`Ignoring path ${path_1.default.resolve(absolutePath, name)} - ${error.message}`);
226
- return false;
227
- }
228
- }))
229
- relativeinstallPaths.push(scopeDirectory + '/' + name);
230
- }
231
- for (const pluginIdentifier of relativeinstallPaths.filter((pluginIdentifier) => {
232
- return PluginManager_1.isQualifiedPluginIdentifier(pluginIdentifier); // needs to be a valid camera.ui plugin name
233
- })) {
234
- try {
235
- const absolutePath = path_1.default.resolve(searchPath, pluginIdentifier);
236
- await this.loadPlugin(absolutePath);
237
- }
238
- catch (error) {
239
- this.logger.warn(error.message);
240
- continue;
241
- }
242
- }
243
- }
244
- }
245
- if (this.plugins.size === 0) {
246
- this.logger.warn('No plugins found. See the README for information on installing plugins.');
247
- }
248
- return this.plugins;
249
- }
250
- loadDefaultPaths() {
251
- if (this.configService.PLUGINS_INSTALL_PATH) {
252
- this.searchPaths.add(this.configService.PLUGINS_INSTALL_PATH);
253
- }
254
- // if (this.configService.config.plugins?.customPluginPath) {
255
- // this.searchPaths.add(this.configService.config.plugins.customPluginPath);
256
- // }
257
- // if (this.configService.config.plugins?.strictPluginResolution) {
258
- if (this.configService.PLUGINS_STRICT_RESOLUTION) {
259
- // if strict plugin resolution is enabled:
260
- // * only use custom plugin path, if set;
261
- // * otherwise add the current npm global prefix (eg. /usr/local/lib/node_modules)
262
- if (this.searchPaths.size === 0) {
263
- this.addNpmPrefixToSearchPaths();
264
- }
265
- return;
266
- }
267
- if (require.main) {
268
- // add the paths used by require()
269
- require.main.paths.forEach((path) => this.searchPaths.add(path));
270
- }
271
- // THIS SECTION FROM: https://github.com/yeoman/environment/blob/master/lib/resolver.js
272
- // Adding global npm directories
273
- // We tried using npm to get the global modules path, but it haven't work out
274
- // because of bugs in the parsable implementation of `ls` command and mostly
275
- // performance issues. So, we go with our best bet for now.
276
- if (process.env.NODE_PATH) {
277
- process.env.NODE_PATH.split(path_1.default.delimiter)
278
- .filter((path) => !!path)
279
- .map((path) => this.searchPaths.add(path));
280
- }
281
- else {
282
- // Default paths for non-windows systems
283
- if (process.platform !== 'win32') {
284
- this.searchPaths.add('/usr/local/lib/node_modules');
285
- this.searchPaths.add('/usr/lib/node_modules');
286
- }
287
- this.addNpmPrefixToSearchPaths();
288
- }
289
- }
290
- async removeOrphanedPlugins() {
291
- const pluginsService = new plugins_service_1.default();
292
- await pluginsService.removeOrphanPluginsDb();
293
- }
294
- handlePluginRegistration(constructor, contract) {
295
- if (!this.currentInitializingPlugin) {
296
- throw new Error(`Unexpected plugin registration. Plugin "${contract.pluginName}" tried to register outside the initializer function!`);
297
- }
298
- if (contract.pluginName !== this.currentInitializingPlugin.pluginName) {
299
- throw new Error(`Plugin '${this.currentInitializingPlugin.pluginName}' tried to register with an incorrect plugin identifier: '${contract.pluginName}'. Please report this to the developer!`);
300
- }
301
- this.currentInitializingPlugin.registerPlugin(constructor, contract);
302
- }
303
- addNpmPrefixToSearchPaths() {
304
- if (process.platform === 'win32') {
305
- this.searchPaths.add(path_1.default.join(process.env.APPDATA, 'npm/node_modules'));
306
- }
307
- else {
308
- this.searchPaths.add((0, child_process_1.execSync)('/bin/echo -n "$(npm -g prefix)/lib/node_modules"', {
309
- env: Object.assign({
310
- npm_config_loglevel: 'silent',
311
- npm_update_notifier: 'false',
312
- }, process.env),
313
- }).toString('utf8'));
314
- }
315
- }
316
- };
317
- exports.PluginManager = PluginManager;
318
- exports.PluginManager = PluginManager = PluginManager_1 = __decorate([
319
- (0, tsyringe_1.registry)([
320
- {
321
- token: 'configService',
322
- useValue: (0, tsyringe_1.delay)(() => config_1.ConfigService),
323
- },
324
- ]),
325
- (0, tsyringe_1.scoped)(tsyringe_1.Lifecycle.ContainerScoped),
326
- __metadata("design:paramtypes", [])
327
- ], PluginManager);
328
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/index.ts"],"names":[],"mappings":"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"}