@openremote/core 1.0.2 → 1.2.0-snapshot.20240512154942

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 (52) hide show
  1. package/README.md +86 -8
  2. package/lib/asset-mixin.d.ts +46 -0
  3. package/lib/asset-mixin.js +1 -0
  4. package/lib/asset-mixin.js.map +1 -0
  5. package/{dist → lib}/console.d.ts +21 -12
  6. package/lib/console.js +1 -0
  7. package/lib/console.js.map +1 -0
  8. package/lib/defaults.d.ts +15 -0
  9. package/lib/defaults.js +1 -0
  10. package/lib/defaults.js.map +1 -0
  11. package/{dist → lib}/event.d.ts +30 -16
  12. package/lib/event.js +1 -0
  13. package/lib/event.js.map +1 -0
  14. package/lib/index.d.ts +150 -0
  15. package/lib/index.js +1 -0
  16. package/lib/index.js.map +1 -0
  17. package/lib/util.d.ts +92 -0
  18. package/lib/util.js +1 -0
  19. package/lib/util.js.map +1 -0
  20. package/package.json +31 -14
  21. package/dist/asset-mixin.d.ts +0 -25
  22. package/dist/asset-mixin.js +0 -115
  23. package/dist/asset-mixin.js.map +0 -1
  24. package/dist/console.js +0 -446
  25. package/dist/console.js.map +0 -1
  26. package/dist/event.js +0 -454
  27. package/dist/event.js.map +0 -1
  28. package/dist/index.d.ts +0 -137
  29. package/dist/index.js +0 -683
  30. package/dist/index.js.map +0 -1
  31. package/dist/util.d.ts +0 -17
  32. package/dist/util.js +0 -72
  33. package/dist/util.js.map +0 -1
  34. package/src/asset-mixin.ts +0 -132
  35. package/src/console.d.ts +0 -56
  36. package/src/console.js +0 -451
  37. package/src/console.js.map +0 -1
  38. package/src/console.ts +0 -530
  39. package/src/event.d.ts +0 -75
  40. package/src/event.js +0 -410
  41. package/src/event.js.map +0 -1
  42. package/src/event.ts +0 -584
  43. package/src/index.d.ts +0 -110
  44. package/src/index.js +0 -525
  45. package/src/index.js.map +0 -1
  46. package/src/index.ts +0 -803
  47. package/src/util.d.ts +0 -15
  48. package/src/util.js +0 -46
  49. package/src/util.js.map +0 -1
  50. package/src/util.ts +0 -94
  51. package/tsconfig.json +0 -14
  52. package/tsconfig.tsbuildinfo +0 -9788
package/src/index.js DELETED
@@ -1,525 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- return new (P || (P = Promise))(function (resolve, reject) {
3
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
4
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
5
- function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
6
- step((generator = generator.apply(thisArg, _arguments || [])).next());
7
- });
8
- };
9
- import 'url-search-params-polyfill';
10
- import { Console } from "./console";
11
- import rest from "@openremote/rest";
12
- import { EventProviderStatus, WebSocketEventProvider } from "./event";
13
- export var ORError;
14
- (function (ORError) {
15
- ORError["NONE"] = "NONE";
16
- ORError["MANAGER_FAILED_TO_LOAD"] = "MANAGER_FAILED_TO_LOAD";
17
- ORError["KEYCLOAK_FAILED_TO_LOAD"] = "KEYCLOAK_FAILED_TO_LOAD";
18
- ORError["AUTH_TYPE_UNSUPPORTED"] = "AUTH_TYPE_UNSUPPORTED";
19
- ORError["CONSOLE_ERROR"] = "CONSOLE_INIT_ERROR";
20
- ORError["EVENTS_CONNECTION_ERROR"] = "EVENTS_CONNECTION_ERROR";
21
- })(ORError || (ORError = {}));
22
- export var Auth;
23
- (function (Auth) {
24
- Auth["KEYCLOAK"] = "KEYCLOAK";
25
- Auth["BASIC"] = "BASIC";
26
- Auth["NONE"] = "NONE";
27
- })(Auth || (Auth = {}));
28
- export var OREvent;
29
- (function (OREvent) {
30
- OREvent["INIT"] = "INIT";
31
- OREvent["AUTHENTICATED"] = "AUTHENTICATED";
32
- OREvent["ERROR"] = "ERROR";
33
- OREvent["READY"] = "READY";
34
- OREvent["CONSOLE_INIT"] = "CONSOLE_INIT";
35
- OREvent["CONSOLE_READY"] = "CONSOLE_READY";
36
- OREvent["EVENTS_CONNECTED"] = "EVENTS_CONNECTED";
37
- OREvent["EVENTS_CONNECTING"] = "EVENTS_CONNECTING";
38
- OREvent["EVENTS_DISCONNECTED"] = "EVENTS_DISCONNECTED";
39
- })(OREvent || (OREvent = {}));
40
- export var EventProviderType;
41
- (function (EventProviderType) {
42
- EventProviderType["WEBSOCKET"] = "WEBSOCKET";
43
- EventProviderType["POLLING"] = "POLLING";
44
- })(EventProviderType || (EventProviderType = {}));
45
- export class Manager {
46
- constructor() {
47
- this._error = ORError.NONE;
48
- this._authenticated = false;
49
- this._ready = false;
50
- this._name = "";
51
- this._username = "";
52
- this._keycloak = null;
53
- this._roles = [];
54
- this._keycloakUpdateTokenInterval = undefined;
55
- this._managerVersion = "";
56
- this._listeners = [];
57
- this._events = null;
58
- }
59
- get username() {
60
- return this._username;
61
- }
62
- get error() {
63
- return this._error;
64
- }
65
- get authenticated() {
66
- return this._authenticated;
67
- }
68
- get initialised() {
69
- return this._config != null;
70
- }
71
- get ready() {
72
- return this._ready;
73
- }
74
- get config() {
75
- return this._config;
76
- }
77
- get roles() {
78
- return this._roles;
79
- }
80
- get managerVersion() {
81
- return this._managerVersion;
82
- }
83
- get isManagerAvailable() {
84
- return this._managerVersion && this._managerVersion !== "";
85
- }
86
- get isError() {
87
- return this._error != null && this._error !== ORError.NONE;
88
- }
89
- get connectionStatus() {
90
- return this._events && this._events.status;
91
- }
92
- get console() {
93
- return this._console;
94
- }
95
- get events() {
96
- return this._events;
97
- }
98
- static normaliseConfig(config) {
99
- const normalisedConfig = Object.assign({}, config);
100
- if (!normalisedConfig.managerUrl || normalisedConfig.managerUrl === "") {
101
- // Assume manager is running on same host as this code
102
- normalisedConfig.managerUrl = window.location.protocol + "//" + window.location.hostname + ":" + window.location.port;
103
- }
104
- else {
105
- // Normalise by stripping any trailing slashes
106
- normalisedConfig.managerUrl = normalisedConfig.managerUrl.replace(/\/+$/, "");
107
- }
108
- if (!normalisedConfig.realm || normalisedConfig.realm === "") {
109
- // Assume master realm
110
- normalisedConfig.realm = "master";
111
- }
112
- if (normalisedConfig.auth === Auth.KEYCLOAK) {
113
- // Determine URL of keycloak server
114
- if (!normalisedConfig.keycloakUrl || normalisedConfig.keycloakUrl === "") {
115
- // Assume keycloak is running on same host as the manager
116
- normalisedConfig.keycloakUrl = normalisedConfig.managerUrl + "/auth";
117
- }
118
- else {
119
- // Normalise by stripping any trailing slashes
120
- normalisedConfig.keycloakUrl = normalisedConfig.keycloakUrl.replace(/\/+$/, "");
121
- }
122
- }
123
- if (normalisedConfig.consoleAutoEnable === undefined) {
124
- normalisedConfig.consoleAutoEnable = true;
125
- }
126
- if (!normalisedConfig.eventProviderType) {
127
- normalisedConfig.eventProviderType = EventProviderType.WEBSOCKET;
128
- }
129
- if (!normalisedConfig.pollingIntervalMillis || normalisedConfig.pollingIntervalMillis < 5000) {
130
- normalisedConfig.pollingIntervalMillis = 10000;
131
- }
132
- return normalisedConfig;
133
- }
134
- isManagerSameOrigin() {
135
- if (!this.initialised) {
136
- return false;
137
- }
138
- const managerUrl = new URL(this._config.managerUrl);
139
- const windowUrl = window.location;
140
- return managerUrl.protocol === windowUrl.protocol
141
- && managerUrl.hostname === windowUrl.hostname
142
- && managerUrl.port === windowUrl.port;
143
- }
144
- addListener(callback) {
145
- const index = this._listeners.indexOf(callback);
146
- if (index < 0) {
147
- this._listeners.push(callback);
148
- }
149
- }
150
- removeListener(callback) {
151
- const index = this._listeners.indexOf(callback);
152
- if (index >= 0) {
153
- this._listeners.splice(index, 1);
154
- }
155
- }
156
- init(config) {
157
- return __awaiter(this, void 0, void 0, function* () {
158
- if (this._config) {
159
- console.log("Already initialised");
160
- }
161
- this._config = Manager.normaliseConfig(config);
162
- let success = yield this.doInit();
163
- if (success) {
164
- success = this.doRestApiInit();
165
- }
166
- if (success) {
167
- success = yield this.doConsoleInit();
168
- }
169
- if (success) {
170
- success = yield this.doAuthInit();
171
- }
172
- // TODO: Reinstate this once websocket supports anonymous connections
173
- // if (success) {
174
- // success = await this.doEventsSubscriptionInit();
175
- // }
176
- if (success) {
177
- this._ready = true;
178
- this._emitEvent(OREvent.READY);
179
- }
180
- return success;
181
- });
182
- }
183
- doInit() {
184
- return __awaiter(this, void 0, void 0, function* () {
185
- // Check manager exists by calling the info endpoint
186
- try {
187
- const json = yield new Promise((resolve, reject) => {
188
- const oReq = new XMLHttpRequest();
189
- oReq.addEventListener("load", () => {
190
- resolve(JSON.parse(oReq.responseText));
191
- });
192
- oReq.addEventListener("error", () => {
193
- reject(new Error("Failed to contact the manager"));
194
- });
195
- oReq.open("GET", this._config.managerUrl + "/api/master/info");
196
- oReq.send();
197
- });
198
- this._managerVersion = json && json.version ? json.version : "";
199
- return true;
200
- }
201
- catch (e) {
202
- // TODO: Implement auto retry?
203
- console.error("Failed to contact the manager", e);
204
- this._setError(ORError.MANAGER_FAILED_TO_LOAD);
205
- return false;
206
- }
207
- });
208
- }
209
- doAuthInit() {
210
- return __awaiter(this, void 0, void 0, function* () {
211
- let success = true;
212
- switch (this._config.auth) {
213
- case Auth.BASIC:
214
- // TODO: Implement Basic auth support
215
- if (this._config.credentials) {
216
- rest.setBasicAuth(this._config.credentials.username, this._config.credentials.password);
217
- }
218
- this._setError(ORError.AUTH_TYPE_UNSUPPORTED);
219
- success = false;
220
- break;
221
- case Auth.KEYCLOAK:
222
- success = yield this.loadAndInitialiseKeycloak();
223
- // Add interceptor to inject authorization header on each request
224
- rest.addRequestInterceptor((config) => {
225
- if (!config.headers.Authorization) {
226
- const token = this.getKeycloakToken();
227
- if (token) {
228
- config.headers.Authorization = "Bearer " + token;
229
- }
230
- }
231
- return config;
232
- });
233
- break;
234
- case Auth.NONE:
235
- // Nothing for us to do here
236
- break;
237
- default:
238
- this._setError(ORError.AUTH_TYPE_UNSUPPORTED);
239
- success = false;
240
- break;
241
- }
242
- return success;
243
- });
244
- }
245
- doRestApiInit() {
246
- rest.setTimeout(10000);
247
- rest.initialise(this.getApiBaseUrl());
248
- return true;
249
- }
250
- doEventsSubscriptionInit() {
251
- return __awaiter(this, void 0, void 0, function* () {
252
- let connected = false;
253
- switch (this._config.eventProviderType) {
254
- case EventProviderType.WEBSOCKET:
255
- this._events = new WebSocketEventProvider(this._config.managerUrl, (status) => { this.onEventsProviderStatusChanged(status); });
256
- connected = yield this._events.connect();
257
- break;
258
- case EventProviderType.POLLING:
259
- break;
260
- }
261
- if (!connected) {
262
- this._setError(ORError.EVENTS_CONNECTION_ERROR);
263
- }
264
- return connected;
265
- });
266
- }
267
- onEventsProviderStatusChanged(status) {
268
- switch (status) {
269
- case EventProviderStatus.DISCONNECTED:
270
- this._emitEvent(OREvent.EVENTS_DISCONNECTED);
271
- break;
272
- case EventProviderStatus.CONNECTED:
273
- this._emitEvent(OREvent.EVENTS_CONNECTED);
274
- break;
275
- case EventProviderStatus.CONNECTING:
276
- this._emitEvent(OREvent.EVENTS_CONNECTING);
277
- break;
278
- }
279
- }
280
- doConsoleInit() {
281
- return __awaiter(this, void 0, void 0, function* () {
282
- try {
283
- let orConsole = new Console(this._config.realm, this._config.consoleAutoEnable, () => {
284
- this._emitEvent(OREvent.CONSOLE_READY);
285
- });
286
- this._console = orConsole;
287
- yield orConsole.initialise();
288
- this._emitEvent(OREvent.CONSOLE_INIT);
289
- return true;
290
- }
291
- catch (e) {
292
- this._setError(ORError.CONSOLE_ERROR);
293
- return false;
294
- }
295
- });
296
- }
297
- logout(redirectUrl) {
298
- if (this._keycloak) {
299
- if (this.console.isMobile) {
300
- this.console.storeData("REFRESH_TOKEN", null);
301
- }
302
- const options = redirectUrl && redirectUrl !== "" ? { redirectUri: redirectUrl } : null;
303
- this._keycloak.logout(options);
304
- }
305
- }
306
- login(options) {
307
- if (!this.initialised) {
308
- return;
309
- }
310
- switch (this._config.auth) {
311
- case Auth.BASIC:
312
- if (options && options.credentials) {
313
- this._config.credentials = Object.assign({}, options.credentials);
314
- }
315
- const username = this._config.credentials ? this._config.credentials.username : null;
316
- const password = this._config.credentials ? this._config.credentials.password : null;
317
- if (username && password && username !== "" && password !== "") {
318
- // TODO: Perform some request to check basic auth credentials
319
- this._setAuthenticated(true);
320
- }
321
- break;
322
- case Auth.KEYCLOAK:
323
- if (this._keycloak) {
324
- const keycloakOptions = {};
325
- if (options && options.redirectUrl && options.redirectUrl !== "") {
326
- keycloakOptions.redirectUri = options.redirectUrl;
327
- }
328
- if (this.isMobile()) {
329
- keycloakOptions.scope = "offline_access";
330
- }
331
- this._keycloak.login(keycloakOptions);
332
- }
333
- break;
334
- case Auth.NONE:
335
- break;
336
- }
337
- }
338
- isSuperUser() {
339
- return this.hasRole("admin");
340
- }
341
- getApiBaseUrl() {
342
- let baseUrl = this._config.managerUrl;
343
- baseUrl += "/api/" + this._config.realm + "/";
344
- return baseUrl;
345
- }
346
- getAppName() {
347
- let pathArr = location.pathname.split('/');
348
- return pathArr.length >= 1 ? pathArr[1] : "";
349
- }
350
- hasRole(role) {
351
- return this._roles && this._roles.indexOf(role) >= 0;
352
- }
353
- getAuthorizationHeader() {
354
- if (this._keycloak && this.authenticated) {
355
- return "Bearer " + this._keycloak.token;
356
- }
357
- return undefined;
358
- }
359
- getKeycloakToken() {
360
- if (this._keycloak && this.authenticated) {
361
- return this._keycloak.token;
362
- }
363
- return undefined;
364
- }
365
- getRealm() {
366
- if (this._config) {
367
- return this._config.realm;
368
- }
369
- return undefined;
370
- }
371
- isMobile() {
372
- return this.console && this.console.isMobile;
373
- }
374
- _onAuthenticated() {
375
- // If native shell is enabled, we need an offline refresh token
376
- if (this.console && this.console.isMobile && this.config.auth === Auth.KEYCLOAK) {
377
- if (this._keycloak.refreshTokenParsed.typ === "Offline") {
378
- console.debug("Storing offline refresh token");
379
- this.console.storeData("REFRESH_TOKEN", this._keycloak.refreshToken);
380
- }
381
- else {
382
- this.login();
383
- }
384
- }
385
- }
386
- // NOTE: The below works with Keycloak 2.x JS API - They made breaking changes in newer versions
387
- // so this will need updating.
388
- loadAndInitialiseKeycloak() {
389
- return __awaiter(this, void 0, void 0, function* () {
390
- // Load the keycloak JS API
391
- const promise = new Promise((resolve, reject) => {
392
- // Load keycloak script from keycloak server
393
- const scriptElement = document.createElement("script");
394
- scriptElement.src = this._config.keycloakUrl + "/js/keycloak.js";
395
- scriptElement.onload = (e) => resolve(e);
396
- scriptElement.onerror = (e) => reject(e);
397
- document.querySelector("head").appendChild(scriptElement);
398
- });
399
- try {
400
- yield promise;
401
- // Should have Keycloak global var now
402
- if (!window.Keycloak) {
403
- this._setError(ORError.KEYCLOAK_FAILED_TO_LOAD);
404
- return false;
405
- }
406
- // Initialise keycloak
407
- this._keycloak = window.Keycloak({
408
- clientId: "openremote",
409
- realm: this._config.realm,
410
- url: this._config.keycloakUrl
411
- });
412
- this._keycloak.onAuthSuccess = () => {
413
- if (keycloakPromise) {
414
- keycloakPromise(true);
415
- }
416
- };
417
- this._keycloak.onAuthError = () => {
418
- this._setAuthenticated(false);
419
- };
420
- // There's a bug in some Keycloak versions which means the init promise doesn't resolve
421
- // so putting a check in place; wrap keycloak promise in proper ES6 promise
422
- let keycloakPromise = null;
423
- try {
424
- // Try to use a stored offline refresh token if defined
425
- const offlineToken = yield this._getNativeOfflineRefreshToken();
426
- const authenticated = yield new Promise(((resolve, reject) => {
427
- keycloakPromise = resolve;
428
- this._keycloak.init({
429
- checkLoginIframe: false,
430
- onLoad: this._config.autoLogin ? "login-required" : "check-sso",
431
- refreshToken: offlineToken
432
- }).success((auth) => {
433
- resolve(auth);
434
- }).error(() => {
435
- reject();
436
- });
437
- }));
438
- keycloakPromise = null;
439
- if (authenticated) {
440
- this._name = this._keycloak.tokenParsed.name;
441
- this._username = this._keycloak.tokenParsed.preferred_username;
442
- this._roles = this._keycloak.realmAccess.roles;
443
- // Update the access token every 10s (note keycloak will only update if expiring within configured
444
- // time period.
445
- if (this._keycloakUpdateTokenInterval) {
446
- clearInterval(this._keycloakUpdateTokenInterval);
447
- delete this._keycloakUpdateTokenInterval;
448
- }
449
- this._keycloakUpdateTokenInterval = window.setInterval(() => {
450
- this.updateKeycloakAccessToken();
451
- }, 10000);
452
- this._onAuthenticated();
453
- }
454
- this._setAuthenticated(authenticated);
455
- return true;
456
- }
457
- catch (e) {
458
- console.error(e);
459
- keycloakPromise = null;
460
- this._setAuthenticated(false);
461
- return false;
462
- }
463
- }
464
- catch (error) {
465
- this._setError(ORError.KEYCLOAK_FAILED_TO_LOAD);
466
- return false;
467
- }
468
- });
469
- }
470
- updateKeycloakAccessToken() {
471
- // Access token must be good for X more seconds, should be half of Constants.ACCESS_TOKEN_LIFESPAN_SECONDS
472
- return new Promise(() => {
473
- this._keycloak.updateToken(30)
474
- .success((tokenRefreshed) => {
475
- // If refreshed from server, it means the refresh token was still good for another access token
476
- console.debug("Access token update success, refreshed from server: " + tokenRefreshed);
477
- return tokenRefreshed;
478
- })
479
- .error(() => {
480
- // Refresh token expired (either SSO max session duration or offline idle timeout), see
481
- // IDENTITY_SESSION_MAX_MINUTES and IDENTITY_SESSION_OFFLINE_TIMEOUT_MINUTES server config
482
- console.info("Access token update failed, refresh token expired, login required");
483
- this._keycloak.clearToken();
484
- this._keycloak.login();
485
- });
486
- });
487
- }
488
- _getNativeOfflineRefreshToken() {
489
- return __awaiter(this, void 0, void 0, function* () {
490
- if (this.console && this.console.isMobile) {
491
- return yield this.console.retrieveData("REFRESH_TOKEN");
492
- }
493
- return null;
494
- });
495
- }
496
- _emitEvent(event) {
497
- window.setTimeout(() => {
498
- for (const listener of this._listeners) {
499
- listener(event);
500
- }
501
- }, 0);
502
- }
503
- _setError(error) {
504
- this._error = error;
505
- this._emitEvent(OREvent.ERROR);
506
- }
507
- // TODO: Remove events logic once websocket supports anonymous connections
508
- _setAuthenticated(authenticated) {
509
- this._authenticated = authenticated;
510
- if (authenticated) {
511
- this._emitEvent(OREvent.AUTHENTICATED);
512
- if (!this._events) {
513
- this.doEventsSubscriptionInit();
514
- }
515
- }
516
- else {
517
- if (this._events != null) {
518
- this._events.disconnect();
519
- }
520
- this._events = null;
521
- }
522
- }
523
- }
524
- export default new Manager();
525
- //# sourceMappingURL=index.js.map
package/src/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}