@interopio/desktop 6.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop.umd.min.js","sources":["../node_modules/@interopio/core/dist/core.es.js","../src/activity/entities/activityEntity.ts","../src/activity/helpers/util.ts","../src/activity/entities/activityType.ts","../src/activity/entities/windowType.ts","../src/activity/contracts/entityEvent.ts","../src/activity/core/activityAGM.ts","../src/activity/entities/attachedActivityDescriptor.ts","../src/activity/helpers/promiseExtensions.ts","../src/activity/entities/activity.ts","../src/activity/helpers/logger.ts","../src/activity/entities/activityWindow.ts","../src/activity/contracts/activityStatus.ts","../src/activity/bridges/gw3Bridge.ts","../src/activity/API/activityMyAPI.ts","../src/activity/helpers/readyMarker.ts","../src/activity/helpers/entityObservableCollection.ts","../src/activity/core/activityManager.ts","../src/activity/API/activityManagementAPI.ts","../src/activity/API/activityAPI.ts","../src/activity/activityModule.ts","../src/app-manager/const/agm-names.ts","../node_modules/callback-registry/lib/index.js","../src/app-manager/helper.ts","../src/app-manager/application.ts","../src/app-manager/instance.ts","../src/app-manager/app-manager.ts","../src/app-manager/entitlements.ts","../src/app-manager/in-memory.ts","../src/app-manager/main.ts","../src/app-manager/snapshot.ts","../src/app-manager/data-subscription.ts","../node_modules/shortid/lib/random/random-from-seed.js","../node_modules/shortid/lib/alphabet.js","../node_modules/shortid/lib/random/random-byte-browser.js","../node_modules/shortid/lib/encode.js","../node_modules/shortid/lib/decode.js","../node_modules/shortid/lib/build.js","../node_modules/shortid/lib/is-valid.js","../node_modules/shortid/lib/index.js","../node_modules/shortid/index.js","../src/windows/jumpList/manager.ts","../src/windows/store.ts","../src/utils.ts","../src/windows/jumpList/actions.ts","../src/windows/jumpList/categories.ts","../src/windows/jumpList/main.ts","../src/windows/window.ts","../src/windows/environment/helpers.ts","../src/windows/environment/gd/executor.ts","../src/windows/environment/gd/gd.ts","../src/windows/environment/detector.ts","../src/windows/group.ts","../src/windows/groups.ts","../src/windows/main.ts","../src/layouts/store.ts","../src/layouts/contextProvider.ts","../src/layouts/transform.ts","../src/layouts/layout.ts","../src/layouts/layouts.ts","../src/layouts/stream/acsStream.ts","../src/layouts/main.ts","../src/displays/displayManager.ts","../src/channels/agm.ts","../src/channels/contexts.ts","../src/channels/channels.ts","../src/channels/main.ts","../src/hotkeys/hotkeys.ts","../src/config.ts","../src/notifications/notification.ts","../src/notifications/panel.ts","../src/notifications/main.ts","../src/themes/themes.ts","../src/intents/constants.ts","../src/intents/common.ts","../src/intents/intents.ts","../src/prefs/index.ts","../src/cookies/index.ts","../src/eventsDispatcher.ts","../src/glue.ts","../src/factoryCallInfo.ts","../src/hotkeys/main.ts","../src/themes/main.ts","../src/cookies/main.ts","../src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nfunction __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nvar __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nfunction __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nfunction __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\n\nvar MetricTypes = {\r\n STRING: 1,\r\n NUMBER: 2,\r\n TIMESTAMP: 3,\r\n OBJECT: 4\r\n};\n\nfunction getMetricTypeByValue(metric) {\r\n if (metric.type === MetricTypes.TIMESTAMP) {\r\n return \"timestamp\";\r\n }\r\n else if (metric.type === MetricTypes.NUMBER) {\r\n return \"number\";\r\n }\r\n else if (metric.type === MetricTypes.STRING) {\r\n return \"string\";\r\n }\r\n else if (metric.type === MetricTypes.OBJECT) {\r\n return \"object\";\r\n }\r\n return \"unknown\";\r\n}\r\nfunction getTypeByValue(value) {\r\n if (value.constructor === Date) {\r\n return \"timestamp\";\r\n }\r\n else if (typeof value === \"number\") {\r\n return \"number\";\r\n }\r\n else if (typeof value === \"string\") {\r\n return \"string\";\r\n }\r\n else if (typeof value === \"object\") {\r\n return \"object\";\r\n }\r\n else {\r\n return \"string\";\r\n }\r\n}\r\nfunction serializeMetric(metric) {\r\n var serializedMetrics = {};\r\n var type = getMetricTypeByValue(metric);\r\n if (type === \"object\") {\r\n var values = Object.keys(metric.value).reduce(function (memo, key) {\r\n var innerType = getTypeByValue(metric.value[key]);\r\n if (innerType === \"object\") {\r\n var composite = defineNestedComposite(metric.value[key]);\r\n memo[key] = {\r\n type: \"object\",\r\n description: \"\",\r\n context: {},\r\n composite: composite,\r\n };\r\n }\r\n else {\r\n memo[key] = {\r\n type: innerType,\r\n description: \"\",\r\n context: {},\r\n };\r\n }\r\n return memo;\r\n }, {});\r\n serializedMetrics.composite = values;\r\n }\r\n serializedMetrics.name = normalizeMetricName(metric.path.join(\"/\") + \"/\" + metric.name);\r\n serializedMetrics.type = type;\r\n serializedMetrics.description = metric.description;\r\n serializedMetrics.context = {};\r\n return serializedMetrics;\r\n}\r\nfunction defineNestedComposite(values) {\r\n return Object.keys(values).reduce(function (memo, key) {\r\n var type = getTypeByValue(values[key]);\r\n if (type === \"object\") {\r\n memo[key] = {\r\n type: \"object\",\r\n description: \"\",\r\n context: {},\r\n composite: defineNestedComposite(values[key]),\r\n };\r\n }\r\n else {\r\n memo[key] = {\r\n type: type,\r\n description: \"\",\r\n context: {},\r\n };\r\n }\r\n return memo;\r\n }, {});\r\n}\r\nfunction normalizeMetricName(name) {\r\n if (typeof name !== \"undefined\" && name.length > 0 && name[0] !== \"/\") {\r\n return \"/\" + name;\r\n }\r\n else {\r\n return name;\r\n }\r\n}\r\nfunction getMetricValueByType(metric) {\r\n var type = getMetricTypeByValue(metric);\r\n if (type === \"timestamp\") {\r\n return Date.now();\r\n }\r\n else {\r\n return publishNestedComposite(metric.value);\r\n }\r\n}\r\nfunction publishNestedComposite(values) {\r\n if (typeof values !== \"object\") {\r\n return values;\r\n }\r\n return Object.keys(values).reduce(function (memo, key) {\r\n var value = values[key];\r\n if (typeof value === \"object\" && value.constructor !== Date) {\r\n memo[key] = publishNestedComposite(value);\r\n }\r\n else if (value.constructor === Date) {\r\n memo[key] = new Date(value).getTime();\r\n }\r\n else if (value.constructor === Boolean) {\r\n memo[key] = value.toString();\r\n }\r\n else {\r\n memo[key] = value;\r\n }\r\n return memo;\r\n }, {});\r\n}\r\nfunction flatten(arr) {\r\n return arr.reduce(function (flat, toFlatten) {\r\n return flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten);\r\n }, []);\r\n}\r\nfunction getHighestState(arr) {\r\n return arr.sort(function (a, b) {\r\n if (!a.state) {\r\n return 1;\r\n }\r\n if (!b.state) {\r\n return -1;\r\n }\r\n return b.state - a.state;\r\n })[0];\r\n}\r\nfunction aggregateDescription(arr) {\r\n var msg = \"\";\r\n arr.forEach(function (m, idx, a) {\r\n var path = m.path.join(\".\");\r\n if (idx === a.length - 1) {\r\n msg += path + \".\" + m.name + \": \" + m.description;\r\n }\r\n else {\r\n msg += path + \".\" + m.name + \": \" + m.description + \",\";\r\n }\r\n });\r\n if (msg.length > 100) {\r\n return msg.slice(0, 100) + \"...\";\r\n }\r\n else {\r\n return msg;\r\n }\r\n}\r\nfunction composeMsgForRootStateMetric(system) {\r\n var aggregatedState = system.root.getAggregateState();\r\n var merged = flatten(aggregatedState);\r\n var highestState = getHighestState(merged);\r\n var aggregateDesc = aggregateDescription(merged);\r\n return {\r\n description: aggregateDesc,\r\n value: highestState.state,\r\n };\r\n}\n\nfunction gw3 (connection, config) {\r\n var _this = this;\r\n if (!connection || typeof connection !== \"object\") {\r\n throw new Error(\"Connection is required parameter\");\r\n }\r\n var joinPromise;\r\n var session;\r\n var init = function (repo) {\r\n var resolveReadyPromise;\r\n joinPromise = new Promise(function (resolve) {\r\n resolveReadyPromise = resolve;\r\n });\r\n session = connection.domain(\"metrics\");\r\n session.onJoined(function (reconnect) {\r\n if (!reconnect && resolveReadyPromise) {\r\n resolveReadyPromise();\r\n resolveReadyPromise = undefined;\r\n }\r\n var rootStateMetric = {\r\n name: \"/State\",\r\n type: \"object\",\r\n composite: {\r\n Description: {\r\n type: \"string\",\r\n description: \"\",\r\n },\r\n Value: {\r\n type: \"number\",\r\n description: \"\",\r\n },\r\n },\r\n description: \"System state\",\r\n context: {},\r\n };\r\n var defineRootMetricsMsg = {\r\n type: \"define\",\r\n metrics: [rootStateMetric],\r\n };\r\n session.send(defineRootMetricsMsg);\r\n if (reconnect) {\r\n replayRepo(repo);\r\n }\r\n });\r\n session.join({\r\n system: config.system,\r\n service: config.service,\r\n instance: config.instance\r\n });\r\n };\r\n var replayRepo = function (repo) {\r\n replaySystem(repo.root);\r\n };\r\n var replaySystem = function (system) {\r\n createSystem(system);\r\n system.metrics.forEach(function (m) {\r\n createMetric(m);\r\n });\r\n system.subSystems.forEach(function (ss) {\r\n replaySystem(ss);\r\n });\r\n };\r\n var createSystem = function (system) { return __awaiter(_this, void 0, void 0, function () {\r\n var metric, createMetricsMsg;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (system.parent === undefined) {\r\n return [2];\r\n }\r\n return [4, joinPromise];\r\n case 1:\r\n _a.sent();\r\n metric = {\r\n name: normalizeMetricName(system.path.join(\"/\") + \"/\" + system.name + \"/State\"),\r\n type: \"object\",\r\n composite: {\r\n Description: {\r\n type: \"string\",\r\n description: \"\",\r\n },\r\n Value: {\r\n type: \"number\",\r\n description: \"\",\r\n },\r\n },\r\n description: \"System state\",\r\n context: {},\r\n };\r\n createMetricsMsg = {\r\n type: \"define\",\r\n metrics: [metric],\r\n };\r\n session.send(createMetricsMsg);\r\n return [2];\r\n }\r\n });\r\n }); };\r\n var updateSystem = function (system, state) { return __awaiter(_this, void 0, void 0, function () {\r\n var shadowedUpdateMetric, stateObj, rootMetric;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4, joinPromise];\r\n case 1:\r\n _a.sent();\r\n shadowedUpdateMetric = {\r\n type: \"publish\",\r\n values: [{\r\n name: normalizeMetricName(system.path.join(\"/\") + \"/\" + system.name + \"/State\"),\r\n value: {\r\n Description: state.description,\r\n Value: state.state,\r\n },\r\n timestamp: Date.now(),\r\n }],\r\n };\r\n session.send(shadowedUpdateMetric);\r\n stateObj = composeMsgForRootStateMetric(system);\r\n rootMetric = {\r\n type: \"publish\",\r\n peer_id: connection.peerId,\r\n values: [{\r\n name: \"/State\",\r\n value: {\r\n Description: stateObj.description,\r\n Value: stateObj.value,\r\n },\r\n timestamp: Date.now(),\r\n }],\r\n };\r\n session.send(rootMetric);\r\n return [2];\r\n }\r\n });\r\n }); };\r\n var createMetric = function (metric) { return __awaiter(_this, void 0, void 0, function () {\r\n var metricClone, m, createMetricsMsg;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n metricClone = cloneMetric(metric);\r\n return [4, joinPromise];\r\n case 1:\r\n _a.sent();\r\n m = serializeMetric(metricClone);\r\n createMetricsMsg = {\r\n type: \"define\",\r\n metrics: [m],\r\n };\r\n session.send(createMetricsMsg);\r\n if (typeof metricClone.value !== \"undefined\") {\r\n updateMetricCore(metricClone);\r\n }\r\n return [2];\r\n }\r\n });\r\n }); };\r\n var updateMetric = function (metric) { return __awaiter(_this, void 0, void 0, function () {\r\n var metricClone;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n metricClone = cloneMetric(metric);\r\n return [4, joinPromise];\r\n case 1:\r\n _a.sent();\r\n updateMetricCore(metricClone);\r\n return [2];\r\n }\r\n });\r\n }); };\r\n var updateMetricCore = function (metric) {\r\n if (canUpdate()) {\r\n var value = getMetricValueByType(metric);\r\n var publishMetricsMsg = {\r\n type: \"publish\",\r\n values: [{\r\n name: normalizeMetricName(metric.path.join(\"/\") + \"/\" + metric.name),\r\n value: value,\r\n timestamp: Date.now(),\r\n }],\r\n };\r\n return session.sendFireAndForget(publishMetricsMsg);\r\n }\r\n return Promise.resolve();\r\n };\r\n var cloneMetric = function (metric) {\r\n var metricClone = __assign({}, metric);\r\n if (typeof metric.value === \"object\" && metric.value !== null) {\r\n metricClone.value = __assign({}, metric.value);\r\n }\r\n return metricClone;\r\n };\r\n var canUpdate = function () {\r\n var _a;\r\n try {\r\n var func = (_a = config.canUpdateMetric) !== null && _a !== void 0 ? _a : (function () { return true; });\r\n return func();\r\n }\r\n catch (_b) {\r\n return true;\r\n }\r\n };\r\n return {\r\n init: init,\r\n createSystem: createSystem,\r\n updateSystem: updateSystem,\r\n createMetric: createMetric,\r\n updateMetric: updateMetric,\r\n };\r\n}\n\nvar Helpers = {\r\n validate: function (definition, parent, transport) {\r\n if (definition === null || typeof definition !== \"object\") {\r\n throw new Error(\"Missing definition\");\r\n }\r\n if (parent === null || typeof parent !== \"object\") {\r\n throw new Error(\"Missing parent\");\r\n }\r\n if (transport === null || typeof transport !== \"object\") {\r\n throw new Error(\"Missing transport\");\r\n }\r\n },\r\n};\n\nvar BaseMetric = (function () {\r\n function BaseMetric(definition, system, transport, value, type) {\r\n this.definition = definition;\r\n this.system = system;\r\n this.transport = transport;\r\n this.value = value;\r\n this.type = type;\r\n this.path = [];\r\n Helpers.validate(definition, system, transport);\r\n this.path = system.path.slice(0);\r\n this.path.push(system.name);\r\n this.name = definition.name;\r\n this.description = definition.description;\r\n transport.createMetric(this);\r\n }\r\n Object.defineProperty(BaseMetric.prototype, \"repo\", {\r\n get: function () {\r\n var _a;\r\n return (_a = this.system) === null || _a === void 0 ? void 0 : _a.repo;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(BaseMetric.prototype, \"id\", {\r\n get: function () { return \"\".concat(this.system.path, \"/\").concat(name); },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n BaseMetric.prototype.update = function (newValue) {\r\n this.value = newValue;\r\n return this.transport.updateMetric(this);\r\n };\r\n return BaseMetric;\r\n}());\n\nvar NumberMetric = (function (_super) {\r\n __extends(NumberMetric, _super);\r\n function NumberMetric(definition, system, transport, value) {\r\n return _super.call(this, definition, system, transport, value, MetricTypes.NUMBER) || this;\r\n }\r\n NumberMetric.prototype.incrementBy = function (num) {\r\n this.update(this.value + num);\r\n };\r\n NumberMetric.prototype.increment = function () {\r\n this.incrementBy(1);\r\n };\r\n NumberMetric.prototype.decrement = function () {\r\n this.incrementBy(-1);\r\n };\r\n NumberMetric.prototype.decrementBy = function (num) {\r\n this.incrementBy(num * -1);\r\n };\r\n return NumberMetric;\r\n}(BaseMetric));\n\nvar ObjectMetric = (function (_super) {\r\n __extends(ObjectMetric, _super);\r\n function ObjectMetric(definition, system, transport, value) {\r\n return _super.call(this, definition, system, transport, value, MetricTypes.OBJECT) || this;\r\n }\r\n ObjectMetric.prototype.update = function (newValue) {\r\n this.mergeValues(newValue);\r\n return this.transport.updateMetric(this);\r\n };\r\n ObjectMetric.prototype.mergeValues = function (values) {\r\n var _this = this;\r\n return Object.keys(this.value).forEach(function (k) {\r\n if (typeof values[k] !== \"undefined\") {\r\n _this.value[k] = values[k];\r\n }\r\n });\r\n };\r\n return ObjectMetric;\r\n}(BaseMetric));\n\nvar StringMetric = (function (_super) {\r\n __extends(StringMetric, _super);\r\n function StringMetric(definition, system, transport, value) {\r\n return _super.call(this, definition, system, transport, value, MetricTypes.STRING) || this;\r\n }\r\n return StringMetric;\r\n}(BaseMetric));\n\nvar TimestampMetric = (function (_super) {\r\n __extends(TimestampMetric, _super);\r\n function TimestampMetric(definition, system, transport, value) {\r\n return _super.call(this, definition, system, transport, value, MetricTypes.TIMESTAMP) || this;\r\n }\r\n TimestampMetric.prototype.now = function () {\r\n this.update(new Date());\r\n };\r\n return TimestampMetric;\r\n}(BaseMetric));\n\nfunction system(name, repo, protocol, parent, description) {\r\n if (!repo) {\r\n throw new Error(\"Repository is required\");\r\n }\r\n if (!protocol) {\r\n throw new Error(\"Transport is required\");\r\n }\r\n var _transport = protocol;\r\n var _name = name;\r\n var _description = description || \"\";\r\n var _repo = repo;\r\n var _parent = parent;\r\n var _path = _buildPath(parent);\r\n var _state = {};\r\n var id = _arrayToString(_path, \"/\") + name;\r\n var root = repo.root;\r\n var _subSystems = [];\r\n var _metrics = [];\r\n function subSystem(nameSystem, descriptionSystem) {\r\n if (!nameSystem || nameSystem.length === 0) {\r\n throw new Error(\"name is required\");\r\n }\r\n var match = _subSystems.filter(function (s) { return s.name === nameSystem; });\r\n if (match.length > 0) {\r\n return match[0];\r\n }\r\n var _system = system(nameSystem, _repo, _transport, me, descriptionSystem);\r\n _subSystems.push(_system);\r\n return _system;\r\n }\r\n function setState(state, stateDescription) {\r\n _state = { state: state, description: stateDescription };\r\n _transport.updateSystem(me, _state);\r\n }\r\n function stringMetric(definition, value) {\r\n return _getOrCreateMetric(definition, MetricTypes.STRING, value, function (metricDef) { return new StringMetric(metricDef, me, _transport, value); });\r\n }\r\n function numberMetric(definition, value) {\r\n return _getOrCreateMetric(definition, MetricTypes.NUMBER, value, function (metricDef) { return new NumberMetric(metricDef, me, _transport, value); });\r\n }\r\n function objectMetric(definition, value) {\r\n return _getOrCreateMetric(definition, MetricTypes.OBJECT, value, function (metricDef) { return new ObjectMetric(metricDef, me, _transport, value); });\r\n }\r\n function timestampMetric(definition, value) {\r\n return _getOrCreateMetric(definition, MetricTypes.TIMESTAMP, value, function (metricDef) { return new TimestampMetric(metricDef, me, _transport, value); });\r\n }\r\n function _getOrCreateMetric(metricObject, expectedType, value, createMetric) {\r\n var metricDef = { name: \"\" };\r\n if (typeof metricObject === \"string\") {\r\n metricDef = { name: metricObject };\r\n }\r\n else {\r\n metricDef = metricObject;\r\n }\r\n var matching = _metrics.filter(function (shadowedMetric) { return shadowedMetric.name === metricDef.name; });\r\n if (matching.length > 0) {\r\n var existing = matching[0];\r\n if (existing.type !== expectedType) {\r\n throw new Error(\"A metric named \".concat(metricDef.name, \" is already defined with different type.\"));\r\n }\r\n if (typeof value !== \"undefined\") {\r\n existing\r\n .update(value)\r\n .catch(function () { });\r\n }\r\n return existing;\r\n }\r\n var metric = createMetric(metricDef);\r\n _metrics.push(metric);\r\n return metric;\r\n }\r\n function _buildPath(shadowedSystem) {\r\n if (!shadowedSystem || !shadowedSystem.parent) {\r\n return [];\r\n }\r\n var path = _buildPath(shadowedSystem.parent);\r\n path.push(shadowedSystem.name);\r\n return path;\r\n }\r\n function _arrayToString(path, separator) {\r\n return ((path && path.length > 0) ? path.join(separator) : \"\");\r\n }\r\n function getAggregateState() {\r\n var aggState = [];\r\n if (Object.keys(_state).length > 0) {\r\n aggState.push({\r\n name: _name,\r\n path: _path,\r\n state: _state.state,\r\n description: _state.description,\r\n });\r\n }\r\n _subSystems.forEach(function (shadowedSubSystem) {\r\n var result = shadowedSubSystem.getAggregateState();\r\n if (result.length > 0) {\r\n aggState.push.apply(aggState, result);\r\n }\r\n });\r\n return aggState;\r\n }\r\n var me = {\r\n get name() {\r\n return _name;\r\n },\r\n get description() {\r\n return _description;\r\n },\r\n get repo() {\r\n return _repo;\r\n },\r\n get parent() {\r\n return _parent;\r\n },\r\n path: _path,\r\n id: id,\r\n root: root,\r\n get subSystems() {\r\n return _subSystems;\r\n },\r\n get metrics() {\r\n return _metrics;\r\n },\r\n subSystem: subSystem,\r\n getState: function () {\r\n return _state;\r\n },\r\n setState: setState,\r\n stringMetric: stringMetric,\r\n timestampMetric: timestampMetric,\r\n objectMetric: objectMetric,\r\n numberMetric: numberMetric,\r\n getAggregateState: getAggregateState,\r\n };\r\n _transport.createSystem(me);\r\n return me;\r\n}\n\nvar Repository = (function () {\r\n function Repository(options, protocol) {\r\n protocol.init(this);\r\n this.root = system(\"\", this, protocol);\r\n this.addSystemMetrics(this.root, options.clickStream || options.clickStream === undefined);\r\n }\r\n Repository.prototype.addSystemMetrics = function (rootSystem, useClickStream) {\r\n if (typeof navigator !== \"undefined\") {\r\n rootSystem.stringMetric(\"UserAgent\", navigator.userAgent);\r\n }\r\n if (useClickStream && typeof document !== \"undefined\") {\r\n var clickStream_1 = rootSystem.subSystem(\"ClickStream\");\r\n var documentClickHandler = function (e) {\r\n var _a;\r\n if (!e.target) {\r\n return;\r\n }\r\n var target = e.target;\r\n var className = target ? (_a = target.getAttribute(\"class\")) !== null && _a !== void 0 ? _a : \"\" : \"\";\r\n clickStream_1.objectMetric(\"LastBrowserEvent\", {\r\n type: \"click\",\r\n timestamp: new Date(),\r\n target: {\r\n className: className,\r\n id: target.id,\r\n type: \"<\" + target.tagName.toLowerCase() + \">\",\r\n href: target.href || \"\",\r\n },\r\n });\r\n };\r\n clickStream_1.objectMetric(\"Page\", {\r\n title: document.title,\r\n page: window.location.href,\r\n });\r\n if (document.addEventListener) {\r\n document.addEventListener(\"click\", documentClickHandler);\r\n }\r\n else {\r\n document.attachEvent(\"onclick\", documentClickHandler);\r\n }\r\n }\r\n rootSystem.stringMetric(\"StartTime\", (new Date()).toString());\r\n var urlMetric = rootSystem.stringMetric(\"StartURL\", \"\");\r\n var appNameMetric = rootSystem.stringMetric(\"AppName\", \"\");\r\n if (typeof window !== \"undefined\") {\r\n if (typeof window.location !== \"undefined\") {\r\n var startUrl = window.location.href;\r\n urlMetric.update(startUrl);\r\n }\r\n if (typeof window.glue42gd !== \"undefined\") {\r\n appNameMetric.update(window.glue42gd.appName);\r\n }\r\n }\r\n };\r\n return Repository;\r\n}());\n\nvar NullProtocol = (function () {\r\n function NullProtocol() {\r\n }\r\n NullProtocol.prototype.init = function (repo) {\r\n };\r\n NullProtocol.prototype.createSystem = function (system) {\r\n return Promise.resolve();\r\n };\r\n NullProtocol.prototype.updateSystem = function (metric, state) {\r\n return Promise.resolve();\r\n };\r\n NullProtocol.prototype.createMetric = function (metric) {\r\n return Promise.resolve();\r\n };\r\n NullProtocol.prototype.updateMetric = function (metric) {\r\n return Promise.resolve();\r\n };\r\n return NullProtocol;\r\n}());\n\nvar PerfTracker = (function () {\r\n function PerfTracker(api, initialPublishTimeout, publishInterval) {\r\n this.api = api;\r\n this.lastCount = 0;\r\n this.initialPublishTimeout = 10 * 1000;\r\n this.publishInterval = 60 * 1000;\r\n this.initialPublishTimeout = initialPublishTimeout !== null && initialPublishTimeout !== void 0 ? initialPublishTimeout : this.initialPublishTimeout;\r\n this.publishInterval = publishInterval !== null && publishInterval !== void 0 ? publishInterval : this.publishInterval;\r\n this.scheduleCollection();\r\n this.system = this.api.subSystem(\"performance\", \"Performance data published by the web application\");\r\n }\r\n PerfTracker.prototype.scheduleCollection = function () {\r\n var _this = this;\r\n setTimeout(function () {\r\n _this.collect();\r\n setInterval(function () {\r\n _this.collect();\r\n }, _this.publishInterval);\r\n }, this.initialPublishTimeout);\r\n };\r\n PerfTracker.prototype.collect = function () {\r\n try {\r\n this.collectMemory();\r\n this.collectEntries();\r\n }\r\n catch (_a) {\r\n }\r\n };\r\n PerfTracker.prototype.collectMemory = function () {\r\n var memory = window.performance.memory;\r\n this.system.stringMetric(\"memory\", JSON.stringify({\r\n totalJSHeapSize: memory.totalJSHeapSize,\r\n usedJSHeapSize: memory.usedJSHeapSize\r\n }));\r\n };\r\n PerfTracker.prototype.collectEntries = function () {\r\n var allEntries = window.performance.getEntries();\r\n if (allEntries.length <= this.lastCount) {\r\n return;\r\n }\r\n this.lastCount = allEntries.length;\r\n var jsonfiedEntries = allEntries.map(function (i) { return i.toJSON(); });\r\n this.system.stringMetric(\"entries\", JSON.stringify(jsonfiedEntries));\r\n };\r\n return PerfTracker;\r\n}());\n\nvar metrics = (function (options) {\r\n var protocol;\r\n if (!options.connection || typeof options.connection !== \"object\") {\r\n protocol = new NullProtocol();\r\n }\r\n else {\r\n protocol = gw3(options.connection, options);\r\n }\r\n var repo = new Repository(options, protocol);\r\n var rootSystem = repo.root;\r\n if (!options.disableAutoAppSystem) {\r\n rootSystem = rootSystem.subSystem(\"App\");\r\n }\r\n var api = addFAVSupport(rootSystem);\r\n initPerf(api, options.pagePerformanceMetrics);\r\n return api;\r\n});\r\nfunction initPerf(api, config) {\r\n var _a, _b;\r\n if (typeof window === \"undefined\") {\r\n return;\r\n }\r\n var perfConfig = (_b = (_a = window === null || window === void 0 ? void 0 : window.glue42gd) === null || _a === void 0 ? void 0 : _a.metrics) === null || _b === void 0 ? void 0 : _b.pagePerformanceMetrics;\r\n if (perfConfig) {\r\n config = perfConfig;\r\n }\r\n if (config === null || config === void 0 ? void 0 : config.enabled) {\r\n new PerfTracker(api, config.initialPublishTimeout, config.publishInterval);\r\n }\r\n}\r\nfunction addFAVSupport(system) {\r\n var reportingSystem = system.subSystem(\"reporting\");\r\n var def = {\r\n name: \"features\"\r\n };\r\n var featureMetric;\r\n var featureMetricFunc = function (name, action, payload) {\r\n if (typeof name === \"undefined\" || name === \"\") {\r\n throw new Error(\"name is mandatory\");\r\n }\r\n else if (typeof action === \"undefined\" || action === \"\") {\r\n throw new Error(\"action is mandatory\");\r\n }\r\n else if (typeof payload === \"undefined\" || payload === \"\") {\r\n throw new Error(\"payload is mandatory\");\r\n }\r\n if (!featureMetric) {\r\n featureMetric = reportingSystem.objectMetric(def, { name: name, action: action, payload: payload });\r\n }\r\n else {\r\n featureMetric.update({\r\n name: name,\r\n action: action,\r\n payload: payload\r\n });\r\n }\r\n };\r\n system.featureMetric = featureMetricFunc;\r\n return system;\r\n}\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nfunction createRegistry(options) {\n if (options && options.errorHandling\n && typeof options.errorHandling !== \"function\"\n && options.errorHandling !== \"log\"\n && options.errorHandling !== \"silent\"\n && options.errorHandling !== \"throw\") {\n throw new Error(\"Invalid options passed to createRegistry. Prop errorHandling should be [\\\"log\\\" | \\\"silent\\\" | \\\"throw\\\" | (err) => void], but \" + typeof options.errorHandling + \" was passed\");\n }\n var _userErrorHandler = options && typeof options.errorHandling === \"function\" && options.errorHandling;\n var callbacks = {};\n function add(key, callback, replayArgumentsArr) {\n var callbacksForKey = callbacks[key];\n if (!callbacksForKey) {\n callbacksForKey = [];\n callbacks[key] = callbacksForKey;\n }\n callbacksForKey.push(callback);\n if (replayArgumentsArr) {\n setTimeout(function () {\n replayArgumentsArr.forEach(function (replayArgument) {\n var _a;\n if ((_a = callbacks[key]) === null || _a === void 0 ? void 0 : _a.includes(callback)) {\n try {\n if (Array.isArray(replayArgument)) {\n callback.apply(undefined, replayArgument);\n }\n else {\n callback.apply(undefined, [replayArgument]);\n }\n }\n catch (err) {\n _handleError(err, key);\n }\n }\n });\n }, 0);\n }\n return function () {\n var allForKey = callbacks[key];\n if (!allForKey) {\n return;\n }\n allForKey = allForKey.reduce(function (acc, element, index) {\n if (!(element === callback && acc.length === index)) {\n acc.push(element);\n }\n return acc;\n }, []);\n if (allForKey.length === 0) {\n delete callbacks[key];\n }\n else {\n callbacks[key] = allForKey;\n }\n };\n }\n function execute(key) {\n var argumentsArr = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n argumentsArr[_i - 1] = arguments[_i];\n }\n var callbacksForKey = callbacks[key];\n if (!callbacksForKey || callbacksForKey.length === 0) {\n return [];\n }\n var results = [];\n callbacksForKey.forEach(function (callback) {\n try {\n var result = callback.apply(undefined, argumentsArr);\n results.push(result);\n }\n catch (err) {\n results.push(undefined);\n _handleError(err, key);\n }\n });\n return results;\n }\n function _handleError(exceptionArtifact, key) {\n var errParam = exceptionArtifact instanceof Error ? exceptionArtifact : new Error(exceptionArtifact);\n if (_userErrorHandler) {\n _userErrorHandler(errParam);\n return;\n }\n var msg = \"[ERROR] callback-registry: User callback for key \\\"\" + key + \"\\\" failed: \" + errParam.stack;\n if (options) {\n switch (options.errorHandling) {\n case \"log\":\n return console.error(msg);\n case \"silent\":\n return;\n case \"throw\":\n throw new Error(msg);\n }\n }\n console.error(msg);\n }\n function clear() {\n callbacks = {};\n }\n function clearKey(key) {\n var callbacksForKey = callbacks[key];\n if (!callbacksForKey) {\n return;\n }\n delete callbacks[key];\n }\n return {\n add: add,\n execute: execute,\n clear: clear,\n clearKey: clearKey\n };\n}\ncreateRegistry.default = createRegistry;\nvar lib$1 = createRegistry;\n\nvar InProcTransport = (function () {\r\n function InProcTransport(settings, logger) {\r\n var _this = this;\r\n this.registry = lib$1();\r\n this.gw = settings.facade;\r\n this.gw.connect(function (_client, message) {\r\n _this.messageHandler(message);\r\n }).then(function (client) {\r\n _this.client = client;\r\n });\r\n }\r\n Object.defineProperty(InProcTransport.prototype, \"isObjectBasedTransport\", {\r\n get: function () {\r\n return true;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n InProcTransport.prototype.sendObject = function (msg) {\r\n if (this.client) {\r\n this.client.send(msg);\r\n return Promise.resolve(undefined);\r\n }\r\n else {\r\n return Promise.reject(\"not connected\");\r\n }\r\n };\r\n InProcTransport.prototype.send = function (_msg) {\r\n return Promise.reject(\"not supported\");\r\n };\r\n InProcTransport.prototype.onMessage = function (callback) {\r\n return this.registry.add(\"onMessage\", callback);\r\n };\r\n InProcTransport.prototype.onConnectedChanged = function (callback) {\r\n callback(true);\r\n return function () { };\r\n };\r\n InProcTransport.prototype.close = function () {\r\n return Promise.resolve();\r\n };\r\n InProcTransport.prototype.open = function () {\r\n return Promise.resolve();\r\n };\r\n InProcTransport.prototype.name = function () {\r\n return \"in-memory\";\r\n };\r\n InProcTransport.prototype.reconnect = function () {\r\n return Promise.resolve();\r\n };\r\n InProcTransport.prototype.messageHandler = function (msg) {\r\n this.registry.execute(\"onMessage\", msg);\r\n };\r\n return InProcTransport;\r\n}());\n\nvar SharedWorkerTransport = (function () {\r\n function SharedWorkerTransport(workerFile, logger) {\r\n var _this = this;\r\n this.logger = logger;\r\n this.registry = lib$1();\r\n this.worker = new SharedWorker(workerFile);\r\n this.worker.port.onmessage = function (e) {\r\n _this.messageHandler(e.data);\r\n };\r\n }\r\n Object.defineProperty(SharedWorkerTransport.prototype, \"isObjectBasedTransport\", {\r\n get: function () {\r\n return true;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n SharedWorkerTransport.prototype.sendObject = function (msg) {\r\n this.worker.port.postMessage(msg);\r\n return Promise.resolve();\r\n };\r\n SharedWorkerTransport.prototype.send = function (_msg) {\r\n return Promise.reject(\"not supported\");\r\n };\r\n SharedWorkerTransport.prototype.onMessage = function (callback) {\r\n return this.registry.add(\"onMessage\", callback);\r\n };\r\n SharedWorkerTransport.prototype.onConnectedChanged = function (callback) {\r\n callback(true);\r\n return function () { };\r\n };\r\n SharedWorkerTransport.prototype.close = function () {\r\n return Promise.resolve();\r\n };\r\n SharedWorkerTransport.prototype.open = function () {\r\n return Promise.resolve();\r\n };\r\n SharedWorkerTransport.prototype.name = function () {\r\n return \"shared-worker\";\r\n };\r\n SharedWorkerTransport.prototype.reconnect = function () {\r\n return Promise.resolve();\r\n };\r\n SharedWorkerTransport.prototype.messageHandler = function (msg) {\r\n this.registry.execute(\"onMessage\", msg);\r\n };\r\n return SharedWorkerTransport;\r\n}());\n\nvar Utils = (function () {\r\n function Utils() {\r\n }\r\n Utils.isNode = function () {\r\n if (typeof Utils._isNode !== \"undefined\") {\r\n return Utils._isNode;\r\n }\r\n if (typeof window !== \"undefined\") {\r\n Utils._isNode = false;\r\n return false;\r\n }\r\n try {\r\n Utils._isNode = Object.prototype.toString.call(global.process) === \"[object process]\";\r\n }\r\n catch (e) {\r\n Utils._isNode = false;\r\n }\r\n return Utils._isNode;\r\n };\r\n return Utils;\r\n}());\n\nvar PromiseWrapper = (function () {\r\n function PromiseWrapper() {\r\n var _this = this;\r\n this.rejected = false;\r\n this.resolved = false;\r\n this.promise = new Promise(function (resolve, reject) {\r\n _this.resolve = function (t) {\r\n _this.resolved = true;\r\n resolve(t);\r\n };\r\n _this.reject = function (err) {\r\n _this.rejected = true;\r\n reject(err);\r\n };\r\n });\r\n }\r\n PromiseWrapper.delay = function (time) {\r\n return new Promise(function (resolve) { return setTimeout(resolve, time); });\r\n };\r\n Object.defineProperty(PromiseWrapper.prototype, \"ended\", {\r\n get: function () {\r\n return this.rejected || this.resolved;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n return PromiseWrapper;\r\n}());\n\nvar timers = {};\r\nfunction getAllTimers() {\r\n return timers;\r\n}\r\nfunction timer (timerName) {\r\n var existing = timers[timerName];\r\n if (existing) {\r\n return existing;\r\n }\r\n var marks = [];\r\n function now() {\r\n return new Date().getTime();\r\n }\r\n var startTime = now();\r\n mark(\"start\", startTime);\r\n var endTime;\r\n var period;\r\n function stop() {\r\n endTime = now();\r\n mark(\"end\", endTime);\r\n period = endTime - startTime;\r\n return period;\r\n }\r\n function mark(name, time) {\r\n var currentTime = time !== null && time !== void 0 ? time : now();\r\n var diff = 0;\r\n if (marks.length > 0) {\r\n diff = currentTime - marks[marks.length - 1].time;\r\n }\r\n marks.push({ name: name, time: currentTime, diff: diff });\r\n }\r\n var timerObj = {\r\n get startTime() {\r\n return startTime;\r\n },\r\n get endTime() {\r\n return endTime;\r\n },\r\n get period() {\r\n return period;\r\n },\r\n stop: stop,\r\n mark: mark,\r\n marks: marks\r\n };\r\n timers[timerName] = timerObj;\r\n return timerObj;\r\n}\n\nvar WebSocketConstructor = Utils.isNode() ? require(\"ws\") : window.WebSocket;\r\nvar WS = (function () {\r\n function WS(settings, logger) {\r\n this.startupTimer = timer(\"connection\");\r\n this._running = true;\r\n this._registry = lib$1();\r\n this.wsRequests = [];\r\n this.settings = settings;\r\n this.logger = logger;\r\n if (!this.settings.ws) {\r\n throw new Error(\"ws is missing\");\r\n }\r\n }\r\n WS.prototype.onMessage = function (callback) {\r\n return this._registry.add(\"onMessage\", callback);\r\n };\r\n WS.prototype.send = function (msg, options) {\r\n var _this = this;\r\n return new Promise(function (resolve, reject) {\r\n _this.waitForSocketConnection(function () {\r\n var _a;\r\n try {\r\n (_a = _this.ws) === null || _a === void 0 ? void 0 : _a.send(msg);\r\n resolve();\r\n }\r\n catch (e) {\r\n reject(e);\r\n }\r\n }, reject);\r\n });\r\n };\r\n WS.prototype.open = function () {\r\n var _this = this;\r\n this.logger.info(\"opening ws...\");\r\n this._running = true;\r\n return new Promise(function (resolve, reject) {\r\n _this.waitForSocketConnection(resolve, reject);\r\n });\r\n };\r\n WS.prototype.close = function () {\r\n this._running = false;\r\n if (this.ws) {\r\n this.ws.close();\r\n }\r\n return Promise.resolve();\r\n };\r\n WS.prototype.onConnectedChanged = function (callback) {\r\n return this._registry.add(\"onConnectedChanged\", callback);\r\n };\r\n WS.prototype.name = function () {\r\n return this.settings.ws;\r\n };\r\n WS.prototype.reconnect = function () {\r\n var _a;\r\n (_a = this.ws) === null || _a === void 0 ? void 0 : _a.close();\r\n var pw = new PromiseWrapper();\r\n this.waitForSocketConnection(function () {\r\n pw.resolve();\r\n });\r\n return pw.promise;\r\n };\r\n WS.prototype.waitForSocketConnection = function (callback, failed) {\r\n var _a;\r\n failed = failed !== null && failed !== void 0 ? failed : (function () { });\r\n if (!this._running) {\r\n failed(\"wait for socket on \".concat(this.settings.ws, \" failed - socket closed by user\"));\r\n return;\r\n }\r\n if (((_a = this.ws) === null || _a === void 0 ? void 0 : _a.readyState) === 1) {\r\n callback();\r\n return;\r\n }\r\n this.wsRequests.push({ callback: callback, failed: failed });\r\n if (this.wsRequests.length > 1) {\r\n return;\r\n }\r\n this.openSocket();\r\n };\r\n WS.prototype.openSocket = function (retryInterval, retriesLeft) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var _this = this;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n this.startupTimer.mark(\"opening-socket\");\r\n if (retryInterval === undefined) {\r\n retryInterval = this.settings.reconnectInterval;\r\n }\r\n if (typeof retriesLeft === \"undefined\") {\r\n retriesLeft = this.settings.reconnectAttempts;\r\n }\r\n if (retriesLeft !== undefined) {\r\n if (retriesLeft === 0) {\r\n this.notifyForSocketState(\"wait for socket on \".concat(this.settings.ws, \" failed - no more retries left\"));\r\n return [2];\r\n }\r\n this.logger.debug(\"will retry \".concat(retriesLeft, \" more times (every \").concat(retryInterval, \" ms)\"));\r\n }\r\n _b.label = 1;\r\n case 1:\r\n _b.trys.push([1, 3, , 4]);\r\n return [4, this.initiateSocket()];\r\n case 2:\r\n _b.sent();\r\n this.startupTimer.mark(\"socket-initiated\");\r\n this.notifyForSocketState();\r\n return [3, 4];\r\n case 3:\r\n _b.sent();\r\n setTimeout(function () {\r\n var retries = retriesLeft === undefined ? undefined : retriesLeft - 1;\r\n _this.openSocket(retryInterval, retries);\r\n }, retryInterval);\r\n return [3, 4];\r\n case 4: return [2];\r\n }\r\n });\r\n });\r\n };\r\n WS.prototype.initiateSocket = function () {\r\n var _this = this;\r\n var pw = new PromiseWrapper();\r\n this.logger.debug(\"initiating ws to \".concat(this.settings.ws, \"...\"));\r\n this.ws = new WebSocketConstructor(this.settings.ws || \"\");\r\n this.ws.onerror = function (err) {\r\n var reason = \"\";\r\n try {\r\n reason = JSON.stringify(err);\r\n }\r\n catch (error) {\r\n var seen_1 = new WeakSet();\r\n var replacer = function (key, value) {\r\n if (typeof value === \"object\" && value !== null) {\r\n if (seen_1.has(value)) {\r\n return;\r\n }\r\n seen_1.add(value);\r\n }\r\n return value;\r\n };\r\n reason = JSON.stringify(err, replacer);\r\n }\r\n pw.reject(\"error\");\r\n _this.notifyStatusChanged(false, reason);\r\n };\r\n this.ws.onclose = function (err) {\r\n _this.logger.info(\"ws closed \".concat(err));\r\n pw.reject(\"closed\");\r\n _this.notifyStatusChanged(false);\r\n };\r\n this.ws.onopen = function () {\r\n var _a;\r\n _this.startupTimer.mark(\"ws-opened\");\r\n _this.logger.info(\"ws opened \".concat((_a = _this.settings.identity) === null || _a === void 0 ? void 0 : _a.application));\r\n pw.resolve();\r\n _this.notifyStatusChanged(true);\r\n };\r\n this.ws.onmessage = function (message) {\r\n _this._registry.execute(\"onMessage\", message.data);\r\n };\r\n return pw.promise;\r\n };\r\n WS.prototype.notifyForSocketState = function (error) {\r\n this.wsRequests.forEach(function (wsRequest) {\r\n if (error) {\r\n if (wsRequest.failed) {\r\n wsRequest.failed(error);\r\n }\r\n }\r\n else {\r\n wsRequest.callback();\r\n }\r\n });\r\n this.wsRequests = [];\r\n };\r\n WS.prototype.notifyStatusChanged = function (status, reason) {\r\n this._registry.execute(\"onConnectedChanged\", status, reason);\r\n };\r\n return WS;\r\n}());\n\nvar shortidExports = {};\nvar shortid$1 = {\n get exports(){ return shortidExports; },\n set exports(v){ shortidExports = v; },\n};\n\nvar libExports = {};\nvar lib = {\n get exports(){ return libExports; },\n set exports(v){ libExports = v; },\n};\n\n// Found this seed-based random generator somewhere\n// Based on The Central Randomizer 1.3 (C) 1997 by Paul Houle (houle@msc.cornell.edu)\n\nvar seed = 1;\n\n/**\n * return a random number based on a seed\n * @param seed\n * @returns {number}\n */\nfunction getNextValue() {\n seed = (seed * 9301 + 49297) % 233280;\n return seed/(233280.0);\n}\n\nfunction setSeed$1(_seed_) {\n seed = _seed_;\n}\n\nvar randomFromSeed$1 = {\n nextValue: getNextValue,\n seed: setSeed$1\n};\n\nvar randomFromSeed = randomFromSeed$1;\n\nvar ORIGINAL = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-';\nvar alphabet$2;\nvar previousSeed;\n\nvar shuffled;\n\nfunction reset() {\n shuffled = false;\n}\n\nfunction setCharacters(_alphabet_) {\n if (!_alphabet_) {\n if (alphabet$2 !== ORIGINAL) {\n alphabet$2 = ORIGINAL;\n reset();\n }\n return;\n }\n\n if (_alphabet_ === alphabet$2) {\n return;\n }\n\n if (_alphabet_.length !== ORIGINAL.length) {\n throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. You submitted ' + _alphabet_.length + ' characters: ' + _alphabet_);\n }\n\n var unique = _alphabet_.split('').filter(function(item, ind, arr){\n return ind !== arr.lastIndexOf(item);\n });\n\n if (unique.length) {\n throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. These characters were not unique: ' + unique.join(', '));\n }\n\n alphabet$2 = _alphabet_;\n reset();\n}\n\nfunction characters(_alphabet_) {\n setCharacters(_alphabet_);\n return alphabet$2;\n}\n\nfunction setSeed(seed) {\n randomFromSeed.seed(seed);\n if (previousSeed !== seed) {\n reset();\n previousSeed = seed;\n }\n}\n\nfunction shuffle() {\n if (!alphabet$2) {\n setCharacters(ORIGINAL);\n }\n\n var sourceArray = alphabet$2.split('');\n var targetArray = [];\n var r = randomFromSeed.nextValue();\n var characterIndex;\n\n while (sourceArray.length > 0) {\n r = randomFromSeed.nextValue();\n characterIndex = Math.floor(r * sourceArray.length);\n targetArray.push(sourceArray.splice(characterIndex, 1)[0]);\n }\n return targetArray.join('');\n}\n\nfunction getShuffled() {\n if (shuffled) {\n return shuffled;\n }\n shuffled = shuffle();\n return shuffled;\n}\n\n/**\n * lookup shuffled letter\n * @param index\n * @returns {string}\n */\nfunction lookup(index) {\n var alphabetShuffled = getShuffled();\n return alphabetShuffled[index];\n}\n\nfunction get () {\n return alphabet$2 || ORIGINAL;\n}\n\nvar alphabet_1 = {\n get: get,\n characters: characters,\n seed: setSeed,\n lookup: lookup,\n shuffled: getShuffled\n};\n\nvar crypto = typeof window === 'object' && (window.crypto || window.msCrypto); // IE 11 uses window.msCrypto\n\nvar randomByte;\n\nif (!crypto || !crypto.getRandomValues) {\n randomByte = function(size) {\n var bytes = [];\n for (var i = 0; i < size; i++) {\n bytes.push(Math.floor(Math.random() * 256));\n }\n return bytes;\n };\n} else {\n randomByte = function(size) {\n return crypto.getRandomValues(new Uint8Array(size));\n };\n}\n\nvar randomByteBrowser = randomByte;\n\n// This file replaces `format.js` in bundlers like webpack or Rollup,\n// according to `browser` config in `package.json`.\n\nvar format_browser = function (random, alphabet, size) {\n // We can’t use bytes bigger than the alphabet. To make bytes values closer\n // to the alphabet, we apply bitmask on them. We look for the closest\n // `2 ** x - 1` number, which will be bigger than alphabet size. If we have\n // 30 symbols in the alphabet, we will take 31 (00011111).\n // We do not use faster Math.clz32, because it is not available in browsers.\n var mask = (2 << Math.log(alphabet.length - 1) / Math.LN2) - 1;\n // Bitmask is not a perfect solution (in our example it will pass 31 bytes,\n // which is bigger than the alphabet). As a result, we will need more bytes,\n // than ID size, because we will refuse bytes bigger than the alphabet.\n\n // Every hardware random generator call is costly,\n // because we need to wait for entropy collection. This is why often it will\n // be faster to ask for few extra bytes in advance, to avoid additional calls.\n\n // Here we calculate how many random bytes should we call in advance.\n // It depends on ID length, mask / alphabet size and magic number 1.6\n // (which was selected according benchmarks).\n\n // -~f => Math.ceil(f) if n is float number\n // -~i => i + 1 if n is integer number\n var step = -~(1.6 * mask * size / alphabet.length);\n var id = '';\n\n while (true) {\n var bytes = random(step);\n // Compact alternative for `for (var i = 0; i < step; i++)`\n var i = step;\n while (i--) {\n // If random byte is bigger than alphabet even after bitmask,\n // we refuse it by `|| ''`.\n id += alphabet[bytes[i] & mask] || '';\n // More compact than `id.length + 1 === size`\n if (id.length === +size) return id\n }\n }\n};\n\nvar alphabet$1 = alphabet_1;\nvar random = randomByteBrowser;\nvar format = format_browser;\n\nfunction generate$1(number) {\n var loopCounter = 0;\n var done;\n\n var str = '';\n\n while (!done) {\n str = str + format(random, alphabet$1.get(), 1);\n done = number < (Math.pow(16, loopCounter + 1 ) );\n loopCounter++;\n }\n return str;\n}\n\nvar generate_1 = generate$1;\n\nvar generate = generate_1;\n\n// Ignore all milliseconds before a certain time to reduce the size of the date entropy without sacrificing uniqueness.\n// This number should be updated every year or so to keep the generated id short.\n// To regenerate `new Date() - 0` and bump the version. Always bump the version!\nvar REDUCE_TIME = 1567752802062;\n\n// don't change unless we change the algos or REDUCE_TIME\n// must be an integer and less than 16\nvar version$1 = 7;\n\n// Counter is used when shortid is called multiple times in one second.\nvar counter;\n\n// Remember the last time shortid was called in case counter is needed.\nvar previousSeconds;\n\n/**\n * Generate unique id\n * Returns string id\n */\nfunction build(clusterWorkerId) {\n var str = '';\n\n var seconds = Math.floor((Date.now() - REDUCE_TIME) * 0.001);\n\n if (seconds === previousSeconds) {\n counter++;\n } else {\n counter = 0;\n previousSeconds = seconds;\n }\n\n str = str + generate(version$1);\n str = str + generate(clusterWorkerId);\n if (counter > 0) {\n str = str + generate(counter);\n }\n str = str + generate(seconds);\n return str;\n}\n\nvar build_1 = build;\n\nvar alphabet = alphabet_1;\n\nfunction isShortId(id) {\n if (!id || typeof id !== 'string' || id.length < 6 ) {\n return false;\n }\n\n var nonAlphabetic = new RegExp('[^' +\n alphabet.get().replace(/[|\\\\{}()[\\]^$+*?.-]/g, '\\\\$&') +\n ']');\n return !nonAlphabetic.test(id);\n}\n\nvar isValid = isShortId;\n\n(function (module) {\n\n\tvar alphabet = alphabet_1;\n\tvar build = build_1;\n\tvar isValid$1 = isValid;\n\n\t// if you are using cluster or multiple servers use this to make each instance\n\t// has a unique value for worker\n\t// Note: I don't know if this is automatically set when using third\n\t// party cluster solutions such as pm2.\n\tvar clusterWorkerId = 0;\n\n\t/**\n\t * Set the seed.\n\t * Highly recommended if you don't want people to try to figure out your id schema.\n\t * exposed as shortid.seed(int)\n\t * @param seed Integer value to seed the random alphabet. ALWAYS USE THE SAME SEED or you might get overlaps.\n\t */\n\tfunction seed(seedValue) {\n\t alphabet.seed(seedValue);\n\t return module.exports;\n\t}\n\n\t/**\n\t * Set the cluster worker or machine id\n\t * exposed as shortid.worker(int)\n\t * @param workerId worker must be positive integer. Number less than 16 is recommended.\n\t * returns shortid module so it can be chained.\n\t */\n\tfunction worker(workerId) {\n\t clusterWorkerId = workerId;\n\t return module.exports;\n\t}\n\n\t/**\n\t *\n\t * sets new characters to use in the alphabet\n\t * returns the shuffled alphabet\n\t */\n\tfunction characters(newCharacters) {\n\t if (newCharacters !== undefined) {\n\t alphabet.characters(newCharacters);\n\t }\n\n\t return alphabet.shuffled();\n\t}\n\n\t/**\n\t * Generate unique id\n\t * Returns string id\n\t */\n\tfunction generate() {\n\t return build(clusterWorkerId);\n\t}\n\n\t// Export all other functions as properties of the generate function\n\tmodule.exports = generate;\n\tmodule.exports.generate = generate;\n\tmodule.exports.seed = seed;\n\tmodule.exports.worker = worker;\n\tmodule.exports.characters = characters;\n\tmodule.exports.isValid = isValid$1;\n} (lib));\n\n(function (module) {\n\tmodule.exports = libExports;\n} (shortid$1));\n\nvar shortid = /*@__PURE__*/getDefaultExportFromCjs(shortidExports);\n\nfunction domainSession (domain, connection, logger, successMessages, errorMessages) {\r\n if (domain == null) {\r\n domain = \"global\";\r\n }\r\n successMessages = successMessages || [\"success\"];\r\n errorMessages = errorMessages || [\"error\"];\r\n var isJoined = false;\r\n var tryReconnecting = false;\r\n var _latestOptions;\r\n var _connectionOn = false;\r\n var callbacks = lib$1();\r\n connection.disconnected(handleConnectionDisconnected);\r\n connection.loggedIn(handleConnectionLoggedIn);\r\n connection.on(\"success\", function (msg) { return handleSuccessMessage(msg); });\r\n connection.on(\"error\", function (msg) { return handleErrorMessage(msg); });\r\n connection.on(\"result\", function (msg) { return handleSuccessMessage(msg); });\r\n if (successMessages) {\r\n successMessages.forEach(function (sm) {\r\n connection.on(sm, function (msg) { return handleSuccessMessage(msg); });\r\n });\r\n }\r\n if (errorMessages) {\r\n errorMessages.forEach(function (sm) {\r\n connection.on(sm, function (msg) { return handleErrorMessage(msg); });\r\n });\r\n }\r\n var requestsMap = {};\r\n function join(options) {\r\n _latestOptions = options;\r\n return new Promise(function (resolve, reject) {\r\n if (isJoined) {\r\n resolve({});\r\n return;\r\n }\r\n var joinPromise;\r\n if (domain === \"global\") {\r\n joinPromise = _connectionOn ? Promise.resolve({}) : Promise.reject(\"not connected to gateway\");\r\n }\r\n else {\r\n logger.debug(\"joining domain \".concat(domain));\r\n var joinMsg = {\r\n type: \"join\",\r\n destination: domain,\r\n domain: \"global\",\r\n options: options,\r\n };\r\n joinPromise = send(joinMsg);\r\n }\r\n joinPromise\r\n .then(function () {\r\n handleJoined();\r\n resolve({});\r\n })\r\n .catch(function (err) {\r\n logger.debug(\"error joining \" + domain + \" domain: \" + JSON.stringify(err));\r\n reject(err);\r\n });\r\n });\r\n }\r\n function leave() {\r\n if (domain === \"global\") {\r\n return Promise.resolve();\r\n }\r\n logger.debug(\"stopping session \" + domain + \"...\");\r\n var leaveMsg = {\r\n type: \"leave\",\r\n destination: domain,\r\n domain: \"global\",\r\n };\r\n tryReconnecting = false;\r\n return send(leaveMsg)\r\n .then(function () {\r\n isJoined = false;\r\n callbacks.execute(\"onLeft\");\r\n })\r\n .catch(function () {\r\n isJoined = false;\r\n callbacks.execute(\"onLeft\");\r\n });\r\n }\r\n function handleJoined() {\r\n logger.debug(\"did join \" + domain);\r\n isJoined = true;\r\n var wasReconnect = tryReconnecting;\r\n tryReconnecting = false;\r\n callbacks.execute(\"onJoined\", wasReconnect);\r\n }\r\n function handleConnectionDisconnected() {\r\n _connectionOn = false;\r\n logger.debug(\"connection is down\");\r\n isJoined = false;\r\n tryReconnecting = true;\r\n callbacks.execute(\"onLeft\", { disconnected: true });\r\n }\r\n function handleConnectionLoggedIn() {\r\n _connectionOn = true;\r\n if (tryReconnecting) {\r\n logger.debug(\"connection is now up - trying to reconnect...\");\r\n join(_latestOptions);\r\n }\r\n }\r\n function onJoined(callback) {\r\n if (isJoined) {\r\n callback(false);\r\n }\r\n return callbacks.add(\"onJoined\", callback);\r\n }\r\n function onLeft(callback) {\r\n if (!isJoined) {\r\n callback();\r\n }\r\n return callbacks.add(\"onLeft\", callback);\r\n }\r\n function handleErrorMessage(msg) {\r\n if (domain !== msg.domain) {\r\n return;\r\n }\r\n var requestId = msg.request_id;\r\n if (!requestId) {\r\n return;\r\n }\r\n var entry = requestsMap[requestId];\r\n if (!entry) {\r\n return;\r\n }\r\n entry.error(msg);\r\n }\r\n function handleSuccessMessage(msg) {\r\n if (msg.domain !== domain) {\r\n return;\r\n }\r\n var requestId = msg.request_id;\r\n if (!requestId) {\r\n return;\r\n }\r\n var entry = requestsMap[requestId];\r\n if (!entry) {\r\n return;\r\n }\r\n entry.success(msg);\r\n }\r\n function getNextRequestId() {\r\n return shortid();\r\n }\r\n function send(msg, tag, options) {\r\n options = options || {};\r\n msg.request_id = msg.request_id || getNextRequestId();\r\n msg.domain = msg.domain || domain;\r\n if (!options.skipPeerId) {\r\n msg.peer_id = connection.peerId;\r\n }\r\n var requestId = msg.request_id;\r\n return new Promise(function (resolve, reject) {\r\n requestsMap[requestId] = {\r\n success: function (successMsg) {\r\n delete requestsMap[requestId];\r\n successMsg._tag = tag;\r\n resolve(successMsg);\r\n },\r\n error: function (errorMsg) {\r\n logger.warn(\"GW error - \".concat(JSON.stringify(errorMsg), \" for request \").concat(JSON.stringify(msg)));\r\n delete requestsMap[requestId];\r\n errorMsg._tag = tag;\r\n reject(errorMsg);\r\n },\r\n };\r\n connection\r\n .send(msg, options)\r\n .catch(function (err) {\r\n requestsMap[requestId].error({ err: err });\r\n });\r\n });\r\n }\r\n function sendFireAndForget(msg) {\r\n msg.request_id = msg.request_id ? msg.request_id : getNextRequestId();\r\n msg.domain = msg.domain || domain;\r\n msg.peer_id = connection.peerId;\r\n return connection.send(msg);\r\n }\r\n return {\r\n join: join,\r\n leave: leave,\r\n onJoined: onJoined,\r\n onLeft: onLeft,\r\n send: send,\r\n sendFireAndForget: sendFireAndForget,\r\n on: function (type, callback) {\r\n connection.on(type, function (msg) {\r\n if (msg.domain !== domain) {\r\n return;\r\n }\r\n try {\r\n callback(msg);\r\n }\r\n catch (e) {\r\n logger.error(\"Callback failed: \".concat(e, \" \\n \").concat(e.stack, \" \\n msg was: \").concat(JSON.stringify(msg)), e);\r\n }\r\n });\r\n },\r\n loggedIn: function (callback) { return connection.loggedIn(callback); },\r\n connected: function (callback) { return connection.connected(callback); },\r\n disconnected: function (callback) { return connection.disconnected(callback); },\r\n get peerId() {\r\n return connection.peerId;\r\n },\r\n get domain() {\r\n return domain;\r\n },\r\n };\r\n}\n\nvar GW3ProtocolImpl = (function () {\r\n function GW3ProtocolImpl(connection, settings, logger) {\r\n var _this = this;\r\n this.connection = connection;\r\n this.settings = settings;\r\n this.logger = logger;\r\n this.protocolVersion = 3;\r\n this.datePrefix = \"#T42_DATE#\";\r\n this.datePrefixLen = this.datePrefix.length;\r\n this.dateMinLen = this.datePrefixLen + 1;\r\n this.datePrefixFirstChar = this.datePrefix[0];\r\n this.registry = lib$1();\r\n this._isLoggedIn = false;\r\n this.shouldTryLogin = true;\r\n this.initialLogin = true;\r\n this.initialLoginAttempts = 3;\r\n this.sessions = [];\r\n connection.disconnected(function () {\r\n _this.handleDisconnected();\r\n });\r\n this.ping();\r\n }\r\n Object.defineProperty(GW3ProtocolImpl.prototype, \"isLoggedIn\", {\r\n get: function () {\r\n return this._isLoggedIn;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n GW3ProtocolImpl.prototype.processStringMessage = function (message) {\r\n var _this = this;\r\n var msg = JSON.parse(message, function (key, value) {\r\n if (typeof value !== \"string\") {\r\n return value;\r\n }\r\n if (value.length < _this.dateMinLen) {\r\n return value;\r\n }\r\n if (value[0] !== _this.datePrefixFirstChar) {\r\n return value;\r\n }\r\n if (value.substring(0, _this.datePrefixLen) !== _this.datePrefix) {\r\n return value;\r\n }\r\n try {\r\n var milliseconds = parseInt(value.substring(_this.datePrefixLen, value.length), 10);\r\n if (isNaN(milliseconds)) {\r\n return value;\r\n }\r\n return new Date(milliseconds);\r\n }\r\n catch (ex) {\r\n return value;\r\n }\r\n });\r\n return {\r\n msg: msg,\r\n msgType: msg.type,\r\n };\r\n };\r\n GW3ProtocolImpl.prototype.createStringMessage = function (message) {\r\n var oldToJson = Date.prototype.toJSON;\r\n try {\r\n var datePrefix_1 = this.datePrefix;\r\n Date.prototype.toJSON = function () {\r\n return datePrefix_1 + this.getTime();\r\n };\r\n var result = JSON.stringify(message);\r\n return result;\r\n }\r\n finally {\r\n Date.prototype.toJSON = oldToJson;\r\n }\r\n };\r\n GW3ProtocolImpl.prototype.processObjectMessage = function (message) {\r\n if (!message.type) {\r\n throw new Error(\"Object should have type property\");\r\n }\r\n return {\r\n msg: message,\r\n msgType: message.type,\r\n };\r\n };\r\n GW3ProtocolImpl.prototype.createObjectMessage = function (message) {\r\n return message;\r\n };\r\n GW3ProtocolImpl.prototype.login = function (config, reconnect) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var authentication, token, e_1, _a, helloMsg, sendOptions, welcomeMsg, msg, token, _b, err_1;\r\n return __generator(this, function (_c) {\r\n switch (_c.label) {\r\n case 0:\r\n this.logger.debug(\"logging in...\");\r\n this.loginConfig = config;\r\n if (!this.loginConfig) {\r\n this.loginConfig = { username: \"\", password: \"\" };\r\n }\r\n this.shouldTryLogin = true;\r\n authentication = {};\r\n this.connection.gatewayToken = config.gatewayToken;\r\n if (!config.gatewayToken) return [3, 5];\r\n if (!reconnect) return [3, 4];\r\n _c.label = 1;\r\n case 1:\r\n _c.trys.push([1, 3, , 4]);\r\n return [4, this.getNewGWToken()];\r\n case 2:\r\n token = _c.sent();\r\n config.gatewayToken = token;\r\n return [3, 4];\r\n case 3:\r\n e_1 = _c.sent();\r\n this.logger.warn(\"failed to get GW token when reconnecting \".concat((e_1 === null || e_1 === void 0 ? void 0 : e_1.message) || e_1));\r\n return [3, 4];\r\n case 4:\r\n authentication.method = \"gateway-token\";\r\n authentication.token = config.gatewayToken;\r\n this.connection.gatewayToken = config.gatewayToken;\r\n return [3, 10];\r\n case 5:\r\n if (!(config.flowName === \"sspi\")) return [3, 9];\r\n authentication.provider = \"win\";\r\n authentication.method = \"access-token\";\r\n if (!(config.flowCallback && config.sessionId)) return [3, 7];\r\n _a = authentication;\r\n return [4, config.flowCallback(config.sessionId, null)];\r\n case 6:\r\n _a.token =\r\n (_c.sent())\r\n .data\r\n .toString(\"base64\");\r\n return [3, 8];\r\n case 7: throw new Error(\"Invalid SSPI config\");\r\n case 8: return [3, 10];\r\n case 9:\r\n if (config.token) {\r\n authentication.method = \"access-token\";\r\n authentication.token = config.token;\r\n }\r\n else if (config.username) {\r\n authentication.method = \"secret\";\r\n authentication.login = config.username;\r\n authentication.secret = config.password;\r\n }\r\n else if (config.provider) {\r\n authentication.provider = config.provider;\r\n authentication.providerContext = config.providerContext;\r\n }\r\n else {\r\n throw new Error(\"invalid auth message\" + JSON.stringify(config));\r\n }\r\n _c.label = 10;\r\n case 10:\r\n helloMsg = {\r\n type: \"hello\",\r\n identity: this.settings.identity,\r\n authentication: authentication\r\n };\r\n if (config.sessionId) {\r\n helloMsg.request_id = config.sessionId;\r\n }\r\n this.globalDomain = domainSession(\"global\", this.connection, this.logger.subLogger(\"global-domain\"), [\r\n \"welcome\",\r\n \"token\",\r\n \"authentication-request\"\r\n ]);\r\n sendOptions = { skipPeerId: true };\r\n if (this.initialLogin) {\r\n sendOptions.retryInterval = this.settings.reconnectInterval;\r\n sendOptions.maxRetries = this.settings.reconnectAttempts;\r\n }\r\n _c.label = 11;\r\n case 11:\r\n _c.trys.push([11, 19, 20, 21]);\r\n welcomeMsg = void 0;\r\n _c.label = 12;\r\n case 12:\r\n return [4, this.globalDomain.send(helloMsg, undefined, sendOptions)];\r\n case 13:\r\n msg = _c.sent();\r\n if (!(msg.type === \"authentication-request\")) return [3, 16];\r\n token = Buffer.from(msg.authentication.token, \"base64\");\r\n if (!(config.flowCallback && config.sessionId)) return [3, 15];\r\n _b = helloMsg.authentication;\r\n return [4, config.flowCallback(config.sessionId, token)];\r\n case 14:\r\n _b.token =\r\n (_c.sent())\r\n .data\r\n .toString(\"base64\");\r\n _c.label = 15;\r\n case 15:\r\n helloMsg.request_id = config.sessionId;\r\n return [3, 12];\r\n case 16:\r\n if (msg.type === \"welcome\") {\r\n welcomeMsg = msg;\r\n return [3, 18];\r\n }\r\n else if (msg.type === \"error\") {\r\n throw new Error(\"Authentication failed: \" + msg.reason);\r\n }\r\n else {\r\n throw new Error(\"Unexpected message type during authentication: \" + msg.type);\r\n }\r\n case 17: return [3, 12];\r\n case 18:\r\n this.initialLogin = false;\r\n this.logger.debug(\"login successful with peerId \" + welcomeMsg.peer_id);\r\n this.connection.peerId = welcomeMsg.peer_id;\r\n this.connection.resolvedIdentity = welcomeMsg.resolved_identity;\r\n this.connection.availableDomains = welcomeMsg.available_domains;\r\n if (welcomeMsg.options) {\r\n this.connection.token = welcomeMsg.options.access_token;\r\n this.connection.info = welcomeMsg.options.info;\r\n }\r\n this.setLoggedIn(true);\r\n return [2, welcomeMsg.resolved_identity];\r\n case 19:\r\n err_1 = _c.sent();\r\n this.logger.error(\"error sending hello message - \" + (err_1.message || err_1.msg || err_1.reason || err_1), err_1);\r\n throw err_1;\r\n case 20:\r\n if (config && config.flowCallback && config.sessionId) {\r\n config.flowCallback(config.sessionId, null);\r\n }\r\n return [7];\r\n case 21: return [2];\r\n }\r\n });\r\n });\r\n };\r\n GW3ProtocolImpl.prototype.logout = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var promises;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n this.logger.debug(\"logging out...\");\r\n this.shouldTryLogin = false;\r\n if (this.pingTimer) {\r\n clearTimeout(this.pingTimer);\r\n }\r\n promises = this.sessions.map(function (session) {\r\n session.leave();\r\n });\r\n return [4, Promise.all(promises)];\r\n case 1:\r\n _a.sent();\r\n return [2];\r\n }\r\n });\r\n });\r\n };\r\n GW3ProtocolImpl.prototype.loggedIn = function (callback) {\r\n if (this._isLoggedIn) {\r\n callback();\r\n }\r\n return this.registry.add(\"onLoggedIn\", callback);\r\n };\r\n GW3ProtocolImpl.prototype.domain = function (domainName, domainLogger, successMessages, errorMessages) {\r\n var session = this.sessions.filter(function (s) { return s.domain === domainName; })[0];\r\n if (!session) {\r\n session = domainSession(domainName, this.connection, domainLogger, successMessages, errorMessages);\r\n this.sessions.push(session);\r\n }\r\n return session;\r\n };\r\n GW3ProtocolImpl.prototype.handleDisconnected = function () {\r\n var _this = this;\r\n this.setLoggedIn(false);\r\n var tryToLogin = this.shouldTryLogin;\r\n if (tryToLogin && this.initialLogin) {\r\n if (this.initialLoginAttempts <= 0) {\r\n return;\r\n }\r\n this.initialLoginAttempts--;\r\n }\r\n this.logger.debug(\"disconnected - will try new login?\" + this.shouldTryLogin);\r\n if (this.shouldTryLogin) {\r\n if (!this.loginConfig) {\r\n throw new Error(\"no login info\");\r\n }\r\n this.connection.login(this.loginConfig, true)\r\n .catch(function () {\r\n setTimeout(_this.handleDisconnected.bind(_this), _this.settings.reconnectInterval || 1000);\r\n });\r\n }\r\n };\r\n GW3ProtocolImpl.prototype.setLoggedIn = function (value) {\r\n this._isLoggedIn = value;\r\n if (this._isLoggedIn) {\r\n this.registry.execute(\"onLoggedIn\");\r\n }\r\n };\r\n GW3ProtocolImpl.prototype.ping = function () {\r\n var _this = this;\r\n if (!this.shouldTryLogin) {\r\n return;\r\n }\r\n if (this._isLoggedIn) {\r\n this.connection.send({ type: \"ping\" });\r\n }\r\n this.pingTimer = setTimeout(function () {\r\n _this.ping();\r\n }, 30 * 1000);\r\n };\r\n GW3ProtocolImpl.prototype.authToken = function () {\r\n var createTokenReq = {\r\n type: \"create-token\"\r\n };\r\n if (!this.globalDomain) {\r\n return Promise.reject(new Error(\"no global domain session\"));\r\n }\r\n return this.globalDomain.send(createTokenReq)\r\n .then(function (res) {\r\n return res.token;\r\n });\r\n };\r\n GW3ProtocolImpl.prototype.getNewGWToken = function () {\r\n if (typeof window !== undefined) {\r\n var glue42gd = window.glue42gd;\r\n if (glue42gd) {\r\n return glue42gd.getGWToken();\r\n }\r\n }\r\n return Promise.reject(new Error(\"not running in GD\"));\r\n };\r\n return GW3ProtocolImpl;\r\n}());\n\nvar MessageReplayerImpl = (function () {\r\n function MessageReplayerImpl(specs) {\r\n this.specsNames = [];\r\n this.messages = {};\r\n this.subs = {};\r\n this.subsRefCount = {};\r\n this.specs = {};\r\n for (var _i = 0, specs_1 = specs; _i < specs_1.length; _i++) {\r\n var spec = specs_1[_i];\r\n this.specs[spec.name] = spec;\r\n this.specsNames.push(spec.name);\r\n }\r\n }\r\n MessageReplayerImpl.prototype.init = function (connection) {\r\n var _this = this;\r\n this.connection = connection;\r\n for (var _i = 0, _a = this.specsNames; _i < _a.length; _i++) {\r\n var name_1 = _a[_i];\r\n var _loop_1 = function (type) {\r\n var refCount = this_1.subsRefCount[type];\r\n if (!refCount) {\r\n refCount = 0;\r\n }\r\n refCount += 1;\r\n this_1.subsRefCount[type] = refCount;\r\n if (refCount > 1) {\r\n return \"continue\";\r\n }\r\n var sub = connection.on(type, function (msg) { return _this.processMessage(type, msg); });\r\n this_1.subs[type] = sub;\r\n };\r\n var this_1 = this;\r\n for (var _b = 0, _c = this.specs[name_1].types; _b < _c.length; _b++) {\r\n var type = _c[_b];\r\n _loop_1(type);\r\n }\r\n }\r\n };\r\n MessageReplayerImpl.prototype.processMessage = function (type, msg) {\r\n if (this.isDone || !msg) {\r\n return;\r\n }\r\n for (var _i = 0, _a = this.specsNames; _i < _a.length; _i++) {\r\n var name_2 = _a[_i];\r\n if (this.specs[name_2].types.indexOf(type) !== -1) {\r\n var messages = this.messages[name_2] || [];\r\n this.messages[name_2] = messages;\r\n messages.push(msg);\r\n }\r\n }\r\n };\r\n MessageReplayerImpl.prototype.drain = function (name, callback) {\r\n var _a;\r\n if (callback) {\r\n (this.messages[name] || []).forEach(callback);\r\n }\r\n delete this.messages[name];\r\n for (var _i = 0, _b = this.specs[name].types; _i < _b.length; _i++) {\r\n var type = _b[_i];\r\n this.subsRefCount[type] -= 1;\r\n if (this.subsRefCount[type] <= 0) {\r\n (_a = this.connection) === null || _a === void 0 ? void 0 : _a.off(this.subs[type]);\r\n delete this.subs[type];\r\n delete this.subsRefCount[type];\r\n }\r\n }\r\n delete this.specs[name];\r\n if (!this.specs.length) {\r\n this.isDone = true;\r\n }\r\n };\r\n return MessageReplayerImpl;\r\n}());\n\nvar PromisePlus = function (executor, timeoutMilliseconds, timeoutMessage) {\r\n return new Promise(function (resolve, reject) {\r\n var timeout = setTimeout(function () {\r\n var message = timeoutMessage || \"Promise timeout hit: \".concat(timeoutMilliseconds);\r\n reject(message);\r\n }, timeoutMilliseconds);\r\n var providedPromise = new Promise(executor);\r\n providedPromise\r\n .then(function (result) {\r\n clearTimeout(timeout);\r\n resolve(result);\r\n })\r\n .catch(function (error) {\r\n clearTimeout(timeout);\r\n reject(error);\r\n });\r\n });\r\n};\n\nvar WebPlatformTransport = (function () {\r\n function WebPlatformTransport(settings, logger, identity) {\r\n this.settings = settings;\r\n this.logger = logger;\r\n this.identity = identity;\r\n this.iAmConnected = false;\r\n this.parentReady = false;\r\n this.rejected = false;\r\n this.children = [];\r\n this.extContentAvailable = false;\r\n this.extContentConnecting = false;\r\n this.extContentConnected = false;\r\n this.parentInExtMode = false;\r\n this.webNamespace = \"g42_core_web\";\r\n this.parentPingTimeout = 5000;\r\n this.connectionRequestTimeout = 7000;\r\n this.defaultTargetString = \"*\";\r\n this.registry = lib$1();\r\n this.messages = {\r\n connectionAccepted: { name: \"connectionAccepted\", handle: this.handleConnectionAccepted.bind(this) },\r\n connectionRejected: { name: \"connectionRejected\", handle: this.handleConnectionRejected.bind(this) },\r\n connectionRequest: { name: \"connectionRequest\", handle: this.handleConnectionRequest.bind(this) },\r\n parentReady: {\r\n name: \"parentReady\", handle: function () {\r\n }\r\n },\r\n parentPing: { name: \"parentPing\", handle: this.handleParentPing.bind(this) },\r\n platformPing: { name: \"platformPing\", handle: this.handlePlatformPing.bind(this) },\r\n platformReady: { name: \"platformReady\", handle: this.handlePlatformReady.bind(this) },\r\n clientUnload: { name: \"clientUnload\", handle: this.handleClientUnload.bind(this) },\r\n manualUnload: { name: \"manualUnload\", handle: this.handleManualUnload.bind(this) },\r\n extConnectionResponse: { name: \"extConnectionResponse\", handle: this.handleExtConnectionResponse.bind(this) },\r\n extSetupRequest: { name: \"extSetupRequest\", handle: this.handleExtSetupRequest.bind(this) },\r\n gatewayDisconnect: { name: \"gatewayDisconnect\", handle: this.handleGatewayDisconnect.bind(this) },\r\n gatewayInternalConnect: { name: \"gatewayInternalConnect\", handle: this.handleGatewayInternalConnect.bind(this) }\r\n };\r\n this.extContentAvailable = !!window.glue42ext;\r\n this.setUpMessageListener();\r\n this.setUpUnload();\r\n this.setupPlatformUnloadListener();\r\n this.parentType = window.name.includes(\"#wsp\") ? \"workspace\" : undefined;\r\n }\r\n WebPlatformTransport.prototype.manualSetReadyState = function () {\r\n this.iAmConnected = true;\r\n this.parentReady = true;\r\n };\r\n Object.defineProperty(WebPlatformTransport.prototype, \"transportWindowId\", {\r\n get: function () {\r\n return this.publicWindowId;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(WebPlatformTransport.prototype, \"communicationId\", {\r\n get: function () {\r\n return this._communicationId;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n WebPlatformTransport.prototype.sendObject = function (msg) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n if (this.extContentConnected) {\r\n return [2, window.postMessage({ glue42ExtOut: msg }, this.defaultTargetString)];\r\n }\r\n if (!this.port) {\r\n throw new Error(\"Cannot send message, because the port was not opened yet\");\r\n }\r\n this.port.postMessage(msg);\r\n return [2];\r\n });\r\n });\r\n };\r\n Object.defineProperty(WebPlatformTransport.prototype, \"isObjectBasedTransport\", {\r\n get: function () {\r\n return true;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n WebPlatformTransport.prototype.onMessage = function (callback) {\r\n return this.registry.add(\"onMessage\", callback);\r\n };\r\n WebPlatformTransport.prototype.send = function () {\r\n return Promise.reject(\"not supported\");\r\n };\r\n WebPlatformTransport.prototype.onConnectedChanged = function (callback) {\r\n return this.registry.add(\"onConnectedChanged\", callback);\r\n };\r\n WebPlatformTransport.prototype.open = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n this.logger.debug(\"opening a connection to the web platform gateway.\");\r\n return [4, this.connect()];\r\n case 1:\r\n _a.sent();\r\n this.notifyStatusChanged(true);\r\n return [2];\r\n }\r\n });\r\n });\r\n };\r\n WebPlatformTransport.prototype.close = function () {\r\n var _a, _b;\r\n var message = {\r\n glue42core: {\r\n type: this.messages.gatewayDisconnect.name,\r\n data: {\r\n clientId: this.myClientId,\r\n ownWindowId: (_a = this.identity) === null || _a === void 0 ? void 0 : _a.windowId\r\n }\r\n }\r\n };\r\n (_b = this.port) === null || _b === void 0 ? void 0 : _b.postMessage(message);\r\n this.parentReady = false;\r\n this.notifyStatusChanged(false, \"manual reconnection\");\r\n return Promise.resolve();\r\n };\r\n WebPlatformTransport.prototype.name = function () {\r\n return \"web-platform\";\r\n };\r\n WebPlatformTransport.prototype.reconnect = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4, this.close()];\r\n case 1:\r\n _a.sent();\r\n return [2, Promise.resolve()];\r\n }\r\n });\r\n });\r\n };\r\n WebPlatformTransport.prototype.initiateInternalConnection = function () {\r\n var _this = this;\r\n return new Promise(function (resolve, reject) {\r\n _this.logger.debug(\"opening an internal web platform connection\");\r\n _this.port = _this.settings.port;\r\n if (_this.iAmConnected) {\r\n _this.logger.warn(\"cannot open a new connection, because this client is currently connected\");\r\n return;\r\n }\r\n _this.port.onmessage = function (event) {\r\n var _a, _b;\r\n if (_this.iAmConnected && !((_a = event.data) === null || _a === void 0 ? void 0 : _a.glue42core)) {\r\n _this.registry.execute(\"onMessage\", event.data);\r\n return;\r\n }\r\n var data = (_b = event.data) === null || _b === void 0 ? void 0 : _b.glue42core;\r\n if (!data) {\r\n return;\r\n }\r\n if (data.type === _this.messages.gatewayInternalConnect.name && data.success) {\r\n _this.publicWindowId = _this.settings.windowId;\r\n if (_this.identity && _this.publicWindowId) {\r\n _this.identity.windowId = _this.publicWindowId;\r\n _this.identity.instance = _this.publicWindowId;\r\n }\r\n resolve();\r\n }\r\n if (data.type === _this.messages.gatewayInternalConnect.name && data.error) {\r\n reject(data.error);\r\n }\r\n };\r\n _this.port.postMessage({\r\n glue42core: {\r\n type: _this.messages.gatewayInternalConnect.name\r\n }\r\n });\r\n });\r\n };\r\n WebPlatformTransport.prototype.initiateRemoteConnection = function (target) {\r\n var _this = this;\r\n return PromisePlus(function (resolve, reject) {\r\n var _a;\r\n _this.connectionResolve = resolve;\r\n _this.connectionReject = reject;\r\n _this.myClientId = (_a = _this.myClientId) !== null && _a !== void 0 ? _a : shortid();\r\n var bridgeInstanceId = _this.getMyWindowId() || shortid();\r\n var request = {\r\n glue42core: {\r\n type: _this.messages.connectionRequest.name,\r\n clientId: _this.myClientId,\r\n clientType: \"child\",\r\n bridgeInstanceId: bridgeInstanceId,\r\n selfAssignedWindowId: _this.selfAssignedWindowId\r\n }\r\n };\r\n _this.logger.debug(\"sending connection request\");\r\n if (_this.extContentConnecting) {\r\n request.glue42core.clientType = \"child\";\r\n request.glue42core.bridgeInstanceId = _this.myClientId;\r\n request.glue42core.parentWindowId = _this.parentWindowId;\r\n return window.postMessage(request, _this.defaultTargetString);\r\n }\r\n if (!target) {\r\n throw new Error(\"Cannot send a connection request, because no glue target was specified!\");\r\n }\r\n target.postMessage(request, _this.defaultTargetString);\r\n }, this.connectionRequestTimeout, \"The connection to the target glue window timed out\");\r\n };\r\n WebPlatformTransport.prototype.isParentCheckSuccess = function (parentCheck) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n _a.trys.push([0, 2, , 3]);\r\n return [4, parentCheck];\r\n case 1:\r\n _a.sent();\r\n return [2, { success: true }];\r\n case 2:\r\n _a.sent();\r\n return [2, { success: false }];\r\n case 3: return [2];\r\n }\r\n });\r\n });\r\n };\r\n WebPlatformTransport.prototype.setUpMessageListener = function () {\r\n var _this = this;\r\n if (this.settings.port) {\r\n this.logger.debug(\"skipping generic message listener, because this is an internal client\");\r\n return;\r\n }\r\n window.addEventListener(\"message\", function (event) {\r\n var _a;\r\n var data = (_a = event.data) === null || _a === void 0 ? void 0 : _a.glue42core;\r\n if (!data || _this.rejected) {\r\n return;\r\n }\r\n if (!_this.checkMessageTypeValid(data.type)) {\r\n _this.logger.error(\"cannot handle the incoming glue42 core message, because the type is invalid: \".concat(data.type));\r\n return;\r\n }\r\n var messageType = data.type;\r\n _this.logger.debug(\"received valid glue42core message of type: \".concat(messageType));\r\n _this.messages[messageType].handle(event);\r\n });\r\n };\r\n WebPlatformTransport.prototype.setUpUnload = function () {\r\n var _this = this;\r\n if (this.settings.port) {\r\n this.logger.debug(\"skipping unload event listener, because this is an internal client\");\r\n return;\r\n }\r\n window.addEventListener(\"beforeunload\", function () {\r\n var _a, _b;\r\n if (_this.extContentConnected) {\r\n return;\r\n }\r\n var message = {\r\n glue42core: {\r\n type: _this.messages.clientUnload.name,\r\n data: {\r\n clientId: _this.myClientId,\r\n ownWindowId: (_a = _this.identity) === null || _a === void 0 ? void 0 : _a.windowId\r\n }\r\n }\r\n };\r\n if (_this.parent) {\r\n _this.parent.postMessage(message, _this.defaultTargetString);\r\n }\r\n (_b = _this.port) === null || _b === void 0 ? void 0 : _b.postMessage(message);\r\n });\r\n };\r\n WebPlatformTransport.prototype.handlePlatformReady = function (event) {\r\n this.logger.debug(\"the web platform gave the ready signal\");\r\n this.parentReady = true;\r\n if (this.parentPingResolve) {\r\n this.parentPingResolve();\r\n delete this.parentPingResolve;\r\n }\r\n if (this.parentPingInterval) {\r\n clearInterval(this.parentPingInterval);\r\n delete this.parentPingInterval;\r\n }\r\n this.parent = event.source;\r\n this.parentType = window.name.includes(\"#wsp\") ? \"workspace\" : \"window\";\r\n };\r\n WebPlatformTransport.prototype.handleConnectionAccepted = function (event) {\r\n var _a;\r\n var data = (_a = event.data) === null || _a === void 0 ? void 0 : _a.glue42core;\r\n if (this.myClientId === data.clientId) {\r\n return this.handleAcceptanceOfMyRequest(data);\r\n }\r\n return this.handleAcceptanceOfGrandChildRequest(data, event);\r\n };\r\n WebPlatformTransport.prototype.handleAcceptanceOfMyRequest = function (data) {\r\n var _this = this;\r\n this.logger.debug(\"handling a connection accepted signal targeted at me.\");\r\n this.isPreferredActivated = data.isPreferredActivated;\r\n if (this.extContentConnecting) {\r\n return this.processExtContentConnection(data);\r\n }\r\n if (!data.port) {\r\n this.logger.error(\"cannot set up my connection, because I was not provided with a port\");\r\n return;\r\n }\r\n this.publicWindowId = this.getMyWindowId();\r\n if (this.identity) {\r\n this.identity.windowId = this.publicWindowId;\r\n this.identity.instance = this.identity.instance ? this.identity.instance : this.publicWindowId || shortid();\r\n }\r\n if (this.identity && data.appName) {\r\n this.identity.application = data.appName;\r\n this.identity.applicationName = data.appName;\r\n }\r\n this._communicationId = data.communicationId;\r\n this.port = data.port;\r\n this.port.onmessage = function (e) { return _this.registry.execute(\"onMessage\", e.data); };\r\n if (this.connectionResolve) {\r\n this.logger.debug(\"my connection is set up, calling the connection resolve.\");\r\n this.connectionResolve();\r\n delete this.connectionResolve;\r\n return;\r\n }\r\n this.logger.error(\"unable to call the connection resolve, because no connection promise was found\");\r\n };\r\n WebPlatformTransport.prototype.processExtContentConnection = function (data) {\r\n var _this = this;\r\n this.logger.debug(\"handling a connection accepted signal targeted at me for extension content connection.\");\r\n this.extContentConnecting = false;\r\n this.extContentConnected = true;\r\n this.publicWindowId = this.parentWindowId || this.myClientId;\r\n if (this.extContentConnecting && this.identity) {\r\n this.identity.windowId = this.publicWindowId;\r\n }\r\n if (this.identity && data.appName) {\r\n this.identity.application = data.appName;\r\n this.identity.applicationName = data.appName;\r\n }\r\n window.addEventListener(\"message\", function (event) {\r\n var _a;\r\n var extData = (_a = event.data) === null || _a === void 0 ? void 0 : _a.glue42ExtInc;\r\n if (!extData) {\r\n return;\r\n }\r\n _this.registry.execute(\"onMessage\", extData);\r\n });\r\n if (this.connectionResolve) {\r\n this.logger.debug(\"my connection is set up, calling the connection resolve.\");\r\n this.connectionResolve();\r\n delete this.connectionResolve;\r\n return;\r\n }\r\n };\r\n WebPlatformTransport.prototype.handleAcceptanceOfGrandChildRequest = function (data, event) {\r\n if (this.extContentConnecting || this.extContentConnected) {\r\n this.logger.debug(\"cannot process acceptance of a grandchild, because I am connected to a content script\");\r\n return;\r\n }\r\n this.logger.debug(\"handling a connection accepted signal targeted at a grandchild: \".concat(data.clientId));\r\n var child = this.children.find(function (c) { return c.grandChildId === data.clientId; });\r\n if (!child) {\r\n this.logger.error(\"cannot handle connection accepted for grandchild: \".concat(data.clientId, \", because there is no grandchild with this id\"));\r\n return;\r\n }\r\n child.connected = true;\r\n this.logger.debug(\"the grandchild connection for \".concat(data.clientId, \" is set up, forwarding the success message and the gateway port\"));\r\n data.parentWindowId = this.publicWindowId;\r\n child.source.postMessage(event.data, child.origin, [data.port]);\r\n return;\r\n };\r\n WebPlatformTransport.prototype.handleConnectionRejected = function () {\r\n this.logger.debug(\"handling a connection rejection. Most likely the reason is that this window was not created by a glue API call\");\r\n if (this.connectionReject) {\r\n this.connectionReject(\"The platform connection was rejected. Most likely because this window was not created by a glue API call\");\r\n delete this.connectionReject;\r\n }\r\n };\r\n WebPlatformTransport.prototype.handleConnectionRequest = function (event) {\r\n if (this.extContentConnecting) {\r\n this.logger.debug(\"This connection request event is targeted at the extension content\");\r\n return;\r\n }\r\n var source = event.source;\r\n var data = event.data.glue42core;\r\n if (!data.clientType || data.clientType !== \"grandChild\") {\r\n return this.rejectConnectionRequest(source, event.origin, \"rejecting a connection request, because the source was not opened by a glue API call\");\r\n }\r\n if (!data.clientId) {\r\n return this.rejectConnectionRequest(source, event.origin, \"rejecting a connection request, because the source did not provide a valid id\");\r\n }\r\n if (!this.parent) {\r\n return this.rejectConnectionRequest(source, event.origin, \"Cannot forward the connection request, because no direct connection to the platform was found\");\r\n }\r\n this.logger.debug(\"handling a connection request for a grandchild: \".concat(data.clientId));\r\n this.children.push({ grandChildId: data.clientId, source: source, connected: false, origin: event.origin });\r\n this.logger.debug(\"grandchild: \".concat(data.clientId, \" is prepared, forwarding connection request to the platform\"));\r\n this.parent.postMessage(event.data, this.defaultTargetString);\r\n };\r\n WebPlatformTransport.prototype.handleParentPing = function (event) {\r\n if (!this.parentReady) {\r\n this.logger.debug(\"my parent is not ready, I am ignoring the parent ping\");\r\n return;\r\n }\r\n if (!this.iAmConnected) {\r\n this.logger.debug(\"i am not fully connected yet, I am ignoring the parent ping\");\r\n return;\r\n }\r\n var message = {\r\n glue42core: {\r\n type: this.messages.parentReady.name\r\n }\r\n };\r\n if (this.extContentConnected) {\r\n message.glue42core.extMode = { windowId: this.myClientId };\r\n }\r\n var source = event.source;\r\n this.logger.debug(\"responding to a parent ping with a ready message\");\r\n source.postMessage(message, event.origin);\r\n };\r\n WebPlatformTransport.prototype.setupPlatformUnloadListener = function () {\r\n var _this = this;\r\n this.onMessage(function (msg) {\r\n if (msg.type === \"platformUnload\") {\r\n _this.logger.debug(\"detected a web platform unload\");\r\n _this.parentReady = false;\r\n _this.notifyStatusChanged(false, \"Gateway unloaded\");\r\n }\r\n });\r\n };\r\n WebPlatformTransport.prototype.handleManualUnload = function () {\r\n var _a, _b;\r\n var message = {\r\n glue42core: {\r\n type: this.messages.clientUnload.name,\r\n data: {\r\n clientId: this.myClientId,\r\n ownWindowId: (_a = this.identity) === null || _a === void 0 ? void 0 : _a.windowId\r\n }\r\n }\r\n };\r\n if (this.extContentConnected) {\r\n return window.postMessage({ glue42ExtOut: message }, this.defaultTargetString);\r\n }\r\n (_b = this.port) === null || _b === void 0 ? void 0 : _b.postMessage(message);\r\n };\r\n WebPlatformTransport.prototype.handleClientUnload = function (event) {\r\n var data = event.data.glue42core;\r\n var clientId = data === null || data === void 0 ? void 0 : data.data.clientId;\r\n if (!clientId) {\r\n this.logger.warn(\"cannot process grand child unload, because the provided id was not valid\");\r\n return;\r\n }\r\n var foundChild = this.children.find(function (child) { return child.grandChildId === clientId; });\r\n if (!foundChild) {\r\n this.logger.warn(\"cannot process grand child unload, because this client is unaware of this grandchild\");\r\n return;\r\n }\r\n this.logger.debug(\"handling grandchild unload for id: \".concat(clientId));\r\n this.children = this.children.filter(function (child) { return child.grandChildId !== clientId; });\r\n };\r\n WebPlatformTransport.prototype.handlePlatformPing = function () {\r\n return;\r\n };\r\n WebPlatformTransport.prototype.notifyStatusChanged = function (status, reason) {\r\n this.iAmConnected = status;\r\n this.registry.execute(\"onConnectedChanged\", status, reason);\r\n };\r\n WebPlatformTransport.prototype.checkMessageTypeValid = function (typeToValidate) {\r\n return typeof typeToValidate === \"string\" && !!this.messages[typeToValidate];\r\n };\r\n WebPlatformTransport.prototype.rejectConnectionRequest = function (source, origin, reason) {\r\n this.rejected = true;\r\n this.logger.error(reason);\r\n var rejection = {\r\n glue42core: {\r\n type: this.messages.connectionRejected.name\r\n }\r\n };\r\n source.postMessage(rejection, origin);\r\n };\r\n WebPlatformTransport.prototype.requestConnectionPermissionFromExt = function () {\r\n var _this = this;\r\n return this.waitForContentScript()\r\n .then(function () { return PromisePlus(function (resolve, reject) {\r\n _this.extConnectionResolve = resolve;\r\n _this.extConnectionReject = reject;\r\n var message = {\r\n glue42core: {\r\n type: \"extSetupRequest\"\r\n }\r\n };\r\n _this.logger.debug(\"permission request to the extension content script was sent\");\r\n window.postMessage(message, _this.defaultTargetString);\r\n }, _this.parentPingTimeout, \"Cannot initialize glue, because this app was not opened or created by a Glue Client and the request for extension connection timed out\"); });\r\n };\r\n WebPlatformTransport.prototype.handleExtConnectionResponse = function (event) {\r\n var _a;\r\n var data = (_a = event.data) === null || _a === void 0 ? void 0 : _a.glue42core;\r\n if (!data.approved) {\r\n return this.extConnectionReject ? this.extConnectionReject(\"Cannot initialize glue, because this app was not opened or created by a Glue Client and the request for extension connection was rejected\") : undefined;\r\n }\r\n if (this.extConnectionResolve) {\r\n this.extConnectionResolve();\r\n delete this.extConnectionResolve;\r\n }\r\n this.extContentConnecting = true;\r\n this.parentType = \"extension\";\r\n this.logger.debug(\"The extension connection was approved, proceeding.\");\r\n };\r\n WebPlatformTransport.prototype.handleExtSetupRequest = function () {\r\n return;\r\n };\r\n WebPlatformTransport.prototype.handleGatewayDisconnect = function () {\r\n return;\r\n };\r\n WebPlatformTransport.prototype.handleGatewayInternalConnect = function () {\r\n return;\r\n };\r\n WebPlatformTransport.prototype.waitForContentScript = function () {\r\n var _a;\r\n var contentReady = !!((_a = window.glue42ext) === null || _a === void 0 ? void 0 : _a.content);\r\n if (contentReady) {\r\n return Promise.resolve();\r\n }\r\n return PromisePlus(function (resolve) {\r\n window.addEventListener(\"Glue42EXTReady\", function () {\r\n resolve();\r\n });\r\n }, this.connectionRequestTimeout, \"The content script was available, but was never heard to be ready\");\r\n };\r\n WebPlatformTransport.prototype.connect = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (!this.settings.port) return [3, 2];\r\n return [4, this.initiateInternalConnection()];\r\n case 1:\r\n _a.sent();\r\n this.logger.debug(\"internal web platform connection completed\");\r\n return [2];\r\n case 2:\r\n this.logger.debug(\"opening a client web platform connection\");\r\n return [4, this.findParent()];\r\n case 3:\r\n _a.sent();\r\n return [4, this.initiateRemoteConnection(this.parent)];\r\n case 4:\r\n _a.sent();\r\n this.logger.debug(\"the client is connected\");\r\n return [2];\r\n }\r\n });\r\n });\r\n };\r\n WebPlatformTransport.prototype.findParent = function () {\r\n var _a;\r\n return __awaiter(this, void 0, void 0, function () {\r\n var connectionNotPossibleMsg, myInsideParents, myOutsideParents, uniqueParents, defaultParentCheck;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n connectionNotPossibleMsg = \"Cannot initiate glue, because this window was not opened or created by a glue client\";\r\n myInsideParents = this.getPossibleParentsInWindow(window);\r\n myOutsideParents = this.getPossibleParentsOutsideWindow((_a = window.top) === null || _a === void 0 ? void 0 : _a.opener, window.top);\r\n uniqueParents = new Set(__spreadArray(__spreadArray([], myInsideParents, true), myOutsideParents, true));\r\n if (!uniqueParents.size && !this.extContentAvailable) {\r\n throw new Error(connectionNotPossibleMsg);\r\n }\r\n if (!(!uniqueParents.size && this.extContentAvailable)) return [3, 2];\r\n return [4, this.requestConnectionPermissionFromExt()];\r\n case 1:\r\n _b.sent();\r\n return [2];\r\n case 2: return [4, this.isParentCheckSuccess(this.confirmParent(Array.from(uniqueParents)))];\r\n case 3:\r\n defaultParentCheck = _b.sent();\r\n if (defaultParentCheck.success) {\r\n this.logger.debug(\"The default parent was found!\");\r\n return [2];\r\n }\r\n if (!this.extContentAvailable) {\r\n throw new Error(connectionNotPossibleMsg);\r\n }\r\n return [4, this.requestConnectionPermissionFromExt()];\r\n case 4:\r\n _b.sent();\r\n return [2];\r\n }\r\n });\r\n });\r\n };\r\n WebPlatformTransport.prototype.getPossibleParentsInWindow = function (currentWindow) {\r\n return (!currentWindow || currentWindow === currentWindow.top) ? [] : __spreadArray([currentWindow.parent], this.getPossibleParentsInWindow(currentWindow.parent), true);\r\n };\r\n WebPlatformTransport.prototype.getPossibleParentsOutsideWindow = function (opener, current) {\r\n return (!opener || !current || opener === current) ? [] : __spreadArray(__spreadArray([opener], this.getPossibleParentsInWindow(opener), true), this.getPossibleParentsOutsideWindow(opener.opener, opener), true);\r\n };\r\n WebPlatformTransport.prototype.confirmParent = function (targets) {\r\n var _this = this;\r\n var connectionNotPossibleMsg = \"Cannot initiate glue, because this window was not opened or created by a glue client\";\r\n var parentCheck = PromisePlus(function (resolve) {\r\n _this.parentPingResolve = resolve;\r\n var message = {\r\n glue42core: {\r\n type: _this.messages.platformPing.name\r\n }\r\n };\r\n _this.parentPingInterval = setInterval(function () {\r\n targets.forEach(function (target) {\r\n target.postMessage(message, _this.defaultTargetString);\r\n });\r\n }, 1000);\r\n }, this.parentPingTimeout, connectionNotPossibleMsg);\r\n parentCheck.catch(function () {\r\n if (_this.parentPingInterval) {\r\n clearInterval(_this.parentPingInterval);\r\n delete _this.parentPingInterval;\r\n }\r\n });\r\n return parentCheck;\r\n };\r\n WebPlatformTransport.prototype.getMyWindowId = function () {\r\n var _a;\r\n if (this.parentType === \"workspace\") {\r\n return window.name.substring(0, window.name.indexOf(\"#wsp\"));\r\n }\r\n if (window !== window.top) {\r\n return;\r\n }\r\n if ((_a = window.name) === null || _a === void 0 ? void 0 : _a.includes(\"g42\")) {\r\n return window.name;\r\n }\r\n this.selfAssignedWindowId = this.selfAssignedWindowId || \"g42-\".concat(shortid());\r\n return this.selfAssignedWindowId;\r\n };\r\n return WebPlatformTransport;\r\n}());\n\nvar waitForInvocations = function (invocations, callback) {\r\n var left = invocations;\r\n return function () {\r\n left--;\r\n if (left === 0) {\r\n callback();\r\n }\r\n };\r\n};\n\nvar AsyncSequelizer = (function () {\r\n function AsyncSequelizer(minSequenceInterval) {\r\n if (minSequenceInterval === void 0) { minSequenceInterval = 0; }\r\n this.minSequenceInterval = minSequenceInterval;\r\n this.queue = [];\r\n this.isExecutingQueue = false;\r\n }\r\n AsyncSequelizer.prototype.enqueue = function (action) {\r\n var _this = this;\r\n return new Promise(function (resolve, reject) {\r\n _this.queue.push({ action: action, resolve: resolve, reject: reject });\r\n _this.executeQueue();\r\n });\r\n };\r\n AsyncSequelizer.prototype.executeQueue = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var operation, actionResult, error_1;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (this.isExecutingQueue) {\r\n return [2];\r\n }\r\n this.isExecutingQueue = true;\r\n _a.label = 1;\r\n case 1:\r\n if (!this.queue.length) return [3, 7];\r\n operation = this.queue.shift();\r\n if (!operation) {\r\n this.isExecutingQueue = false;\r\n return [2];\r\n }\r\n _a.label = 2;\r\n case 2:\r\n _a.trys.push([2, 4, , 5]);\r\n return [4, operation.action()];\r\n case 3:\r\n actionResult = _a.sent();\r\n operation.resolve(actionResult);\r\n return [3, 5];\r\n case 4:\r\n error_1 = _a.sent();\r\n operation.reject(error_1);\r\n return [3, 5];\r\n case 5: return [4, this.intervalBreak()];\r\n case 6:\r\n _a.sent();\r\n return [3, 1];\r\n case 7:\r\n this.isExecutingQueue = false;\r\n return [2];\r\n }\r\n });\r\n });\r\n };\r\n AsyncSequelizer.prototype.intervalBreak = function () {\r\n var _this = this;\r\n return new Promise(function (res) { return setTimeout(res, _this.minSequenceInterval); });\r\n };\r\n return AsyncSequelizer;\r\n}());\n\nvar Connection = (function () {\r\n function Connection(settings, logger) {\r\n this.settings = settings;\r\n this.logger = logger;\r\n this.messageHandlers = {};\r\n this.ids = 1;\r\n this.registry = lib$1();\r\n this._connected = false;\r\n this.isTrace = false;\r\n this._swapTransport = false;\r\n this._switchInProgress = false;\r\n this._transportSubscriptions = [];\r\n this._sequelizer = new AsyncSequelizer();\r\n settings = settings || {};\r\n settings.reconnectAttempts = settings.reconnectAttempts || 10;\r\n settings.reconnectInterval = settings.reconnectInterval || 1000;\r\n if (settings.inproc) {\r\n this.transport = new InProcTransport(settings.inproc, logger.subLogger(\"inMemory\"));\r\n }\r\n else if (settings.sharedWorker) {\r\n this.transport = new SharedWorkerTransport(settings.sharedWorker, logger.subLogger(\"shared-worker\"));\r\n }\r\n else if (settings.webPlatform) {\r\n this.transport = new WebPlatformTransport(settings.webPlatform, logger.subLogger(\"web-platform\"), settings.identity);\r\n }\r\n else if (settings.ws !== undefined) {\r\n this.transport = new WS(settings, logger.subLogger(\"ws\"));\r\n }\r\n else {\r\n throw new Error(\"No connection information specified\");\r\n }\r\n this.isTrace = logger.canPublish(\"trace\");\r\n logger.debug(\"starting with \".concat(this.transport.name(), \" transport\"));\r\n this.protocol = new GW3ProtocolImpl(this, settings, logger.subLogger(\"protocol\"));\r\n var unsubConnectionChanged = this.transport.onConnectedChanged(this.handleConnectionChanged.bind(this));\r\n var unsubOnMessage = this.transport.onMessage(this.handleTransportMessage.bind(this));\r\n this._transportSubscriptions.push(unsubConnectionChanged);\r\n this._transportSubscriptions.push(unsubOnMessage);\r\n this._defaultTransport = this.transport;\r\n }\r\n Object.defineProperty(Connection.prototype, \"protocolVersion\", {\r\n get: function () {\r\n var _a;\r\n return (_a = this.protocol) === null || _a === void 0 ? void 0 : _a.protocolVersion;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Connection.prototype.switchTransport = function (settings) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var _this = this;\r\n return __generator(this, function (_a) {\r\n return [2, this._sequelizer.enqueue(function () { return __awaiter(_this, void 0, void 0, function () {\r\n var switchTargetTransport, verifyPromise, isSwitchSuccess;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (!settings || typeof settings !== \"object\") {\r\n throw new Error(\"Cannot switch transports, because the settings are missing or invalid.\");\r\n }\r\n if (typeof settings.type === \"undefined\") {\r\n throw new Error(\"Cannot switch the transport, because the type is not defined\");\r\n }\r\n this.logger.trace(\"Starting transport switch with settings: \".concat(JSON.stringify(settings)));\r\n switchTargetTransport = settings.type === \"secondary\" ? this.getNewSecondaryTransport(settings) : this._defaultTransport;\r\n this._targetTransport = switchTargetTransport;\r\n this._targetAuth = settings.type === \"secondary\" ? this.getNewSecondaryAuth(settings) : this._defaultAuth;\r\n verifyPromise = this.verifyConnection();\r\n this._swapTransport = true;\r\n this._switchInProgress = true;\r\n this.logger.trace(\"The new transport has been set, closing the current transport\");\r\n return [4, this.transport.close()];\r\n case 1:\r\n _a.sent();\r\n _a.label = 2;\r\n case 2:\r\n _a.trys.push([2, 4, , 5]);\r\n return [4, verifyPromise];\r\n case 3:\r\n _a.sent();\r\n isSwitchSuccess = this.transport === switchTargetTransport;\r\n this.logger.info(\"The reconnection after the switch was completed. Was the switch a success: \".concat(isSwitchSuccess));\r\n this._switchInProgress = false;\r\n return [2, { success: isSwitchSuccess }];\r\n case 4:\r\n _a.sent();\r\n this.logger.info(\"The reconnection after the switch timed out, reverting back to the default transport.\");\r\n this.switchTransport({ type: \"default\" });\r\n this._switchInProgress = false;\r\n return [2, { success: false }];\r\n case 5: return [2];\r\n }\r\n });\r\n }); })];\r\n });\r\n });\r\n };\r\n Connection.prototype.onLibReAnnounced = function (callback) {\r\n return this.registry.add(\"libReAnnounced\", callback);\r\n };\r\n Connection.prototype.setLibReAnnounced = function (lib) {\r\n this.registry.execute(\"libReAnnounced\", lib);\r\n };\r\n Connection.prototype.send = function (message, options) {\r\n if (this.transport.sendObject &&\r\n this.transport.isObjectBasedTransport) {\r\n var msg = this.protocol.createObjectMessage(message);\r\n if (this.isTrace) {\r\n this.logger.trace(\">> \".concat(JSON.stringify(msg)));\r\n }\r\n return this.transport.sendObject(msg, options);\r\n }\r\n else {\r\n var strMessage = this.protocol.createStringMessage(message);\r\n if (this.isTrace) {\r\n this.logger.trace(\">> \".concat(strMessage));\r\n }\r\n return this.transport.send(strMessage, options);\r\n }\r\n };\r\n Connection.prototype.on = function (type, messageHandler) {\r\n type = type.toLowerCase();\r\n if (this.messageHandlers[type] === undefined) {\r\n this.messageHandlers[type] = {};\r\n }\r\n var id = this.ids++;\r\n this.messageHandlers[type][id] = messageHandler;\r\n return {\r\n type: type,\r\n id: id,\r\n };\r\n };\r\n Connection.prototype.off = function (info) {\r\n delete this.messageHandlers[info.type.toLowerCase()][info.id];\r\n };\r\n Object.defineProperty(Connection.prototype, \"isConnected\", {\r\n get: function () {\r\n return this.protocol.isLoggedIn;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Connection.prototype.connected = function (callback) {\r\n var _this = this;\r\n return this.protocol.loggedIn(function () {\r\n var currentServer = _this.transport.name();\r\n callback(currentServer);\r\n });\r\n };\r\n Connection.prototype.disconnected = function (callback) {\r\n return this.registry.add(\"disconnected\", callback);\r\n };\r\n Connection.prototype.login = function (authRequest, reconnect) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var newAuth, identity, error_2;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (!this._defaultAuth) {\r\n this._defaultAuth = authRequest;\r\n }\r\n if (this._swapTransport) {\r\n this.logger.trace(\"Detected a transport swap, swapping transports\");\r\n newAuth = this.transportSwap();\r\n authRequest = newAuth !== null && newAuth !== void 0 ? newAuth : authRequest;\r\n }\r\n this.logger.trace(\"Starting login for transport: \".concat(this.transport.name(), \" and auth \").concat(JSON.stringify(authRequest)));\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 4, , 5]);\r\n return [4, this.transport.open()];\r\n case 2:\r\n _a.sent();\r\n this.logger.trace(\"Transport: \".concat(this.transport.name(), \" opened, logging in\"));\r\n timer(\"connection\").mark(\"transport-opened\");\r\n return [4, this.protocol.login(authRequest, reconnect)];\r\n case 3:\r\n identity = _a.sent();\r\n this.logger.trace(\"Logged in with identity: \".concat(JSON.stringify(identity)));\r\n timer(\"connection\").mark(\"protocol-logged-in\");\r\n return [2, identity];\r\n case 4:\r\n error_2 = _a.sent();\r\n if (this._switchInProgress) {\r\n this.logger.trace(\"An error while logging in after a transport swap, preparing a default swap.\");\r\n this.prepareDefaultSwap();\r\n }\r\n throw new Error(error_2);\r\n case 5: return [2];\r\n }\r\n });\r\n });\r\n };\r\n Connection.prototype.logout = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0: return [4, this.protocol.logout()];\r\n case 1:\r\n _a.sent();\r\n return [4, this.transport.close()];\r\n case 2:\r\n _a.sent();\r\n return [2];\r\n }\r\n });\r\n });\r\n };\r\n Connection.prototype.loggedIn = function (callback) {\r\n return this.protocol.loggedIn(callback);\r\n };\r\n Connection.prototype.domain = function (domain, successMessages, errorMessages) {\r\n return this.protocol.domain(domain, this.logger.subLogger(\"domain=\".concat(domain)), successMessages, errorMessages);\r\n };\r\n Connection.prototype.authToken = function () {\r\n return this.protocol.authToken();\r\n };\r\n Connection.prototype.reconnect = function () {\r\n return this.transport.reconnect();\r\n };\r\n Connection.prototype.distributeMessage = function (message, type) {\r\n var _this = this;\r\n var handlers = this.messageHandlers[type.toLowerCase()];\r\n if (handlers !== undefined) {\r\n Object.keys(handlers).forEach(function (handlerId) {\r\n var handler = handlers[handlerId];\r\n if (handler !== undefined) {\r\n try {\r\n handler(message);\r\n }\r\n catch (error) {\r\n try {\r\n _this.logger.error(\"Message handler failed with \".concat(error.stack), error);\r\n }\r\n catch (loggerError) {\r\n console.log(\"Message handler failed\", error);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n };\r\n Connection.prototype.handleConnectionChanged = function (connected) {\r\n if (this._connected === connected) {\r\n return;\r\n }\r\n this._connected = connected;\r\n if (connected) {\r\n if (this.settings.replaySpecs && this.settings.replaySpecs.length) {\r\n this.replayer = new MessageReplayerImpl(this.settings.replaySpecs);\r\n this.replayer.init(this);\r\n }\r\n this.registry.execute(\"connected\");\r\n }\r\n else {\r\n this.registry.execute(\"disconnected\");\r\n }\r\n };\r\n Connection.prototype.handleTransportMessage = function (msg) {\r\n var msgObj;\r\n if (typeof msg === \"string\") {\r\n msgObj = this.protocol.processStringMessage(msg);\r\n }\r\n else {\r\n msgObj = this.protocol.processObjectMessage(msg);\r\n }\r\n if (this.isTrace) {\r\n this.logger.trace(\"<< \".concat(JSON.stringify(msgObj)));\r\n }\r\n this.distributeMessage(msgObj.msg, msgObj.msgType);\r\n };\r\n Connection.prototype.verifyConnection = function () {\r\n var _this = this;\r\n return PromisePlus(function (resolve) {\r\n var unsub;\r\n var ready = waitForInvocations(2, function () {\r\n if (unsub) {\r\n unsub();\r\n }\r\n resolve();\r\n });\r\n unsub = _this.onLibReAnnounced(function (lib) {\r\n if (lib.name === \"interop\") {\r\n return ready();\r\n }\r\n if (lib.name === \"contexts\") {\r\n return ready();\r\n }\r\n });\r\n }, 10000, \"Transport switch timed out waiting for all libraries to be re-announced\");\r\n };\r\n Connection.prototype.getNewSecondaryTransport = function (settings) {\r\n var _a;\r\n if (!((_a = settings.transportConfig) === null || _a === void 0 ? void 0 : _a.url)) {\r\n throw new Error(\"Missing secondary transport URL.\");\r\n }\r\n return new WS(Object.assign({}, this.settings, { ws: settings.transportConfig.url, reconnectAttempts: 1 }), this.logger.subLogger(\"ws-secondary\"));\r\n };\r\n Connection.prototype.getNewSecondaryAuth = function (settings) {\r\n var _a;\r\n if (!((_a = settings.transportConfig) === null || _a === void 0 ? void 0 : _a.auth)) {\r\n throw new Error(\"Missing secondary transport auth information.\");\r\n }\r\n return settings.transportConfig.auth;\r\n };\r\n Connection.prototype.transportSwap = function () {\r\n this._swapTransport = false;\r\n if (!this._targetTransport || !this._targetAuth) {\r\n this.logger.warn(\"Error while switching transports - either the target transport or auth is not defined: transport defined -> \".concat(!!this._defaultTransport, \", auth defined -> \").concat(!!this._targetAuth, \". Staying on the current one.\"));\r\n return;\r\n }\r\n this._transportSubscriptions.forEach(function (unsub) { return unsub(); });\r\n this._transportSubscriptions = [];\r\n this.transport = this._targetTransport;\r\n var unsubConnectionChanged = this.transport.onConnectedChanged(this.handleConnectionChanged.bind(this));\r\n var unsubOnMessage = this.transport.onMessage(this.handleTransportMessage.bind(this));\r\n this._transportSubscriptions.push(unsubConnectionChanged);\r\n this._transportSubscriptions.push(unsubOnMessage);\r\n return this._targetAuth;\r\n };\r\n Connection.prototype.prepareDefaultSwap = function () {\r\n var _this = this;\r\n this._transportSubscriptions.forEach(function (unsub) { return unsub(); });\r\n this._transportSubscriptions = [];\r\n this.transport.close().catch(function (error) { return _this.logger.warn(\"Error closing the \".concat(_this.transport.name(), \" transport after a failed connection attempt: \").concat(JSON.stringify(error))); });\r\n this._targetTransport = this._defaultTransport;\r\n this._targetAuth = this._defaultAuth;\r\n this._swapTransport = true;\r\n };\r\n return Connection;\r\n}());\n\nvar order = [\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"off\"];\r\nvar Logger = (function () {\r\n function Logger(name, parent, logFn) {\r\n this.name = name;\r\n this.parent = parent;\r\n this.subLoggers = [];\r\n this.logFn = console;\r\n this.customLogFn = false;\r\n this.name = name;\r\n if (parent) {\r\n this.path = \"\".concat(parent.path, \".\").concat(name);\r\n }\r\n else {\r\n this.path = name;\r\n }\r\n this.loggerFullName = \"[\".concat(this.path, \"]\");\r\n this.includeTimeAndLevel = !logFn;\r\n if (logFn) {\r\n this.logFn = logFn;\r\n this.customLogFn = true;\r\n }\r\n }\r\n Logger.prototype.subLogger = function (name) {\r\n var existingSub = this.subLoggers.filter(function (subLogger) {\r\n return subLogger.name === name;\r\n })[0];\r\n if (existingSub !== undefined) {\r\n return existingSub;\r\n }\r\n Object.keys(this).forEach(function (key) {\r\n if (key === name) {\r\n throw new Error(\"This sub logger name is not allowed.\");\r\n }\r\n });\r\n var sub = new Logger(name, this, this.customLogFn ? this.logFn : undefined);\r\n this.subLoggers.push(sub);\r\n return sub;\r\n };\r\n Logger.prototype.publishLevel = function (level) {\r\n var _a;\r\n if (level) {\r\n this._publishLevel = level;\r\n }\r\n return this._publishLevel || ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.publishLevel());\r\n };\r\n Logger.prototype.consoleLevel = function (level) {\r\n var _a;\r\n if (level) {\r\n this._consoleLevel = level;\r\n }\r\n return this._consoleLevel || ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.consoleLevel());\r\n };\r\n Logger.prototype.log = function (message, level, error) {\r\n this.publishMessage(level || \"info\", message, error);\r\n };\r\n Logger.prototype.trace = function (message) {\r\n this.log(message, \"trace\");\r\n };\r\n Logger.prototype.debug = function (message) {\r\n this.log(message, \"debug\");\r\n };\r\n Logger.prototype.info = function (message) {\r\n this.log(message, \"info\");\r\n };\r\n Logger.prototype.warn = function (message) {\r\n this.log(message, \"warn\");\r\n };\r\n Logger.prototype.error = function (message, err) {\r\n this.log(message, \"error\");\r\n };\r\n Logger.prototype.canPublish = function (level, compareWith) {\r\n var levelIdx = order.indexOf(level);\r\n var restrictionIdx = order.indexOf(compareWith || this.consoleLevel() || \"trace\");\r\n return levelIdx >= restrictionIdx;\r\n };\r\n Logger.prototype.publishMessage = function (level, message, error) {\r\n var loggerName = this.loggerFullName;\r\n if (level === \"error\" && !error) {\r\n var e = new Error();\r\n if (e.stack) {\r\n message =\r\n message +\r\n \"\\n\" +\r\n e.stack\r\n .split(\"\\n\")\r\n .slice(3)\r\n .join(\"\\n\");\r\n }\r\n }\r\n if (this.canPublish(level, this.publishLevel())) {\r\n var interop = Logger.Interop;\r\n if (interop) {\r\n try {\r\n if (interop.methods({ name: Logger.InteropMethodName }).length > 0) {\r\n interop.invoke(Logger.InteropMethodName, {\r\n msg: \"\".concat(message),\r\n logger: loggerName,\r\n level: level\r\n });\r\n }\r\n }\r\n catch (_a) {\r\n }\r\n }\r\n }\r\n if (this.canPublish(level)) {\r\n var prefix = \"\";\r\n if (this.includeTimeAndLevel) {\r\n var date = new Date();\r\n var time = \"\".concat(date.getHours(), \":\").concat(date.getMinutes(), \":\").concat(date.getSeconds(), \":\").concat(date.getMilliseconds());\r\n prefix = \"[\".concat(time, \"] [\").concat(level, \"] \");\r\n }\r\n var toPrint = \"\".concat(prefix).concat(loggerName, \": \").concat(message);\r\n switch (level) {\r\n case \"trace\":\r\n this.logFn.debug(toPrint);\r\n break;\r\n case \"debug\":\r\n if (this.logFn.debug) {\r\n this.logFn.debug(toPrint);\r\n }\r\n else {\r\n this.logFn.log(toPrint);\r\n }\r\n break;\r\n case \"info\":\r\n this.logFn.info(toPrint);\r\n break;\r\n case \"warn\":\r\n this.logFn.warn(toPrint);\r\n break;\r\n case \"error\":\r\n this.logFn.error(toPrint, error);\r\n break;\r\n }\r\n }\r\n };\r\n Logger.InteropMethodName = \"T42.AppLogger.Log\";\r\n return Logger;\r\n}());\n\nvar GW_MESSAGE_CREATE_CONTEXT = \"create-context\";\r\nvar GW_MESSAGE_ACTIVITY_CREATED = \"created\";\r\nvar GW_MESSAGE_ACTIVITY_DESTROYED = \"destroyed\";\r\nvar GW_MESSAGE_CONTEXT_CREATED = \"context-created\";\r\nvar GW_MESSAGE_CONTEXT_ADDED = \"context-added\";\r\nvar GW_MESSAGE_SUBSCRIBE_CONTEXT = \"subscribe-context\";\r\nvar GW_MESSAGE_SUBSCRIBED_CONTEXT = \"subscribed-context\";\r\nvar GW_MESSAGE_UNSUBSCRIBE_CONTEXT = \"unsubscribe-context\";\r\nvar GW_MESSAGE_DESTROY_CONTEXT = \"destroy-context\";\r\nvar GW_MESSAGE_CONTEXT_DESTROYED = \"context-destroyed\";\r\nvar GW_MESSAGE_UPDATE_CONTEXT = \"update-context\";\r\nvar GW_MESSAGE_CONTEXT_UPDATED = \"context-updated\";\r\nvar GW_MESSAGE_JOINED_ACTIVITY = \"joined\";\n\nvar ContextMessageReplaySpec = {\r\n get name() {\r\n return \"context\";\r\n },\r\n get types() {\r\n return [\r\n GW_MESSAGE_CREATE_CONTEXT,\r\n GW_MESSAGE_ACTIVITY_CREATED,\r\n GW_MESSAGE_ACTIVITY_DESTROYED,\r\n GW_MESSAGE_CONTEXT_CREATED,\r\n GW_MESSAGE_CONTEXT_ADDED,\r\n GW_MESSAGE_SUBSCRIBE_CONTEXT,\r\n GW_MESSAGE_SUBSCRIBED_CONTEXT,\r\n GW_MESSAGE_UNSUBSCRIBE_CONTEXT,\r\n GW_MESSAGE_DESTROY_CONTEXT,\r\n GW_MESSAGE_CONTEXT_DESTROYED,\r\n GW_MESSAGE_UPDATE_CONTEXT,\r\n GW_MESSAGE_CONTEXT_UPDATED,\r\n GW_MESSAGE_JOINED_ACTIVITY\r\n ];\r\n }\r\n};\n\nvar version = \"6.0.2\";\n\nfunction prepareConfig (configuration, ext, glue42gd) {\r\n var _a, _b, _c, _d;\r\n var nodeStartingContext;\r\n if (Utils.isNode()) {\r\n var startingContextString = process.env._GD_STARTING_CONTEXT_;\r\n if (startingContextString) {\r\n try {\r\n nodeStartingContext = JSON.parse(startingContextString);\r\n }\r\n catch (_e) {\r\n }\r\n }\r\n }\r\n function getConnection() {\r\n var _a, _b, _c, _d, _e, _f;\r\n var gwConfig = configuration.gateway;\r\n var protocolVersion = (_a = gwConfig === null || gwConfig === void 0 ? void 0 : gwConfig.protocolVersion) !== null && _a !== void 0 ? _a : 3;\r\n var reconnectInterval = gwConfig === null || gwConfig === void 0 ? void 0 : gwConfig.reconnectInterval;\r\n var reconnectAttempts = gwConfig === null || gwConfig === void 0 ? void 0 : gwConfig.reconnectAttempts;\r\n var defaultWs = \"ws://localhost:8385\";\r\n var ws = gwConfig === null || gwConfig === void 0 ? void 0 : gwConfig.ws;\r\n var sharedWorker = gwConfig === null || gwConfig === void 0 ? void 0 : gwConfig.sharedWorker;\r\n var inproc = gwConfig === null || gwConfig === void 0 ? void 0 : gwConfig.inproc;\r\n var webPlatform = (_b = gwConfig === null || gwConfig === void 0 ? void 0 : gwConfig.webPlatform) !== null && _b !== void 0 ? _b : undefined;\r\n if (glue42gd) {\r\n ws = glue42gd.gwURL;\r\n }\r\n if (Utils.isNode() && nodeStartingContext && nodeStartingContext.gwURL) {\r\n ws = nodeStartingContext.gwURL;\r\n }\r\n if (!ws && !sharedWorker && !inproc) {\r\n ws = defaultWs;\r\n }\r\n var instanceId;\r\n var windowId;\r\n var pid;\r\n var environment;\r\n var region;\r\n var appName = getApplication();\r\n var uniqueAppName = appName;\r\n if (typeof glue42gd !== \"undefined\") {\r\n windowId = glue42gd.windowId;\r\n pid = glue42gd.pid;\r\n if (glue42gd.env) {\r\n environment = glue42gd.env.env;\r\n region = glue42gd.env.region;\r\n }\r\n uniqueAppName = (_c = glue42gd.application) !== null && _c !== void 0 ? _c : \"glue-app\";\r\n instanceId = glue42gd.appInstanceId;\r\n }\r\n else if (Utils.isNode()) {\r\n pid = process.pid;\r\n if (nodeStartingContext) {\r\n environment = nodeStartingContext.env;\r\n region = nodeStartingContext.region;\r\n instanceId = nodeStartingContext.instanceId;\r\n }\r\n }\r\n else if (typeof (window === null || window === void 0 ? void 0 : window.glue42electron) !== \"undefined\") {\r\n windowId = window === null || window === void 0 ? void 0 : window.glue42electron.instanceId;\r\n pid = window === null || window === void 0 ? void 0 : window.glue42electron.pid;\r\n environment = window === null || window === void 0 ? void 0 : window.glue42electron.env;\r\n region = window === null || window === void 0 ? void 0 : window.glue42electron.region;\r\n uniqueAppName = (_d = window === null || window === void 0 ? void 0 : window.glue42electron.application) !== null && _d !== void 0 ? _d : \"glue-app\";\r\n instanceId = window === null || window === void 0 ? void 0 : window.glue42electron.instanceId;\r\n }\r\n else ;\r\n var replaySpecs = (_f = (_e = configuration.gateway) === null || _e === void 0 ? void 0 : _e.replaySpecs) !== null && _f !== void 0 ? _f : [];\r\n replaySpecs.push(ContextMessageReplaySpec);\r\n var identity = {\r\n application: uniqueAppName,\r\n applicationName: appName,\r\n windowId: windowId,\r\n instance: instanceId,\r\n process: pid,\r\n region: region,\r\n environment: environment,\r\n api: ext.version || version\r\n };\r\n if (configuration.identity) {\r\n identity = Object.assign(identity, configuration.identity);\r\n }\r\n return {\r\n identity: identity,\r\n reconnectInterval: reconnectInterval,\r\n ws: ws,\r\n sharedWorker: sharedWorker,\r\n webPlatform: webPlatform,\r\n inproc: inproc,\r\n protocolVersion: protocolVersion,\r\n reconnectAttempts: reconnectAttempts,\r\n replaySpecs: replaySpecs,\r\n };\r\n }\r\n function getContexts() {\r\n if (typeof configuration.contexts === \"undefined\") {\r\n return { reAnnounceKnownContexts: true };\r\n }\r\n if (typeof configuration.contexts === \"boolean\" && configuration.contexts) {\r\n return { reAnnounceKnownContexts: true };\r\n }\r\n if (typeof configuration.contexts === \"object\") {\r\n return Object.assign({}, { reAnnounceKnownContexts: true }, configuration.contexts);\r\n }\r\n return false;\r\n }\r\n function getApplication() {\r\n if (configuration.application) {\r\n return configuration.application;\r\n }\r\n if (glue42gd) {\r\n return glue42gd.applicationName;\r\n }\r\n if (typeof window !== \"undefined\" && typeof window.glue42electron !== \"undefined\") {\r\n return window.glue42electron.application;\r\n }\r\n var uid = shortid();\r\n if (Utils.isNode()) {\r\n if (nodeStartingContext) {\r\n return nodeStartingContext.applicationConfig.name;\r\n }\r\n return \"NodeJS\" + uid;\r\n }\r\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\r\n return document.title + \" (\".concat(uid, \")\");\r\n }\r\n return uid;\r\n }\r\n function getAuth() {\r\n var _a, _b, _c;\r\n if (typeof configuration.auth === \"string\") {\r\n return {\r\n token: configuration.auth\r\n };\r\n }\r\n if (configuration.auth) {\r\n return configuration.auth;\r\n }\r\n if (Utils.isNode() && nodeStartingContext && nodeStartingContext.gwToken) {\r\n return {\r\n gatewayToken: nodeStartingContext.gwToken\r\n };\r\n }\r\n if (((_a = configuration.gateway) === null || _a === void 0 ? void 0 : _a.webPlatform) || ((_b = configuration.gateway) === null || _b === void 0 ? void 0 : _b.inproc) || ((_c = configuration.gateway) === null || _c === void 0 ? void 0 : _c.sharedWorker)) {\r\n return {\r\n username: \"glue42\", password: \"glue42\"\r\n };\r\n }\r\n }\r\n function getLogger() {\r\n var _a, _b;\r\n var config = configuration.logger;\r\n var defaultLevel = \"warn\";\r\n if (!config) {\r\n config = defaultLevel;\r\n }\r\n var gdConsoleLevel;\r\n if (glue42gd) {\r\n gdConsoleLevel = glue42gd.consoleLogLevel;\r\n }\r\n if (typeof config === \"string\") {\r\n return { console: gdConsoleLevel !== null && gdConsoleLevel !== void 0 ? gdConsoleLevel : config, publish: defaultLevel };\r\n }\r\n return {\r\n console: (_a = gdConsoleLevel !== null && gdConsoleLevel !== void 0 ? gdConsoleLevel : config.console) !== null && _a !== void 0 ? _a : defaultLevel,\r\n publish: (_b = config.publish) !== null && _b !== void 0 ? _b : defaultLevel\r\n };\r\n }\r\n var connection = getConnection();\r\n var application = getApplication();\r\n if (typeof window !== \"undefined\") {\r\n var windowAsAny = window;\r\n var containerApplication = windowAsAny.htmlContainer ?\r\n \"\".concat(windowAsAny.htmlContainer.containerName, \".\").concat(windowAsAny.htmlContainer.application) :\r\n (_a = windowAsAny === null || windowAsAny === void 0 ? void 0 : windowAsAny.glue42gd) === null || _a === void 0 ? void 0 : _a.application;\r\n if (containerApplication) {\r\n application = containerApplication;\r\n }\r\n }\r\n return {\r\n bus: (_b = configuration.bus) !== null && _b !== void 0 ? _b : false,\r\n application: application,\r\n auth: getAuth(),\r\n logger: getLogger(),\r\n connection: connection,\r\n metrics: (_c = configuration.metrics) !== null && _c !== void 0 ? _c : true,\r\n contexts: getContexts(),\r\n version: ext.version || version,\r\n libs: (_d = ext.libs) !== null && _d !== void 0 ? _d : [],\r\n customLogger: configuration.customLogger\r\n };\r\n}\n\nvar GW3ContextData = (function () {\r\n function GW3ContextData(contextId, name, isAnnounced, activityId) {\r\n this.updateCallbacks = {};\r\n this.contextId = contextId;\r\n this.name = name;\r\n this.isAnnounced = isAnnounced;\r\n this.activityId = activityId;\r\n this.context = {};\r\n }\r\n GW3ContextData.prototype.hasCallbacks = function () {\r\n return Object.keys(this.updateCallbacks).length > 0;\r\n };\r\n GW3ContextData.prototype.getState = function () {\r\n if (this.isAnnounced && this.hasCallbacks()) {\r\n return 3;\r\n }\r\n if (this.isAnnounced) {\r\n return 2;\r\n }\r\n if (this.hasCallbacks()) {\r\n return 1;\r\n }\r\n return 0;\r\n };\r\n return GW3ContextData;\r\n}());\n\nvar lodash_clonedeepExports = {};\nvar lodash_clonedeep = {\n get exports(){ return lodash_clonedeepExports; },\n set exports(v){ lodash_clonedeepExports = v; },\n};\n\n/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n(function (module, exports) {\n\t/** Used as the size to enable large array optimizations. */\n\tvar LARGE_ARRAY_SIZE = 200;\n\n\t/** Used to stand-in for `undefined` hash values. */\n\tvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\n\t/** `Object#toString` result references. */\n\tvar argsTag = '[object Arguments]',\n\t arrayTag = '[object Array]',\n\t boolTag = '[object Boolean]',\n\t dateTag = '[object Date]',\n\t errorTag = '[object Error]',\n\t funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]',\n\t mapTag = '[object Map]',\n\t numberTag = '[object Number]',\n\t objectTag = '[object Object]',\n\t promiseTag = '[object Promise]',\n\t regexpTag = '[object RegExp]',\n\t setTag = '[object Set]',\n\t stringTag = '[object String]',\n\t symbolTag = '[object Symbol]',\n\t weakMapTag = '[object WeakMap]';\n\n\tvar arrayBufferTag = '[object ArrayBuffer]',\n\t dataViewTag = '[object DataView]',\n\t float32Tag = '[object Float32Array]',\n\t float64Tag = '[object Float64Array]',\n\t int8Tag = '[object Int8Array]',\n\t int16Tag = '[object Int16Array]',\n\t int32Tag = '[object Int32Array]',\n\t uint8Tag = '[object Uint8Array]',\n\t uint8ClampedTag = '[object Uint8ClampedArray]',\n\t uint16Tag = '[object Uint16Array]',\n\t uint32Tag = '[object Uint32Array]';\n\n\t/**\n\t * Used to match `RegExp`\n\t * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n\t */\n\tvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n\t/** Used to match `RegExp` flags from their coerced string values. */\n\tvar reFlags = /\\w*$/;\n\n\t/** Used to detect host constructors (Safari). */\n\tvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n\t/** Used to identify `toStringTag` values supported by `_.clone`. */\n\tvar cloneableTags = {};\n\tcloneableTags[argsTag] = cloneableTags[arrayTag] =\n\tcloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n\tcloneableTags[boolTag] = cloneableTags[dateTag] =\n\tcloneableTags[float32Tag] = cloneableTags[float64Tag] =\n\tcloneableTags[int8Tag] = cloneableTags[int16Tag] =\n\tcloneableTags[int32Tag] = cloneableTags[mapTag] =\n\tcloneableTags[numberTag] = cloneableTags[objectTag] =\n\tcloneableTags[regexpTag] = cloneableTags[setTag] =\n\tcloneableTags[stringTag] = cloneableTags[symbolTag] =\n\tcloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n\tcloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n\tcloneableTags[errorTag] = cloneableTags[funcTag] =\n\tcloneableTags[weakMapTag] = false;\n\n\t/** Detect free variable `global` from Node.js. */\n\tvar freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;\n\n\t/** Detect free variable `self`. */\n\tvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n\t/** Used as a reference to the global object. */\n\tvar root = freeGlobal || freeSelf || Function('return this')();\n\n\t/** Detect free variable `exports`. */\n\tvar freeExports = exports && !exports.nodeType && exports;\n\n\t/** Detect free variable `module`. */\n\tvar freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module;\n\n\t/** Detect the popular CommonJS extension `module.exports`. */\n\tvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n\t/**\n\t * Adds the key-value `pair` to `map`.\n\t *\n\t * @private\n\t * @param {Object} map The map to modify.\n\t * @param {Array} pair The key-value pair to add.\n\t * @returns {Object} Returns `map`.\n\t */\n\tfunction addMapEntry(map, pair) {\n\t // Don't return `map.set` because it's not chainable in IE 11.\n\t map.set(pair[0], pair[1]);\n\t return map;\n\t}\n\n\t/**\n\t * Adds `value` to `set`.\n\t *\n\t * @private\n\t * @param {Object} set The set to modify.\n\t * @param {*} value The value to add.\n\t * @returns {Object} Returns `set`.\n\t */\n\tfunction addSetEntry(set, value) {\n\t // Don't return `set.add` because it's not chainable in IE 11.\n\t set.add(value);\n\t return set;\n\t}\n\n\t/**\n\t * A specialized version of `_.forEach` for arrays without support for\n\t * iteratee shorthands.\n\t *\n\t * @private\n\t * @param {Array} [array] The array to iterate over.\n\t * @param {Function} iteratee The function invoked per iteration.\n\t * @returns {Array} Returns `array`.\n\t */\n\tfunction arrayEach(array, iteratee) {\n\t var index = -1,\n\t length = array ? array.length : 0;\n\n\t while (++index < length) {\n\t if (iteratee(array[index], index, array) === false) {\n\t break;\n\t }\n\t }\n\t return array;\n\t}\n\n\t/**\n\t * Appends the elements of `values` to `array`.\n\t *\n\t * @private\n\t * @param {Array} array The array to modify.\n\t * @param {Array} values The values to append.\n\t * @returns {Array} Returns `array`.\n\t */\n\tfunction arrayPush(array, values) {\n\t var index = -1,\n\t length = values.length,\n\t offset = array.length;\n\n\t while (++index < length) {\n\t array[offset + index] = values[index];\n\t }\n\t return array;\n\t}\n\n\t/**\n\t * A specialized version of `_.reduce` for arrays without support for\n\t * iteratee shorthands.\n\t *\n\t * @private\n\t * @param {Array} [array] The array to iterate over.\n\t * @param {Function} iteratee The function invoked per iteration.\n\t * @param {*} [accumulator] The initial value.\n\t * @param {boolean} [initAccum] Specify using the first element of `array` as\n\t * the initial value.\n\t * @returns {*} Returns the accumulated value.\n\t */\n\tfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n\t var index = -1,\n\t length = array ? array.length : 0;\n\n\t if (initAccum && length) {\n\t accumulator = array[++index];\n\t }\n\t while (++index < length) {\n\t accumulator = iteratee(accumulator, array[index], index, array);\n\t }\n\t return accumulator;\n\t}\n\n\t/**\n\t * The base implementation of `_.times` without support for iteratee shorthands\n\t * or max array length checks.\n\t *\n\t * @private\n\t * @param {number} n The number of times to invoke `iteratee`.\n\t * @param {Function} iteratee The function invoked per iteration.\n\t * @returns {Array} Returns the array of results.\n\t */\n\tfunction baseTimes(n, iteratee) {\n\t var index = -1,\n\t result = Array(n);\n\n\t while (++index < n) {\n\t result[index] = iteratee(index);\n\t }\n\t return result;\n\t}\n\n\t/**\n\t * Gets the value at `key` of `object`.\n\t *\n\t * @private\n\t * @param {Object} [object] The object to query.\n\t * @param {string} key The key of the property to get.\n\t * @returns {*} Returns the property value.\n\t */\n\tfunction getValue(object, key) {\n\t return object == null ? undefined : object[key];\n\t}\n\n\t/**\n\t * Checks if `value` is a host object in IE < 9.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n\t */\n\tfunction isHostObject(value) {\n\t // Many host objects are `Object` objects that can coerce to strings\n\t // despite having improperly defined `toString` methods.\n\t var result = false;\n\t if (value != null && typeof value.toString != 'function') {\n\t try {\n\t result = !!(value + '');\n\t } catch (e) {}\n\t }\n\t return result;\n\t}\n\n\t/**\n\t * Converts `map` to its key-value pairs.\n\t *\n\t * @private\n\t * @param {Object} map The map to convert.\n\t * @returns {Array} Returns the key-value pairs.\n\t */\n\tfunction mapToArray(map) {\n\t var index = -1,\n\t result = Array(map.size);\n\n\t map.forEach(function(value, key) {\n\t result[++index] = [key, value];\n\t });\n\t return result;\n\t}\n\n\t/**\n\t * Creates a unary function that invokes `func` with its argument transformed.\n\t *\n\t * @private\n\t * @param {Function} func The function to wrap.\n\t * @param {Function} transform The argument transform.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction overArg(func, transform) {\n\t return function(arg) {\n\t return func(transform(arg));\n\t };\n\t}\n\n\t/**\n\t * Converts `set` to an array of its values.\n\t *\n\t * @private\n\t * @param {Object} set The set to convert.\n\t * @returns {Array} Returns the values.\n\t */\n\tfunction setToArray(set) {\n\t var index = -1,\n\t result = Array(set.size);\n\n\t set.forEach(function(value) {\n\t result[++index] = value;\n\t });\n\t return result;\n\t}\n\n\t/** Used for built-in method references. */\n\tvar arrayProto = Array.prototype,\n\t funcProto = Function.prototype,\n\t objectProto = Object.prototype;\n\n\t/** Used to detect overreaching core-js shims. */\n\tvar coreJsData = root['__core-js_shared__'];\n\n\t/** Used to detect methods masquerading as native. */\n\tvar maskSrcKey = (function() {\n\t var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n\t return uid ? ('Symbol(src)_1.' + uid) : '';\n\t}());\n\n\t/** Used to resolve the decompiled source of functions. */\n\tvar funcToString = funcProto.toString;\n\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\n\t/**\n\t * Used to resolve the\n\t * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\n\t/** Used to detect if a method is native. */\n\tvar reIsNative = RegExp('^' +\n\t funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n\t .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n\t);\n\n\t/** Built-in value references. */\n\tvar Buffer = moduleExports ? root.Buffer : undefined,\n\t Symbol = root.Symbol,\n\t Uint8Array = root.Uint8Array,\n\t getPrototype = overArg(Object.getPrototypeOf, Object),\n\t objectCreate = Object.create,\n\t propertyIsEnumerable = objectProto.propertyIsEnumerable,\n\t splice = arrayProto.splice;\n\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeGetSymbols = Object.getOwnPropertySymbols,\n\t nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n\t nativeKeys = overArg(Object.keys, Object);\n\n\t/* Built-in method references that are verified to be native. */\n\tvar DataView = getNative(root, 'DataView'),\n\t Map = getNative(root, 'Map'),\n\t Promise = getNative(root, 'Promise'),\n\t Set = getNative(root, 'Set'),\n\t WeakMap = getNative(root, 'WeakMap'),\n\t nativeCreate = getNative(Object, 'create');\n\n\t/** Used to detect maps, sets, and weakmaps. */\n\tvar dataViewCtorString = toSource(DataView),\n\t mapCtorString = toSource(Map),\n\t promiseCtorString = toSource(Promise),\n\t setCtorString = toSource(Set),\n\t weakMapCtorString = toSource(WeakMap);\n\n\t/** Used to convert symbols to primitives and strings. */\n\tvar symbolProto = Symbol ? Symbol.prototype : undefined,\n\t symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n\t/**\n\t * Creates a hash object.\n\t *\n\t * @private\n\t * @constructor\n\t * @param {Array} [entries] The key-value pairs to cache.\n\t */\n\tfunction Hash(entries) {\n\t var index = -1,\n\t length = entries ? entries.length : 0;\n\n\t this.clear();\n\t while (++index < length) {\n\t var entry = entries[index];\n\t this.set(entry[0], entry[1]);\n\t }\n\t}\n\n\t/**\n\t * Removes all key-value entries from the hash.\n\t *\n\t * @private\n\t * @name clear\n\t * @memberOf Hash\n\t */\n\tfunction hashClear() {\n\t this.__data__ = nativeCreate ? nativeCreate(null) : {};\n\t}\n\n\t/**\n\t * Removes `key` and its value from the hash.\n\t *\n\t * @private\n\t * @name delete\n\t * @memberOf Hash\n\t * @param {Object} hash The hash to modify.\n\t * @param {string} key The key of the value to remove.\n\t * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n\t */\n\tfunction hashDelete(key) {\n\t return this.has(key) && delete this.__data__[key];\n\t}\n\n\t/**\n\t * Gets the hash value for `key`.\n\t *\n\t * @private\n\t * @name get\n\t * @memberOf Hash\n\t * @param {string} key The key of the value to get.\n\t * @returns {*} Returns the entry value.\n\t */\n\tfunction hashGet(key) {\n\t var data = this.__data__;\n\t if (nativeCreate) {\n\t var result = data[key];\n\t return result === HASH_UNDEFINED ? undefined : result;\n\t }\n\t return hasOwnProperty.call(data, key) ? data[key] : undefined;\n\t}\n\n\t/**\n\t * Checks if a hash value for `key` exists.\n\t *\n\t * @private\n\t * @name has\n\t * @memberOf Hash\n\t * @param {string} key The key of the entry to check.\n\t * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n\t */\n\tfunction hashHas(key) {\n\t var data = this.__data__;\n\t return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n\t}\n\n\t/**\n\t * Sets the hash `key` to `value`.\n\t *\n\t * @private\n\t * @name set\n\t * @memberOf Hash\n\t * @param {string} key The key of the value to set.\n\t * @param {*} value The value to set.\n\t * @returns {Object} Returns the hash instance.\n\t */\n\tfunction hashSet(key, value) {\n\t var data = this.__data__;\n\t data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n\t return this;\n\t}\n\n\t// Add methods to `Hash`.\n\tHash.prototype.clear = hashClear;\n\tHash.prototype['delete'] = hashDelete;\n\tHash.prototype.get = hashGet;\n\tHash.prototype.has = hashHas;\n\tHash.prototype.set = hashSet;\n\n\t/**\n\t * Creates an list cache object.\n\t *\n\t * @private\n\t * @constructor\n\t * @param {Array} [entries] The key-value pairs to cache.\n\t */\n\tfunction ListCache(entries) {\n\t var index = -1,\n\t length = entries ? entries.length : 0;\n\n\t this.clear();\n\t while (++index < length) {\n\t var entry = entries[index];\n\t this.set(entry[0], entry[1]);\n\t }\n\t}\n\n\t/**\n\t * Removes all key-value entries from the list cache.\n\t *\n\t * @private\n\t * @name clear\n\t * @memberOf ListCache\n\t */\n\tfunction listCacheClear() {\n\t this.__data__ = [];\n\t}\n\n\t/**\n\t * Removes `key` and its value from the list cache.\n\t *\n\t * @private\n\t * @name delete\n\t * @memberOf ListCache\n\t * @param {string} key The key of the value to remove.\n\t * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n\t */\n\tfunction listCacheDelete(key) {\n\t var data = this.__data__,\n\t index = assocIndexOf(data, key);\n\n\t if (index < 0) {\n\t return false;\n\t }\n\t var lastIndex = data.length - 1;\n\t if (index == lastIndex) {\n\t data.pop();\n\t } else {\n\t splice.call(data, index, 1);\n\t }\n\t return true;\n\t}\n\n\t/**\n\t * Gets the list cache value for `key`.\n\t *\n\t * @private\n\t * @name get\n\t * @memberOf ListCache\n\t * @param {string} key The key of the value to get.\n\t * @returns {*} Returns the entry value.\n\t */\n\tfunction listCacheGet(key) {\n\t var data = this.__data__,\n\t index = assocIndexOf(data, key);\n\n\t return index < 0 ? undefined : data[index][1];\n\t}\n\n\t/**\n\t * Checks if a list cache value for `key` exists.\n\t *\n\t * @private\n\t * @name has\n\t * @memberOf ListCache\n\t * @param {string} key The key of the entry to check.\n\t * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n\t */\n\tfunction listCacheHas(key) {\n\t return assocIndexOf(this.__data__, key) > -1;\n\t}\n\n\t/**\n\t * Sets the list cache `key` to `value`.\n\t *\n\t * @private\n\t * @name set\n\t * @memberOf ListCache\n\t * @param {string} key The key of the value to set.\n\t * @param {*} value The value to set.\n\t * @returns {Object} Returns the list cache instance.\n\t */\n\tfunction listCacheSet(key, value) {\n\t var data = this.__data__,\n\t index = assocIndexOf(data, key);\n\n\t if (index < 0) {\n\t data.push([key, value]);\n\t } else {\n\t data[index][1] = value;\n\t }\n\t return this;\n\t}\n\n\t// Add methods to `ListCache`.\n\tListCache.prototype.clear = listCacheClear;\n\tListCache.prototype['delete'] = listCacheDelete;\n\tListCache.prototype.get = listCacheGet;\n\tListCache.prototype.has = listCacheHas;\n\tListCache.prototype.set = listCacheSet;\n\n\t/**\n\t * Creates a map cache object to store key-value pairs.\n\t *\n\t * @private\n\t * @constructor\n\t * @param {Array} [entries] The key-value pairs to cache.\n\t */\n\tfunction MapCache(entries) {\n\t var index = -1,\n\t length = entries ? entries.length : 0;\n\n\t this.clear();\n\t while (++index < length) {\n\t var entry = entries[index];\n\t this.set(entry[0], entry[1]);\n\t }\n\t}\n\n\t/**\n\t * Removes all key-value entries from the map.\n\t *\n\t * @private\n\t * @name clear\n\t * @memberOf MapCache\n\t */\n\tfunction mapCacheClear() {\n\t this.__data__ = {\n\t 'hash': new Hash,\n\t 'map': new (Map || ListCache),\n\t 'string': new Hash\n\t };\n\t}\n\n\t/**\n\t * Removes `key` and its value from the map.\n\t *\n\t * @private\n\t * @name delete\n\t * @memberOf MapCache\n\t * @param {string} key The key of the value to remove.\n\t * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n\t */\n\tfunction mapCacheDelete(key) {\n\t return getMapData(this, key)['delete'](key);\n\t}\n\n\t/**\n\t * Gets the map value for `key`.\n\t *\n\t * @private\n\t * @name get\n\t * @memberOf MapCache\n\t * @param {string} key The key of the value to get.\n\t * @returns {*} Returns the entry value.\n\t */\n\tfunction mapCacheGet(key) {\n\t return getMapData(this, key).get(key);\n\t}\n\n\t/**\n\t * Checks if a map value for `key` exists.\n\t *\n\t * @private\n\t * @name has\n\t * @memberOf MapCache\n\t * @param {string} key The key of the entry to check.\n\t * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n\t */\n\tfunction mapCacheHas(key) {\n\t return getMapData(this, key).has(key);\n\t}\n\n\t/**\n\t * Sets the map `key` to `value`.\n\t *\n\t * @private\n\t * @name set\n\t * @memberOf MapCache\n\t * @param {string} key The key of the value to set.\n\t * @param {*} value The value to set.\n\t * @returns {Object} Returns the map cache instance.\n\t */\n\tfunction mapCacheSet(key, value) {\n\t getMapData(this, key).set(key, value);\n\t return this;\n\t}\n\n\t// Add methods to `MapCache`.\n\tMapCache.prototype.clear = mapCacheClear;\n\tMapCache.prototype['delete'] = mapCacheDelete;\n\tMapCache.prototype.get = mapCacheGet;\n\tMapCache.prototype.has = mapCacheHas;\n\tMapCache.prototype.set = mapCacheSet;\n\n\t/**\n\t * Creates a stack cache object to store key-value pairs.\n\t *\n\t * @private\n\t * @constructor\n\t * @param {Array} [entries] The key-value pairs to cache.\n\t */\n\tfunction Stack(entries) {\n\t this.__data__ = new ListCache(entries);\n\t}\n\n\t/**\n\t * Removes all key-value entries from the stack.\n\t *\n\t * @private\n\t * @name clear\n\t * @memberOf Stack\n\t */\n\tfunction stackClear() {\n\t this.__data__ = new ListCache;\n\t}\n\n\t/**\n\t * Removes `key` and its value from the stack.\n\t *\n\t * @private\n\t * @name delete\n\t * @memberOf Stack\n\t * @param {string} key The key of the value to remove.\n\t * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n\t */\n\tfunction stackDelete(key) {\n\t return this.__data__['delete'](key);\n\t}\n\n\t/**\n\t * Gets the stack value for `key`.\n\t *\n\t * @private\n\t * @name get\n\t * @memberOf Stack\n\t * @param {string} key The key of the value to get.\n\t * @returns {*} Returns the entry value.\n\t */\n\tfunction stackGet(key) {\n\t return this.__data__.get(key);\n\t}\n\n\t/**\n\t * Checks if a stack value for `key` exists.\n\t *\n\t * @private\n\t * @name has\n\t * @memberOf Stack\n\t * @param {string} key The key of the entry to check.\n\t * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n\t */\n\tfunction stackHas(key) {\n\t return this.__data__.has(key);\n\t}\n\n\t/**\n\t * Sets the stack `key` to `value`.\n\t *\n\t * @private\n\t * @name set\n\t * @memberOf Stack\n\t * @param {string} key The key of the value to set.\n\t * @param {*} value The value to set.\n\t * @returns {Object} Returns the stack cache instance.\n\t */\n\tfunction stackSet(key, value) {\n\t var cache = this.__data__;\n\t if (cache instanceof ListCache) {\n\t var pairs = cache.__data__;\n\t if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n\t pairs.push([key, value]);\n\t return this;\n\t }\n\t cache = this.__data__ = new MapCache(pairs);\n\t }\n\t cache.set(key, value);\n\t return this;\n\t}\n\n\t// Add methods to `Stack`.\n\tStack.prototype.clear = stackClear;\n\tStack.prototype['delete'] = stackDelete;\n\tStack.prototype.get = stackGet;\n\tStack.prototype.has = stackHas;\n\tStack.prototype.set = stackSet;\n\n\t/**\n\t * Creates an array of the enumerable property names of the array-like `value`.\n\t *\n\t * @private\n\t * @param {*} value The value to query.\n\t * @param {boolean} inherited Specify returning inherited property names.\n\t * @returns {Array} Returns the array of property names.\n\t */\n\tfunction arrayLikeKeys(value, inherited) {\n\t // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n\t // Safari 9 makes `arguments.length` enumerable in strict mode.\n\t var result = (isArray(value) || isArguments(value))\n\t ? baseTimes(value.length, String)\n\t : [];\n\n\t var length = result.length,\n\t skipIndexes = !!length;\n\n\t for (var key in value) {\n\t if ((inherited || hasOwnProperty.call(value, key)) &&\n\t !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n\t result.push(key);\n\t }\n\t }\n\t return result;\n\t}\n\n\t/**\n\t * Assigns `value` to `key` of `object` if the existing value is not equivalent\n\t * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n\t * for equality comparisons.\n\t *\n\t * @private\n\t * @param {Object} object The object to modify.\n\t * @param {string} key The key of the property to assign.\n\t * @param {*} value The value to assign.\n\t */\n\tfunction assignValue(object, key, value) {\n\t var objValue = object[key];\n\t if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n\t (value === undefined && !(key in object))) {\n\t object[key] = value;\n\t }\n\t}\n\n\t/**\n\t * Gets the index at which the `key` is found in `array` of key-value pairs.\n\t *\n\t * @private\n\t * @param {Array} array The array to inspect.\n\t * @param {*} key The key to search for.\n\t * @returns {number} Returns the index of the matched value, else `-1`.\n\t */\n\tfunction assocIndexOf(array, key) {\n\t var length = array.length;\n\t while (length--) {\n\t if (eq(array[length][0], key)) {\n\t return length;\n\t }\n\t }\n\t return -1;\n\t}\n\n\t/**\n\t * The base implementation of `_.assign` without support for multiple sources\n\t * or `customizer` functions.\n\t *\n\t * @private\n\t * @param {Object} object The destination object.\n\t * @param {Object} source The source object.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction baseAssign(object, source) {\n\t return object && copyObject(source, keys(source), object);\n\t}\n\n\t/**\n\t * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n\t * traversed objects.\n\t *\n\t * @private\n\t * @param {*} value The value to clone.\n\t * @param {boolean} [isDeep] Specify a deep clone.\n\t * @param {boolean} [isFull] Specify a clone including symbols.\n\t * @param {Function} [customizer] The function to customize cloning.\n\t * @param {string} [key] The key of `value`.\n\t * @param {Object} [object] The parent object of `value`.\n\t * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n\t * @returns {*} Returns the cloned value.\n\t */\n\tfunction baseClone(value, isDeep, isFull, customizer, key, object, stack) {\n\t var result;\n\t if (customizer) {\n\t result = object ? customizer(value, key, object, stack) : customizer(value);\n\t }\n\t if (result !== undefined) {\n\t return result;\n\t }\n\t if (!isObject(value)) {\n\t return value;\n\t }\n\t var isArr = isArray(value);\n\t if (isArr) {\n\t result = initCloneArray(value);\n\t if (!isDeep) {\n\t return copyArray(value, result);\n\t }\n\t } else {\n\t var tag = getTag(value),\n\t isFunc = tag == funcTag || tag == genTag;\n\n\t if (isBuffer(value)) {\n\t return cloneBuffer(value, isDeep);\n\t }\n\t if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n\t if (isHostObject(value)) {\n\t return object ? value : {};\n\t }\n\t result = initCloneObject(isFunc ? {} : value);\n\t if (!isDeep) {\n\t return copySymbols(value, baseAssign(result, value));\n\t }\n\t } else {\n\t if (!cloneableTags[tag]) {\n\t return object ? value : {};\n\t }\n\t result = initCloneByTag(value, tag, baseClone, isDeep);\n\t }\n\t }\n\t // Check for circular references and return its corresponding clone.\n\t stack || (stack = new Stack);\n\t var stacked = stack.get(value);\n\t if (stacked) {\n\t return stacked;\n\t }\n\t stack.set(value, result);\n\n\t if (!isArr) {\n\t var props = isFull ? getAllKeys(value) : keys(value);\n\t }\n\t arrayEach(props || value, function(subValue, key) {\n\t if (props) {\n\t key = subValue;\n\t subValue = value[key];\n\t }\n\t // Recursively populate clone (susceptible to call stack limits).\n\t assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));\n\t });\n\t return result;\n\t}\n\n\t/**\n\t * The base implementation of `_.create` without support for assigning\n\t * properties to the created object.\n\t *\n\t * @private\n\t * @param {Object} prototype The object to inherit from.\n\t * @returns {Object} Returns the new object.\n\t */\n\tfunction baseCreate(proto) {\n\t return isObject(proto) ? objectCreate(proto) : {};\n\t}\n\n\t/**\n\t * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n\t * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n\t * symbols of `object`.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @param {Function} keysFunc The function to get the keys of `object`.\n\t * @param {Function} symbolsFunc The function to get the symbols of `object`.\n\t * @returns {Array} Returns the array of property names and symbols.\n\t */\n\tfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n\t var result = keysFunc(object);\n\t return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n\t}\n\n\t/**\n\t * The base implementation of `getTag`.\n\t *\n\t * @private\n\t * @param {*} value The value to query.\n\t * @returns {string} Returns the `toStringTag`.\n\t */\n\tfunction baseGetTag(value) {\n\t return objectToString.call(value);\n\t}\n\n\t/**\n\t * The base implementation of `_.isNative` without bad shim checks.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a native function,\n\t * else `false`.\n\t */\n\tfunction baseIsNative(value) {\n\t if (!isObject(value) || isMasked(value)) {\n\t return false;\n\t }\n\t var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n\t return pattern.test(toSource(value));\n\t}\n\n\t/**\n\t * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t */\n\tfunction baseKeys(object) {\n\t if (!isPrototype(object)) {\n\t return nativeKeys(object);\n\t }\n\t var result = [];\n\t for (var key in Object(object)) {\n\t if (hasOwnProperty.call(object, key) && key != 'constructor') {\n\t result.push(key);\n\t }\n\t }\n\t return result;\n\t}\n\n\t/**\n\t * Creates a clone of `buffer`.\n\t *\n\t * @private\n\t * @param {Buffer} buffer The buffer to clone.\n\t * @param {boolean} [isDeep] Specify a deep clone.\n\t * @returns {Buffer} Returns the cloned buffer.\n\t */\n\tfunction cloneBuffer(buffer, isDeep) {\n\t if (isDeep) {\n\t return buffer.slice();\n\t }\n\t var result = new buffer.constructor(buffer.length);\n\t buffer.copy(result);\n\t return result;\n\t}\n\n\t/**\n\t * Creates a clone of `arrayBuffer`.\n\t *\n\t * @private\n\t * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n\t * @returns {ArrayBuffer} Returns the cloned array buffer.\n\t */\n\tfunction cloneArrayBuffer(arrayBuffer) {\n\t var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n\t new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n\t return result;\n\t}\n\n\t/**\n\t * Creates a clone of `dataView`.\n\t *\n\t * @private\n\t * @param {Object} dataView The data view to clone.\n\t * @param {boolean} [isDeep] Specify a deep clone.\n\t * @returns {Object} Returns the cloned data view.\n\t */\n\tfunction cloneDataView(dataView, isDeep) {\n\t var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n\t return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n\t}\n\n\t/**\n\t * Creates a clone of `map`.\n\t *\n\t * @private\n\t * @param {Object} map The map to clone.\n\t * @param {Function} cloneFunc The function to clone values.\n\t * @param {boolean} [isDeep] Specify a deep clone.\n\t * @returns {Object} Returns the cloned map.\n\t */\n\tfunction cloneMap(map, isDeep, cloneFunc) {\n\t var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);\n\t return arrayReduce(array, addMapEntry, new map.constructor);\n\t}\n\n\t/**\n\t * Creates a clone of `regexp`.\n\t *\n\t * @private\n\t * @param {Object} regexp The regexp to clone.\n\t * @returns {Object} Returns the cloned regexp.\n\t */\n\tfunction cloneRegExp(regexp) {\n\t var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n\t result.lastIndex = regexp.lastIndex;\n\t return result;\n\t}\n\n\t/**\n\t * Creates a clone of `set`.\n\t *\n\t * @private\n\t * @param {Object} set The set to clone.\n\t * @param {Function} cloneFunc The function to clone values.\n\t * @param {boolean} [isDeep] Specify a deep clone.\n\t * @returns {Object} Returns the cloned set.\n\t */\n\tfunction cloneSet(set, isDeep, cloneFunc) {\n\t var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);\n\t return arrayReduce(array, addSetEntry, new set.constructor);\n\t}\n\n\t/**\n\t * Creates a clone of the `symbol` object.\n\t *\n\t * @private\n\t * @param {Object} symbol The symbol object to clone.\n\t * @returns {Object} Returns the cloned symbol object.\n\t */\n\tfunction cloneSymbol(symbol) {\n\t return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n\t}\n\n\t/**\n\t * Creates a clone of `typedArray`.\n\t *\n\t * @private\n\t * @param {Object} typedArray The typed array to clone.\n\t * @param {boolean} [isDeep] Specify a deep clone.\n\t * @returns {Object} Returns the cloned typed array.\n\t */\n\tfunction cloneTypedArray(typedArray, isDeep) {\n\t var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n\t return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n\t}\n\n\t/**\n\t * Copies the values of `source` to `array`.\n\t *\n\t * @private\n\t * @param {Array} source The array to copy values from.\n\t * @param {Array} [array=[]] The array to copy values to.\n\t * @returns {Array} Returns `array`.\n\t */\n\tfunction copyArray(source, array) {\n\t var index = -1,\n\t length = source.length;\n\n\t array || (array = Array(length));\n\t while (++index < length) {\n\t array[index] = source[index];\n\t }\n\t return array;\n\t}\n\n\t/**\n\t * Copies properties of `source` to `object`.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy properties from.\n\t * @param {Array} props The property identifiers to copy.\n\t * @param {Object} [object={}] The object to copy properties to.\n\t * @param {Function} [customizer] The function to customize copied values.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copyObject(source, props, object, customizer) {\n\t object || (object = {});\n\n\t var index = -1,\n\t length = props.length;\n\n\t while (++index < length) {\n\t var key = props[index];\n\n\t var newValue = customizer\n\t ? customizer(object[key], source[key], key, object, source)\n\t : undefined;\n\n\t assignValue(object, key, newValue === undefined ? source[key] : newValue);\n\t }\n\t return object;\n\t}\n\n\t/**\n\t * Copies own symbol properties of `source` to `object`.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy symbols from.\n\t * @param {Object} [object={}] The object to copy symbols to.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copySymbols(source, object) {\n\t return copyObject(source, getSymbols(source), object);\n\t}\n\n\t/**\n\t * Creates an array of own enumerable property names and symbols of `object`.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names and symbols.\n\t */\n\tfunction getAllKeys(object) {\n\t return baseGetAllKeys(object, keys, getSymbols);\n\t}\n\n\t/**\n\t * Gets the data for `map`.\n\t *\n\t * @private\n\t * @param {Object} map The map to query.\n\t * @param {string} key The reference key.\n\t * @returns {*} Returns the map data.\n\t */\n\tfunction getMapData(map, key) {\n\t var data = map.__data__;\n\t return isKeyable(key)\n\t ? data[typeof key == 'string' ? 'string' : 'hash']\n\t : data.map;\n\t}\n\n\t/**\n\t * Gets the native function at `key` of `object`.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @param {string} key The key of the method to get.\n\t * @returns {*} Returns the function if it's native, else `undefined`.\n\t */\n\tfunction getNative(object, key) {\n\t var value = getValue(object, key);\n\t return baseIsNative(value) ? value : undefined;\n\t}\n\n\t/**\n\t * Creates an array of the own enumerable symbol properties of `object`.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of symbols.\n\t */\n\tvar getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;\n\n\t/**\n\t * Gets the `toStringTag` of `value`.\n\t *\n\t * @private\n\t * @param {*} value The value to query.\n\t * @returns {string} Returns the `toStringTag`.\n\t */\n\tvar getTag = baseGetTag;\n\n\t// Fallback for data views, maps, sets, and weak maps in IE 11,\n\t// for data views in Edge < 14, and promises in Node.js.\n\tif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n\t (Map && getTag(new Map) != mapTag) ||\n\t (Promise && getTag(Promise.resolve()) != promiseTag) ||\n\t (Set && getTag(new Set) != setTag) ||\n\t (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n\t getTag = function(value) {\n\t var result = objectToString.call(value),\n\t Ctor = result == objectTag ? value.constructor : undefined,\n\t ctorString = Ctor ? toSource(Ctor) : undefined;\n\n\t if (ctorString) {\n\t switch (ctorString) {\n\t case dataViewCtorString: return dataViewTag;\n\t case mapCtorString: return mapTag;\n\t case promiseCtorString: return promiseTag;\n\t case setCtorString: return setTag;\n\t case weakMapCtorString: return weakMapTag;\n\t }\n\t }\n\t return result;\n\t };\n\t}\n\n\t/**\n\t * Initializes an array clone.\n\t *\n\t * @private\n\t * @param {Array} array The array to clone.\n\t * @returns {Array} Returns the initialized clone.\n\t */\n\tfunction initCloneArray(array) {\n\t var length = array.length,\n\t result = array.constructor(length);\n\n\t // Add properties assigned by `RegExp#exec`.\n\t if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n\t result.index = array.index;\n\t result.input = array.input;\n\t }\n\t return result;\n\t}\n\n\t/**\n\t * Initializes an object clone.\n\t *\n\t * @private\n\t * @param {Object} object The object to clone.\n\t * @returns {Object} Returns the initialized clone.\n\t */\n\tfunction initCloneObject(object) {\n\t return (typeof object.constructor == 'function' && !isPrototype(object))\n\t ? baseCreate(getPrototype(object))\n\t : {};\n\t}\n\n\t/**\n\t * Initializes an object clone based on its `toStringTag`.\n\t *\n\t * **Note:** This function only supports cloning values with tags of\n\t * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n\t *\n\t * @private\n\t * @param {Object} object The object to clone.\n\t * @param {string} tag The `toStringTag` of the object to clone.\n\t * @param {Function} cloneFunc The function to clone values.\n\t * @param {boolean} [isDeep] Specify a deep clone.\n\t * @returns {Object} Returns the initialized clone.\n\t */\n\tfunction initCloneByTag(object, tag, cloneFunc, isDeep) {\n\t var Ctor = object.constructor;\n\t switch (tag) {\n\t case arrayBufferTag:\n\t return cloneArrayBuffer(object);\n\n\t case boolTag:\n\t case dateTag:\n\t return new Ctor(+object);\n\n\t case dataViewTag:\n\t return cloneDataView(object, isDeep);\n\n\t case float32Tag: case float64Tag:\n\t case int8Tag: case int16Tag: case int32Tag:\n\t case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n\t return cloneTypedArray(object, isDeep);\n\n\t case mapTag:\n\t return cloneMap(object, isDeep, cloneFunc);\n\n\t case numberTag:\n\t case stringTag:\n\t return new Ctor(object);\n\n\t case regexpTag:\n\t return cloneRegExp(object);\n\n\t case setTag:\n\t return cloneSet(object, isDeep, cloneFunc);\n\n\t case symbolTag:\n\t return cloneSymbol(object);\n\t }\n\t}\n\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return !!length &&\n\t (typeof value == 'number' || reIsUint.test(value)) &&\n\t (value > -1 && value % 1 == 0 && value < length);\n\t}\n\n\t/**\n\t * Checks if `value` is suitable for use as unique object key.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n\t */\n\tfunction isKeyable(value) {\n\t var type = typeof value;\n\t return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n\t ? (value !== '__proto__')\n\t : (value === null);\n\t}\n\n\t/**\n\t * Checks if `func` has its source masked.\n\t *\n\t * @private\n\t * @param {Function} func The function to check.\n\t * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n\t */\n\tfunction isMasked(func) {\n\t return !!maskSrcKey && (maskSrcKey in func);\n\t}\n\n\t/**\n\t * Checks if `value` is likely a prototype object.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n\t */\n\tfunction isPrototype(value) {\n\t var Ctor = value && value.constructor,\n\t proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n\t return value === proto;\n\t}\n\n\t/**\n\t * Converts `func` to its source code.\n\t *\n\t * @private\n\t * @param {Function} func The function to process.\n\t * @returns {string} Returns the source code.\n\t */\n\tfunction toSource(func) {\n\t if (func != null) {\n\t try {\n\t return funcToString.call(func);\n\t } catch (e) {}\n\t try {\n\t return (func + '');\n\t } catch (e) {}\n\t }\n\t return '';\n\t}\n\n\t/**\n\t * This method is like `_.clone` except that it recursively clones `value`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 1.0.0\n\t * @category Lang\n\t * @param {*} value The value to recursively clone.\n\t * @returns {*} Returns the deep cloned value.\n\t * @see _.clone\n\t * @example\n\t *\n\t * var objects = [{ 'a': 1 }, { 'b': 2 }];\n\t *\n\t * var deep = _.cloneDeep(objects);\n\t * console.log(deep[0] === objects[0]);\n\t * // => false\n\t */\n\tfunction cloneDeep(value) {\n\t return baseClone(value, true, true);\n\t}\n\n\t/**\n\t * Performs a\n\t * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n\t * comparison between two values to determine if they are equivalent.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n\t * @example\n\t *\n\t * var object = { 'a': 1 };\n\t * var other = { 'a': 1 };\n\t *\n\t * _.eq(object, object);\n\t * // => true\n\t *\n\t * _.eq(object, other);\n\t * // => false\n\t *\n\t * _.eq('a', 'a');\n\t * // => true\n\t *\n\t * _.eq('a', Object('a'));\n\t * // => false\n\t *\n\t * _.eq(NaN, NaN);\n\t * // => true\n\t */\n\tfunction eq(value, other) {\n\t return value === other || (value !== value && other !== other);\n\t}\n\n\t/**\n\t * Checks if `value` is likely an `arguments` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isArguments(function() { return arguments; }());\n\t * // => true\n\t *\n\t * _.isArguments([1, 2, 3]);\n\t * // => false\n\t */\n\tfunction isArguments(value) {\n\t // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n\t return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n\t (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n\t}\n\n\t/**\n\t * Checks if `value` is classified as an `Array` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n\t * @example\n\t *\n\t * _.isArray([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArray(document.body.children);\n\t * // => false\n\t *\n\t * _.isArray('abc');\n\t * // => false\n\t *\n\t * _.isArray(_.noop);\n\t * // => false\n\t */\n\tvar isArray = Array.isArray;\n\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null && isLength(value.length) && !isFunction(value);\n\t}\n\n\t/**\n\t * This method is like `_.isArrayLike` except that it also checks if `value`\n\t * is an object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an array-like object,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isArrayLikeObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject('abc');\n\t * // => false\n\t *\n\t * _.isArrayLikeObject(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLikeObject(value) {\n\t return isObjectLike(value) && isArrayLike(value);\n\t}\n\n\t/**\n\t * Checks if `value` is a buffer.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.3.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n\t * @example\n\t *\n\t * _.isBuffer(new Buffer(2));\n\t * // => true\n\t *\n\t * _.isBuffer(new Uint8Array(2));\n\t * // => false\n\t */\n\tvar isBuffer = nativeIsBuffer || stubFalse;\n\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8-9 which returns 'object' for typed array and other constructors.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This method is loosely based on\n\t * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' &&\n\t value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\n\t/**\n\t * Checks if `value` is the\n\t * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n\t * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\n\t/**\n\t * Checks if `value` is object-like. A value is object-like if it's not `null`\n\t * and has a `typeof` result of \"object\".\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n\t * @example\n\t *\n\t * _.isObjectLike({});\n\t * // => true\n\t *\n\t * _.isObjectLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObjectLike(_.noop);\n\t * // => false\n\t *\n\t * _.isObjectLike(null);\n\t * // => false\n\t */\n\tfunction isObjectLike(value) {\n\t return !!value && typeof value == 'object';\n\t}\n\n\t/**\n\t * Creates an array of the own enumerable property names of `object`.\n\t *\n\t * **Note:** Non-object values are coerced to objects. See the\n\t * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n\t * for more details.\n\t *\n\t * @static\n\t * @since 0.1.0\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.keys(new Foo);\n\t * // => ['a', 'b'] (iteration order is not guaranteed)\n\t *\n\t * _.keys('hi');\n\t * // => ['0', '1']\n\t */\n\tfunction keys(object) {\n\t return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n\t}\n\n\t/**\n\t * This method returns a new empty array.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.13.0\n\t * @category Util\n\t * @returns {Array} Returns the new empty array.\n\t * @example\n\t *\n\t * var arrays = _.times(2, _.stubArray);\n\t *\n\t * console.log(arrays);\n\t * // => [[], []]\n\t *\n\t * console.log(arrays[0] === arrays[1]);\n\t * // => false\n\t */\n\tfunction stubArray() {\n\t return [];\n\t}\n\n\t/**\n\t * This method returns `false`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.13.0\n\t * @category Util\n\t * @returns {boolean} Returns `false`.\n\t * @example\n\t *\n\t * _.times(2, _.stubFalse);\n\t * // => [false, false]\n\t */\n\tfunction stubFalse() {\n\t return false;\n\t}\n\n\tmodule.exports = cloneDeep;\n} (lodash_clonedeep, lodash_clonedeepExports));\n\nvar cloneDeep = lodash_clonedeepExports;\n\nfunction applyContextDelta(context, delta, logger) {\r\n try {\r\n if (logger === null || logger === void 0 ? void 0 : logger.canPublish(\"trace\")) {\r\n logger === null || logger === void 0 ? void 0 : logger.trace(\"applying context delta \".concat(JSON.stringify(delta), \" on context \").concat(JSON.stringify(context)));\r\n }\r\n if (!delta) {\r\n return context;\r\n }\r\n if (delta.reset) {\r\n context = __assign({}, delta.reset);\r\n return context;\r\n }\r\n context = deepClone(context, undefined);\r\n if (delta.commands) {\r\n for (var _i = 0, _a = delta.commands; _i < _a.length; _i++) {\r\n var command = _a[_i];\r\n if (command.type === \"remove\") {\r\n deletePath(context, command.path);\r\n }\r\n else if (command.type === \"set\") {\r\n setValueToPath(context, command.value, command.path);\r\n }\r\n }\r\n return context;\r\n }\r\n var added_1 = delta.added;\r\n var updated_1 = delta.updated;\r\n var removed = delta.removed;\r\n if (added_1) {\r\n Object.keys(added_1).forEach(function (key) {\r\n context[key] = added_1[key];\r\n });\r\n }\r\n if (updated_1) {\r\n Object.keys(updated_1).forEach(function (key) {\r\n mergeObjectsProperties(key, context, updated_1);\r\n });\r\n }\r\n if (removed) {\r\n removed.forEach(function (key) {\r\n delete context[key];\r\n });\r\n }\r\n return context;\r\n }\r\n catch (e) {\r\n logger === null || logger === void 0 ? void 0 : logger.error(\"error applying context delta \".concat(JSON.stringify(delta), \" on context \").concat(JSON.stringify(context)), e);\r\n return context;\r\n }\r\n}\r\nfunction deepClone(obj, hash) {\r\n return cloneDeep(obj);\r\n}\r\nvar mergeObjectsProperties = function (key, what, withWhat) {\r\n var right = withWhat[key];\r\n if (right === undefined) {\r\n return what;\r\n }\r\n var left = what[key];\r\n if (!left || !right) {\r\n what[key] = right;\r\n return what;\r\n }\r\n if (typeof left === \"string\" ||\r\n typeof left === \"number\" ||\r\n typeof left === \"boolean\" ||\r\n typeof right === \"string\" ||\r\n typeof right === \"number\" ||\r\n typeof right === \"boolean\" ||\r\n Array.isArray(left) ||\r\n Array.isArray(right)) {\r\n what[key] = right;\r\n return what;\r\n }\r\n what[key] = Object.assign({}, left, right);\r\n return what;\r\n};\r\nfunction deepEqual(x, y) {\r\n if (x === y) {\r\n return true;\r\n }\r\n if (!(x instanceof Object) || !(y instanceof Object)) {\r\n return false;\r\n }\r\n if (x.constructor !== y.constructor) {\r\n return false;\r\n }\r\n for (var p in x) {\r\n if (!x.hasOwnProperty(p)) {\r\n continue;\r\n }\r\n if (!y.hasOwnProperty(p)) {\r\n return false;\r\n }\r\n if (x[p] === y[p]) {\r\n continue;\r\n }\r\n if (typeof (x[p]) !== \"object\") {\r\n return false;\r\n }\r\n if (!deepEqual(x[p], y[p])) {\r\n return false;\r\n }\r\n }\r\n for (var p in y) {\r\n if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\nfunction setValueToPath(obj, value, path) {\r\n var pathArr = path.split(\".\");\r\n var i;\r\n for (i = 0; i < pathArr.length - 1; i++) {\r\n if (!obj[pathArr[i]]) {\r\n obj[pathArr[i]] = {};\r\n }\r\n if (typeof obj[pathArr[i]] !== \"object\") {\r\n obj[pathArr[i]] = {};\r\n }\r\n obj = obj[pathArr[i]];\r\n }\r\n obj[pathArr[i]] = value;\r\n}\r\nfunction isSubset(superObj, subObj) {\r\n return Object.keys(subObj).every(function (ele) {\r\n if (typeof subObj[ele] === \"object\") {\r\n return isSubset((superObj === null || superObj === void 0 ? void 0 : superObj[ele]) || {}, subObj[ele] || {});\r\n }\r\n return subObj[ele] === (superObj === null || superObj === void 0 ? void 0 : superObj[ele]);\r\n });\r\n}\r\nfunction deletePath(obj, path) {\r\n var pathArr = path.split(\".\");\r\n var i;\r\n for (i = 0; i < pathArr.length - 1; i++) {\r\n if (!obj[pathArr[i]]) {\r\n return;\r\n }\r\n obj = obj[pathArr[i]];\r\n }\r\n delete obj[pathArr[i]];\r\n}\n\nvar GW3Bridge = (function () {\r\n function GW3Bridge(config) {\r\n var _this = this;\r\n var _a;\r\n this._contextNameToData = {};\r\n this._gw3Subscriptions = [];\r\n this._nextCallbackSubscriptionNumber = 0;\r\n this._creationPromises = {};\r\n this._contextNameToId = {};\r\n this._contextIdToName = {};\r\n this._protocolVersion = undefined;\r\n this._contextsTempCache = {};\r\n this._contextsSubscriptionsCache = [];\r\n this._connection = config.connection;\r\n this._logger = config.logger;\r\n this._trackAllContexts = config.trackAllContexts;\r\n this._reAnnounceKnownContexts = config.reAnnounceKnownContexts;\r\n this._gw3Session = this._connection.domain(\"global\", [\r\n GW_MESSAGE_CONTEXT_CREATED,\r\n GW_MESSAGE_SUBSCRIBED_CONTEXT,\r\n GW_MESSAGE_CONTEXT_DESTROYED,\r\n GW_MESSAGE_CONTEXT_UPDATED,\r\n ]);\r\n this._gw3Session.disconnected(this.resetState.bind(this));\r\n this._gw3Session.onJoined(function (wasReconnect) {\r\n if (!wasReconnect) {\r\n return;\r\n }\r\n if (!_this._reAnnounceKnownContexts) {\r\n return _this._connection.setLibReAnnounced({ name: \"contexts\" });\r\n }\r\n _this.reInitiateState().then(function () { return _this._connection.setLibReAnnounced({ name: \"contexts\" }); });\r\n });\r\n this.subscribeToContextCreatedMessages();\r\n this.subscribeToContextUpdatedMessages();\r\n this.subscribeToContextDestroyedMessages();\r\n (_a = this._connection.replayer) === null || _a === void 0 ? void 0 : _a.drain(ContextMessageReplaySpec.name, function (message) {\r\n var type = message.type;\r\n if (!type) {\r\n return;\r\n }\r\n if (type === GW_MESSAGE_CONTEXT_CREATED ||\r\n type === GW_MESSAGE_CONTEXT_ADDED ||\r\n type === GW_MESSAGE_ACTIVITY_CREATED) {\r\n _this.handleContextCreatedMessage(message);\r\n }\r\n else if (type === GW_MESSAGE_SUBSCRIBED_CONTEXT ||\r\n type === GW_MESSAGE_CONTEXT_UPDATED ||\r\n type === GW_MESSAGE_JOINED_ACTIVITY) {\r\n _this.handleContextUpdatedMessage(message);\r\n }\r\n else if (type === GW_MESSAGE_CONTEXT_DESTROYED ||\r\n type === GW_MESSAGE_ACTIVITY_DESTROYED) {\r\n _this.handleContextDestroyedMessage(message);\r\n }\r\n });\r\n }\r\n Object.defineProperty(GW3Bridge.prototype, \"protocolVersion\", {\r\n get: function () {\r\n var _a;\r\n if (!this._protocolVersion) {\r\n var contextsDomainInfo = this._connection.availableDomains.find(function (d) { return d.uri === \"context\"; });\r\n this._protocolVersion = (_a = contextsDomainInfo === null || contextsDomainInfo === void 0 ? void 0 : contextsDomainInfo.version) !== null && _a !== void 0 ? _a : 1;\r\n }\r\n return this._protocolVersion;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(GW3Bridge.prototype, \"setPathSupported\", {\r\n get: function () {\r\n return this.protocolVersion >= 2;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n GW3Bridge.prototype.dispose = function () {\r\n for (var _i = 0, _a = this._gw3Subscriptions; _i < _a.length; _i++) {\r\n var sub = _a[_i];\r\n this._connection.off(sub);\r\n }\r\n this._gw3Subscriptions.length = 0;\r\n for (var contextName in this._contextNameToData) {\r\n if (this._contextNameToId.hasOwnProperty(contextName)) {\r\n delete this._contextNameToData[contextName];\r\n }\r\n }\r\n };\r\n GW3Bridge.prototype.createContext = function (name, data) {\r\n var _this = this;\r\n if (name in this._creationPromises) {\r\n return this._creationPromises[name];\r\n }\r\n this._creationPromises[name] =\r\n this._gw3Session\r\n .send({\r\n type: GW_MESSAGE_CREATE_CONTEXT,\r\n domain: \"global\",\r\n name: name,\r\n data: data,\r\n lifetime: \"retained\",\r\n })\r\n .then(function (createContextMsg) {\r\n _this._contextNameToId[name] = createContextMsg.context_id;\r\n _this._contextIdToName[createContextMsg.context_id] = name;\r\n var contextData = _this._contextNameToData[name] || new GW3ContextData(createContextMsg.context_id, name, true, undefined);\r\n contextData.isAnnounced = true;\r\n contextData.name = name;\r\n contextData.contextId = createContextMsg.context_id;\r\n contextData.context = createContextMsg.data || deepClone(data);\r\n contextData.hasReceivedSnapshot = true;\r\n _this._contextNameToData[name] = contextData;\r\n delete _this._creationPromises[name];\r\n return createContextMsg.context_id;\r\n });\r\n return this._creationPromises[name];\r\n };\r\n GW3Bridge.prototype.all = function () {\r\n var _this = this;\r\n return Object.keys(this._contextNameToData)\r\n .filter(function (name) { return _this._contextNameToData[name].isAnnounced; });\r\n };\r\n GW3Bridge.prototype.update = function (name, delta) {\r\n var _a;\r\n return __awaiter(this, void 0, void 0, function () {\r\n var contextData, currentContext, calculatedDelta;\r\n var _this = this;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n if (delta) {\r\n delta = deepClone(delta);\r\n }\r\n if (!(name in this._creationPromises)) return [3, 2];\r\n return [4, this._creationPromises[name]];\r\n case 1:\r\n _b.sent();\r\n _b.label = 2;\r\n case 2:\r\n contextData = this._contextNameToData[name];\r\n if (!contextData || !contextData.isAnnounced) {\r\n return [2, this.createContext(name, delta)];\r\n }\r\n currentContext = contextData.context;\r\n if (!!contextData.hasCallbacks()) return [3, 4];\r\n return [4, this.get(contextData.name)];\r\n case 3:\r\n currentContext = _b.sent();\r\n _b.label = 4;\r\n case 4:\r\n calculatedDelta = this.protocolVersion === 2 ?\r\n this.calculateContextDeltaV2(currentContext, delta) :\r\n this.calculateContextDeltaV1(currentContext, delta);\r\n if (!Object.keys(calculatedDelta.added).length\r\n && !Object.keys(calculatedDelta.updated).length\r\n && !calculatedDelta.removed.length\r\n && !((_a = calculatedDelta.commands) === null || _a === void 0 ? void 0 : _a.length)) {\r\n return [2, Promise.resolve()];\r\n }\r\n return [2, this._gw3Session\r\n .send({\r\n type: GW_MESSAGE_UPDATE_CONTEXT,\r\n domain: \"global\",\r\n context_id: contextData.contextId,\r\n delta: calculatedDelta,\r\n }, {}, { skipPeerId: false })\r\n .then(function (gwResponse) {\r\n _this.handleUpdated(contextData, calculatedDelta, {\r\n updaterId: gwResponse.peer_id\r\n });\r\n })];\r\n }\r\n });\r\n });\r\n };\r\n GW3Bridge.prototype.set = function (name, data) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var contextData;\r\n var _this = this;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (data) {\r\n data = deepClone(data);\r\n }\r\n if (!(name in this._creationPromises)) return [3, 2];\r\n return [4, this._creationPromises[name]];\r\n case 1:\r\n _a.sent();\r\n _a.label = 2;\r\n case 2:\r\n contextData = this._contextNameToData[name];\r\n if (!contextData || !contextData.isAnnounced) {\r\n return [2, this.createContext(name, data)];\r\n }\r\n return [2, this._gw3Session\r\n .send({\r\n type: GW_MESSAGE_UPDATE_CONTEXT,\r\n domain: \"global\",\r\n context_id: contextData.contextId,\r\n delta: { reset: data },\r\n }, {}, { skipPeerId: false })\r\n .then(function (gwResponse) {\r\n _this.handleUpdated(contextData, {\r\n reset: data,\r\n added: {},\r\n removed: [],\r\n updated: {}\r\n }, {\r\n updaterId: gwResponse.peer_id\r\n });\r\n })];\r\n }\r\n });\r\n });\r\n };\r\n GW3Bridge.prototype.setPath = function (name, path, value) {\r\n if (!this.setPathSupported) {\r\n return Promise.reject(\"glue.contexts.setPath operation is not supported, use Glue42 3.10 or later\");\r\n }\r\n return this.setPaths(name, [{ path: path, value: value }]);\r\n };\r\n GW3Bridge.prototype.setPaths = function (name, pathValues) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var contextData, obj, _i, pathValues_1, pathValue, commands, _a, pathValues_2, pathValue;\r\n var _this = this;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n if (!this.setPathSupported) {\r\n return [2, Promise.reject(\"glue.contexts.setPaths operation is not supported, use Glue42 3.10 or later\")];\r\n }\r\n if (pathValues) {\r\n pathValues = deepClone(pathValues);\r\n }\r\n if (!(name in this._creationPromises)) return [3, 2];\r\n return [4, this._creationPromises[name]];\r\n case 1:\r\n _b.sent();\r\n _b.label = 2;\r\n case 2:\r\n contextData = this._contextNameToData[name];\r\n if (!contextData || !contextData.isAnnounced) {\r\n obj = {};\r\n for (_i = 0, pathValues_1 = pathValues; _i < pathValues_1.length; _i++) {\r\n pathValue = pathValues_1[_i];\r\n setValueToPath(obj, pathValue.value, pathValue.path);\r\n }\r\n return [2, this.createContext(name, obj)];\r\n }\r\n commands = [];\r\n for (_a = 0, pathValues_2 = pathValues; _a < pathValues_2.length; _a++) {\r\n pathValue = pathValues_2[_a];\r\n if (pathValue.value === null) {\r\n commands.push({ type: \"remove\", path: pathValue.path });\r\n }\r\n else {\r\n commands.push({ type: \"set\", path: pathValue.path, value: pathValue.value });\r\n }\r\n }\r\n return [2, this._gw3Session\r\n .send({\r\n type: GW_MESSAGE_UPDATE_CONTEXT,\r\n domain: \"global\",\r\n context_id: contextData.contextId,\r\n delta: { commands: commands }\r\n }, {}, { skipPeerId: false })\r\n .then(function (gwResponse) {\r\n _this.handleUpdated(contextData, {\r\n added: {},\r\n removed: [],\r\n updated: {},\r\n commands: commands\r\n }, {\r\n updaterId: gwResponse.peer_id\r\n });\r\n })];\r\n }\r\n });\r\n });\r\n };\r\n GW3Bridge.prototype.get = function (name) {\r\n var _a;\r\n return __awaiter(this, void 0, void 0, function () {\r\n var contextData, context;\r\n var _this = this;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n if (!(name in this._creationPromises)) return [3, 2];\r\n return [4, this._creationPromises[name]];\r\n case 1:\r\n _b.sent();\r\n _b.label = 2;\r\n case 2:\r\n contextData = this._contextNameToData[name];\r\n if (!contextData || !contextData.isAnnounced) {\r\n return [2, Promise.resolve({})];\r\n }\r\n if (contextData && (!contextData.hasCallbacks() || !contextData.hasReceivedSnapshot)) {\r\n return [2, new Promise(function (resolve) {\r\n _this.subscribe(name, function (data, _d, _r, un) {\r\n _this.unsubscribe(un);\r\n resolve(data);\r\n });\r\n })];\r\n }\r\n context = (_a = contextData === null || contextData === void 0 ? void 0 : contextData.context) !== null && _a !== void 0 ? _a : {};\r\n return [2, Promise.resolve(deepClone(context))];\r\n }\r\n });\r\n });\r\n };\r\n GW3Bridge.prototype.subscribe = function (name, callback, subscriptionKey) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var thisCallbackSubscriptionNumber, contextData, hadCallbacks, clone, clone, clone;\r\n var _this = this;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (!(name in this._creationPromises)) return [3, 2];\r\n return [4, this._creationPromises[name]];\r\n case 1:\r\n _a.sent();\r\n _a.label = 2;\r\n case 2:\r\n thisCallbackSubscriptionNumber = typeof subscriptionKey === \"undefined\" ? this._nextCallbackSubscriptionNumber : subscriptionKey;\r\n if (typeof subscriptionKey === \"undefined\") {\r\n this._nextCallbackSubscriptionNumber += 1;\r\n }\r\n if (this._contextsSubscriptionsCache.every(function (subscription) { return subscription.subKey !== _this._nextCallbackSubscriptionNumber; })) {\r\n this._contextsSubscriptionsCache.push({ contextName: name, subKey: thisCallbackSubscriptionNumber, callback: callback });\r\n }\r\n contextData = this._contextNameToData[name];\r\n if (!contextData ||\r\n !contextData.isAnnounced) {\r\n contextData = contextData || new GW3ContextData(undefined, name, false, undefined);\r\n this._contextNameToData[name] = contextData;\r\n contextData.updateCallbacks[thisCallbackSubscriptionNumber] = callback;\r\n return [2, Promise.resolve(thisCallbackSubscriptionNumber)];\r\n }\r\n hadCallbacks = contextData.hasCallbacks();\r\n contextData.updateCallbacks[thisCallbackSubscriptionNumber] = callback;\r\n if (!hadCallbacks) {\r\n if (!contextData.joinedActivity) {\r\n if (contextData.context && contextData.sentExplicitSubscription) {\r\n if (contextData.hasReceivedSnapshot) {\r\n clone = deepClone(contextData.context);\r\n callback(clone, clone, [], thisCallbackSubscriptionNumber);\r\n }\r\n return [2, Promise.resolve(thisCallbackSubscriptionNumber)];\r\n }\r\n return [2, this.sendSubscribe(contextData)\r\n .then(function () { return thisCallbackSubscriptionNumber; })];\r\n }\r\n else {\r\n if (contextData.hasReceivedSnapshot) {\r\n clone = deepClone(contextData.context);\r\n callback(clone, clone, [], thisCallbackSubscriptionNumber);\r\n }\r\n return [2, Promise.resolve(thisCallbackSubscriptionNumber)];\r\n }\r\n }\r\n else {\r\n if (contextData.hasReceivedSnapshot) {\r\n clone = deepClone(contextData.context);\r\n callback(clone, clone, [], thisCallbackSubscriptionNumber);\r\n }\r\n return [2, Promise.resolve(thisCallbackSubscriptionNumber)];\r\n }\r\n }\r\n });\r\n });\r\n };\r\n GW3Bridge.prototype.unsubscribe = function (subscriptionKey) {\r\n this._contextsSubscriptionsCache = this._contextsSubscriptionsCache.filter(function (subscription) { return subscription.subKey !== subscriptionKey; });\r\n for (var _i = 0, _a = Object.keys(this._contextNameToData); _i < _a.length; _i++) {\r\n var name_1 = _a[_i];\r\n var contextData = this._contextNameToData[name_1];\r\n if (!contextData) {\r\n return;\r\n }\r\n var hadCallbacks = contextData.hasCallbacks();\r\n delete contextData.updateCallbacks[subscriptionKey];\r\n if (contextData.isAnnounced &&\r\n hadCallbacks &&\r\n !contextData.hasCallbacks() &&\r\n contextData.sentExplicitSubscription) {\r\n this.sendUnsubscribe(contextData);\r\n }\r\n if (!contextData.isAnnounced &&\r\n !contextData.hasCallbacks()) {\r\n delete this._contextNameToData[name_1];\r\n }\r\n }\r\n };\r\n GW3Bridge.prototype.destroy = function (name) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var contextData;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (!(name in this._creationPromises)) return [3, 2];\r\n return [4, this._creationPromises[name]];\r\n case 1:\r\n _a.sent();\r\n _a.label = 2;\r\n case 2:\r\n contextData = this._contextNameToData[name];\r\n if (!contextData) {\r\n return [2, Promise.reject(\"context with \".concat(name, \" does not exist\"))];\r\n }\r\n return [2, this._gw3Session\r\n .send({\r\n type: GW_MESSAGE_DESTROY_CONTEXT,\r\n domain: \"global\",\r\n context_id: contextData.contextId,\r\n }).then(function (_) { return undefined; })];\r\n }\r\n });\r\n });\r\n };\r\n GW3Bridge.prototype.handleUpdated = function (contextData, delta, extraData) {\r\n var oldContext = contextData.context;\r\n contextData.context = applyContextDelta(contextData.context, delta, this._logger);\r\n contextData.hasReceivedSnapshot = true;\r\n if (this._contextNameToData[contextData.name] === contextData &&\r\n !deepEqual(oldContext, contextData.context)) {\r\n this.invokeUpdateCallbacks(contextData, delta, extraData);\r\n }\r\n };\r\n GW3Bridge.prototype.subscribeToContextCreatedMessages = function () {\r\n var createdMessageTypes = [\r\n GW_MESSAGE_CONTEXT_ADDED,\r\n GW_MESSAGE_CONTEXT_CREATED,\r\n GW_MESSAGE_ACTIVITY_CREATED,\r\n ];\r\n for (var _i = 0, createdMessageTypes_1 = createdMessageTypes; _i < createdMessageTypes_1.length; _i++) {\r\n var createdMessageType = createdMessageTypes_1[_i];\r\n var sub = this._connection.on(createdMessageType, this.handleContextCreatedMessage.bind(this));\r\n this._gw3Subscriptions.push(sub);\r\n }\r\n };\r\n GW3Bridge.prototype.handleContextCreatedMessage = function (contextCreatedMsg) {\r\n var _this = this;\r\n var createdMessageType = contextCreatedMsg.type;\r\n if (createdMessageType === GW_MESSAGE_ACTIVITY_CREATED) {\r\n this._contextNameToId[contextCreatedMsg.activity_id] = contextCreatedMsg.context_id;\r\n this._contextIdToName[contextCreatedMsg.context_id] = contextCreatedMsg.activity_id;\r\n }\r\n else if (createdMessageType === GW_MESSAGE_CONTEXT_ADDED) {\r\n this._contextNameToId[contextCreatedMsg.name] = contextCreatedMsg.context_id;\r\n this._contextIdToName[contextCreatedMsg.context_id] = contextCreatedMsg.name;\r\n }\r\n else ;\r\n var name = this._contextIdToName[contextCreatedMsg.context_id];\r\n if (!name) {\r\n throw new Error(\"Received created event for context with unknown name: \" + contextCreatedMsg.context_id);\r\n }\r\n if (!this._contextNameToId[name]) {\r\n throw new Error(\"Received created event for context with unknown id: \" + contextCreatedMsg.context_id);\r\n }\r\n var contextData = this._contextNameToData[name];\r\n if (contextData) {\r\n if (contextData.isAnnounced) {\r\n return;\r\n }\r\n else {\r\n if (!contextData.hasCallbacks()) {\r\n throw new Error(\"Assertion failure: contextData.hasCallbacks()\");\r\n }\r\n contextData.isAnnounced = true;\r\n contextData.contextId = contextCreatedMsg.context_id;\r\n contextData.activityId = contextCreatedMsg.activity_id;\r\n if (!contextData.sentExplicitSubscription) {\r\n this.sendSubscribe(contextData);\r\n }\r\n }\r\n }\r\n else {\r\n this._contextNameToData[name] = contextData =\r\n new GW3ContextData(contextCreatedMsg.context_id, name, true, contextCreatedMsg.activity_id);\r\n if (this._trackAllContexts) {\r\n this.subscribe(name, function () { }).then(function (subKey) { return _this._systemContextsSubKey = subKey; });\r\n }\r\n }\r\n };\r\n GW3Bridge.prototype.subscribeToContextUpdatedMessages = function () {\r\n var updatedMessageTypes = [\r\n GW_MESSAGE_CONTEXT_UPDATED,\r\n GW_MESSAGE_SUBSCRIBED_CONTEXT,\r\n GW_MESSAGE_JOINED_ACTIVITY,\r\n ];\r\n for (var _i = 0, updatedMessageTypes_1 = updatedMessageTypes; _i < updatedMessageTypes_1.length; _i++) {\r\n var updatedMessageType = updatedMessageTypes_1[_i];\r\n var sub = this._connection.on(updatedMessageType, this.handleContextUpdatedMessage.bind(this));\r\n this._gw3Subscriptions.push(sub);\r\n }\r\n };\r\n GW3Bridge.prototype.handleContextUpdatedMessage = function (contextUpdatedMsg) {\r\n var updatedMessageType = contextUpdatedMsg.type;\r\n var contextId = contextUpdatedMsg.context_id;\r\n var contextData = this._contextNameToData[this._contextIdToName[contextId]];\r\n var justSeen = !contextData || !contextData.isAnnounced;\r\n if (updatedMessageType === GW_MESSAGE_JOINED_ACTIVITY) {\r\n if (!contextData) {\r\n contextData =\r\n this._contextNameToData[contextUpdatedMsg.activity_id] ||\r\n new GW3ContextData(contextId, contextUpdatedMsg.activity_id, true, contextUpdatedMsg.activity_id);\r\n }\r\n this._contextNameToData[contextUpdatedMsg.activity_id] = contextData;\r\n this._contextIdToName[contextId] = contextUpdatedMsg.activity_id;\r\n this._contextNameToId[contextUpdatedMsg.activity_id] = contextId;\r\n contextData.contextId = contextId;\r\n contextData.isAnnounced = true;\r\n contextData.activityId = contextUpdatedMsg.activity_id;\r\n contextData.joinedActivity = true;\r\n }\r\n else {\r\n if (!contextData || !contextData.isAnnounced) {\r\n if (updatedMessageType === GW_MESSAGE_SUBSCRIBED_CONTEXT) {\r\n contextData = contextData || new GW3ContextData(contextId, contextUpdatedMsg.name, true, undefined);\r\n contextData.sentExplicitSubscription = true;\r\n this._contextNameToData[contextUpdatedMsg.name] = contextData;\r\n this._contextIdToName[contextId] = contextUpdatedMsg.name;\r\n this._contextNameToId[contextUpdatedMsg.name] = contextId;\r\n }\r\n else {\r\n this._logger.error(\"Received 'update' for unknown context: \".concat(contextId));\r\n }\r\n return;\r\n }\r\n }\r\n var oldContext = contextData.context;\r\n contextData.hasReceivedSnapshot = true;\r\n if (updatedMessageType === GW_MESSAGE_SUBSCRIBED_CONTEXT) {\r\n contextData.context = contextUpdatedMsg.data || {};\r\n }\r\n else if (updatedMessageType === GW_MESSAGE_JOINED_ACTIVITY) {\r\n contextData.context = contextUpdatedMsg.context_snapshot || {};\r\n }\r\n else if (updatedMessageType === GW_MESSAGE_CONTEXT_UPDATED) {\r\n contextData.context = applyContextDelta(contextData.context, contextUpdatedMsg.delta, this._logger);\r\n }\r\n else {\r\n throw new Error(\"Unrecognized context update message \" + updatedMessageType);\r\n }\r\n if (justSeen ||\r\n !deepEqual(contextData.context, oldContext) ||\r\n updatedMessageType === GW_MESSAGE_SUBSCRIBED_CONTEXT) {\r\n this.invokeUpdateCallbacks(contextData, contextUpdatedMsg.delta, { updaterId: contextUpdatedMsg.updater_id });\r\n }\r\n };\r\n GW3Bridge.prototype.invokeUpdateCallbacks = function (contextData, delta, extraData) {\r\n delta = delta || { added: {}, updated: {}, reset: {}, removed: [] };\r\n if (delta.commands) {\r\n delta.added = delta.updated = delta.reset = {};\r\n delta.removed = [];\r\n for (var _i = 0, _a = delta.commands; _i < _a.length; _i++) {\r\n var command = _a[_i];\r\n if (command.type === \"remove\") {\r\n if (command.path.indexOf(\".\") === -1) {\r\n delta.removed.push(command.path);\r\n }\r\n setValueToPath(delta.updated, null, command.path);\r\n }\r\n else if (command.type === \"set\") {\r\n setValueToPath(delta.updated, command.value, command.path);\r\n }\r\n }\r\n }\r\n for (var updateCallbackIndex in contextData.updateCallbacks) {\r\n if (contextData.updateCallbacks.hasOwnProperty(updateCallbackIndex)) {\r\n try {\r\n var updateCallback = contextData.updateCallbacks[updateCallbackIndex];\r\n updateCallback(deepClone(contextData.context), deepClone(Object.assign({}, delta.added || {}, delta.updated || {}, delta.reset || {})), delta.removed, parseInt(updateCallbackIndex, 10), extraData);\r\n }\r\n catch (err) {\r\n this._logger.debug(\"callback error: \" + JSON.stringify(err));\r\n }\r\n }\r\n }\r\n };\r\n GW3Bridge.prototype.subscribeToContextDestroyedMessages = function () {\r\n var destroyedMessageTypes = [\r\n GW_MESSAGE_CONTEXT_DESTROYED,\r\n GW_MESSAGE_ACTIVITY_DESTROYED,\r\n ];\r\n for (var _i = 0, destroyedMessageTypes_1 = destroyedMessageTypes; _i < destroyedMessageTypes_1.length; _i++) {\r\n var destroyedMessageType = destroyedMessageTypes_1[_i];\r\n var sub = this._connection.on(destroyedMessageType, this.handleContextDestroyedMessage.bind(this));\r\n this._gw3Subscriptions.push(sub);\r\n }\r\n };\r\n GW3Bridge.prototype.handleContextDestroyedMessage = function (destroyedMsg) {\r\n var destroyedMessageType = destroyedMsg.type;\r\n var contextId;\r\n var name;\r\n if (destroyedMessageType === GW_MESSAGE_ACTIVITY_DESTROYED) {\r\n name = destroyedMsg.activity_id;\r\n contextId = this._contextNameToId[name];\r\n if (!contextId) {\r\n this._logger.error(\"Received 'destroyed' for unknown activity: \".concat(destroyedMsg.activity_id));\r\n return;\r\n }\r\n }\r\n else {\r\n contextId = destroyedMsg.context_id;\r\n name = this._contextIdToName[contextId];\r\n if (!name) {\r\n this._logger.error(\"Received 'destroyed' for unknown context: \".concat(destroyedMsg.context_id));\r\n return;\r\n }\r\n }\r\n delete this._contextIdToName[contextId];\r\n delete this._contextNameToId[name];\r\n var contextData = this._contextNameToData[name];\r\n delete this._contextNameToData[name];\r\n if (!contextData || !contextData.isAnnounced) {\r\n this._logger.error(\"Received 'destroyed' for unknown context: \".concat(contextId));\r\n return;\r\n }\r\n };\r\n GW3Bridge.prototype.sendSubscribe = function (contextData) {\r\n contextData.sentExplicitSubscription = true;\r\n return this._gw3Session\r\n .send({\r\n type: GW_MESSAGE_SUBSCRIBE_CONTEXT,\r\n domain: \"global\",\r\n context_id: contextData.contextId,\r\n }).then(function (_) { return undefined; });\r\n };\r\n GW3Bridge.prototype.sendUnsubscribe = function (contextData) {\r\n contextData.sentExplicitSubscription = false;\r\n return this._gw3Session\r\n .send({\r\n type: GW_MESSAGE_UNSUBSCRIBE_CONTEXT,\r\n domain: \"global\",\r\n context_id: contextData.contextId,\r\n }).then(function (_) { return undefined; });\r\n };\r\n GW3Bridge.prototype.calculateContextDeltaV1 = function (from, to) {\r\n var delta = { added: {}, updated: {}, removed: [], reset: undefined };\r\n if (from) {\r\n for (var _i = 0, _a = Object.keys(from); _i < _a.length; _i++) {\r\n var x = _a[_i];\r\n if (Object.keys(to).indexOf(x) !== -1\r\n && to[x] !== null\r\n && !deepEqual(from[x], to[x])) {\r\n delta.updated[x] = to[x];\r\n }\r\n }\r\n }\r\n for (var _b = 0, _c = Object.keys(to); _b < _c.length; _b++) {\r\n var x = _c[_b];\r\n if (!from || (Object.keys(from).indexOf(x) === -1)) {\r\n if (to[x] !== null) {\r\n delta.added[x] = to[x];\r\n }\r\n }\r\n else if (to[x] === null) {\r\n delta.removed.push(x);\r\n }\r\n }\r\n return delta;\r\n };\r\n GW3Bridge.prototype.calculateContextDeltaV2 = function (from, to) {\r\n var _a, _b;\r\n var delta = { added: {}, updated: {}, removed: [], reset: undefined, commands: [] };\r\n for (var _i = 0, _c = Object.keys(to); _i < _c.length; _i++) {\r\n var x = _c[_i];\r\n if (to[x] !== null) {\r\n var fromX = from ? from[x] : null;\r\n if (!deepEqual(fromX, to[x])) {\r\n (_a = delta.commands) === null || _a === void 0 ? void 0 : _a.push({ type: \"set\", path: x, value: to[x] });\r\n }\r\n }\r\n else {\r\n (_b = delta.commands) === null || _b === void 0 ? void 0 : _b.push({ type: \"remove\", path: x });\r\n }\r\n }\r\n return delta;\r\n };\r\n GW3Bridge.prototype.resetState = function () {\r\n var _this = this;\r\n for (var _i = 0, _a = this._gw3Subscriptions; _i < _a.length; _i++) {\r\n var sub = _a[_i];\r\n this._connection.off(sub);\r\n }\r\n if (this._systemContextsSubKey) {\r\n this.unsubscribe(this._systemContextsSubKey);\r\n delete this._systemContextsSubKey;\r\n }\r\n this._gw3Subscriptions = [];\r\n this._contextNameToId = {};\r\n this._contextIdToName = {};\r\n delete this._protocolVersion;\r\n this._contextsTempCache = Object.keys(this._contextNameToData).reduce(function (cacheSoFar, ctxName) {\r\n cacheSoFar[ctxName] = _this._contextNameToData[ctxName].context;\r\n return cacheSoFar;\r\n }, {});\r\n this._contextNameToData = {};\r\n };\r\n GW3Bridge.prototype.reInitiateState = function () {\r\n var _a;\r\n return __awaiter(this, void 0, void 0, function () {\r\n var _b, _c, _e, _i, ctxName, lastKnownData;\r\n var _this = this;\r\n return __generator(this, function (_f) {\r\n switch (_f.label) {\r\n case 0:\r\n this.subscribeToContextCreatedMessages();\r\n this.subscribeToContextUpdatedMessages();\r\n this.subscribeToContextDestroyedMessages();\r\n (_a = this._connection.replayer) === null || _a === void 0 ? void 0 : _a.drain(ContextMessageReplaySpec.name, function (message) {\r\n var type = message.type;\r\n if (!type) {\r\n return;\r\n }\r\n if (type === GW_MESSAGE_CONTEXT_CREATED ||\r\n type === GW_MESSAGE_CONTEXT_ADDED ||\r\n type === GW_MESSAGE_ACTIVITY_CREATED) {\r\n _this.handleContextCreatedMessage(message);\r\n }\r\n else if (type === GW_MESSAGE_SUBSCRIBED_CONTEXT ||\r\n type === GW_MESSAGE_CONTEXT_UPDATED ||\r\n type === GW_MESSAGE_JOINED_ACTIVITY) {\r\n _this.handleContextUpdatedMessage(message);\r\n }\r\n else if (type === GW_MESSAGE_CONTEXT_DESTROYED ||\r\n type === GW_MESSAGE_ACTIVITY_DESTROYED) {\r\n _this.handleContextDestroyedMessage(message);\r\n }\r\n });\r\n return [4, Promise.all(this._contextsSubscriptionsCache.map(function (subscription) { return _this.subscribe(subscription.contextName, subscription.callback, subscription.subKey); }))];\r\n case 1:\r\n _f.sent();\r\n return [4, this.flushQueue()];\r\n case 2:\r\n _f.sent();\r\n _b = this._contextsTempCache;\r\n _c = [];\r\n for (_e in _b)\r\n _c.push(_e);\r\n _i = 0;\r\n _f.label = 3;\r\n case 3:\r\n if (!(_i < _c.length)) return [3, 7];\r\n _e = _c[_i];\r\n if (!(_e in _b)) return [3, 6];\r\n ctxName = _e;\r\n if (typeof this._contextsTempCache[ctxName] !== \"object\" || Object.keys(this._contextsTempCache[ctxName]).length === 0) {\r\n return [3, 6];\r\n }\r\n lastKnownData = this._contextsTempCache[ctxName];\r\n this._logger.info(\"Re-announcing known context: \".concat(ctxName));\r\n return [4, this.flushQueue()];\r\n case 4:\r\n _f.sent();\r\n return [4, this.update(ctxName, lastKnownData)];\r\n case 5:\r\n _f.sent();\r\n _f.label = 6;\r\n case 6:\r\n _i++;\r\n return [3, 3];\r\n case 7:\r\n this._contextsTempCache = {};\r\n this._logger.info(\"Contexts are re-announced\");\r\n return [2];\r\n }\r\n });\r\n });\r\n };\r\n GW3Bridge.prototype.flushQueue = function () {\r\n return new Promise(function (resolve) { return setTimeout(function () { return resolve(); }, 0); });\r\n };\r\n return GW3Bridge;\r\n}());\n\nvar ContextsModule = (function () {\r\n function ContextsModule(config) {\r\n this._bridge = new GW3Bridge(config);\r\n }\r\n ContextsModule.prototype.all = function () {\r\n return this._bridge.all();\r\n };\r\n ContextsModule.prototype.update = function (name, data) {\r\n this.checkName(name);\r\n this.checkData(data);\r\n return this._bridge.update(name, data);\r\n };\r\n ContextsModule.prototype.set = function (name, data) {\r\n this.checkName(name);\r\n this.checkData(data);\r\n return this._bridge.set(name, data);\r\n };\r\n ContextsModule.prototype.setPath = function (name, path, data) {\r\n this.checkName(name);\r\n this.checkPath(path);\r\n var isTopLevelPath = path === \"\";\r\n if (isTopLevelPath) {\r\n this.checkData(data);\r\n return this.set(name, data);\r\n }\r\n return this._bridge.setPath(name, path, data);\r\n };\r\n ContextsModule.prototype.setPaths = function (name, paths) {\r\n this.checkName(name);\r\n if (!Array.isArray(paths)) {\r\n throw new Error(\"Please provide the paths as an array of PathValues!\");\r\n }\r\n for (var _i = 0, paths_1 = paths; _i < paths_1.length; _i++) {\r\n var _a = paths_1[_i], path = _a.path, value = _a.value;\r\n this.checkPath(path);\r\n var isTopLevelPath = path === \"\";\r\n if (isTopLevelPath) {\r\n this.checkData(value);\r\n }\r\n }\r\n return this._bridge.setPaths(name, paths);\r\n };\r\n ContextsModule.prototype.subscribe = function (name, callback) {\r\n var _this = this;\r\n this.checkName(name);\r\n if (typeof callback !== \"function\") {\r\n throw new Error(\"Please provide the callback as a function!\");\r\n }\r\n return this._bridge\r\n .subscribe(name, function (data, delta, removed, key, extraData) { return callback(data, delta, removed, function () { return _this._bridge.unsubscribe(key); }, extraData); })\r\n .then(function (key) {\r\n return function () {\r\n _this._bridge.unsubscribe(key);\r\n };\r\n });\r\n };\r\n ContextsModule.prototype.get = function (name) {\r\n this.checkName(name);\r\n return this._bridge.get(name);\r\n };\r\n ContextsModule.prototype.ready = function () {\r\n return Promise.resolve(this);\r\n };\r\n ContextsModule.prototype.destroy = function (name) {\r\n this.checkName(name);\r\n return this._bridge.destroy(name);\r\n };\r\n Object.defineProperty(ContextsModule.prototype, \"setPathSupported\", {\r\n get: function () {\r\n return this._bridge.setPathSupported;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n ContextsModule.prototype.checkName = function (name) {\r\n if (typeof name !== \"string\" || name === \"\") {\r\n throw new Error(\"Please provide the name as a non-empty string!\");\r\n }\r\n };\r\n ContextsModule.prototype.checkPath = function (path) {\r\n if (typeof path !== \"string\") {\r\n throw new Error(\"Please provide the path as a dot delimited string!\");\r\n }\r\n };\r\n ContextsModule.prototype.checkData = function (data) {\r\n if (typeof data !== \"object\") {\r\n throw new Error(\"Please provide the data as an object!\");\r\n }\r\n };\r\n return ContextsModule;\r\n}());\n\nfunction promisify (promise, successCallback, errorCallback) {\r\n if (typeof successCallback !== \"function\" && typeof errorCallback !== \"function\") {\r\n return promise;\r\n }\r\n if (typeof successCallback !== \"function\") {\r\n successCallback = function () { };\r\n }\r\n else if (typeof errorCallback !== \"function\") {\r\n errorCallback = function () { };\r\n }\r\n return promise.then(successCallback, errorCallback);\r\n}\n\nfunction rejectAfter(ms, promise, error) {\r\n if (ms === void 0) { ms = 0; }\r\n var timeout;\r\n var clearTimeoutIfThere = function () {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n }\r\n };\r\n promise\r\n .then(function () {\r\n clearTimeoutIfThere();\r\n })\r\n .catch(function () {\r\n clearTimeoutIfThere();\r\n });\r\n return new Promise(function (resolve, reject) {\r\n timeout = setTimeout(function () { return reject(error); }, ms);\r\n });\r\n}\n\nvar InvokeStatus;\r\n(function (InvokeStatus) {\r\n InvokeStatus[InvokeStatus[\"Success\"] = 0] = \"Success\";\r\n InvokeStatus[InvokeStatus[\"Error\"] = 1] = \"Error\";\r\n})(InvokeStatus || (InvokeStatus = {}));\r\nvar Client = (function () {\r\n function Client(protocol, repo, instance, configuration) {\r\n this.protocol = protocol;\r\n this.repo = repo;\r\n this.instance = instance;\r\n this.configuration = configuration;\r\n }\r\n Client.prototype.subscribe = function (method, options, successCallback, errorCallback, existingSub) {\r\n var _this = this;\r\n var callProtocolSubscribe = function (targetServers, stream, successProxy, errorProxy) {\r\n var _a;\r\n options.methodResponseTimeout = (_a = options.methodResponseTimeout) !== null && _a !== void 0 ? _a : options.waitTimeoutMs;\r\n _this.protocol.client.subscribe(stream, options, targetServers, successProxy, errorProxy, existingSub);\r\n };\r\n var promise = new Promise(function (resolve, reject) {\r\n var successProxy = function (sub) {\r\n resolve(sub);\r\n };\r\n var errorProxy = function (err) {\r\n reject(err);\r\n };\r\n if (!method) {\r\n reject(\"Method definition is required. Please, provide either a unique string for a method name or a \\u201CmethodDefinition\\u201D object with a required \\u201Cname\\u201D property.\");\r\n return;\r\n }\r\n var methodDef;\r\n if (typeof method === \"string\") {\r\n methodDef = { name: method };\r\n }\r\n else {\r\n methodDef = method;\r\n }\r\n if (!methodDef.name) {\r\n reject(\"Method definition is required. Please, provide either a unique string for a method name or a \\u201CmethodDefinition\\u201D object with a required \\u201Cname\\u201D property.\");\r\n return;\r\n }\r\n if (options === undefined) {\r\n options = {};\r\n }\r\n var target = options.target;\r\n if (target === undefined) {\r\n target = \"best\";\r\n }\r\n if (typeof target === \"string\" && target !== \"all\" && target !== \"best\") {\r\n reject(new Error(\"\\\"\".concat(target, \"\\\" is not a valid target. Valid targets are \\\"all\\\", \\\"best\\\", or an instance.\")));\r\n return;\r\n }\r\n if (options.methodResponseTimeout === undefined) {\r\n options.methodResponseTimeout = options.method_response_timeout;\r\n if (options.methodResponseTimeout === undefined) {\r\n options.methodResponseTimeout = _this.configuration.methodResponseTimeout;\r\n }\r\n }\r\n if (options.waitTimeoutMs === undefined) {\r\n options.waitTimeoutMs = options.wait_for_method_timeout;\r\n if (options.waitTimeoutMs === undefined) {\r\n options.waitTimeoutMs = _this.configuration.waitTimeoutMs;\r\n }\r\n }\r\n var delayStep = 500;\r\n var delayTillNow = 0;\r\n var currentServers = _this.getServerMethodsByFilterAndTarget(methodDef, target);\r\n if (currentServers.length > 0) {\r\n callProtocolSubscribe(currentServers, currentServers[0].methods[0], successProxy, errorProxy);\r\n }\r\n else {\r\n var retry_1 = function () {\r\n if (!target || !(options.waitTimeoutMs)) {\r\n return;\r\n }\r\n delayTillNow += delayStep;\r\n currentServers = _this.getServerMethodsByFilterAndTarget(methodDef, target);\r\n if (currentServers.length > 0) {\r\n var streamInfo = currentServers[0].methods[0];\r\n callProtocolSubscribe(currentServers, streamInfo, successProxy, errorProxy);\r\n }\r\n else if (delayTillNow >= options.waitTimeoutMs) {\r\n var def = typeof method === \"string\" ? { name: method } : method;\r\n callProtocolSubscribe(currentServers, def, successProxy, errorProxy);\r\n }\r\n else {\r\n setTimeout(retry_1, delayStep);\r\n }\r\n };\r\n setTimeout(retry_1, delayStep);\r\n }\r\n });\r\n return promisify(promise, successCallback, errorCallback);\r\n };\r\n Client.prototype.servers = function (methodFilter) {\r\n var filterCopy = methodFilter === undefined\r\n ? undefined\r\n : __assign({}, methodFilter);\r\n return this.getServers(filterCopy).map(function (serverMethodMap) {\r\n return serverMethodMap.server.instance;\r\n });\r\n };\r\n Client.prototype.methods = function (methodFilter) {\r\n if (typeof methodFilter === \"string\") {\r\n methodFilter = { name: methodFilter };\r\n }\r\n else {\r\n methodFilter = __assign({}, methodFilter);\r\n }\r\n return this.getMethods(methodFilter);\r\n };\r\n Client.prototype.methodsForInstance = function (instance) {\r\n return this.getMethodsForInstance(instance);\r\n };\r\n Client.prototype.methodAdded = function (callback) {\r\n return this.repo.onMethodAdded(callback);\r\n };\r\n Client.prototype.methodRemoved = function (callback) {\r\n return this.repo.onMethodRemoved(callback);\r\n };\r\n Client.prototype.serverAdded = function (callback) {\r\n return this.repo.onServerAdded(callback);\r\n };\r\n Client.prototype.serverRemoved = function (callback) {\r\n return this.repo.onServerRemoved(function (server, reason) {\r\n callback(server, reason);\r\n });\r\n };\r\n Client.prototype.serverMethodAdded = function (callback) {\r\n return this.repo.onServerMethodAdded(function (server, method) {\r\n callback({ server: server, method: method });\r\n });\r\n };\r\n Client.prototype.serverMethodRemoved = function (callback) {\r\n return this.repo.onServerMethodRemoved(function (server, method) {\r\n callback({ server: server, method: method });\r\n });\r\n };\r\n Client.prototype.invoke = function (methodFilter, argumentObj, target, additionalOptions, success, error) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var getInvokePromise;\r\n var _this = this;\r\n return __generator(this, function (_a) {\r\n getInvokePromise = function () { return __awaiter(_this, void 0, void 0, function () {\r\n var methodDefinition, serversMethodMap, method, errorObj, timeout, additionalOptionsCopy, invokePromises, invocationMessages, results, allRejected;\r\n var _this = this;\r\n var _a, _b, _c;\r\n return __generator(this, function (_d) {\r\n switch (_d.label) {\r\n case 0:\r\n if (typeof methodFilter === \"string\") {\r\n methodDefinition = { name: methodFilter };\r\n }\r\n else {\r\n methodDefinition = __assign({}, methodFilter);\r\n }\r\n if (!methodDefinition.name) {\r\n return [2, Promise.reject(\"Method definition is required. Please, provide either a unique string for a method name or a \\u201CmethodDefinition\\u201D object with a required \\u201Cname\\u201D property.\")];\r\n }\r\n if (!argumentObj) {\r\n argumentObj = {};\r\n }\r\n if (!target) {\r\n target = \"best\";\r\n }\r\n if (typeof target === \"string\" && target !== \"all\" && target !== \"best\" && target !== \"skipMine\") {\r\n return [2, Promise.reject(new Error(\"\\\"\".concat(target, \"\\\" is not a valid target. Valid targets are \\\"all\\\" and \\\"best\\\".\")))];\r\n }\r\n if (!additionalOptions) {\r\n additionalOptions = {};\r\n }\r\n if (additionalOptions.methodResponseTimeoutMs === undefined) {\r\n additionalOptions.methodResponseTimeoutMs = additionalOptions.method_response_timeout;\r\n if (additionalOptions.methodResponseTimeoutMs === undefined) {\r\n additionalOptions.methodResponseTimeoutMs = this.configuration.methodResponseTimeout;\r\n }\r\n }\r\n if (additionalOptions.waitTimeoutMs === undefined) {\r\n additionalOptions.waitTimeoutMs = additionalOptions.wait_for_method_timeout;\r\n if (additionalOptions.waitTimeoutMs === undefined) {\r\n additionalOptions.waitTimeoutMs = this.configuration.waitTimeoutMs;\r\n }\r\n }\r\n if (additionalOptions.waitTimeoutMs !== undefined && typeof additionalOptions.waitTimeoutMs !== \"number\") {\r\n return [2, Promise.reject(new Error(\"\\\"\".concat(additionalOptions.waitTimeoutMs, \"\\\" is not a valid number for \\\"waitTimeoutMs\\\" \")))];\r\n }\r\n if (typeof argumentObj !== \"object\") {\r\n return [2, Promise.reject(new Error(\"The method arguments must be an object. method: \".concat(methodDefinition.name)))];\r\n }\r\n serversMethodMap = this.getServerMethodsByFilterAndTarget(methodDefinition, target);\r\n if (!(serversMethodMap.length === 0)) return [3, 4];\r\n _d.label = 1;\r\n case 1:\r\n _d.trys.push([1, 3, , 4]);\r\n return [4, this.tryToAwaitForMethods(methodDefinition, target, additionalOptions)];\r\n case 2:\r\n serversMethodMap = _d.sent();\r\n return [3, 4];\r\n case 3:\r\n _d.sent();\r\n method = __assign(__assign({}, methodDefinition), { getServers: function () { return []; }, supportsStreaming: false, objectTypes: (_a = methodDefinition.objectTypes) !== null && _a !== void 0 ? _a : [], flags: (_c = (_b = methodDefinition.flags) === null || _b === void 0 ? void 0 : _b.metadata) !== null && _c !== void 0 ? _c : {} });\r\n errorObj = {\r\n method: method,\r\n called_with: argumentObj,\r\n message: \"Can not find a method matching \".concat(JSON.stringify(methodFilter), \" with server filter \").concat(JSON.stringify(target)),\r\n executed_by: undefined,\r\n returned: undefined,\r\n status: undefined,\r\n };\r\n return [2, Promise.reject(errorObj)];\r\n case 4:\r\n timeout = additionalOptions.methodResponseTimeoutMs;\r\n additionalOptionsCopy = additionalOptions;\r\n invokePromises = serversMethodMap.map(function (serversMethodPair) {\r\n var invId = shortid();\r\n var method = serversMethodPair.methods[0];\r\n var server = serversMethodPair.server;\r\n var invokePromise = _this.protocol.client.invoke(invId, method, argumentObj, server, additionalOptionsCopy);\r\n return Promise.race([\r\n invokePromise,\r\n rejectAfter(timeout, invokePromise, {\r\n invocationId: invId,\r\n message: \"Invocation timeout (\".concat(timeout, \" ms) reached for method name: \").concat(method === null || method === void 0 ? void 0 : method.name, \", target instance: \").concat(JSON.stringify(server.instance), \", options: \").concat(JSON.stringify(additionalOptionsCopy)),\r\n status: InvokeStatus.Error,\r\n })\r\n ]);\r\n });\r\n return [4, Promise.all(invokePromises)];\r\n case 5:\r\n invocationMessages = _d.sent();\r\n results = this.getInvocationResultObj(invocationMessages, methodDefinition, argumentObj);\r\n allRejected = invocationMessages.every(function (result) { return result.status === InvokeStatus.Error; });\r\n if (allRejected) {\r\n return [2, Promise.reject(results)];\r\n }\r\n return [2, results];\r\n }\r\n });\r\n }); };\r\n return [2, promisify(getInvokePromise(), success, error)];\r\n });\r\n });\r\n };\r\n Client.prototype.getInvocationResultObj = function (invocationResults, method, calledWith) {\r\n var all_return_values = invocationResults\r\n .filter(function (invokeMessage) { return invokeMessage.status === InvokeStatus.Success; })\r\n .reduce(function (allValues, currentValue) {\r\n allValues = __spreadArray(__spreadArray([], allValues, true), [\r\n {\r\n executed_by: currentValue.instance,\r\n returned: currentValue.result,\r\n called_with: calledWith,\r\n method: method,\r\n message: currentValue.message,\r\n status: currentValue.status,\r\n }\r\n ], false);\r\n return allValues;\r\n }, []);\r\n var all_errors = invocationResults\r\n .filter(function (invokeMessage) { return invokeMessage.status === InvokeStatus.Error; })\r\n .reduce(function (allErrors, currError) {\r\n allErrors = __spreadArray(__spreadArray([], allErrors, true), [\r\n {\r\n executed_by: currError.instance,\r\n called_with: calledWith,\r\n name: method.name,\r\n message: currError.message,\r\n }\r\n ], false);\r\n return allErrors;\r\n }, []);\r\n var invResult = invocationResults[0];\r\n var result = {\r\n method: method,\r\n called_with: calledWith,\r\n returned: invResult.result,\r\n executed_by: invResult.instance,\r\n all_return_values: all_return_values,\r\n all_errors: all_errors,\r\n message: invResult.message,\r\n status: invResult.status\r\n };\r\n return result;\r\n };\r\n Client.prototype.tryToAwaitForMethods = function (methodDefinition, target, additionalOptions) {\r\n var _this = this;\r\n return new Promise(function (resolve, reject) {\r\n if (additionalOptions.waitTimeoutMs === 0) {\r\n reject();\r\n return;\r\n }\r\n var delayStep = 500;\r\n var delayTillNow = 0;\r\n var retry = function () {\r\n delayTillNow += delayStep;\r\n var serversMethodMap = _this.getServerMethodsByFilterAndTarget(methodDefinition, target);\r\n if (serversMethodMap.length > 0) {\r\n clearInterval(interval);\r\n resolve(serversMethodMap);\r\n }\r\n else if (delayTillNow >= (additionalOptions.waitTimeoutMs || 10000)) {\r\n clearInterval(interval);\r\n reject();\r\n return;\r\n }\r\n };\r\n var interval = setInterval(retry, delayStep);\r\n });\r\n };\r\n Client.prototype.filterByTarget = function (target, serverMethodMap) {\r\n var _this = this;\r\n if (typeof target === \"string\") {\r\n if (target === \"all\") {\r\n return __spreadArray([], serverMethodMap, true);\r\n }\r\n else if (target === \"best\") {\r\n var localMachine = serverMethodMap\r\n .find(function (s) { return s.server.instance.isLocal; });\r\n if (localMachine) {\r\n return [localMachine];\r\n }\r\n if (serverMethodMap[0] !== undefined) {\r\n return [serverMethodMap[0]];\r\n }\r\n }\r\n else if (target === \"skipMine\") {\r\n return serverMethodMap.filter(function (_a) {\r\n var server = _a.server;\r\n return server.instance.peerId !== _this.instance.peerId;\r\n });\r\n }\r\n }\r\n else {\r\n var targetArray = void 0;\r\n if (!Array.isArray(target)) {\r\n targetArray = [target];\r\n }\r\n else {\r\n targetArray = target;\r\n }\r\n var allServersMatching = targetArray.reduce(function (matches, filter) {\r\n var myMatches = serverMethodMap.filter(function (serverMethodPair) {\r\n return _this.instanceMatch(filter, serverMethodPair.server.instance);\r\n });\r\n return matches.concat(myMatches);\r\n }, []);\r\n return allServersMatching;\r\n }\r\n return [];\r\n };\r\n Client.prototype.instanceMatch = function (instanceFilter, instanceDefinition) {\r\n return this.containsProps(instanceFilter, instanceDefinition);\r\n };\r\n Client.prototype.methodMatch = function (methodFilter, methodDefinition) {\r\n return this.containsProps(methodFilter, methodDefinition);\r\n };\r\n Client.prototype.containsProps = function (filter, repoMethod) {\r\n var filterProps = Object.keys(filter)\r\n .filter(function (prop) {\r\n return filter[prop] !== undefined\r\n && filter[prop] !== null\r\n && typeof filter[prop] !== \"function\"\r\n && prop !== \"object_types\"\r\n && prop !== \"display_name\"\r\n && prop !== \"id\"\r\n && prop !== \"gatewayId\"\r\n && prop !== \"identifier\"\r\n && prop[0] !== \"_\";\r\n });\r\n return filterProps.every(function (prop) {\r\n var isMatch;\r\n var filterValue = filter[prop];\r\n var repoMethodValue = repoMethod[prop];\r\n switch (prop) {\r\n case \"objectTypes\":\r\n isMatch = (filterValue || []).every(function (filterValueEl) {\r\n return (repoMethodValue || []).includes(filterValueEl);\r\n });\r\n break;\r\n case \"flags\":\r\n isMatch = isSubset(repoMethodValue || {}, filterValue || {});\r\n break;\r\n default:\r\n isMatch = String(filterValue).toLowerCase() === String(repoMethodValue).toLowerCase();\r\n }\r\n return isMatch;\r\n });\r\n };\r\n Client.prototype.getMethods = function (methodFilter) {\r\n var _this = this;\r\n if (methodFilter === undefined) {\r\n return this.repo.getMethods();\r\n }\r\n var methods = this.repo.getMethods().filter(function (method) {\r\n return _this.methodMatch(methodFilter, method);\r\n });\r\n return methods;\r\n };\r\n Client.prototype.getMethodsForInstance = function (instanceFilter) {\r\n var _this = this;\r\n var allServers = this.repo.getServers();\r\n var matchingServers = allServers.filter(function (server) {\r\n return _this.instanceMatch(instanceFilter, server.instance);\r\n });\r\n if (matchingServers.length === 0) {\r\n return [];\r\n }\r\n var resultMethodsObject = {};\r\n if (matchingServers.length === 1) {\r\n resultMethodsObject = matchingServers[0].methods;\r\n }\r\n else {\r\n matchingServers.forEach(function (server) {\r\n Object.keys(server.methods).forEach(function (methodKey) {\r\n var method = server.methods[methodKey];\r\n resultMethodsObject[method.identifier] = method;\r\n });\r\n });\r\n }\r\n return Object.keys(resultMethodsObject)\r\n .map(function (key) {\r\n return resultMethodsObject[key];\r\n });\r\n };\r\n Client.prototype.getServers = function (methodFilter) {\r\n var _this = this;\r\n var servers = this.repo.getServers();\r\n if (methodFilter === undefined) {\r\n return servers.map(function (server) {\r\n return { server: server, methods: [] };\r\n });\r\n }\r\n return servers.reduce(function (prev, current) {\r\n var methodsForServer = Object.values(current.methods);\r\n var matchingMethods = methodsForServer.filter(function (method) {\r\n return _this.methodMatch(methodFilter, method);\r\n });\r\n if (matchingMethods.length > 0) {\r\n prev.push({ server: current, methods: matchingMethods });\r\n }\r\n return prev;\r\n }, []);\r\n };\r\n Client.prototype.getServerMethodsByFilterAndTarget = function (methodFilter, target) {\r\n var serversMethodMap = this.getServers(methodFilter);\r\n return this.filterByTarget(target, serversMethodMap);\r\n };\r\n return Client;\r\n}());\n\nvar ServerSubscription = (function () {\r\n function ServerSubscription(protocol, repoMethod, subscription) {\r\n this.protocol = protocol;\r\n this.repoMethod = repoMethod;\r\n this.subscription = subscription;\r\n }\r\n Object.defineProperty(ServerSubscription.prototype, \"stream\", {\r\n get: function () {\r\n if (!this.repoMethod.stream) {\r\n throw new Error(\"no stream\");\r\n }\r\n return this.repoMethod.stream;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(ServerSubscription.prototype, \"arguments\", {\r\n get: function () { return this.subscription.arguments || {}; },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(ServerSubscription.prototype, \"branchKey\", {\r\n get: function () { return this.subscription.branchKey; },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(ServerSubscription.prototype, \"instance\", {\r\n get: function () {\r\n if (!this.subscription.instance) {\r\n throw new Error(\"no instance\");\r\n }\r\n return this.subscription.instance;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n ServerSubscription.prototype.close = function () {\r\n this.protocol.server.closeSingleSubscription(this.repoMethod, this.subscription);\r\n };\r\n ServerSubscription.prototype.push = function (data) {\r\n this.protocol.server.pushDataToSingle(this.repoMethod, this.subscription, data);\r\n };\r\n return ServerSubscription;\r\n}());\n\nvar Request = (function () {\r\n function Request(protocol, repoMethod, requestContext) {\r\n this.protocol = protocol;\r\n this.repoMethod = repoMethod;\r\n this.requestContext = requestContext;\r\n this.arguments = requestContext.arguments;\r\n this.instance = requestContext.instance;\r\n }\r\n Request.prototype.accept = function () {\r\n this.protocol.server.acceptRequestOnBranch(this.requestContext, this.repoMethod, \"\");\r\n };\r\n Request.prototype.acceptOnBranch = function (branch) {\r\n this.protocol.server.acceptRequestOnBranch(this.requestContext, this.repoMethod, branch);\r\n };\r\n Request.prototype.reject = function (reason) {\r\n this.protocol.server.rejectRequest(this.requestContext, this.repoMethod, reason);\r\n };\r\n return Request;\r\n}());\n\nvar ServerStreaming$1 = (function () {\r\n function ServerStreaming(protocol, server) {\r\n var _this = this;\r\n this.protocol = protocol;\r\n this.server = server;\r\n protocol.server.onSubRequest(function (rc, rm) { return _this.handleSubRequest(rc, rm); });\r\n protocol.server.onSubAdded(function (sub, rm) { return _this.handleSubAdded(sub, rm); });\r\n protocol.server.onSubRemoved(function (sub, rm) { return _this.handleSubRemoved(sub, rm); });\r\n }\r\n ServerStreaming.prototype.handleSubRequest = function (requestContext, repoMethod) {\r\n if (!(repoMethod &&\r\n repoMethod.streamCallbacks &&\r\n typeof repoMethod.streamCallbacks.subscriptionRequestHandler === \"function\")) {\r\n return;\r\n }\r\n var request = new Request(this.protocol, repoMethod, requestContext);\r\n repoMethod.streamCallbacks.subscriptionRequestHandler(request);\r\n };\r\n ServerStreaming.prototype.handleSubAdded = function (subscription, repoMethod) {\r\n if (!(repoMethod &&\r\n repoMethod.streamCallbacks &&\r\n typeof repoMethod.streamCallbacks.subscriptionAddedHandler === \"function\")) {\r\n return;\r\n }\r\n var sub = new ServerSubscription(this.protocol, repoMethod, subscription);\r\n repoMethod.streamCallbacks.subscriptionAddedHandler(sub);\r\n };\r\n ServerStreaming.prototype.handleSubRemoved = function (subscription, repoMethod) {\r\n if (!(repoMethod &&\r\n repoMethod.streamCallbacks &&\r\n typeof repoMethod.streamCallbacks.subscriptionRemovedHandler === \"function\")) {\r\n return;\r\n }\r\n var sub = new ServerSubscription(this.protocol, repoMethod, subscription);\r\n repoMethod.streamCallbacks.subscriptionRemovedHandler(sub);\r\n };\r\n return ServerStreaming;\r\n}());\n\nvar ServerBranch = (function () {\r\n function ServerBranch(key, protocol, repoMethod) {\r\n this.key = key;\r\n this.protocol = protocol;\r\n this.repoMethod = repoMethod;\r\n }\r\n ServerBranch.prototype.subscriptions = function () {\r\n var _this = this;\r\n var subList = this.protocol.server.getSubscriptionList(this.repoMethod, this.key);\r\n return subList.map(function (sub) {\r\n return new ServerSubscription(_this.protocol, _this.repoMethod, sub);\r\n });\r\n };\r\n ServerBranch.prototype.close = function () {\r\n this.protocol.server.closeAllSubscriptions(this.repoMethod, this.key);\r\n };\r\n ServerBranch.prototype.push = function (data) {\r\n this.protocol.server.pushData(this.repoMethod, data, [this.key]);\r\n };\r\n return ServerBranch;\r\n}());\n\nvar ServerStream = (function () {\r\n function ServerStream(_protocol, _repoMethod, _server) {\r\n this._protocol = _protocol;\r\n this._repoMethod = _repoMethod;\r\n this._server = _server;\r\n this.name = this._repoMethod.definition.name;\r\n }\r\n ServerStream.prototype.branches = function (key) {\r\n var _this = this;\r\n var bList = this._protocol.server.getBranchList(this._repoMethod);\r\n if (key) {\r\n if (bList.indexOf(key) > -1) {\r\n return new ServerBranch(key, this._protocol, this._repoMethod);\r\n }\r\n return undefined;\r\n }\r\n else {\r\n return bList.map(function (branchKey) {\r\n return new ServerBranch(branchKey, _this._protocol, _this._repoMethod);\r\n });\r\n }\r\n };\r\n ServerStream.prototype.branch = function (key) {\r\n return this.branches(key);\r\n };\r\n ServerStream.prototype.subscriptions = function () {\r\n var _this = this;\r\n var subList = this._protocol.server.getSubscriptionList(this._repoMethod);\r\n return subList.map(function (sub) {\r\n return new ServerSubscription(_this._protocol, _this._repoMethod, sub);\r\n });\r\n };\r\n Object.defineProperty(ServerStream.prototype, \"definition\", {\r\n get: function () {\r\n var _a;\r\n var def2 = this._repoMethod.definition;\r\n return {\r\n accepts: def2.accepts,\r\n description: def2.description,\r\n displayName: def2.displayName,\r\n name: def2.name,\r\n objectTypes: def2.objectTypes,\r\n returns: def2.returns,\r\n supportsStreaming: def2.supportsStreaming,\r\n flags: (_a = def2.flags) === null || _a === void 0 ? void 0 : _a.metadata,\r\n };\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n ServerStream.prototype.close = function () {\r\n this._protocol.server.closeAllSubscriptions(this._repoMethod);\r\n this._server.unregister(this._repoMethod.definition, true);\r\n };\r\n ServerStream.prototype.push = function (data, branches) {\r\n if (typeof branches !== \"string\" && !Array.isArray(branches) && branches !== undefined) {\r\n throw new Error(\"invalid branches should be string or string array\");\r\n }\r\n if (typeof data !== \"object\") {\r\n throw new Error(\"Invalid arguments. Data must be an object.\");\r\n }\r\n this._protocol.server.pushData(this._repoMethod, data, branches);\r\n };\r\n ServerStream.prototype.updateRepoMethod = function (repoMethod) {\r\n this._repoMethod = repoMethod;\r\n };\r\n return ServerStream;\r\n}());\n\nvar Server = (function () {\r\n function Server(protocol, serverRepository) {\r\n this.protocol = protocol;\r\n this.serverRepository = serverRepository;\r\n this.invocations = 0;\r\n this.currentlyUnregistering = {};\r\n this.streaming = new ServerStreaming$1(protocol, this);\r\n this.protocol.server.onInvoked(this.onMethodInvoked.bind(this));\r\n }\r\n Server.prototype.createStream = function (streamDef, callbacks, successCallback, errorCallback, existingStream) {\r\n var _this = this;\r\n var promise = new Promise(function (resolve, reject) {\r\n if (!streamDef) {\r\n reject(\"The stream name must be unique! Please, provide either a unique string for a stream name to “glue.interop.createStream()” or a “methodDefinition” object with a unique “name” property for the stream.\");\r\n return;\r\n }\r\n var streamMethodDefinition;\r\n if (typeof streamDef === \"string\") {\r\n streamMethodDefinition = { name: \"\" + streamDef };\r\n }\r\n else {\r\n streamMethodDefinition = __assign({}, streamDef);\r\n }\r\n if (!streamMethodDefinition.name) {\r\n return reject(\"The \\u201Cname\\u201D property is required for the \\u201CstreamDefinition\\u201D object and must be unique. Stream definition: \".concat(JSON.stringify(streamMethodDefinition)));\r\n }\r\n var nameAlreadyExists = _this.serverRepository.getList()\r\n .some(function (serverMethod) { return serverMethod.definition.name === streamMethodDefinition.name; });\r\n if (nameAlreadyExists) {\r\n return reject(\"A stream with the name \\\"\".concat(streamMethodDefinition.name, \"\\\" already exists! Please, provide a unique name for the stream.\"));\r\n }\r\n streamMethodDefinition.supportsStreaming = true;\r\n if (!callbacks) {\r\n callbacks = {};\r\n }\r\n if (typeof callbacks.subscriptionRequestHandler !== \"function\") {\r\n callbacks.subscriptionRequestHandler = function (request) {\r\n request.accept();\r\n };\r\n }\r\n var repoMethod = _this.serverRepository.add({\r\n definition: streamMethodDefinition,\r\n streamCallbacks: callbacks,\r\n protocolState: {},\r\n });\r\n _this.protocol.server.createStream(repoMethod)\r\n .then(function () {\r\n var streamUserObject;\r\n if (existingStream) {\r\n streamUserObject = existingStream;\r\n existingStream.updateRepoMethod(repoMethod);\r\n }\r\n else {\r\n streamUserObject = new ServerStream(_this.protocol, repoMethod, _this);\r\n }\r\n repoMethod.stream = streamUserObject;\r\n resolve(streamUserObject);\r\n })\r\n .catch(function (err) {\r\n if (repoMethod.repoId) {\r\n _this.serverRepository.remove(repoMethod.repoId);\r\n }\r\n reject(err);\r\n });\r\n });\r\n return promisify(promise, successCallback, errorCallback);\r\n };\r\n Server.prototype.register = function (methodDefinition, callback) {\r\n var _this = this;\r\n if (!methodDefinition) {\r\n return Promise.reject(\"Method definition is required. Please, provide either a unique string for a method name or a “methodDefinition” object with a required “name” property.\");\r\n }\r\n if (typeof callback !== \"function\") {\r\n return Promise.reject(\"The second parameter must be a callback function. Method: \".concat(typeof methodDefinition === \"string\" ? methodDefinition : methodDefinition.name));\r\n }\r\n var wrappedCallbackFunction = function (context, resultCallback) { return __awaiter(_this, void 0, void 0, function () {\r\n var result, resultValue, e_1;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n _a.trys.push([0, 4, , 5]);\r\n result = callback(context.args, context.instance);\r\n if (!(result && typeof result.then === \"function\")) return [3, 2];\r\n return [4, result];\r\n case 1:\r\n resultValue = _a.sent();\r\n resultCallback(undefined, resultValue);\r\n return [3, 3];\r\n case 2:\r\n resultCallback(undefined, result);\r\n _a.label = 3;\r\n case 3: return [3, 5];\r\n case 4:\r\n e_1 = _a.sent();\r\n resultCallback(e_1 !== null && e_1 !== void 0 ? e_1 : \"\", e_1 !== null && e_1 !== void 0 ? e_1 : \"\");\r\n return [3, 5];\r\n case 5: return [2];\r\n }\r\n });\r\n }); };\r\n wrappedCallbackFunction.userCallback = callback;\r\n return this.registerCore(methodDefinition, wrappedCallbackFunction);\r\n };\r\n Server.prototype.registerAsync = function (methodDefinition, callback) {\r\n if (!methodDefinition) {\r\n return Promise.reject(\"Method definition is required. Please, provide either a unique string for a method name or a “methodDefinition” object with a required “name” property.\");\r\n }\r\n if (typeof callback !== \"function\") {\r\n return Promise.reject(\"The second parameter must be a callback function. Method: \".concat(typeof methodDefinition === \"string\" ? methodDefinition : methodDefinition.name));\r\n }\r\n var wrappedCallback = function (context, resultCallback) {\r\n try {\r\n var resultCalled_1 = false;\r\n var success = function (result) {\r\n if (!resultCalled_1) {\r\n resultCallback(undefined, result);\r\n }\r\n resultCalled_1 = true;\r\n };\r\n var error = function (e) {\r\n if (!resultCalled_1) {\r\n if (!e) {\r\n e = \"\";\r\n }\r\n resultCallback(e, e);\r\n }\r\n resultCalled_1 = true;\r\n };\r\n var methodResult = callback(context.args, context.instance, success, error);\r\n if (methodResult && typeof methodResult.then === \"function\") {\r\n methodResult\r\n .then(success)\r\n .catch(error);\r\n }\r\n }\r\n catch (e) {\r\n resultCallback(e, undefined);\r\n }\r\n };\r\n wrappedCallback.userCallbackAsync = callback;\r\n return this.registerCore(methodDefinition, wrappedCallback);\r\n };\r\n Server.prototype.unregister = function (methodFilter, forStream) {\r\n if (forStream === void 0) { forStream = false; }\r\n return __awaiter(this, void 0, void 0, function () {\r\n var methodDefinition, methodToBeRemoved;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (methodFilter === undefined) {\r\n return [2, Promise.reject(\"Please, provide either a unique string for a name or an object containing a “name” property.\")];\r\n }\r\n if (!(typeof methodFilter === \"function\")) return [3, 2];\r\n return [4, this.unregisterWithPredicate(methodFilter, forStream)];\r\n case 1:\r\n _a.sent();\r\n return [2];\r\n case 2:\r\n if (typeof methodFilter === \"string\") {\r\n methodDefinition = { name: methodFilter };\r\n }\r\n else {\r\n methodDefinition = methodFilter;\r\n }\r\n if (methodDefinition.name === undefined) {\r\n return [2, Promise.reject(\"Method name is required. Cannot find a method if the method name is undefined!\")];\r\n }\r\n methodToBeRemoved = this.serverRepository.getList().find(function (serverMethod) {\r\n return serverMethod.definition.name === methodDefinition.name\r\n && (serverMethod.definition.supportsStreaming || false) === forStream;\r\n });\r\n if (!methodToBeRemoved) {\r\n return [2, Promise.reject(\"Method with a name \\\"\".concat(methodDefinition.name, \"\\\" does not exist or is not registered by your application!\"))];\r\n }\r\n return [4, this.removeMethodsOrStreams([methodToBeRemoved])];\r\n case 3:\r\n _a.sent();\r\n return [2];\r\n }\r\n });\r\n });\r\n };\r\n Server.prototype.unregisterWithPredicate = function (filterPredicate, forStream) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var methodsOrStreamsToRemove;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n methodsOrStreamsToRemove = this.serverRepository.getList()\r\n .filter(function (sm) { return filterPredicate(sm.definition); })\r\n .filter(function (serverMethod) {\r\n return (serverMethod.definition.supportsStreaming || false) === forStream;\r\n });\r\n if (!methodsOrStreamsToRemove || methodsOrStreamsToRemove.length === 0) {\r\n return [2, Promise.reject(\"Could not find a \".concat(forStream ? \"stream\" : \"method\", \" matching the specified condition!\"))];\r\n }\r\n return [4, this.removeMethodsOrStreams(methodsOrStreamsToRemove)];\r\n case 1:\r\n _a.sent();\r\n return [2];\r\n }\r\n });\r\n });\r\n };\r\n Server.prototype.removeMethodsOrStreams = function (methodsToRemove) {\r\n var _this = this;\r\n var methodUnregPromises = [];\r\n methodsToRemove.forEach(function (method) {\r\n var promise = _this.protocol.server.unregister(method)\r\n .then(function () {\r\n if (method.repoId) {\r\n _this.serverRepository.remove(method.repoId);\r\n }\r\n });\r\n methodUnregPromises.push(promise);\r\n _this.addAsCurrentlyUnregistering(method.definition.name, promise);\r\n });\r\n return Promise.all(methodUnregPromises);\r\n };\r\n Server.prototype.addAsCurrentlyUnregistering = function (methodName, promise) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var timeout;\r\n var _this = this;\r\n return __generator(this, function (_a) {\r\n timeout = new Promise(function (resolve) { return setTimeout(resolve, 5000); });\r\n this.currentlyUnregistering[methodName] = Promise.race([promise, timeout]).then(function () {\r\n delete _this.currentlyUnregistering[methodName];\r\n });\r\n return [2];\r\n });\r\n });\r\n };\r\n Server.prototype.registerCore = function (method, theFunction) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var methodDefinition, unregisterInProgress, nameAlreadyExists, repoMethod;\r\n var _this = this;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n if (typeof method === \"string\") {\r\n methodDefinition = { name: \"\" + method };\r\n }\r\n else {\r\n methodDefinition = __assign({}, method);\r\n }\r\n if (!methodDefinition.name) {\r\n return [2, Promise.reject(\"Please, provide a (unique) string value for the \\u201Cname\\u201D property in the \\u201CmethodDefinition\\u201D object: \".concat(JSON.stringify(method)))];\r\n }\r\n unregisterInProgress = this.currentlyUnregistering[methodDefinition.name];\r\n if (!unregisterInProgress) return [3, 2];\r\n return [4, unregisterInProgress];\r\n case 1:\r\n _a.sent();\r\n _a.label = 2;\r\n case 2:\r\n nameAlreadyExists = this.serverRepository.getList()\r\n .some(function (serverMethod) { return serverMethod.definition.name === methodDefinition.name; });\r\n if (nameAlreadyExists) {\r\n return [2, Promise.reject(\"A method with the name \\\"\".concat(methodDefinition.name, \"\\\" already exists! Please, provide a unique name for the method.\"))];\r\n }\r\n if (methodDefinition.supportsStreaming) {\r\n return [2, Promise.reject(\"When you create methods with \\u201Cglue.interop.register()\\u201D or \\u201Cglue.interop.registerAsync()\\u201D the property \\u201CsupportsStreaming\\u201D cannot be \\u201Ctrue\\u201D. If you want \\u201C\".concat(methodDefinition.name, \"\\u201D to be a stream, please use the \\u201Cglue.interop.createStream()\\u201D method.\"))];\r\n }\r\n repoMethod = this.serverRepository.add({\r\n definition: methodDefinition,\r\n theFunction: theFunction,\r\n protocolState: {},\r\n });\r\n return [2, this.protocol.server.register(repoMethod)\r\n .catch(function (err) {\r\n if (repoMethod === null || repoMethod === void 0 ? void 0 : repoMethod.repoId) {\r\n _this.serverRepository.remove(repoMethod.repoId);\r\n }\r\n throw err;\r\n })];\r\n }\r\n });\r\n });\r\n };\r\n Server.prototype.onMethodInvoked = function (methodToExecute, invocationId, invocationArgs) {\r\n var _this = this;\r\n if (!methodToExecute || !methodToExecute.theFunction) {\r\n return;\r\n }\r\n methodToExecute.theFunction(invocationArgs, function (err, result) {\r\n if (err !== undefined && err !== null) {\r\n if (err.message && typeof err.message === \"string\") {\r\n err = err.message;\r\n }\r\n else if (typeof err !== \"string\") {\r\n try {\r\n err = JSON.stringify(err);\r\n }\r\n catch (unStrException) {\r\n err = \"un-stringifyable error in onMethodInvoked! Top level prop names: \".concat(Object.keys(err));\r\n }\r\n }\r\n }\r\n if (!result) {\r\n result = {};\r\n }\r\n else if (typeof result !== \"object\" || Array.isArray(result)) {\r\n result = { _value: result };\r\n }\r\n _this.protocol.server.methodInvocationResult(methodToExecute, invocationId, err, result);\r\n });\r\n };\r\n return Server;\r\n}());\n\nvar InstanceWrapper = (function () {\r\n function InstanceWrapper(API, instance, connection) {\r\n var _this = this;\r\n this.wrapped = {};\r\n this.wrapped.getMethods = function () {\r\n return API.methodsForInstance(this);\r\n };\r\n this.wrapped.getStreams = function () {\r\n return API.methodsForInstance(this).filter(function (m) { return m.supportsStreaming; });\r\n };\r\n if (instance) {\r\n this.refreshWrappedObject(instance);\r\n }\r\n if (connection) {\r\n connection.loggedIn(function () {\r\n _this.refresh(connection);\r\n });\r\n this.refresh(connection);\r\n }\r\n }\r\n InstanceWrapper.prototype.unwrap = function () {\r\n return this.wrapped;\r\n };\r\n InstanceWrapper.prototype.refresh = function (connection) {\r\n if (!connection) {\r\n return;\r\n }\r\n var resolvedIdentity = connection === null || connection === void 0 ? void 0 : connection.resolvedIdentity;\r\n var instance = Object.assign({}, resolvedIdentity !== null && resolvedIdentity !== void 0 ? resolvedIdentity : {}, { peerId: connection === null || connection === void 0 ? void 0 : connection.peerId });\r\n this.refreshWrappedObject(instance);\r\n };\r\n InstanceWrapper.prototype.refreshWrappedObject = function (resolvedIdentity) {\r\n var _this = this;\r\n var _a, _b, _c, _d;\r\n Object.keys(resolvedIdentity).forEach(function (key) {\r\n _this.wrapped[key] = resolvedIdentity[key];\r\n });\r\n this.wrapped.user = resolvedIdentity.user;\r\n this.wrapped.instance = resolvedIdentity.instance;\r\n this.wrapped.application = (_a = resolvedIdentity.application) !== null && _a !== void 0 ? _a : shortid();\r\n this.wrapped.applicationName = resolvedIdentity.applicationName;\r\n this.wrapped.pid = (_c = (_b = resolvedIdentity.pid) !== null && _b !== void 0 ? _b : resolvedIdentity.process) !== null && _c !== void 0 ? _c : Math.floor(Math.random() * 10000000000);\r\n this.wrapped.machine = resolvedIdentity.machine;\r\n this.wrapped.environment = resolvedIdentity.environment;\r\n this.wrapped.region = resolvedIdentity.region;\r\n this.wrapped.windowId = resolvedIdentity.windowId;\r\n this.wrapped.isLocal = (_d = resolvedIdentity.isLocal) !== null && _d !== void 0 ? _d : true;\r\n this.wrapped.api = resolvedIdentity.api;\r\n this.wrapped.service = resolvedIdentity.service;\r\n this.wrapped.peerId = resolvedIdentity.peerId;\r\n };\r\n return InstanceWrapper;\r\n}());\n\nvar hideMethodSystemFlags = function (method) {\r\n return __assign(__assign({}, method), { flags: method.flags.metadata || {} });\r\n};\r\nvar ClientRepository = (function () {\r\n function ClientRepository(logger, API) {\r\n this.logger = logger;\r\n this.API = API;\r\n this.servers = {};\r\n this.methodsCount = {};\r\n this.callbacks = lib$1();\r\n var peerId = this.API.instance.peerId;\r\n this.myServer = {\r\n id: peerId,\r\n methods: {},\r\n instance: this.API.instance,\r\n wrapper: this.API.unwrappedInstance,\r\n };\r\n this.servers[peerId] = this.myServer;\r\n }\r\n ClientRepository.prototype.addServer = function (info, serverId) {\r\n this.logger.debug(\"adding server \".concat(serverId));\r\n var current = this.servers[serverId];\r\n if (current) {\r\n return current.id;\r\n }\r\n var wrapper = new InstanceWrapper(this.API, info);\r\n var serverEntry = {\r\n id: serverId,\r\n methods: {},\r\n instance: wrapper.unwrap(),\r\n wrapper: wrapper,\r\n };\r\n this.servers[serverId] = serverEntry;\r\n this.callbacks.execute(\"onServerAdded\", serverEntry.instance);\r\n return serverId;\r\n };\r\n ClientRepository.prototype.removeServerById = function (id, reason) {\r\n var _this = this;\r\n var server = this.servers[id];\r\n if (!server) {\r\n this.logger.warn(\"not aware of server \".concat(id, \", my state \").concat(JSON.stringify(Object.keys(this.servers))));\r\n return;\r\n }\r\n else {\r\n this.logger.debug(\"removing server \".concat(id));\r\n }\r\n Object.keys(server.methods).forEach(function (methodId) {\r\n _this.removeServerMethod(id, methodId);\r\n });\r\n delete this.servers[id];\r\n this.callbacks.execute(\"onServerRemoved\", server.instance, reason);\r\n };\r\n ClientRepository.prototype.addServerMethod = function (serverId, method) {\r\n var _a;\r\n var server = this.servers[serverId];\r\n if (!server) {\r\n throw new Error(\"server does not exists\");\r\n }\r\n if (server.methods[method.id]) {\r\n return;\r\n }\r\n var identifier = this.createMethodIdentifier(method);\r\n var that = this;\r\n var methodDefinition = {\r\n identifier: identifier,\r\n gatewayId: method.id,\r\n name: method.name,\r\n displayName: method.display_name,\r\n description: method.description,\r\n version: method.version,\r\n objectTypes: method.object_types || [],\r\n accepts: method.input_signature,\r\n returns: method.result_signature,\r\n supportsStreaming: typeof method.flags !== \"undefined\" ? method.flags.streaming : false,\r\n flags: (_a = method.flags) !== null && _a !== void 0 ? _a : {},\r\n getServers: function () {\r\n return that.getServersByMethod(identifier);\r\n }\r\n };\r\n methodDefinition.object_types = methodDefinition.objectTypes;\r\n methodDefinition.display_name = methodDefinition.displayName;\r\n methodDefinition.version = methodDefinition.version;\r\n server.methods[method.id] = methodDefinition;\r\n var clientMethodDefinition = hideMethodSystemFlags(methodDefinition);\r\n if (!this.methodsCount[identifier]) {\r\n this.methodsCount[identifier] = 0;\r\n this.callbacks.execute(\"onMethodAdded\", clientMethodDefinition);\r\n }\r\n this.methodsCount[identifier] = this.methodsCount[identifier] + 1;\r\n this.callbacks.execute(\"onServerMethodAdded\", server.instance, clientMethodDefinition);\r\n return methodDefinition;\r\n };\r\n ClientRepository.prototype.removeServerMethod = function (serverId, methodId) {\r\n var server = this.servers[serverId];\r\n if (!server) {\r\n throw new Error(\"server does not exists\");\r\n }\r\n var method = server.methods[methodId];\r\n delete server.methods[methodId];\r\n var clientMethodDefinition = hideMethodSystemFlags(method);\r\n this.methodsCount[method.identifier] = this.methodsCount[method.identifier] - 1;\r\n if (this.methodsCount[method.identifier] === 0) {\r\n this.callbacks.execute(\"onMethodRemoved\", clientMethodDefinition);\r\n }\r\n this.callbacks.execute(\"onServerMethodRemoved\", server.instance, clientMethodDefinition);\r\n };\r\n ClientRepository.prototype.getMethods = function () {\r\n return this.extractMethodsFromServers(Object.values(this.servers)).map(hideMethodSystemFlags);\r\n };\r\n ClientRepository.prototype.getServers = function () {\r\n return Object.values(this.servers).map(this.hideServerMethodSystemFlags);\r\n };\r\n ClientRepository.prototype.onServerAdded = function (callback) {\r\n var unsubscribeFunc = this.callbacks.add(\"onServerAdded\", callback);\r\n var serversWithMethodsToReplay = this.getServers().map(function (s) { return s.instance; });\r\n return this.returnUnsubWithDelayedReplay(unsubscribeFunc, serversWithMethodsToReplay, callback);\r\n };\r\n ClientRepository.prototype.onMethodAdded = function (callback) {\r\n var unsubscribeFunc = this.callbacks.add(\"onMethodAdded\", callback);\r\n var methodsToReplay = this.getMethods();\r\n return this.returnUnsubWithDelayedReplay(unsubscribeFunc, methodsToReplay, callback);\r\n };\r\n ClientRepository.prototype.onServerMethodAdded = function (callback) {\r\n var unsubscribeFunc = this.callbacks.add(\"onServerMethodAdded\", callback);\r\n var unsubCalled = false;\r\n var servers = this.getServers();\r\n setTimeout(function () {\r\n servers.forEach(function (server) {\r\n var methods = server.methods;\r\n Object.keys(methods).forEach(function (methodId) {\r\n if (!unsubCalled) {\r\n callback(server.instance, methods[methodId]);\r\n }\r\n });\r\n });\r\n }, 0);\r\n return function () {\r\n unsubCalled = true;\r\n unsubscribeFunc();\r\n };\r\n };\r\n ClientRepository.prototype.onMethodRemoved = function (callback) {\r\n var unsubscribeFunc = this.callbacks.add(\"onMethodRemoved\", callback);\r\n return unsubscribeFunc;\r\n };\r\n ClientRepository.prototype.onServerRemoved = function (callback) {\r\n var unsubscribeFunc = this.callbacks.add(\"onServerRemoved\", callback);\r\n return unsubscribeFunc;\r\n };\r\n ClientRepository.prototype.onServerMethodRemoved = function (callback) {\r\n var unsubscribeFunc = this.callbacks.add(\"onServerMethodRemoved\", callback);\r\n return unsubscribeFunc;\r\n };\r\n ClientRepository.prototype.getServerById = function (id) {\r\n return this.hideServerMethodSystemFlags(this.servers[id]);\r\n };\r\n ClientRepository.prototype.reset = function () {\r\n var _a;\r\n var _this = this;\r\n Object.keys(this.servers).forEach(function (key) {\r\n _this.removeServerById(key, \"reset\");\r\n });\r\n this.servers = (_a = {},\r\n _a[this.myServer.id] = this.myServer,\r\n _a);\r\n this.methodsCount = {};\r\n };\r\n ClientRepository.prototype.createMethodIdentifier = function (methodInfo) {\r\n var _a, _b;\r\n var accepts = (_a = methodInfo.input_signature) !== null && _a !== void 0 ? _a : \"\";\r\n var returns = (_b = methodInfo.result_signature) !== null && _b !== void 0 ? _b : \"\";\r\n return (methodInfo.name + accepts + returns).toLowerCase();\r\n };\r\n ClientRepository.prototype.getServersByMethod = function (identifier) {\r\n var allServers = [];\r\n Object.values(this.servers).forEach(function (server) {\r\n Object.values(server.methods).forEach(function (method) {\r\n if (method.identifier === identifier) {\r\n allServers.push(server.instance);\r\n }\r\n });\r\n });\r\n return allServers;\r\n };\r\n ClientRepository.prototype.returnUnsubWithDelayedReplay = function (unsubscribeFunc, collectionToReplay, callback) {\r\n var unsubCalled = false;\r\n setTimeout(function () {\r\n collectionToReplay.forEach(function (item) {\r\n if (!unsubCalled) {\r\n callback(item);\r\n }\r\n });\r\n }, 0);\r\n return function () {\r\n unsubCalled = true;\r\n unsubscribeFunc();\r\n };\r\n };\r\n ClientRepository.prototype.hideServerMethodSystemFlags = function (server) {\r\n var clientMethods = {};\r\n Object.entries(server.methods).forEach(function (_a) {\r\n var name = _a[0], method = _a[1];\r\n clientMethods[name] = hideMethodSystemFlags(method);\r\n });\r\n return __assign(__assign({}, server), { methods: clientMethods });\r\n };\r\n ClientRepository.prototype.extractMethodsFromServers = function (servers) {\r\n var methods = Object.values(servers).reduce(function (clientMethods, server) {\r\n return __spreadArray(__spreadArray([], clientMethods, true), Object.values(server.methods), true);\r\n }, []);\r\n return methods;\r\n };\r\n return ClientRepository;\r\n}());\n\nvar ServerRepository = (function () {\r\n function ServerRepository() {\r\n this.nextId = 0;\r\n this.methods = [];\r\n }\r\n ServerRepository.prototype.add = function (method) {\r\n method.repoId = String(this.nextId);\r\n this.nextId += 1;\r\n this.methods.push(method);\r\n return method;\r\n };\r\n ServerRepository.prototype.remove = function (repoId) {\r\n if (typeof repoId !== \"string\") {\r\n return new TypeError(\"Expecting a string\");\r\n }\r\n this.methods = this.methods.filter(function (m) {\r\n return m.repoId !== repoId;\r\n });\r\n };\r\n ServerRepository.prototype.getById = function (id) {\r\n if (typeof id !== \"string\") {\r\n return undefined;\r\n }\r\n return this.methods.find(function (m) {\r\n return m.repoId === id;\r\n });\r\n };\r\n ServerRepository.prototype.getList = function () {\r\n return this.methods.map(function (m) { return m; });\r\n };\r\n ServerRepository.prototype.length = function () {\r\n return this.methods.length;\r\n };\r\n ServerRepository.prototype.reset = function () {\r\n this.methods = [];\r\n };\r\n return ServerRepository;\r\n}());\n\nvar SUBSCRIPTION_REQUEST = \"onSubscriptionRequest\";\r\nvar SUBSCRIPTION_ADDED = \"onSubscriptionAdded\";\r\nvar SUBSCRIPTION_REMOVED = \"onSubscriptionRemoved\";\r\nvar ServerStreaming = (function () {\r\n function ServerStreaming(session, repository, serverRepository) {\r\n var _this = this;\r\n this.session = session;\r\n this.repository = repository;\r\n this.serverRepository = serverRepository;\r\n this.ERR_URI_SUBSCRIPTION_FAILED = \"com.tick42.agm.errors.subscription.failure\";\r\n this.callbacks = lib$1();\r\n this.nextStreamId = 0;\r\n session.on(\"add-interest\", function (msg) {\r\n _this.handleAddInterest(msg);\r\n });\r\n session.on(\"remove-interest\", function (msg) {\r\n _this.handleRemoveInterest(msg);\r\n });\r\n }\r\n ServerStreaming.prototype.acceptRequestOnBranch = function (requestContext, streamingMethod, branch) {\r\n if (typeof branch !== \"string\") {\r\n branch = \"\";\r\n }\r\n if (typeof streamingMethod.protocolState.subscriptionsMap !== \"object\") {\r\n throw new TypeError(\"The streaming method is missing its subscriptions.\");\r\n }\r\n if (!Array.isArray(streamingMethod.protocolState.branchKeyToStreamIdMap)) {\r\n throw new TypeError(\"The streaming method is missing its branches.\");\r\n }\r\n var streamId = this.getStreamId(streamingMethod, branch);\r\n var key = requestContext.msg.subscription_id;\r\n var subscription = {\r\n id: key,\r\n arguments: requestContext.arguments,\r\n instance: requestContext.instance,\r\n branchKey: branch,\r\n streamId: streamId,\r\n subscribeMsg: requestContext.msg,\r\n };\r\n streamingMethod.protocolState.subscriptionsMap[key] = subscription;\r\n this.session.sendFireAndForget({\r\n type: \"accepted\",\r\n subscription_id: key,\r\n stream_id: streamId,\r\n });\r\n this.callbacks.execute(SUBSCRIPTION_ADDED, subscription, streamingMethod);\r\n };\r\n ServerStreaming.prototype.rejectRequest = function (requestContext, streamingMethod, reason) {\r\n if (typeof reason !== \"string\") {\r\n reason = \"\";\r\n }\r\n this.sendSubscriptionFailed(\"Subscription rejected by user. \" + reason, requestContext.msg.subscription_id);\r\n };\r\n ServerStreaming.prototype.pushData = function (streamingMethod, data, branches) {\r\n var _this = this;\r\n if (typeof streamingMethod !== \"object\" || !Array.isArray(streamingMethod.protocolState.branchKeyToStreamIdMap)) {\r\n return;\r\n }\r\n if (typeof data !== \"object\") {\r\n throw new Error(\"Invalid arguments. Data must be an object.\");\r\n }\r\n if (typeof branches === \"string\") {\r\n branches = [branches];\r\n }\r\n else if (!Array.isArray(branches) || branches.length <= 0) {\r\n branches = [];\r\n }\r\n var streamIdList = streamingMethod.protocolState.branchKeyToStreamIdMap\r\n .filter(function (br) {\r\n if (!branches || branches.length === 0) {\r\n return true;\r\n }\r\n return branches.indexOf(br.key) >= 0;\r\n }).map(function (br) {\r\n return br.streamId;\r\n });\r\n streamIdList.forEach(function (streamId) {\r\n var publishMessage = {\r\n type: \"publish\",\r\n stream_id: streamId,\r\n data: data,\r\n };\r\n _this.session.sendFireAndForget(publishMessage);\r\n });\r\n };\r\n ServerStreaming.prototype.pushDataToSingle = function (method, subscription, data) {\r\n if (typeof data !== \"object\") {\r\n throw new Error(\"Invalid arguments. Data must be an object.\");\r\n }\r\n var postMessage = {\r\n type: \"post\",\r\n subscription_id: subscription.id,\r\n data: data,\r\n };\r\n this.session.sendFireAndForget(postMessage);\r\n };\r\n ServerStreaming.prototype.closeSingleSubscription = function (streamingMethod, subscription) {\r\n if (streamingMethod.protocolState.subscriptionsMap) {\r\n delete streamingMethod.protocolState.subscriptionsMap[subscription.id];\r\n }\r\n var dropSubscriptionMessage = {\r\n type: \"drop-subscription\",\r\n subscription_id: subscription.id,\r\n reason: \"Server dropping a single subscription\",\r\n };\r\n this.session.sendFireAndForget(dropSubscriptionMessage);\r\n subscription.instance;\r\n this.callbacks.execute(SUBSCRIPTION_REMOVED, subscription, streamingMethod);\r\n };\r\n ServerStreaming.prototype.closeMultipleSubscriptions = function (streamingMethod, branchKey) {\r\n var _this = this;\r\n if (typeof streamingMethod !== \"object\" || typeof streamingMethod.protocolState.subscriptionsMap !== \"object\") {\r\n return;\r\n }\r\n if (!streamingMethod.protocolState.subscriptionsMap) {\r\n return;\r\n }\r\n var subscriptionsMap = streamingMethod.protocolState.subscriptionsMap;\r\n var subscriptionsToClose = Object.keys(subscriptionsMap)\r\n .map(function (key) {\r\n return subscriptionsMap[key];\r\n });\r\n if (typeof branchKey === \"string\") {\r\n subscriptionsToClose = subscriptionsToClose.filter(function (sub) {\r\n return sub.branchKey === branchKey;\r\n });\r\n }\r\n subscriptionsToClose.forEach(function (subscription) {\r\n delete subscriptionsMap[subscription.id];\r\n var drop = {\r\n type: \"drop-subscription\",\r\n subscription_id: subscription.id,\r\n reason: \"Server dropping all subscriptions on stream_id: \" + subscription.streamId,\r\n };\r\n _this.session.sendFireAndForget(drop);\r\n });\r\n };\r\n ServerStreaming.prototype.getSubscriptionList = function (streamingMethod, branchKey) {\r\n if (typeof streamingMethod !== \"object\") {\r\n return [];\r\n }\r\n var subscriptions = [];\r\n if (!streamingMethod.protocolState.subscriptionsMap) {\r\n return [];\r\n }\r\n var subscriptionsMap = streamingMethod.protocolState.subscriptionsMap;\r\n var allSubscriptions = Object.keys(subscriptionsMap)\r\n .map(function (key) {\r\n return subscriptionsMap[key];\r\n });\r\n if (typeof branchKey !== \"string\") {\r\n subscriptions = allSubscriptions;\r\n }\r\n else {\r\n subscriptions = allSubscriptions.filter(function (sub) {\r\n return sub.branchKey === branchKey;\r\n });\r\n }\r\n return subscriptions;\r\n };\r\n ServerStreaming.prototype.getBranchList = function (streamingMethod) {\r\n if (typeof streamingMethod !== \"object\") {\r\n return [];\r\n }\r\n if (!streamingMethod.protocolState.subscriptionsMap) {\r\n return [];\r\n }\r\n var subscriptionsMap = streamingMethod.protocolState.subscriptionsMap;\r\n var allSubscriptions = Object.keys(subscriptionsMap)\r\n .map(function (key) {\r\n return subscriptionsMap[key];\r\n });\r\n var result = [];\r\n allSubscriptions.forEach(function (sub) {\r\n var branch = \"\";\r\n if (typeof sub === \"object\" && typeof sub.branchKey === \"string\") {\r\n branch = sub.branchKey;\r\n }\r\n if (result.indexOf(branch) === -1) {\r\n result.push(branch);\r\n }\r\n });\r\n return result;\r\n };\r\n ServerStreaming.prototype.onSubAdded = function (callback) {\r\n this.onSubscriptionLifetimeEvent(SUBSCRIPTION_ADDED, callback);\r\n };\r\n ServerStreaming.prototype.onSubRequest = function (callback) {\r\n this.onSubscriptionLifetimeEvent(SUBSCRIPTION_REQUEST, callback);\r\n };\r\n ServerStreaming.prototype.onSubRemoved = function (callback) {\r\n this.onSubscriptionLifetimeEvent(SUBSCRIPTION_REMOVED, callback);\r\n };\r\n ServerStreaming.prototype.handleRemoveInterest = function (msg) {\r\n var streamingMethod = this.serverRepository.getById(msg.method_id);\r\n if (typeof msg.subscription_id !== \"string\" ||\r\n typeof streamingMethod !== \"object\") {\r\n return;\r\n }\r\n if (!streamingMethod.protocolState.subscriptionsMap) {\r\n return;\r\n }\r\n if (typeof streamingMethod.protocolState.subscriptionsMap[msg.subscription_id] !== \"object\") {\r\n return;\r\n }\r\n var subscription = streamingMethod.protocolState.subscriptionsMap[msg.subscription_id];\r\n delete streamingMethod.protocolState.subscriptionsMap[msg.subscription_id];\r\n this.callbacks.execute(SUBSCRIPTION_REMOVED, subscription, streamingMethod);\r\n };\r\n ServerStreaming.prototype.onSubscriptionLifetimeEvent = function (eventName, handlerFunc) {\r\n this.callbacks.add(eventName, handlerFunc);\r\n };\r\n ServerStreaming.prototype.getNextStreamId = function () {\r\n return this.nextStreamId++ + \"\";\r\n };\r\n ServerStreaming.prototype.handleAddInterest = function (msg) {\r\n var caller = this.repository.getServerById(msg.caller_id);\r\n var instance = caller.instance;\r\n var requestContext = {\r\n msg: msg,\r\n arguments: msg.arguments_kv || {},\r\n instance: instance,\r\n };\r\n var streamingMethod = this.serverRepository.getById(msg.method_id);\r\n if (streamingMethod === undefined) {\r\n var errorMsg = \"No method with id \" + msg.method_id + \" on this server.\";\r\n this.sendSubscriptionFailed(errorMsg, msg.subscription_id);\r\n return;\r\n }\r\n if (streamingMethod.protocolState.subscriptionsMap &&\r\n streamingMethod.protocolState.subscriptionsMap[msg.subscription_id]) {\r\n this.sendSubscriptionFailed(\"A subscription with id \" + msg.subscription_id + \" already exists.\", msg.subscription_id);\r\n return;\r\n }\r\n this.callbacks.execute(SUBSCRIPTION_REQUEST, requestContext, streamingMethod);\r\n };\r\n ServerStreaming.prototype.sendSubscriptionFailed = function (reason, subscriptionId) {\r\n var errorMessage = {\r\n type: \"error\",\r\n reason_uri: this.ERR_URI_SUBSCRIPTION_FAILED,\r\n reason: reason,\r\n request_id: subscriptionId,\r\n };\r\n this.session.sendFireAndForget(errorMessage);\r\n };\r\n ServerStreaming.prototype.getStreamId = function (streamingMethod, branchKey) {\r\n if (typeof branchKey !== \"string\") {\r\n branchKey = \"\";\r\n }\r\n if (!streamingMethod.protocolState.branchKeyToStreamIdMap) {\r\n throw new Error(\"streaming \".concat(streamingMethod.definition.name, \" method without protocol state\"));\r\n }\r\n var needleBranch = streamingMethod.protocolState.branchKeyToStreamIdMap.filter(function (branch) {\r\n return branch.key === branchKey;\r\n })[0];\r\n var streamId = (needleBranch ? needleBranch.streamId : undefined);\r\n if (typeof streamId !== \"string\" || streamId === \"\") {\r\n streamId = this.getNextStreamId();\r\n streamingMethod.protocolState.branchKeyToStreamIdMap.push({ key: branchKey, streamId: streamId });\r\n }\r\n return streamId;\r\n };\r\n return ServerStreaming;\r\n}());\n\nvar ServerProtocol = (function () {\r\n function ServerProtocol(session, clientRepository, serverRepository, logger) {\r\n var _this = this;\r\n this.session = session;\r\n this.clientRepository = clientRepository;\r\n this.serverRepository = serverRepository;\r\n this.logger = logger;\r\n this.callbacks = lib$1();\r\n this.streaming = new ServerStreaming(session, clientRepository, serverRepository);\r\n this.session.on(\"invoke\", function (msg) { return _this.handleInvokeMessage(msg); });\r\n }\r\n ServerProtocol.prototype.createStream = function (repoMethod) {\r\n repoMethod.protocolState.subscriptionsMap = {};\r\n repoMethod.protocolState.branchKeyToStreamIdMap = [];\r\n return this.register(repoMethod, true);\r\n };\r\n ServerProtocol.prototype.register = function (repoMethod, isStreaming) {\r\n var _this = this;\r\n var _a;\r\n var methodDef = repoMethod.definition;\r\n var flags = Object.assign({}, { metadata: (_a = methodDef.flags) !== null && _a !== void 0 ? _a : {} }, { streaming: isStreaming || false });\r\n var registerMsg = {\r\n type: \"register\",\r\n methods: [{\r\n id: repoMethod.repoId,\r\n name: methodDef.name,\r\n display_name: methodDef.displayName,\r\n description: methodDef.description,\r\n version: methodDef.version,\r\n flags: flags,\r\n object_types: methodDef.objectTypes || methodDef.object_types,\r\n input_signature: methodDef.accepts,\r\n result_signature: methodDef.returns,\r\n restrictions: undefined,\r\n }],\r\n };\r\n return this.session.send(registerMsg, { methodId: repoMethod.repoId })\r\n .then(function () {\r\n _this.logger.debug(\"registered method \" + repoMethod.definition.name + \" with id \" + repoMethod.repoId);\r\n })\r\n .catch(function (msg) {\r\n _this.logger.warn(\"failed to register method \".concat(repoMethod.definition.name, \" with id \").concat(repoMethod.repoId, \" - \").concat(JSON.stringify(msg)));\r\n throw msg;\r\n });\r\n };\r\n ServerProtocol.prototype.onInvoked = function (callback) {\r\n this.callbacks.add(\"onInvoked\", callback);\r\n };\r\n ServerProtocol.prototype.methodInvocationResult = function (method, invocationId, err, result) {\r\n var msg;\r\n if (err || err === \"\") {\r\n msg = {\r\n type: \"error\",\r\n request_id: invocationId,\r\n reason_uri: \"agm.errors.client_error\",\r\n reason: err,\r\n context: result,\r\n peer_id: undefined,\r\n };\r\n }\r\n else {\r\n msg = {\r\n type: \"yield\",\r\n invocation_id: invocationId,\r\n peer_id: this.session.peerId,\r\n result: result,\r\n request_id: undefined,\r\n };\r\n }\r\n this.session.sendFireAndForget(msg);\r\n };\r\n ServerProtocol.prototype.unregister = function (method) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var msg;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n msg = {\r\n type: \"unregister\",\r\n methods: [method.repoId],\r\n };\r\n return [4, this.session.send(msg)];\r\n case 1:\r\n _a.sent();\r\n return [2];\r\n }\r\n });\r\n });\r\n };\r\n ServerProtocol.prototype.getBranchList = function (method) {\r\n return this.streaming.getBranchList(method);\r\n };\r\n ServerProtocol.prototype.getSubscriptionList = function (method, branchKey) {\r\n return this.streaming.getSubscriptionList(method, branchKey);\r\n };\r\n ServerProtocol.prototype.closeAllSubscriptions = function (method, branchKey) {\r\n this.streaming.closeMultipleSubscriptions(method, branchKey);\r\n };\r\n ServerProtocol.prototype.pushData = function (method, data, branches) {\r\n this.streaming.pushData(method, data, branches);\r\n };\r\n ServerProtocol.prototype.pushDataToSingle = function (method, subscription, data) {\r\n this.streaming.pushDataToSingle(method, subscription, data);\r\n };\r\n ServerProtocol.prototype.closeSingleSubscription = function (method, subscription) {\r\n this.streaming.closeSingleSubscription(method, subscription);\r\n };\r\n ServerProtocol.prototype.acceptRequestOnBranch = function (requestContext, method, branch) {\r\n this.streaming.acceptRequestOnBranch(requestContext, method, branch);\r\n };\r\n ServerProtocol.prototype.rejectRequest = function (requestContext, method, reason) {\r\n this.streaming.rejectRequest(requestContext, method, reason);\r\n };\r\n ServerProtocol.prototype.onSubRequest = function (callback) {\r\n this.streaming.onSubRequest(callback);\r\n };\r\n ServerProtocol.prototype.onSubAdded = function (callback) {\r\n this.streaming.onSubAdded(callback);\r\n };\r\n ServerProtocol.prototype.onSubRemoved = function (callback) {\r\n this.streaming.onSubRemoved(callback);\r\n };\r\n ServerProtocol.prototype.handleInvokeMessage = function (msg) {\r\n var invocationId = msg.invocation_id;\r\n var callerId = msg.caller_id;\r\n var methodId = msg.method_id;\r\n var args = msg.arguments_kv;\r\n var methodList = this.serverRepository.getList();\r\n var method = methodList.filter(function (m) {\r\n return m.repoId === methodId;\r\n })[0];\r\n if (method === undefined) {\r\n return;\r\n }\r\n var client = this.clientRepository.getServerById(callerId).instance;\r\n var invocationArgs = { args: args, instance: client };\r\n this.callbacks.execute(\"onInvoked\", method, invocationId, invocationArgs);\r\n };\r\n return ServerProtocol;\r\n}());\n\nvar UserSubscription = (function () {\r\n function UserSubscription(repository, subscriptionData) {\r\n this.repository = repository;\r\n this.subscriptionData = subscriptionData;\r\n }\r\n Object.defineProperty(UserSubscription.prototype, \"requestArguments\", {\r\n get: function () {\r\n return this.subscriptionData.params.arguments || {};\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(UserSubscription.prototype, \"servers\", {\r\n get: function () {\r\n var _this = this;\r\n return this.subscriptionData.trackedServers\r\n .filter(function (pair) { return pair.subscriptionId; })\r\n .map(function (pair) { return _this.repository.getServerById(pair.serverId).instance; });\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(UserSubscription.prototype, \"serverInstance\", {\r\n get: function () {\r\n return this.servers[0];\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(UserSubscription.prototype, \"stream\", {\r\n get: function () {\r\n return this.subscriptionData.method;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n UserSubscription.prototype.onData = function (dataCallback) {\r\n if (typeof dataCallback !== \"function\") {\r\n throw new TypeError(\"The data callback must be a function.\");\r\n }\r\n this.subscriptionData.handlers.onData.push(dataCallback);\r\n if (this.subscriptionData.handlers.onData.length === 1 && this.subscriptionData.queued.data.length > 0) {\r\n this.subscriptionData.queued.data.forEach(function (dataItem) {\r\n dataCallback(dataItem);\r\n });\r\n }\r\n };\r\n UserSubscription.prototype.onClosed = function (closedCallback) {\r\n if (typeof closedCallback !== \"function\") {\r\n throw new TypeError(\"The callback must be a function.\");\r\n }\r\n this.subscriptionData.handlers.onClosed.push(closedCallback);\r\n };\r\n UserSubscription.prototype.onFailed = function (callback) {\r\n };\r\n UserSubscription.prototype.onConnected = function (callback) {\r\n if (typeof callback !== \"function\") {\r\n throw new TypeError(\"The callback must be a function.\");\r\n }\r\n this.subscriptionData.handlers.onConnected.push(callback);\r\n };\r\n UserSubscription.prototype.close = function () {\r\n this.subscriptionData.close();\r\n };\r\n UserSubscription.prototype.setNewSubscription = function (newSub) {\r\n this.subscriptionData = newSub;\r\n };\r\n return UserSubscription;\r\n}());\n\nvar TimedCache = (function () {\r\n function TimedCache(config) {\r\n this.config = config;\r\n this.cache = [];\r\n this.timeoutIds = [];\r\n }\r\n TimedCache.prototype.add = function (element) {\r\n var _this = this;\r\n var id = shortid();\r\n this.cache.push({ id: id, element: element });\r\n var timeoutId = setTimeout(function () {\r\n var elementIdx = _this.cache.findIndex(function (entry) { return entry.id === id; });\r\n if (elementIdx < 0) {\r\n return;\r\n }\r\n _this.cache.splice(elementIdx, 1);\r\n }, this.config.ELEMENT_TTL_MS);\r\n this.timeoutIds.push(timeoutId);\r\n };\r\n TimedCache.prototype.flush = function () {\r\n var elements = this.cache.map(function (entry) { return entry.element; });\r\n this.timeoutIds.forEach(function (id) { return clearInterval(id); });\r\n this.cache = [];\r\n this.timeoutIds = [];\r\n return elements;\r\n };\r\n return TimedCache;\r\n}());\n\nvar STATUS_AWAITING_ACCEPT = \"awaitingAccept\";\r\nvar STATUS_SUBSCRIBED = \"subscribed\";\r\nvar ERR_MSG_SUB_FAILED = \"Subscription failed.\";\r\nvar ERR_MSG_SUB_REJECTED = \"Subscription rejected.\";\r\nvar ON_CLOSE_MSG_SERVER_INIT = \"ServerInitiated\";\r\nvar ON_CLOSE_MSG_CLIENT_INIT = \"ClientInitiated\";\r\nvar ClientStreaming = (function () {\r\n function ClientStreaming(session, repository, logger) {\r\n var _this = this;\r\n this.session = session;\r\n this.repository = repository;\r\n this.logger = logger;\r\n this.subscriptionsList = {};\r\n this.timedCache = new TimedCache({ ELEMENT_TTL_MS: 10000 });\r\n this.subscriptionIdToLocalKeyMap = {};\r\n this.nextSubLocalKey = 0;\r\n this.handleErrorSubscribing = function (errorResponse) {\r\n var tag = errorResponse._tag;\r\n var subLocalKey = tag.subLocalKey;\r\n var pendingSub = _this.subscriptionsList[subLocalKey];\r\n if (typeof pendingSub !== \"object\") {\r\n return;\r\n }\r\n pendingSub.trackedServers = pendingSub.trackedServers.filter(function (server) {\r\n return server.serverId !== tag.serverId;\r\n });\r\n if (pendingSub.trackedServers.length <= 0) {\r\n clearTimeout(pendingSub.timeoutId);\r\n if (pendingSub.status === STATUS_AWAITING_ACCEPT) {\r\n var reason = (typeof errorResponse.reason === \"string\" && errorResponse.reason !== \"\") ?\r\n ' Publisher said \"' + errorResponse.reason + '\".' :\r\n \" No reason given.\";\r\n var callArgs = typeof pendingSub.params.arguments === \"object\" ?\r\n JSON.stringify(pendingSub.params.arguments) :\r\n \"{}\";\r\n pendingSub.error({\r\n message: ERR_MSG_SUB_REJECTED + reason + \" Called with:\" + callArgs,\r\n called_with: pendingSub.params.arguments,\r\n method: pendingSub.method,\r\n });\r\n }\r\n else if (pendingSub.status === STATUS_SUBSCRIBED) {\r\n _this.callOnClosedHandlers(pendingSub);\r\n }\r\n delete _this.subscriptionsList[subLocalKey];\r\n }\r\n };\r\n this.handleSubscribed = function (msg) {\r\n var subLocalKey = msg._tag.subLocalKey;\r\n var pendingSub = _this.subscriptionsList[subLocalKey];\r\n if (typeof pendingSub !== \"object\") {\r\n return;\r\n }\r\n var serverId = msg._tag.serverId;\r\n var acceptingServer = pendingSub.trackedServers\r\n .filter(function (server) {\r\n return server.serverId === serverId;\r\n })[0];\r\n if (typeof acceptingServer !== \"object\") {\r\n return;\r\n }\r\n acceptingServer.subscriptionId = msg.subscription_id;\r\n _this.subscriptionIdToLocalKeyMap[msg.subscription_id] = subLocalKey;\r\n var isFirstResponse = (pendingSub.status === STATUS_AWAITING_ACCEPT);\r\n pendingSub.status = STATUS_SUBSCRIBED;\r\n if (isFirstResponse) {\r\n var reconnect = false;\r\n var sub = pendingSub.subscription;\r\n if (sub) {\r\n sub.setNewSubscription(pendingSub);\r\n pendingSub.success(sub);\r\n reconnect = true;\r\n }\r\n else {\r\n sub = new UserSubscription(_this.repository, pendingSub);\r\n pendingSub.subscription = sub;\r\n pendingSub.success(sub);\r\n }\r\n for (var _i = 0, _a = pendingSub.handlers.onConnected; _i < _a.length; _i++) {\r\n var handler = _a[_i];\r\n try {\r\n handler(sub.serverInstance, reconnect);\r\n }\r\n catch (e) {\r\n }\r\n }\r\n }\r\n };\r\n this.handleEventData = function (msg) {\r\n var subLocalKey = _this.subscriptionIdToLocalKeyMap[msg.subscription_id];\r\n if (typeof subLocalKey === \"undefined\") {\r\n return;\r\n }\r\n var subscription = _this.subscriptionsList[subLocalKey];\r\n if (typeof subscription !== \"object\") {\r\n return;\r\n }\r\n var trackedServersFound = subscription.trackedServers.filter(function (server) {\r\n return server.subscriptionId === msg.subscription_id;\r\n });\r\n if (trackedServersFound.length !== 1) {\r\n return;\r\n }\r\n var isPrivateData = msg.oob;\r\n var sendingServerId = trackedServersFound[0].serverId;\r\n var receivedStreamData = function () {\r\n return {\r\n data: msg.data,\r\n server: _this.repository.getServerById(sendingServerId).instance,\r\n requestArguments: subscription.params.arguments,\r\n message: undefined,\r\n private: isPrivateData,\r\n };\r\n };\r\n var onDataHandlers = subscription.handlers.onData;\r\n var queuedData = subscription.queued.data;\r\n if (onDataHandlers.length > 0) {\r\n onDataHandlers.forEach(function (callback) {\r\n if (typeof callback === \"function\") {\r\n callback(receivedStreamData());\r\n }\r\n });\r\n }\r\n else {\r\n queuedData.push(receivedStreamData());\r\n }\r\n };\r\n this.handleSubscriptionCancelled = function (msg) {\r\n var subLocalKey = _this.subscriptionIdToLocalKeyMap[msg.subscription_id];\r\n if (typeof subLocalKey === \"undefined\") {\r\n return;\r\n }\r\n var subscription = _this.subscriptionsList[subLocalKey];\r\n if (typeof subscription !== \"object\") {\r\n return;\r\n }\r\n var expectedNewLength = subscription.trackedServers.length - 1;\r\n subscription.trackedServers = subscription.trackedServers.filter(function (server) {\r\n if (server.subscriptionId === msg.subscription_id) {\r\n subscription.queued.closers.push(server.serverId);\r\n return false;\r\n }\r\n else {\r\n return true;\r\n }\r\n });\r\n if (subscription.trackedServers.length !== expectedNewLength) {\r\n return;\r\n }\r\n if (subscription.trackedServers.length <= 0) {\r\n _this.timedCache.add(subscription);\r\n clearTimeout(subscription.timeoutId);\r\n _this.callOnClosedHandlers(subscription);\r\n delete _this.subscriptionsList[subLocalKey];\r\n }\r\n delete _this.subscriptionIdToLocalKeyMap[msg.subscription_id];\r\n };\r\n session.on(\"subscribed\", this.handleSubscribed);\r\n session.on(\"event\", this.handleEventData);\r\n session.on(\"subscription-cancelled\", this.handleSubscriptionCancelled);\r\n }\r\n ClientStreaming.prototype.subscribe = function (streamingMethod, params, targetServers, success, error, existingSub) {\r\n var _this = this;\r\n if (targetServers.length === 0) {\r\n error({\r\n method: streamingMethod,\r\n called_with: params.arguments,\r\n message: ERR_MSG_SUB_FAILED + \" No available servers matched the target params.\",\r\n });\r\n return;\r\n }\r\n var subLocalKey = this.getNextSubscriptionLocalKey();\r\n var pendingSub = this.registerSubscription(subLocalKey, streamingMethod, params, success, error, params.methodResponseTimeout || 10000, existingSub);\r\n if (typeof pendingSub !== \"object\") {\r\n error({\r\n method: streamingMethod,\r\n called_with: params.arguments,\r\n message: ERR_MSG_SUB_FAILED + \" Unable to register the user callbacks.\",\r\n });\r\n return;\r\n }\r\n targetServers.forEach(function (target) {\r\n var serverId = target.server.id;\r\n var method = target.methods.find(function (m) { return m.name === streamingMethod.name; });\r\n if (!method) {\r\n _this.logger.error(\"can not find method \".concat(streamingMethod.name, \" for target \").concat(target.server.id));\r\n return;\r\n }\r\n pendingSub.trackedServers.push({\r\n serverId: serverId,\r\n subscriptionId: undefined,\r\n });\r\n var msg = {\r\n type: \"subscribe\",\r\n server_id: serverId,\r\n method_id: method.gatewayId,\r\n arguments_kv: params.arguments,\r\n };\r\n _this.session.send(msg, { serverId: serverId, subLocalKey: subLocalKey })\r\n .then(function (m) { return _this.handleSubscribed(m); })\r\n .catch(function (err) { return _this.handleErrorSubscribing(err); });\r\n });\r\n };\r\n ClientStreaming.prototype.drainSubscriptions = function () {\r\n var existing = Object.values(this.subscriptionsList);\r\n this.subscriptionsList = {};\r\n this.subscriptionIdToLocalKeyMap = {};\r\n return existing;\r\n };\r\n ClientStreaming.prototype.drainSubscriptionsCache = function () {\r\n return this.timedCache.flush();\r\n };\r\n ClientStreaming.prototype.getNextSubscriptionLocalKey = function () {\r\n var current = this.nextSubLocalKey;\r\n this.nextSubLocalKey += 1;\r\n return current;\r\n };\r\n ClientStreaming.prototype.registerSubscription = function (subLocalKey, method, params, success, error, timeout, existingSub) {\r\n var _this = this;\r\n var subsInfo = {\r\n localKey: subLocalKey,\r\n status: STATUS_AWAITING_ACCEPT,\r\n method: method,\r\n params: params,\r\n success: success,\r\n error: error,\r\n trackedServers: [],\r\n handlers: {\r\n onData: (existingSub === null || existingSub === void 0 ? void 0 : existingSub.handlers.onData) || [],\r\n onClosed: (existingSub === null || existingSub === void 0 ? void 0 : existingSub.handlers.onClosed) || [],\r\n onConnected: (existingSub === null || existingSub === void 0 ? void 0 : existingSub.handlers.onConnected) || [],\r\n },\r\n queued: {\r\n data: [],\r\n closers: [],\r\n },\r\n timeoutId: undefined,\r\n close: function () { return _this.closeSubscription(subLocalKey); },\r\n subscription: existingSub === null || existingSub === void 0 ? void 0 : existingSub.subscription\r\n };\r\n if (!existingSub) {\r\n if (params.onData) {\r\n subsInfo.handlers.onData.push(params.onData);\r\n }\r\n if (params.onClosed) {\r\n subsInfo.handlers.onClosed.push(params.onClosed);\r\n }\r\n if (params.onConnected) {\r\n subsInfo.handlers.onConnected.push(params.onConnected);\r\n }\r\n }\r\n this.subscriptionsList[subLocalKey] = subsInfo;\r\n subsInfo.timeoutId = setTimeout(function () {\r\n if (_this.subscriptionsList[subLocalKey] === undefined) {\r\n return;\r\n }\r\n var pendingSub = _this.subscriptionsList[subLocalKey];\r\n if (pendingSub.status === STATUS_AWAITING_ACCEPT) {\r\n error({\r\n method: method,\r\n called_with: params.arguments,\r\n message: ERR_MSG_SUB_FAILED + \" Subscription attempt timed out after \" + timeout + \" ms.\",\r\n });\r\n delete _this.subscriptionsList[subLocalKey];\r\n }\r\n else if (pendingSub.status === STATUS_SUBSCRIBED && pendingSub.trackedServers.length > 0) {\r\n pendingSub.trackedServers = pendingSub.trackedServers.filter(function (server) {\r\n return (typeof server.subscriptionId !== \"undefined\");\r\n });\r\n delete pendingSub.timeoutId;\r\n if (pendingSub.trackedServers.length <= 0) {\r\n _this.callOnClosedHandlers(pendingSub);\r\n delete _this.subscriptionsList[subLocalKey];\r\n }\r\n }\r\n }, timeout);\r\n return subsInfo;\r\n };\r\n ClientStreaming.prototype.callOnClosedHandlers = function (subscription, reason) {\r\n var closersCount = subscription.queued.closers.length;\r\n var closingServerId = (closersCount > 0) ? subscription.queued.closers[closersCount - 1] : null;\r\n var closingServer;\r\n if (closingServerId !== undefined && typeof closingServerId === \"string\") {\r\n closingServer = this.repository.getServerById(closingServerId).instance;\r\n }\r\n subscription.handlers.onClosed.forEach(function (callback) {\r\n if (typeof callback !== \"function\") {\r\n return;\r\n }\r\n callback({\r\n message: reason || ON_CLOSE_MSG_SERVER_INIT,\r\n requestArguments: subscription.params.arguments || {},\r\n server: closingServer,\r\n stream: subscription.method,\r\n });\r\n });\r\n };\r\n ClientStreaming.prototype.closeSubscription = function (subLocalKey) {\r\n var _this = this;\r\n var subscription = this.subscriptionsList[subLocalKey];\r\n if (typeof subscription !== \"object\") {\r\n return;\r\n }\r\n subscription.trackedServers.forEach(function (server) {\r\n if (typeof server.subscriptionId === \"undefined\") {\r\n return;\r\n }\r\n subscription.queued.closers.push(server.serverId);\r\n _this.session.sendFireAndForget({\r\n type: \"unsubscribe\",\r\n subscription_id: server.subscriptionId,\r\n reason_uri: \"\",\r\n reason: ON_CLOSE_MSG_CLIENT_INIT,\r\n });\r\n delete _this.subscriptionIdToLocalKeyMap[server.subscriptionId];\r\n });\r\n subscription.trackedServers = [];\r\n this.callOnClosedHandlers(subscription, ON_CLOSE_MSG_CLIENT_INIT);\r\n delete this.subscriptionsList[subLocalKey];\r\n };\r\n return ClientStreaming;\r\n}());\n\nvar ClientProtocol = (function () {\r\n function ClientProtocol(session, repository, logger) {\r\n var _this = this;\r\n this.session = session;\r\n this.repository = repository;\r\n this.logger = logger;\r\n session.on(\"peer-added\", function (msg) { return _this.handlePeerAdded(msg); });\r\n session.on(\"peer-removed\", function (msg) { return _this.handlePeerRemoved(msg); });\r\n session.on(\"methods-added\", function (msg) { return _this.handleMethodsAddedMessage(msg); });\r\n session.on(\"methods-removed\", function (msg) { return _this.handleMethodsRemovedMessage(msg); });\r\n this.streaming = new ClientStreaming(session, repository, logger);\r\n }\r\n ClientProtocol.prototype.subscribe = function (stream, options, targetServers, success, error, existingSub) {\r\n this.streaming.subscribe(stream, options, targetServers, success, error, existingSub);\r\n };\r\n ClientProtocol.prototype.invoke = function (id, method, args, target) {\r\n var _this = this;\r\n var serverId = target.id;\r\n var methodId = method.gatewayId;\r\n var msg = {\r\n type: \"call\",\r\n server_id: serverId,\r\n method_id: methodId,\r\n arguments_kv: args,\r\n };\r\n return this.session.send(msg, { invocationId: id, serverId: serverId })\r\n .then(function (m) { return _this.handleResultMessage(m); })\r\n .catch(function (err) { return _this.handleInvocationError(err); });\r\n };\r\n ClientProtocol.prototype.drainSubscriptions = function () {\r\n return this.streaming.drainSubscriptions();\r\n };\r\n ClientProtocol.prototype.drainSubscriptionsCache = function () {\r\n return this.streaming.drainSubscriptionsCache();\r\n };\r\n ClientProtocol.prototype.handlePeerAdded = function (msg) {\r\n var newPeerId = msg.new_peer_id;\r\n var remoteId = msg.identity;\r\n var isLocal = msg.meta ? msg.meta.local : true;\r\n var pid = Number(remoteId.process);\r\n var serverInfo = {\r\n machine: remoteId.machine,\r\n pid: isNaN(pid) ? remoteId.process : pid,\r\n instance: remoteId.instance,\r\n application: remoteId.application,\r\n applicationName: remoteId.applicationName,\r\n environment: remoteId.environment,\r\n region: remoteId.region,\r\n user: remoteId.user,\r\n windowId: remoteId.windowId,\r\n peerId: newPeerId,\r\n api: remoteId.api,\r\n isLocal: isLocal\r\n };\r\n this.repository.addServer(serverInfo, newPeerId);\r\n };\r\n ClientProtocol.prototype.handlePeerRemoved = function (msg) {\r\n var removedPeerId = msg.removed_id;\r\n var reason = msg.reason;\r\n this.repository.removeServerById(removedPeerId, reason);\r\n };\r\n ClientProtocol.prototype.handleMethodsAddedMessage = function (msg) {\r\n var _this = this;\r\n var serverId = msg.server_id;\r\n var methods = msg.methods;\r\n methods.forEach(function (method) {\r\n _this.repository.addServerMethod(serverId, method);\r\n });\r\n };\r\n ClientProtocol.prototype.handleMethodsRemovedMessage = function (msg) {\r\n var _this = this;\r\n var serverId = msg.server_id;\r\n var methodIdList = msg.methods;\r\n var server = this.repository.getServerById(serverId);\r\n var serverMethodKeys = Object.keys(server.methods);\r\n serverMethodKeys.forEach(function (methodKey) {\r\n var method = server.methods[methodKey];\r\n if (methodIdList.indexOf(method.gatewayId) > -1) {\r\n _this.repository.removeServerMethod(serverId, methodKey);\r\n }\r\n });\r\n };\r\n ClientProtocol.prototype.handleResultMessage = function (msg) {\r\n var invocationId = msg._tag.invocationId;\r\n var result = msg.result;\r\n var serverId = msg._tag.serverId;\r\n var server = this.repository.getServerById(serverId);\r\n return {\r\n invocationId: invocationId,\r\n result: result,\r\n instance: server.instance,\r\n status: InvokeStatus.Success,\r\n message: \"\"\r\n };\r\n };\r\n ClientProtocol.prototype.handleInvocationError = function (msg) {\r\n this.logger.debug(\"handle invocation error \".concat(JSON.stringify(msg)));\r\n if (\"_tag\" in msg) {\r\n var invocationId = msg._tag.invocationId;\r\n var serverId = msg._tag.serverId;\r\n var server = this.repository.getServerById(serverId);\r\n var message = msg.reason;\r\n var context_1 = msg.context;\r\n return {\r\n invocationId: invocationId,\r\n result: context_1,\r\n instance: server.instance,\r\n status: InvokeStatus.Error,\r\n message: message\r\n };\r\n }\r\n else {\r\n return {\r\n invocationId: \"\",\r\n message: msg.message,\r\n status: InvokeStatus.Error,\r\n error: msg\r\n };\r\n }\r\n };\r\n return ClientProtocol;\r\n}());\n\nfunction gW3ProtocolFactory (instance, connection, clientRepository, serverRepository, libConfig, interop) {\r\n var logger = libConfig.logger.subLogger(\"gw3-protocol\");\r\n var resolveReadyPromise;\r\n var readyPromise = new Promise(function (resolve) {\r\n resolveReadyPromise = resolve;\r\n });\r\n var session = connection.domain(\"agm\", [\"subscribed\"]);\r\n var server = new ServerProtocol(session, clientRepository, serverRepository, logger.subLogger(\"server\"));\r\n var client = new ClientProtocol(session, clientRepository, logger.subLogger(\"client\"));\r\n function handleReconnect() {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var reconnectionPromises, existingSubscriptions, _loop_1, _i, existingSubscriptions_1, sub, registeredMethods, _loop_2, _a, registeredMethods_1, method;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n logger.info(\"reconnected - will replay registered methods and subscriptions\");\r\n client.drainSubscriptionsCache().forEach(function (sub) {\r\n var methodInfo = sub.method;\r\n var params = Object.assign({}, sub.params);\r\n logger.info(\"trying to soft-re-subscribe to method \".concat(methodInfo.name, \", with params: \").concat(JSON.stringify(params)));\r\n interop.client.subscribe(methodInfo, params, undefined, undefined, sub).then(function () { return logger.info(\"soft-subscribing to method \".concat(methodInfo.name, \" DONE\")); }).catch(function (error) { return logger.warn(\"subscribing to method \".concat(methodInfo.name, \" failed: \").concat(JSON.stringify(error), \"}\")); });\r\n });\r\n reconnectionPromises = [];\r\n existingSubscriptions = client.drainSubscriptions();\r\n _loop_1 = function (sub) {\r\n var methodInfo = sub.method;\r\n var params = Object.assign({}, sub.params);\r\n logger.info(\"trying to re-subscribe to method \".concat(methodInfo.name, \", with params: \").concat(JSON.stringify(params)));\r\n reconnectionPromises.push(interop.client.subscribe(methodInfo, params, undefined, undefined, sub).then(function () { return logger.info(\"subscribing to method \".concat(methodInfo.name, \" DONE\")); }));\r\n };\r\n for (_i = 0, existingSubscriptions_1 = existingSubscriptions; _i < existingSubscriptions_1.length; _i++) {\r\n sub = existingSubscriptions_1[_i];\r\n _loop_1(sub);\r\n }\r\n registeredMethods = serverRepository.getList();\r\n serverRepository.reset();\r\n _loop_2 = function (method) {\r\n var def = method.definition;\r\n logger.info(\"re-publishing method \".concat(def.name));\r\n if (method.stream) {\r\n reconnectionPromises.push(interop.server.createStream(def, method.streamCallbacks, undefined, undefined, method.stream).then(function () { return logger.info(\"subscribing to method \".concat(def.name, \" DONE\")); }));\r\n }\r\n else if (method.theFunction && method.theFunction.userCallback) {\r\n reconnectionPromises.push(interop.register(def, method.theFunction.userCallback).then(function () { return logger.info(\"subscribing to method \".concat(def.name, \" DONE\")); }));\r\n }\r\n else if (method.theFunction && method.theFunction.userCallbackAsync) {\r\n reconnectionPromises.push(interop.registerAsync(def, method.theFunction.userCallbackAsync).then(function () { return logger.info(\"subscribing to method \".concat(def.name, \" DONE\")); }));\r\n }\r\n logger.info(\"re-publishing method \".concat(def.name, \" DONE\"));\r\n };\r\n for (_a = 0, registeredMethods_1 = registeredMethods; _a < registeredMethods_1.length; _a++) {\r\n method = registeredMethods_1[_a];\r\n _loop_2(method);\r\n }\r\n return [4, Promise.all(reconnectionPromises)];\r\n case 1:\r\n _b.sent();\r\n logger.info(\"Interop is re-announced\");\r\n return [2];\r\n }\r\n });\r\n });\r\n }\r\n function handleInitialJoin() {\r\n if (resolveReadyPromise) {\r\n resolveReadyPromise({\r\n client: client,\r\n server: server,\r\n });\r\n resolveReadyPromise = undefined;\r\n }\r\n }\r\n session.onJoined(function (reconnect) {\r\n clientRepository.addServer(instance, connection.peerId);\r\n if (reconnect) {\r\n handleReconnect().then(function () { return connection.setLibReAnnounced({ name: \"interop\" }); }).catch(function (error) { return logger.warn(\"Error while re-announcing interop: \".concat(JSON.stringify(error))); });\r\n }\r\n else {\r\n handleInitialJoin();\r\n }\r\n });\r\n session.onLeft(function () {\r\n clientRepository.reset();\r\n });\r\n session.join();\r\n return readyPromise;\r\n}\n\nvar Interop = (function () {\r\n function Interop(configuration) {\r\n var _this = this;\r\n if (typeof configuration === \"undefined\") {\r\n throw new Error(\"configuration is required\");\r\n }\r\n if (typeof configuration.connection === \"undefined\") {\r\n throw new Error(\"configuration.connections is required\");\r\n }\r\n var connection = configuration.connection;\r\n if (typeof configuration.methodResponseTimeout !== \"number\") {\r\n configuration.methodResponseTimeout = 30 * 1000;\r\n }\r\n if (typeof configuration.waitTimeoutMs !== \"number\") {\r\n configuration.waitTimeoutMs = 30 * 1000;\r\n }\r\n this.unwrappedInstance = new InstanceWrapper(this, undefined, connection);\r\n this.instance = this.unwrappedInstance.unwrap();\r\n this.clientRepository = new ClientRepository(configuration.logger.subLogger(\"cRep\"), this);\r\n this.serverRepository = new ServerRepository();\r\n var protocolPromise;\r\n if (connection.protocolVersion === 3) {\r\n protocolPromise = gW3ProtocolFactory(this.instance, connection, this.clientRepository, this.serverRepository, configuration, this);\r\n }\r\n else {\r\n throw new Error(\"protocol \".concat(connection.protocolVersion, \" not supported\"));\r\n }\r\n this.readyPromise = protocolPromise.then(function (protocol) {\r\n _this.protocol = protocol;\r\n _this.client = new Client(_this.protocol, _this.clientRepository, _this.instance, configuration);\r\n _this.server = new Server(_this.protocol, _this.serverRepository);\r\n return _this;\r\n });\r\n }\r\n Interop.prototype.ready = function () {\r\n return this.readyPromise;\r\n };\r\n Interop.prototype.serverRemoved = function (callback) {\r\n return this.client.serverRemoved(callback);\r\n };\r\n Interop.prototype.serverAdded = function (callback) {\r\n return this.client.serverAdded(callback);\r\n };\r\n Interop.prototype.serverMethodRemoved = function (callback) {\r\n return this.client.serverMethodRemoved(callback);\r\n };\r\n Interop.prototype.serverMethodAdded = function (callback) {\r\n return this.client.serverMethodAdded(callback);\r\n };\r\n Interop.prototype.methodRemoved = function (callback) {\r\n return this.client.methodRemoved(callback);\r\n };\r\n Interop.prototype.methodAdded = function (callback) {\r\n return this.client.methodAdded(callback);\r\n };\r\n Interop.prototype.methodsForInstance = function (instance) {\r\n return this.client.methodsForInstance(instance);\r\n };\r\n Interop.prototype.methods = function (methodFilter) {\r\n return this.client.methods(methodFilter);\r\n };\r\n Interop.prototype.servers = function (methodFilter) {\r\n return this.client.servers(methodFilter);\r\n };\r\n Interop.prototype.subscribe = function (method, options, successCallback, errorCallback) {\r\n return this.client.subscribe(method, options, successCallback, errorCallback);\r\n };\r\n Interop.prototype.createStream = function (streamDef, callbacks, successCallback, errorCallback) {\r\n return this.server.createStream(streamDef, callbacks, successCallback, errorCallback);\r\n };\r\n Interop.prototype.unregister = function (methodFilter) {\r\n return this.server.unregister(methodFilter);\r\n };\r\n Interop.prototype.registerAsync = function (methodDefinition, callback) {\r\n return this.server.registerAsync(methodDefinition, callback);\r\n };\r\n Interop.prototype.register = function (methodDefinition, callback) {\r\n return this.server.register(methodDefinition, callback);\r\n };\r\n Interop.prototype.invoke = function (methodFilter, argumentObj, target, additionalOptions, success, error) {\r\n return this.client.invoke(methodFilter, argumentObj, target, additionalOptions, success, error);\r\n };\r\n Interop.prototype.waitForMethod = function (name) {\r\n var pw = new PromiseWrapper();\r\n var unsubscribe = this.client.methodAdded(function (m) {\r\n if (m.name === name) {\r\n unsubscribe();\r\n pw.resolve(m);\r\n }\r\n });\r\n return pw.promise;\r\n };\r\n return Interop;\r\n}());\n\nvar successMessages = [\"subscribed\", \"success\"];\r\nvar MessageBus = (function () {\r\n function MessageBus(connection, logger) {\r\n var _this = this;\r\n this.publish = function (topic, data, options) {\r\n var _a = options || {}, routingKey = _a.routingKey, target = _a.target;\r\n var args = _this.removeEmptyValues({\r\n type: \"publish\",\r\n topic: topic,\r\n data: data,\r\n peer_id: _this.peerId,\r\n routing_key: routingKey,\r\n target_identity: target\r\n });\r\n _this.session.send(args);\r\n };\r\n this.subscribe = function (topic, callback, options) {\r\n return new Promise(function (resolve, reject) {\r\n var _a = options || {}, routingKey = _a.routingKey, target = _a.target;\r\n var args = _this.removeEmptyValues({\r\n type: \"subscribe\",\r\n topic: topic,\r\n peer_id: _this.peerId,\r\n routing_key: routingKey,\r\n source: target\r\n });\r\n _this.session.send(args)\r\n .then(function (response) {\r\n var subscription_id = response.subscription_id;\r\n _this.subscriptions.push({ subscription_id: subscription_id, topic: topic, callback: callback, source: target });\r\n resolve({\r\n unsubscribe: function () {\r\n _this.session.send({ type: \"unsubscribe\", subscription_id: subscription_id, peer_id: _this.peerId });\r\n _this.subscriptions = _this.subscriptions.filter(function (s) { return s.subscription_id !== subscription_id; });\r\n return Promise.resolve();\r\n }\r\n });\r\n })\r\n .catch(function (error) { return reject(error); });\r\n });\r\n };\r\n this.watchOnEvent = function () {\r\n _this.session.on(\"event\", function (args) {\r\n var data = args.data, subscription_id = args.subscription_id;\r\n var source = args[\"publisher-identity\"];\r\n var subscription = _this.subscriptions.find(function (s) { return s.subscription_id === subscription_id; });\r\n if (subscription) {\r\n if (!subscription.source) {\r\n subscription.callback(data, subscription.topic, source);\r\n }\r\n else {\r\n if (_this.keysMatch(subscription.source, source)) {\r\n subscription.callback(data, subscription.topic, source);\r\n }\r\n }\r\n }\r\n });\r\n };\r\n this.connection = connection;\r\n this.logger = logger;\r\n this.peerId = connection.peerId;\r\n this.subscriptions = [];\r\n this.session = connection.domain(\"bus\", successMessages);\r\n this.readyPromise = this.session.join();\r\n this.readyPromise.then(function () {\r\n _this.watchOnEvent();\r\n });\r\n }\r\n MessageBus.prototype.ready = function () {\r\n return this.readyPromise;\r\n };\r\n MessageBus.prototype.removeEmptyValues = function (obj) {\r\n var cleaned = {};\r\n Object.keys(obj).forEach(function (key) {\r\n if (obj[key] !== undefined && obj[key] !== null) {\r\n cleaned[key] = obj[key];\r\n }\r\n });\r\n return cleaned;\r\n };\r\n MessageBus.prototype.keysMatch = function (obj1, obj2) {\r\n var keysObj1 = Object.keys(obj1);\r\n var allMatch = true;\r\n keysObj1.forEach(function (key) {\r\n if (obj1[key] !== obj2[key]) {\r\n allMatch = false;\r\n }\r\n });\r\n return allMatch;\r\n };\r\n return MessageBus;\r\n}());\n\nvar IOConnectCoreFactory = function (userConfig, ext) {\r\n var _a, _b;\r\n var iodesktop = typeof window === \"object\" ? ((_a = window.iodesktop) !== null && _a !== void 0 ? _a : window.glue42gd) : undefined;\r\n var preloadPromise = typeof window === \"object\" ? ((_b = window.gdPreloadPromise) !== null && _b !== void 0 ? _b : Promise.resolve()) : Promise.resolve();\r\n var glueInitTimer = timer(\"glue\");\r\n userConfig = userConfig || {};\r\n ext = ext || {};\r\n var internalConfig = prepareConfig(userConfig, ext, iodesktop);\r\n var _connection;\r\n var _interop;\r\n var _logger;\r\n var _metrics;\r\n var _contexts;\r\n var _bus;\r\n var _allowTrace;\r\n var libs = {};\r\n function registerLib(name, inner, t) {\r\n _allowTrace = _logger.canPublish(\"trace\");\r\n if (_allowTrace) {\r\n _logger.trace(\"registering \".concat(name, \" module\"));\r\n }\r\n var done = function () {\r\n inner.initTime = t.stop();\r\n inner.initEndTime = t.endTime;\r\n inner.marks = t.marks;\r\n if (_allowTrace) {\r\n _logger.trace(\"\".concat(name, \" is ready - \").concat(t.endTime - t.startTime));\r\n }\r\n };\r\n inner.initStartTime = t.startTime;\r\n if (inner.ready) {\r\n inner.ready().then(function () {\r\n done();\r\n });\r\n }\r\n else {\r\n done();\r\n }\r\n if (!Array.isArray(name)) {\r\n name = [name];\r\n }\r\n name.forEach(function (n) {\r\n libs[n] = inner;\r\n IOConnectCoreFactory[n] = inner;\r\n });\r\n }\r\n function setupConnection() {\r\n var initTimer = timer(\"connection\");\r\n _connection = new Connection(internalConfig.connection, _logger.subLogger(\"connection\"));\r\n var authPromise = Promise.resolve(internalConfig.auth);\r\n if (internalConfig.connection && !internalConfig.auth) {\r\n if (iodesktop) {\r\n authPromise = iodesktop.getGWToken()\r\n .then(function (token) {\r\n return {\r\n gatewayToken: token\r\n };\r\n });\r\n }\r\n else if (typeof window !== \"undefined\" && (window === null || window === void 0 ? void 0 : window.glue42electron)) {\r\n if (typeof window.glue42electron.gwToken === \"string\") {\r\n authPromise = Promise.resolve({\r\n gatewayToken: window.glue42electron.gwToken\r\n });\r\n }\r\n }\r\n else {\r\n authPromise = Promise.reject(\"You need to provide auth information\");\r\n }\r\n }\r\n return authPromise\r\n .then(function (authConfig) {\r\n initTimer.mark(\"auth-promise-resolved\");\r\n var authRequest;\r\n if (Object.prototype.toString.call(authConfig) === \"[object Object]\") {\r\n authRequest = authConfig;\r\n }\r\n else {\r\n throw new Error(\"Invalid auth object - \" + JSON.stringify(authConfig));\r\n }\r\n return _connection.login(authRequest);\r\n })\r\n .then(function () {\r\n registerLib(\"connection\", _connection, initTimer);\r\n return internalConfig;\r\n })\r\n .catch(function (e) {\r\n if (_connection) {\r\n _connection.logout();\r\n }\r\n throw e;\r\n });\r\n }\r\n function setupLogger() {\r\n var _a;\r\n var initTimer = timer(\"logger\");\r\n _logger = new Logger(\"\".concat((_a = internalConfig.connection.identity) === null || _a === void 0 ? void 0 : _a.application), undefined, internalConfig.customLogger);\r\n _logger.consoleLevel(internalConfig.logger.console);\r\n _logger.publishLevel(internalConfig.logger.publish);\r\n if (_logger.canPublish(\"debug\")) {\r\n _logger.debug(\"initializing glue...\");\r\n }\r\n registerLib(\"logger\", _logger, initTimer);\r\n return Promise.resolve(undefined);\r\n }\r\n function setupMetrics() {\r\n var _a, _b, _c, _d, _e;\r\n var initTimer = timer(\"metrics\");\r\n var config = internalConfig.metrics;\r\n var metricsPublishingEnabledFunc = iodesktop === null || iodesktop === void 0 ? void 0 : iodesktop.getMetricsPublishingEnabled;\r\n var identity = internalConfig.connection.identity;\r\n var canUpdateMetric = metricsPublishingEnabledFunc ? metricsPublishingEnabledFunc : function () { return true; };\r\n var disableAutoAppSystem = (_a = (typeof config !== \"boolean\" && config.disableAutoAppSystem)) !== null && _a !== void 0 ? _a : false;\r\n _metrics = metrics({\r\n connection: config ? _connection : undefined,\r\n logger: _logger.subLogger(\"metrics\"),\r\n canUpdateMetric: canUpdateMetric,\r\n system: \"Glue42\",\r\n service: (_c = (_b = identity === null || identity === void 0 ? void 0 : identity.service) !== null && _b !== void 0 ? _b : iodesktop === null || iodesktop === void 0 ? void 0 : iodesktop.applicationName) !== null && _c !== void 0 ? _c : internalConfig.application,\r\n instance: (_e = (_d = identity === null || identity === void 0 ? void 0 : identity.instance) !== null && _d !== void 0 ? _d : identity === null || identity === void 0 ? void 0 : identity.windowId) !== null && _e !== void 0 ? _e : shortid(),\r\n disableAutoAppSystem: disableAutoAppSystem,\r\n pagePerformanceMetrics: typeof config !== \"boolean\" ? config === null || config === void 0 ? void 0 : config.pagePerformanceMetrics : undefined\r\n });\r\n registerLib(\"metrics\", _metrics, initTimer);\r\n return Promise.resolve();\r\n }\r\n function setupInterop() {\r\n var initTimer = timer(\"interop\");\r\n var agmConfig = {\r\n connection: _connection,\r\n logger: _logger.subLogger(\"interop\"),\r\n };\r\n _interop = new Interop(agmConfig);\r\n Logger.Interop = _interop;\r\n registerLib([\"interop\", \"agm\"], _interop, initTimer);\r\n return Promise.resolve();\r\n }\r\n function setupContexts() {\r\n var hasActivities = (internalConfig.activities && _connection.protocolVersion === 3);\r\n var needsContexts = internalConfig.contexts || hasActivities;\r\n if (needsContexts) {\r\n var initTimer = timer(\"contexts\");\r\n _contexts = new ContextsModule({\r\n connection: _connection,\r\n logger: _logger.subLogger(\"contexts\"),\r\n trackAllContexts: typeof internalConfig.contexts === \"object\" ? internalConfig.contexts.trackAllContexts : false,\r\n reAnnounceKnownContexts: typeof internalConfig.contexts === \"object\" ? internalConfig.contexts.reAnnounceKnownContexts : false\r\n });\r\n registerLib(\"contexts\", _contexts, initTimer);\r\n return _contexts;\r\n }\r\n else {\r\n var replayer = _connection.replayer;\r\n if (replayer) {\r\n replayer.drain(ContextMessageReplaySpec.name);\r\n }\r\n }\r\n }\r\n function setupBus() {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var initTimer;\r\n return __generator(this, function (_a) {\r\n if (!internalConfig.bus) {\r\n return [2, Promise.resolve()];\r\n }\r\n initTimer = timer(\"bus\");\r\n _bus = new MessageBus(_connection, _logger.subLogger(\"bus\"));\r\n registerLib(\"bus\", _bus, initTimer);\r\n return [2, Promise.resolve()];\r\n });\r\n });\r\n }\r\n function setupExternalLibs(externalLibs) {\r\n try {\r\n externalLibs.forEach(function (lib) {\r\n setupExternalLib(lib.name, lib.create);\r\n });\r\n return Promise.resolve();\r\n }\r\n catch (e) {\r\n return Promise.reject(e);\r\n }\r\n }\r\n function setupExternalLib(name, createCallback) {\r\n var initTimer = timer(name);\r\n var lib = createCallback(libs);\r\n if (lib) {\r\n registerLib(name, lib, initTimer);\r\n }\r\n }\r\n function waitForLibs() {\r\n var libsReadyPromises = Object.keys(libs).map(function (key) {\r\n var lib = libs[key];\r\n return lib.ready ?\r\n lib.ready() : Promise.resolve();\r\n });\r\n return Promise.all(libsReadyPromises);\r\n }\r\n function constructGlueObject() {\r\n var feedbackFunc = function (feedbackInfo) {\r\n if (!_interop) {\r\n return;\r\n }\r\n _interop.invoke(\"T42.ACS.Feedback\", feedbackInfo, \"best\");\r\n };\r\n var info = {\r\n coreVersion: version,\r\n version: internalConfig.version\r\n };\r\n glueInitTimer.stop();\r\n var glue = {\r\n feedback: feedbackFunc,\r\n info: info,\r\n logger: _logger,\r\n interop: _interop,\r\n agm: _interop,\r\n connection: _connection,\r\n metrics: _metrics,\r\n contexts: _contexts,\r\n bus: _bus,\r\n version: internalConfig.version,\r\n userConfig: userConfig,\r\n done: function () {\r\n _logger === null || _logger === void 0 ? void 0 : _logger.info(\"done called by user...\");\r\n return _connection.logout();\r\n }\r\n };\r\n glue.performance = {\r\n get glueVer() {\r\n return internalConfig.version;\r\n },\r\n get glueConfig() {\r\n return JSON.stringify(userConfig);\r\n },\r\n get browser() {\r\n return window.performance.timing.toJSON();\r\n },\r\n get memory() {\r\n return window.performance.memory;\r\n },\r\n get initTimes() {\r\n var all = getAllTimers();\r\n return Object.keys(all).map(function (key) {\r\n var t = all[key];\r\n return {\r\n name: key,\r\n duration: t.endTime - t.startTime,\r\n marks: t.marks,\r\n startTime: t.startTime,\r\n endTime: t.endTime\r\n };\r\n });\r\n }\r\n };\r\n Object.keys(libs).forEach(function (key) {\r\n var lib = libs[key];\r\n glue[key] = lib;\r\n });\r\n glue.config = {};\r\n Object.keys(internalConfig).forEach(function (k) {\r\n glue.config[k] = internalConfig[k];\r\n });\r\n if (ext && ext.extOptions) {\r\n Object.keys(ext.extOptions).forEach(function (k) {\r\n glue.config[k] = ext === null || ext === void 0 ? void 0 : ext.extOptions[k];\r\n });\r\n }\r\n if (ext === null || ext === void 0 ? void 0 : ext.enrichGlue) {\r\n ext.enrichGlue(glue);\r\n }\r\n if (iodesktop && iodesktop.updatePerfData) {\r\n iodesktop.updatePerfData(glue.performance);\r\n }\r\n if (glue.agm) {\r\n var deprecatedDecorator = function (fn, wrong, proper) {\r\n return function () {\r\n glue.logger.warn(\"glue.js - 'glue.agm.\".concat(wrong, \"' method is deprecated, use 'glue.interop.\").concat(proper, \"' instead.\"));\r\n return fn.apply(glue.agm, arguments);\r\n };\r\n };\r\n var agmAny = glue.agm;\r\n agmAny.method_added = deprecatedDecorator(glue.agm.methodAdded, \"method_added\", \"methodAdded\");\r\n agmAny.method_removed = deprecatedDecorator(glue.agm.methodRemoved, \"method_removed\", \"methodRemoved\");\r\n agmAny.server_added = deprecatedDecorator(glue.agm.serverAdded, \"server_added\", \"serverAdded\");\r\n agmAny.server_method_aded = deprecatedDecorator(glue.agm.serverMethodAdded, \"server_method_aded\", \"serverMethodAdded\");\r\n agmAny.server_method_removed = deprecatedDecorator(glue.agm.serverMethodRemoved, \"server_method_removed\", \"serverMethodRemoved\");\r\n }\r\n return glue;\r\n }\r\n function registerInstanceIfNeeded() {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var RegisterInstanceMethodName, isMethodAvailable, error_1, typedError;\r\n return __generator(this, function (_a) {\r\n switch (_a.label) {\r\n case 0:\r\n RegisterInstanceMethodName = \"T42.ACS.RegisterInstance\";\r\n if (!(Utils.isNode() && typeof process.env._GD_STARTING_CONTEXT_ === \"undefined\" && typeof (userConfig === null || userConfig === void 0 ? void 0 : userConfig.application) !== \"undefined\")) return [3, 4];\r\n isMethodAvailable = _interop.methods({ name: RegisterInstanceMethodName }).length > 0;\r\n if (!isMethodAvailable) return [3, 4];\r\n _a.label = 1;\r\n case 1:\r\n _a.trys.push([1, 3, , 4]);\r\n return [4, _interop.invoke(RegisterInstanceMethodName, { appName: userConfig === null || userConfig === void 0 ? void 0 : userConfig.application, pid: process.pid })];\r\n case 2:\r\n _a.sent();\r\n return [3, 4];\r\n case 3:\r\n error_1 = _a.sent();\r\n typedError = error_1;\r\n _logger.error(\"Cannot register as an instance: \".concat(JSON.stringify(typedError.message)));\r\n return [3, 4];\r\n case 4: return [2];\r\n }\r\n });\r\n });\r\n }\r\n return preloadPromise\r\n .then(setupLogger)\r\n .then(setupConnection)\r\n .then(function () { return Promise.all([setupMetrics(), setupInterop(), setupContexts(), setupBus()]); })\r\n .then(function () { return _interop.readyPromise; })\r\n .then(function () { return registerInstanceIfNeeded(); })\r\n .then(function () {\r\n return setupExternalLibs(internalConfig.libs || []);\r\n })\r\n .then(waitForLibs)\r\n .then(constructGlueObject)\r\n .catch(function (err) {\r\n return Promise.reject({\r\n err: err,\r\n libs: libs\r\n });\r\n });\r\n};\r\nif (typeof window !== \"undefined\") {\r\n window.IOConnectCore = IOConnectCoreFactory;\r\n}\r\nIOConnectCoreFactory.version = version;\r\nIOConnectCoreFactory.default = IOConnectCoreFactory;\n\nexport { IOConnectCoreFactory as default };\n//# sourceMappingURL=core.es.js.map\n","import ActivityManager from \"../core/activityManager\";\n\n/**\n * Base class for activity entities with reference to the activity manager\n * @private\n */\nexport default class ActivityEntity {\n\n public _manager: ActivityManager;\n public _id: string;\n\n constructor(id: string) {\n this._id = id;\n }\n\n public get id(): string {\n return this._id;\n }\n\n /**\n * Updates the properties of the current object using the properties of another object\n * These two should have the same id.\n */\n public _update(other: ActivityEntity) {\n if (other._id !== this._id) {\n throw Error(\"Can not update from entity with different id.\");\n }\n this._updateCore(other);\n }\n\n public _updateCore(other: ActivityEntity) {\n return;\n }\n\n public _beforeDelete(other: ActivityEntity) {\n return;\n }\n}\n","// some small useful functions (so we don't reference underscore or lodash)\n\nexport function isNumber(arg: any) {\n return typeof arg === \"number\";\n}\n\nexport function isString(arg: any) {\n return typeof arg === \"string\";\n}\n\nexport function isObject(arg: any) {\n return typeof arg === \"object\" && arg !== null;\n}\n\nexport function isArray(arg: any) {\n // TODO optimize\n if (Array.isArray) {\n return Array.isArray(arg);\n }\n return toString.call(arg) === \"[object Array]\";\n}\nexport function isUndefined(arg: any) {\n return typeof arg === \"undefined\";\n}\n\nexport function isUndefinedOrNull(arg: any) {\n return arg === null || typeof arg === \"undefined\";\n}\n\nexport function isNullOrWhiteSpace(str: string) {\n return (typeof str !== \"string\" || !str || str.length === 0 || /^\\s*$/.test(str));\n}\n\nexport function isBoolean(obj: any) {\n return obj === true || obj === false || toString.call(obj) === \"[object Boolean]\";\n}\n\n/**\n * Checks if an object is empty (has no properties)\n * @private\n */\nexport function isEmpty(arg: any) {\n for (const prop in arg) {\n if (arg.hasOwnProperty(prop)) {\n return false;\n }\n }\n return true;\n}\n\nexport function isFunction(arg: any) {\n return !!(arg && arg.constructor && arg.call && arg.apply);\n}\n\nexport function some<T>(array: T[], predicate: (el: any, index: number) => boolean) {\n for (let index = 0; index < array.length; index++) {\n if (predicate(array[index], index)) {\n return true;\n }\n }\n return false;\n}\n\nexport function first<T>(array: T[], predicate: (el: any, index: number) => boolean) {\n for (let index = 0; index < array.length; index++) {\n if (predicate(array[index], index)) {\n return array[index];\n }\n }\n return undefined;\n}\n\nexport function ifNotUndefined<T>(what: T, doWithIt: (what: T) => void) {\n if (typeof what !== \"undefined\") {\n doWithIt(what);\n }\n}\n\nexport function promisify(promise: Promise<any>, successCallback: () => void, errorCallback: () => void) {\n \"use strict\";\n if (typeof successCallback !== \"function\" && typeof errorCallback !== \"function\") {\n return promise;\n }\n\n if (typeof successCallback !== \"function\") {\n successCallback = () => { return; };\n } else if (typeof errorCallback !== \"function\") {\n errorCallback = () => { return; };\n }\n\n promise.then(successCallback, errorCallback);\n}\n","import * as contracts from \"../contracts/contracts\";\nimport Activity from \"./activity\";\nimport ActivityEntity from \"./activityEntity\";\nimport WindowType from \"./windowType\";\nimport { ifNotUndefined } from \"../helpers/util\";\nimport { WindowDefinition } from \"./windowDefinition\";\n\nimport { IOConnectDesktop } from \"../../../desktop\";\ntype OverrideTypeDefinition = IOConnectDesktop.Activities.OverrideTypeDefinition;\n\n/**\n * An activity type is a definition template for an activity, consisting of a collection of window types,\n * their layout and an initial activity context.\n *\n * @module activityType\n */\nexport default class ActivityType extends ActivityEntity {\n\n public _name: string;\n public _description: string;\n public _ownerWindow: WindowType;\n public _helperWindows: WindowType[];\n\n constructor(name: string, ownerWindow: WindowType, helperWindows?: WindowType[], description?: string) {\n super(name);\n this._name = name;\n this._description = description;\n this._ownerWindow = ownerWindow;\n this._helperWindows = helperWindows || [];\n }\n\n /**\n * @var {string} name Name of the activity type\n */\n public get name(): string {\n return this._name;\n }\n\n /**\n * @var {string} description description for the activity type\n */\n public get description(): string {\n return this._description;\n }\n\n /**\n * A list of window types that should be created when initiating a new instance of that activity type\n * @var {windowDefinition[]} helperWindows\n */\n public get helperWindows(): WindowType[] {\n return this._helperWindows.map((hw) => this.covertToWindowDef(hw));\n }\n\n /**\n * @var {windowDefinition} ownerWindow Returns the definition of the owner window for that activity type\n */\n public get ownerWindow(): WindowType {\n return this.covertToWindowDef(this._ownerWindow);\n }\n\n /**\n * Initiates a new activity of this type\n *\n * @function initiate\n * @param {object} context The initial context to be used for the new activity\n * @param callback\n * @param configuration\n * @returns {Promise<activity>}\n */\n public initiate(context: object, callback?: contracts.Callback<Activity>, configuration?: WindowDefinition[] | OverrideTypeDefinition): Promise<Activity> {\n return this._manager.initiate(this._name, context, callback, configuration);\n }\n\n public _updateCore(other: ActivityType) {\n super._updateCore(other);\n ifNotUndefined(other._description, (x) => this._description = x);\n ifNotUndefined(other._ownerWindow, (x) => this._ownerWindow = x);\n ifNotUndefined(other._helperWindows, (x) => this._helperWindows = x);\n }\n\n private covertToWindowDef(windowType: any): any {\n // GD2 + old glue js backward compatible\n return {\n type: windowType?.id?.type,\n name: windowType?.id?.name\n };\n }\n}\n","import ActivityEntity from \"./activityEntity\";\nimport ActivityWindow from \"./activityWindow\";\nimport { WindowDefinition } from \"./windowDefinition\";\nimport Activity from \"./activity\";\nimport { IOConnectDesktop } from \"../../../desktop\";\n\n/**\n * A window type is a definition of a window, typically configured in ACS.\n *\n * @module windowType\n */\nexport default class WindowType extends ActivityEntity {\n\n public _name: string;\n public _appByWindowTypeGetter: (name: string) => void;\n\n constructor(name: string, appByWindowTypeGetter: (wt: string) => IOConnectDesktop.AppManager.Application) {\n super(name);\n this._name = name;\n this._appByWindowTypeGetter = appByWindowTypeGetter;\n }\n\n /**\n * Name of the window type\n * @var {string} name\n */\n public get name(): string {\n return this._name;\n }\n\n /**\n * Returns the ACS configuration related to this window type (as application object from AppManager API)\n * @returns {any}\n */\n public get config(): any {\n return this._appByWindowTypeGetter(this._name);\n }\n\n /**\n * @var {activityWindow[]} windows All windows from that type\n */\n public get windows(): ActivityWindow[] {\n return this._manager.getWindows({ type: this._name });\n }\n\n public create(activity: Activity, configuration: any): Promise<ActivityWindow> {\n const definition: WindowDefinition = (Object as any).assign({ type: this.name, name: this.name, isIndependent: false }, configuration);\n return this._manager.createWindow(activity, definition);\n }\n}\n","import { ActivityStatus } from \"./activityStatus\";\n\nexport class EntityEvent<T> {\n public entity: T;\n public context: EntityEventContext;\n\n constructor(entitiy: T, context: EntityEventContext) {\n this.entity = entitiy;\n this.context = context;\n }\n}\n\nexport class EntityEventContext {\n public type: string;\n\n constructor(eventType: string) {\n this.type = eventType;\n }\n}\n\nexport class ActivityStatusChangeEventContext extends EntityEventContext {\n public oldStatus: ActivityStatus;\n public newStatus: ActivityStatus;\n\n constructor(newStatus: ActivityStatus, oldStatus: ActivityStatus) {\n super(EntityEventType.StatusChange);\n this.newStatus = newStatus;\n this.oldStatus = oldStatus;\n }\n}\n\nexport class ActivityContextChangedEventContext extends EntityEventContext {\n public context: object;\n public updated: object;\n public removed: string[];\n\n constructor(context: string | object, updated: object, removed: string[]) {\n super(EntityEventType.ActivityContextChange);\n this.context = typeof context === \"string\" ? JSON.parse(context) : context;\n this.updated = updated;\n this.removed = removed;\n }\n}\n\nexport class EntityEventType {\n public static Added = \"added\";\n public static Removed = \"removed\";\n public static Updated = \"updated\";\n public static Closed = \"closed\";\n public static StatusChange = \"statusChange\";\n public static ActivityContextChange = \"activityContextUpdate\";\n public static ActivityWindowEvent = \"activityWindowEvent\";\n // #deleteme TODO: these are not implemented in HC\n public static ActivityWindowJoinedActivity = \"joined\";\n public static ActivityWindowLeftActivity = \"left\";\n}\n\nexport class ActivityState {\n public static Created = \"created\";\n public static Started = \"started\";\n public static Destroyed = \"destroyed\";\n}\n","import { IOConnectDesktop } from \"../../../desktop\";\nimport Activity from \"../entities/activity\";\nimport ActivityWindow from \"../entities/activityWindow\";\nimport * as util from \"../helpers/util\";\nimport { promisify } from \"../helpers/util\";\n\n// A helper class that provides lame activity AGM implementation\n// Can be initialized with or without activity - in case no activity (independent windows outside activity) only\n// subset of the methods work\nexport class ActivityAGM {\n public static AGM: IOConnectDesktop.AGM.API;\n\n private _activity: Activity;\n\n constructor(activity: Activity) {\n this._activity = activity;\n }\n\n public register(definition: string | IOConnectDesktop.AGM.MethodDefinition, handler: (args: object, caller: IOConnectDesktop.AGM.Instance) => object) {\n this._ensureHasAgm();\n ActivityAGM.AGM.register(definition, handler);\n }\n\n public servers(): IOConnectDesktop.AGM.Instance[] {\n this._ensureHasAgm();\n\n if (util.isUndefinedOrNull(this._activity)) {\n // or return ActivityAGM.AGM.servers()\n return [];\n }\n\n return this._activity.windows.map(\n (w: ActivityWindow) => {\n return w.instance;\n });\n }\n\n public methods(): IOConnectDesktop.AGM.MethodDefinition[] {\n this._ensureHasAgm();\n\n if (util.isUndefinedOrNull(this._activity)) {\n // or return ActivityAGM.AGM.methods()\n return [];\n }\n\n const windows = this._activity.windows;\n const methodNames: string[] = [];\n const methods: IOConnectDesktop.AGM.MethodDefinition[] = [];\n\n // get all windows and their methods, then assemble distinct methods\n windows.forEach((window) => {\n const windowMethods = this.methodsForWindow(window);\n windowMethods.forEach((currentWindowMethod) => {\n if (methodNames.indexOf(currentWindowMethod.name) === -1) {\n methodNames.push(currentWindowMethod.name);\n methods.push(currentWindowMethod);\n }\n });\n });\n\n return methods;\n }\n\n public methodsForWindow(window: ActivityWindow): IOConnectDesktop.AGM.MethodDefinition[] {\n this._ensureHasAgm();\n // get instance and use agm to get methods for instance\n if (!window.instance) {\n return [];\n }\n\n return ActivityAGM.AGM.methodsForInstance(window.instance);\n }\n\n /** Possible invoke targets\n *\n * \"activity.all\" - [default]\n * \"activity.best\"\n * ActivityWindow\n * [ActivityWindow] -\n *\n * classic AGM\n * \"all\" - agm all\n * \"best\" - agm best\n * instance - agm\n * [ instances ]\n *\n */\n public invoke(\n methodName: string,\n arg: object,\n target: string | IOConnectDesktop.AGM.Instance | ActivityWindow | IOConnectDesktop.AGM.Instance[] | ActivityWindow[],\n options?: IOConnectDesktop.AGM.InvokeOptions,\n success?: () => void,\n error?: () => void): Promise<object> {\n\n this._ensureHasAgm();\n const activityServers = this.servers();\n let serversToInvokeAgainst: IOConnectDesktop.AGM.Instance[] = [];\n\n if (util.isUndefinedOrNull(target)) {\n target = \"activity.all\";\n }\n\n if (util.isString(target)) {\n if (target === \"activity.all\") {\n serversToInvokeAgainst = activityServers;\n } else if (target === \"activity.best\") {\n const potentialTargets = activityServers.filter((server) => {\n const methods = ActivityAGM.AGM.methodsForInstance(server);\n return methods.filter((m) => {\n return m.name === methodName;\n }).length > 0;\n });\n if (potentialTargets.length > 0) {\n serversToInvokeAgainst = [potentialTargets[0]];\n }\n } else if (target === \"all\" || target === \"best\") {\n return promisify(ActivityAGM.AGM.invoke(methodName, arg, target, options), success, error);\n } else {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n throw new Error(\"Invalid invoke target \" + target);\n }\n } else if (util.isArray(target)) {\n // if the array is not empty\n if ((target as any).length >= 0) {\n const firstElem = (target as any)[0];\n // check argument type\n if (this._isInstance(firstElem)) {\n serversToInvokeAgainst = (target as IOConnectDesktop.AGM.Instance[]).map((instance: IOConnectDesktop.AGM.Instance) => instance);\n } else if (this._isActivityWindow(firstElem)) {\n serversToInvokeAgainst = (target as ActivityWindow[]).map((win: ActivityWindow) => win.instance);\n } else {\n throw new Error(\"Unknown target object\");\n }\n }\n } else {\n if (this._isInstance(target)) {\n serversToInvokeAgainst = [target as IOConnectDesktop.AGM.Instance];\n } else if (this._isActivityWindow(target)) {\n serversToInvokeAgainst = [(target as ActivityWindow).instance];\n } else {\n throw new Error(\"Unknown target object\");\n }\n }\n\n throw new Error(\"Not implemented\");\n // return promisify(ActivityAGM.AGM.invoke(methodName, arg, serversToInvokeAgainst, options), success, error);\n }\n\n public unregister(definition: string | IOConnectDesktop.AGM.MethodDefinition) {\n this._ensureHasAgm();\n return ActivityAGM.AGM.unregister(definition);\n }\n\n public createStream(methodDefinition: string | IOConnectDesktop.AGM.MethodDefinition,\n subscriptionAddedHandler: (request: IOConnectDesktop.AGM.StreamSubscription) => void,\n subscriptionRemovedHandler: (request: IOConnectDesktop.AGM.StreamSubscription) => void) {\n this._ensureHasAgm();\n\n ActivityAGM.AGM.createStream(methodDefinition, {\n subscriptionAddedHandler,\n subscriptionRemovedHandler,\n subscriptionRequestHandler: undefined\n });\n }\n\n public subscribe(methodDefinition: string | IOConnectDesktop.AGM.MethodDefinition, parameters: object, target: string | IOConnectDesktop.AGM.Instance | IOConnectDesktop.AGM.Instance[]): Promise<IOConnectDesktop.AGM.Subscription> {\n this._ensureHasAgm();\n // #deleteme TODO: check servers needed?\n // const servers = this.servers();\n\n return ActivityAGM.AGM.subscribe(methodDefinition, parameters);\n }\n\n public _ensureHasAgm() {\n if (util.isUndefinedOrNull(ActivityAGM.AGM)) {\n throw new Error(\"Agm should be configured to be used in activity\");\n }\n }\n\n public _isInstance(obj: any) {\n // lame check\n return obj.application !== undefined;\n }\n\n public _isActivityWindow(obj: any) {\n return obj.instance !== undefined;\n }\n}\n","import { ActivityDescriptor } from \"./activityDescriptor\";\nimport ActivityManager from \"../core/activityManager\";\nimport Activity from \"./activity\";\n\nexport class AttachedActivityDescriptor implements ActivityDescriptor {\n private _manager: ActivityManager;\n private _state: ActivityDescriptor;\n private _ownerActivityId: string;\n\n constructor(\n manager: ActivityManager,\n ownerActivityId: string,\n state: ActivityDescriptor) {\n this._manager = manager;\n this._ownerActivityId = ownerActivityId;\n this._state = state;\n }\n\n public get ownerId() {\n return this._state.ownerId;\n }\n\n public get windowIds() {\n return this._state.windowIds;\n }\n\n public get frameColor() {\n return this._state.frameColor;\n }\n\n public get context() {\n return this._state.context;\n }\n\n public get tag() {\n return this._state.tag;\n }\n\n public detach(descriptor?: ActivityDescriptor): Promise<Activity> {\n\n descriptor = descriptor || {};\n\n const merged: ActivityDescriptor = {};\n\n Object.keys(this._state).forEach((prop) => {\n merged[prop] = this._state[prop];\n });\n\n merged.context = descriptor.context || merged.context;\n merged.frameColor = descriptor.frameColor || merged.frameColor;\n\n return this._manager.detachActivities(this._ownerActivityId, merged);\n }\n}\n","import * as util from \"../helpers/util\";\n\nconst nextTick = (cb: () => void) => {\n setTimeout(cb, 0);\n};\n\n/**\n * Convert a Promise to node style callback\n * @private\n */\nexport function nodeify<T>(promise: Promise<T>, callback: any): Promise<T> {\n if (!util.isFunction(callback)) {\n return promise;\n }\n\n promise.then(\n (resp) => {\n nextTick( () => { // not sure if this is needed, promises should be already executed on the event pool\n callback(null, resp);\n });\n },\n (err) => {\n nextTick(() => {\n callback(err, null);\n });\n });\n}\n","import * as contracts from \"../contracts/contracts\";\nimport ActivityType from \"./activityType\";\nimport ActivityWindow from \"./activityWindow\";\nimport { ActivityStatus } from \"../contracts/activityStatus\";\nimport ActivityEntity from \"./activityEntity\";\nimport { WindowDefinition } from \"./windowDefinition\";\nimport { ActivityAGM } from \"../core/activityAGM\";\nimport { CloneOptions } from \"./cloneOptions\";\nimport { AttachedActivityDescriptor } from \"./attachedActivityDescriptor\";\nimport { nodeify } from \"../helpers/promiseExtensions\";\nimport { ifNotUndefined } from \"../helpers/util\";\n\n/**\n * Activity is an instance of an activity type just like an object is an instance of a class\n * in class-based languages (and just like ‘John’ is an instance of a 'Person’).\n *\n * Activity is often used as a synonym for activity instance.\n *\n * Each activity instance has a single owner window and can optionally have one or more helper windows.\n *\n * @module activity\n */\nexport default class Activity extends ActivityEntity {\n\n public _id: string;\n public _actType: string;\n public _status: ActivityStatus;\n public _context: object;\n public _ownerId: string;\n public _agm: ActivityAGM;\n public _attached: any;\n\n constructor(\n id: string,\n actType: string,\n status: ActivityStatus,\n context: object,\n ownerId: string) {\n super(id);\n this._id = id;\n this._actType = actType;\n this._status = status;\n this._context = context;\n this._ownerId = ownerId;\n this._agm = new ActivityAGM(this);\n }\n\n /**\n * Activity type\n * @var {module:activityType} type\n */\n public get type(): ActivityType {\n if (this._manager) {\n return this._manager.getActivityType(this._actType);\n }\n return undefined;\n }\n\n /**\n * Get current activity context. To update use updateContext , to replace setContext\n * @var {object} context\n */\n public get context(): object {\n return this._context;\n }\n\n /**\n * Get activity status\n * @var {activityStatus} status\n */\n public get status(): ActivityStatus {\n return this._status;\n }\n\n /**\n * The owner window\n * @var {module:activityWindow} owner\n */\n public get owner(): ActivityWindow {\n if (!this._ownerId) {\n return null;\n }\n return this._manager.getWindows({ id: this._ownerId })[0];\n }\n\n /**\n * All windows participating in the activity\n * @var {module:activityWindow[]} windows\n */\n public get windows(): ActivityWindow[] {\n return this._manager.getWindows({ activityId: this._id });\n }\n\n /**\n * @var {module:activityAGM} agm\n */\n public get agm(): ActivityAGM {\n return this._agm;\n }\n\n /**\n * Joins a specific window to the activity\n *\n * @private\n * @function join\n * @param window The window to join\n * @param callback (Optional) Result callback\n * @returns Promise for ActivityWindow\n */\n public addWindow(window: ActivityWindow, callback?: contracts.Callback<ActivityWindow>): Promise<ActivityWindow> {\n return this._manager.addWindowToActivity(this, window, callback);\n }\n\n /**\n * Creates a new window and joins it to the activity\n *\n * @function createWindow\n * @param {string|windowDefinition} windowType The type of the window to be created\n * @param callback\n * @returns {Promise<module:activityWindow>}\n */\n public createWindow(windowType: string | WindowDefinition, callback?: contracts.Callback<ActivityWindow>): Promise<ActivityWindow> {\n return this._manager.createWindow(this, windowType, callback);\n }\n\n /**\n * Creates a stacked set of windows and joins them to the\n *\n * @function createStackedWindows\n * @param {string[] | windowDefinition[]} windowTypes The types of the windows to be created\n * @param {number} timeout\n * @param callback\n * @returns {Promise<module:activityWindow[]>}\n */\n public createStackedWindows(windowTypes: (string | WindowDefinition)[], timeout?: number, callback?: contracts.Callback<ActivityWindow[]>): Promise<ActivityWindow[]> {\n return this._manager.createStackedWindows(this, windowTypes, timeout, callback);\n }\n\n /**\n * Removes a window from the activity\n *\n * @private\n * @param window\n * @param callback\n * @returns Promise for ActivityWindow\n */\n public leave(window: ActivityWindow, callback?: contracts.Callback<ActivityWindow>): Promise<ActivityWindow> {\n return this._manager.leaveWindowFromActivity(this, window, callback);\n }\n\n /**\n * Get all windows participating in the activity from a given type\n *\n * @param {string} windowType\n * @returns {module:activityWindow[]}\n */\n public getWindowsByType(windowType: string): ActivityWindow[] {\n const filter = { activityId: this._id, type: windowType };\n return this._manager.getWindows(filter);\n }\n\n /**\n * Replaces the activity context with a new one.\n *\n * @function setContext\n * @param {object} context The new context\n * @param callback\n * @returns {Promise<Object>}\n */\n public setContext(context: object, callback?: contracts.Callback<Activity>): Promise<object> {\n return this._manager.setActivityContext(this, context, callback);\n }\n\n /**\n * Updates activity context using the properties from the context argument.\n * If old context is {a:1, b:2, c:3} and invoking updateContext({b:3, c:null}) will result a context\n * be {a:1, b:3}\n *\n * @function updateContext\n * @param {object} context\n * @param callback\n * @return {Promise<object>}\n */\n public updateContext(context: object, callback?: contracts.Callback<Activity>): Promise<object> {\n return this._manager.updateActivityContext(this, context, callback);\n }\n\n /**\n * Subscribe for status change events\n *\n * @function onStatusChange\n *\n * @param {activityStatusChangeHandler} handler Handler function that will receive status notifications\n */\n public onStatusChange(handler: (activity: Activity, newStatus: ActivityStatus, oldStatus: ActivityStatus) => void): () => void {\n return this._manager.subscribeActivityEvents((a, ns, os) => {\n if (a.id === this.id) {\n handler(a, ns, os);\n }\n });\n }\n\n /**\n * Subscribe for window related events, like joined, removed from activity\n *\n * @function onWindowEvent\n * @param {windowEventHandler} handler Handler function that will receive windows events\n */\n public onWindowEvent(handler: contracts.ActivityWindowEventHandler): () => void {\n return this._manager.subscribeWindowEvents((a, w, e) => {\n if (a.id === this.id) {\n handler(a, w, e);\n }\n });\n }\n\n /**\n * Subscribe for context updates\n *\n * @function onContextChanged\n * @param {contextChangedHandler} handler Handler function that will receive context related events\n */\n public onContextChanged(handler: contracts.ContextUpdateHandler) {\n this._manager.subscribeActivityContextChanged((act, context, updated, removed) => {\n if (act.id === this.id) {\n handler(context, updated, removed, act);\n }\n });\n\n try {\n // replay the context at the time of subscribing, swallow user exceptions\n handler(this.context, this.context, [], this);\n } catch (e) {\n return;\n }\n }\n\n /**\n * Stops the activity\n * @function stop\n */\n public stop() {\n this._manager.stopActivity(this);\n }\n\n /**\n * Clones the activity into a new one\n * @function clone\n * @param {CloneOptions} options\n */\n public clone(options: CloneOptions) {\n return this._manager.clone(this, options);\n }\n\n public attach(activity: Activity | string, tag?: object): Promise<AttachedActivityDescriptor> {\n let activityId;\n if (typeof activity === \"string\") {\n activityId = activity;\n } else {\n activityId = activity.id;\n }\n return this._manager.attachActivities(activityId, this.id, tag);\n }\n\n public onActivityAttached(callback: (descriptor: AttachedActivityDescriptor) => void) {\n this._manager.subscribeActivitiesAttached((newActId: string, oldActId: string, descriptor: AttachedActivityDescriptor) => {\n if (newActId !== this._id) {\n return;\n }\n\n callback(descriptor);\n });\n }\n\n public onDetached(callback: (newAct: Activity, state: any) => void) {\n this._manager.subscribeActivitiesDetached((newAct: Activity, originalActivity: Activity, state: any) => {\n if (originalActivity.id !== this._id) {\n return;\n }\n\n callback(newAct, state);\n });\n }\n\n public _updateCore(other: Activity) {\n super._updateCore(other);\n ifNotUndefined(other._actType, (x) => this._actType = x);\n ifNotUndefined(other._context, (x) => this._context = x);\n ifNotUndefined(other._ownerId, (x) => this._ownerId = x);\n if (other._status && (!this._status || (this._status.state !== other._status.state))) {\n this._status = other._status;\n }\n }\n\n public _updateDescriptors(allStates: any) {\n this._attached = allStates.map((s: any) => {\n return new AttachedActivityDescriptor(this._manager, this._id, s);\n });\n }\n\n public get attached(): AttachedActivityDescriptor[] {\n return this._attached;\n }\n\n public setFrameColor(color: string, callback: () => void): Promise<Activity> {\n const promise = new Promise<Activity>((resolve, reject) => {\n\n let callbacksToWait = this.windows.length;\n if (callbacksToWait === 0) {\n resolve(this);\n }\n\n this.windows.forEach((w) => {\n w.underlyingWindow.setFrameColor(color, () => {\n callbacksToWait--;\n if (callbacksToWait <= 0) {\n resolve(this);\n }\n });\n });\n\n setTimeout(() => {\n\n if (callbacksToWait > 0) {\n reject(this.id + \" - timed out waiting for setFrameColor with\" + color);\n }\n\n }, 5000);\n\n });\n\n return nodeify(promise, callback);\n }\n\n public getFrameColor(): string {\n\n if (!this.windows || this.windows.length === 0) {\n return \"\";\n }\n\n return this.windows[0].underlyingWindow.frameColor;\n }\n}\n","/* eslint-disable no-console */\n/* tslint:disable */\n\nimport { IOConnectDesktop } from \"../../../desktop\";\nimport * as util from \"./util\";\n\nexport class LogLevel {\n public static Trace = \"trace\";\n public static Debug = \"debug\";\n public static Info = \"info\";\n public static Warn = \"warn\";\n public static Error = \"error\";\n}\n\nexport class Logger {\n\n public static Level: string = LogLevel.Info;\n public static GlueLogger: IOConnectDesktop.Logger.API;\n\n private _glueLogger: IOConnectDesktop.Logger.API;\n\n public static GetNamed(name: string): Logger {\n return new Logger(name);\n }\n\n public static Get(owner: any): Logger {\n return new Logger(Logger.GetTypeName(owner));\n }\n\n public _name: string;\n\n constructor(name: string) {\n this._name = name;\n // we have a glue logger let's create a new logger for it\n if (!util.isUndefinedOrNull(Logger.GlueLogger)) {\n this._glueLogger = Logger.GlueLogger.subLogger(name);\n }\n }\n\n public trace(message: string) {\n if (!util.isUndefinedOrNull(this._glueLogger)) {\n this._glueLogger.trace(message);\n } else {\n if (Logger.Level === LogLevel.Trace) {\n console.info(this._getMessage(message, LogLevel.Trace));\n }\n }\n }\n\n public debug(message: string) {\n if (!util.isUndefinedOrNull(this._glueLogger)) {\n this._glueLogger.debug(message);\n } else {\n if (Logger.Level === LogLevel.Debug ||\n Logger.Level === LogLevel.Trace) {\n console.info(this._getMessage(message, LogLevel.Debug));\n }\n }\n }\n\n public info(message: string) {\n if (!util.isUndefinedOrNull(this._glueLogger)) {\n this._glueLogger.info(message);\n } else {\n if (Logger.Level === LogLevel.Debug ||\n Logger.Level === LogLevel.Trace ||\n Logger.Level === LogLevel.Info) {\n console.info(this._getMessage(message, LogLevel.Info));\n }\n }\n }\n\n public warn(message: string) {\n if (!util.isUndefinedOrNull(this._glueLogger)) {\n this._glueLogger.warn(message);\n } else {\n if (Logger.Level === LogLevel.Debug ||\n Logger.Level === LogLevel.Trace ||\n Logger.Level === LogLevel.Info ||\n Logger.Level === LogLevel.Warn) {\n console.info(this._getMessage(message, LogLevel.Info));\n }\n }\n }\n\n public error(message: string) {\n if (!util.isUndefinedOrNull(this._glueLogger)) {\n this._glueLogger.error(message);\n } else {\n console.error(this._getMessage(message, LogLevel.Error));\n console.trace();\n }\n }\n\n public _getMessage(message: string, level: string): string {\n return \"[\" + level + \"] \" + this._name + \" - \" + message;\n }\n\n /**\n * Returns the function name for a given object (same as constructor.name but cross-browser)\n */\n public static GetTypeName(object: object): string {\n const funcNameRegex = /function (.{1,})\\(/;\n const results = (funcNameRegex).exec(object.constructor.toString());\n return (results && results.length > 1) ? results[1] : \"\";\n }\n}\n","import * as contracts from \"../contracts/contracts\";\nimport { WindowBounds } from \"../contracts/windowBounds\";\n\nimport WindowType from \"./windowType\";\nimport ActivityEntity from \"./activityEntity\";\nimport Activity from \"./activity\";\n\nimport { Logger } from \"../helpers/logger\";\nimport * as util from \"../helpers/util\";\nimport { ifNotUndefined } from \"../helpers/util\";\nimport { EntityEventType } from \"../contracts/entityEvent\";\nimport { IOConnectDesktop } from \"../../../desktop\";\n\n/**\n * A window participating in an activity\n *\n * @module activityWindow\n */\nexport default class ActivityWindow extends ActivityEntity {\n\n private _logger: Logger = Logger.Get(\"window\");\n\n private _type: string;\n private _activityId: string;\n private _name: string;\n private _instance: IOConnectDesktop.Interop.Instance;\n private _isIndependent: boolean;\n private _windowGetter: () => IOConnectDesktop.Windows.IOConnectWindow;\n private _hcWindowId: string;\n\n constructor(id: string, name: string, type: string, activityId: string, instance: IOConnectDesktop.Interop.Instance, isIndependent: boolean, windowGetter: any,\n hcWindowId: string) {\n super(id);\n this._type = type;\n this._activityId = activityId;\n this._name = name;\n this._instance = instance;\n this._isIndependent = isIndependent;\n this._windowGetter = windowGetter;\n this._hcWindowId = hcWindowId;\n }\n\n /**\n * Return window's title\n * @function getBounds\n * @return {Promise<WindowBounds>}\n */\n public getBounds(): Promise<WindowBounds> {\n return this._manager.getWindowBounds(this.id);\n }\n\n /**\n * @var {string} name The window name\n */\n public get name(): string {\n return this._name;\n }\n\n /**\n * @var {bool} isIndependent True if this is an independent window\n */\n public get isIndependent(): boolean {\n return this._isIndependent;\n }\n\n /**\n * @var {module:windowType} type The window type\n */\n public get type(): WindowType {\n if (this._manager) {\n return this._manager.getWindowType(this._type);\n }\n return undefined;\n }\n\n /**\n * @var {module:activity} activity The activity that the window is part of\n */\n public get activity(): Activity {\n if (util.isUndefined(this._activityId)) {\n return undefined;\n }\n return this._manager.getActivityById(this._activityId);\n }\n\n /**\n * @var {bool} isOwner True if the window is the owner of the activity.\n */\n public get isOwner(): boolean {\n const act = this.activity;\n if (util.isUndefined(act)) {\n return false;\n }\n\n return act.owner.id === this.id;\n }\n\n /**\n * Sets window's visibility\n *\n * @function setVisible\n * @param {boolean} isVisible\n * @returns {Promise<module:activityWindow>}\n */\n public setVisible(isVisible: boolean, callback?: contracts.Callback<ActivityWindow>): Promise<ActivityWindow> {\n return this._manager.setWindowVisibility(this.id, isVisible);\n }\n\n /**\n * Activate window\n * @function activate\n * @param {boolean} focus If true then activate window with focus otherwise activate window without focus\n */\n public activate(focus: boolean): Promise<ActivityWindow> {\n return this._manager.activateWindow(this.id, focus);\n }\n\n /**\n * Sets window's bounds\n * @function setBounds\n *\n * @param {bounds} bounds The new bounds to be applied\n * @returns {Promise<module:activityWindow>}\n */\n public setBounds(bounds: WindowBounds, callback?: contracts.Callback<ActivityWindow>): Promise<ActivityWindow> {\n return this._manager.setWindowBounds(this.id, bounds, callback);\n }\n\n /**\n * Closes the window\n *\n * @function close\n * @returns {Promise}\n */\n public close(): Promise<any> {\n return this._manager.closeWindow(this.id);\n }\n\n /**\n * @var {agmInstance} instance The agm instance of that window. You can use this to invoke AGM methods against that window\n */\n public get instance(): IOConnectDesktop.Interop.Instance {\n return this._instance;\n }\n\n /**\n * Returns the window as object from Windows API (glue.windows).\n *\n * @var {window} underlyingWindow\n */\n public get underlyingWindow(): any {\n const window = this._windowGetter();\n if (!window) {\n // we don't have the window object any more, let's return as much as we can\n return {\n id: this._hcWindowId\n };\n }\n return window;\n }\n\n public onActivityJoined(callback: (activity: Activity) => void) {\n this._subscribeForActivityWindowEvent(EntityEventType.ActivityWindowJoinedActivity, callback);\n }\n\n public onActivityRemoved(callback: (activity: Activity) => void) {\n this._subscribeForActivityWindowEvent(EntityEventType.ActivityWindowLeftActivity, callback);\n }\n\n public _updateCore(other: ActivityWindow) {\n ifNotUndefined(other._activityId, (x) => this._activityId = x);\n ifNotUndefined(other._isIndependent, (x) => this._isIndependent = x);\n ifNotUndefined(other._hcWindowId, (x) => this._hcWindowId = x);\n ifNotUndefined(other._type, (x) => this._type = x);\n ifNotUndefined(other._name, (x) => this._name = x);\n\n if (!util.isUndefinedOrNull(other._instance)) {\n this._instance = other._instance;\n }\n }\n\n public _subscribeForActivityWindowEvent(eventName: string, callback: (activity: Activity) => void) {\n this._manager.subscribeWindowEvents((activity, window, event) => {\n // ignore events not related to this window\n if (window.id !== this.id) {\n return;\n }\n\n if (event === eventName) {\n callback(activity);\n }\n });\n }\n\n public _beforeDelete(other: ActivityWindow) {\n this._hcWindowId = other._hcWindowId;\n }\n}\n","/**\n * @typedef {Object} activityStatus Defines activity instance status\n * @property {string} state Current state\n * @property {string} message Message\n * @property {Date} time Time of the last status update\n */\nexport class ActivityStatus {\n public state: string;\n public message: string;\n public time: Date;\n\n constructor(state: string, message: string, time: Date) {\n this.state = state;\n this.message = message;\n this.time = time;\n }\n\n public getState(): string {\n return this.state;\n }\n\n public getMessage(): string {\n return this.message;\n }\n\n public getTime(): Date {\n return this.time;\n }\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n/* eslint-disable prefer-const */\nimport { AnnouncementInfo } from \"../contracts/announcementInfo\";\n\nimport { ActivityBridge } from \"./activityBridge\";\nimport ActivityType from \"../entities/activityType\";\nimport WindowType from \"../entities/windowType\";\nimport { EventHandlerCallback } from \"../contracts/contracts\";\nimport { WindowDefinition } from \"../entities/windowDefinition\";\nimport {\n ActivityContextChangedEventContext,\n ActivityStatusChangeEventContext,\n EntityEvent,\n EntityEventContext,\n EntityEventType,\n} from \"../contracts/entityEvent\";\nimport { WindowFactory } from \"../contracts/windowFactory\";\nimport Activity from \"../entities/activity\";\nimport ActivityWindow from \"../entities/activityWindow\";\nimport { WindowBounds } from \"../contracts/windowBounds\";\nimport {\n ActivityGwMessage,\n ActivityTypeGwMessage,\n ActivityTypeGwMessageEntity,\n GwMessage,\n PeerCreatedGwMessage,\n PeerFactoryGwMessage,\n PeerFactoryGwMessageEntity,\n PeerRequestedGwMessage,\n} from \"./gw3BridgeMessages\";\nimport { ActivityDescriptor } from \"../entities/activityDescriptor\";\nimport { CloneOptions } from \"../entities/cloneOptions\";\nimport { IOConnectDesktop } from \"../../../desktop\";\n\nimport { ActivityStatus } from \"../contracts/activityStatus\";\nimport { ActivityConfig } from \"../activityConfig\";\n\nimport { IOConnectDesktop as glue42 } from \"../../../desktop\";\ntype OverrideTypeDefinition = glue42.Activities.OverrideTypeDefinition;\n\nconst gwMessageSuccess = \"success\";\nconst gwMmessageError = \"error\";\n\nconst gwMessageAddActivityTypes = \"add-types\";\nconst gwMmessageActivityTypesAdded = \"types-added\";\nconst gwMessageRemoveActivityTypes = \"remove-types\";\nconst gwMessageActivityTypesRemoved = \"types-removed\";\n\nconst gwMessageActivityCreated = \"created\";\nconst gwMessageActivityDestroyed = \"destroyed\";\nconst gwMessageActivityInitiated = \"initiated\";\nconst gwMmessageJoinActivity = \"join-activity\";\nconst gwMessageJoinedActivity = \"joined\";\nconst gwMessageActivityJoined = \"activity-joined\";\nconst gwMessageLeaveActivity = \"leave-activity\";\nconst gwMessageActivityLeft = \"left\";\nconst gwNmessageMergeActivities = \"merge\";\nconst gwMessageSplitActivities = \"split\";\nconst gwMessageChildrenChanged = \"children-changed\";\nconst gwMessageOwnerChanged = \"owner-changed\";\n\nconst gwMessageAddPeerFactories = \"add-peer-factories\";\nconst gwMessagePeerFactoriesAdded = \"peer-factories-added\";\nconst gwMessageRemovePeerFactories = \"remove-peer-factories\";\nconst gwMessagePeerFactoriesRemoved = \"peer-factories-removed\";\n\nconst gwMessageCreateActivity = \"create\";\nconst gwMessageCreatePeer = \"create-peer\";\nconst gwMessagePeerRequested = \"peer-requested\";\nconst gwMessageReady = \"ready\";\nconst gwMessagePeerCreated = \"peer-created\";\n\nconst gwMessageDestroyActivity = \"destroy\";\nconst gwMessageDisposePeer = \"dispose-peer\";\nconst gwMessageDestroyPeer = \"destroy-peer\";\n\ndeclare let window: any;\ndeclare let process: any;\n\nexport default class GW3Bridge implements ActivityBridge {\n\n private static activityTypeGwMessageEntityToActivityType(\n entity: ActivityTypeGwMessageEntity,\n description: string): ActivityType {\n\n const nameToWindowType =\n (windowName: any) =>\n new WindowType(\n windowName,\n undefined);\n\n return new ActivityType(\n entity.name,\n entity.owner_type && nameToWindowType(entity.owner_type),\n entity.helper_types && entity.helper_types.map(nameToWindowType),\n description);\n }\n\n private static peerFactoryGwMessageEntityToWindowType(entity: PeerFactoryGwMessageEntity): WindowType {\n return new WindowType(\n entity.peer_type,\n /* #deleteme TODO: review - appmanager configuration? */(_) => undefined);\n }\n\n private static activityGwMessageToActivity(msg: ActivityGwMessage, status: ActivityStatus): Activity {\n const ownerId = msg.owner !== undefined ? msg.owner.peer_id : msg.owner_id;\n return new Activity(\n msg.activity_id,\n msg.activity_type,\n status,\n msg.context_snapshot,\n ownerId);\n }\n\n private static activityToActivityStatusChangeEvent(act: Activity) {\n return new EntityEvent<Activity>(act, new ActivityStatusChangeEventContext(act.status, undefined));\n }\n\n private _connection: IOConnectDesktop.Connection.API;\n private _logger: any;\n private _contexts: IOConnectDesktop.Contexts.API;\n private _windows: IOConnectDesktop.Windows.API;\n\n private _gw3Session: IOConnectDesktop.Connection.GW3DomainSession;\n\n // callbacks\n\n private _activityChangeCallbacks: EventHandlerCallback<EntityEvent<Activity>>[] = [];\n private _activityTypeStatusChangeCallbacks: EventHandlerCallback<EntityEvent<ActivityType>>[] = [];\n private _activityWindowChangeCallbacks: EventHandlerCallback<EntityEvent<ActivityWindow>>[] = [];\n private _windowTypeStatusChangeCallbacks: EventHandlerCallback<EntityEvent<WindowType>>[] = [];\n\n // state tracking\n private _peerIdAndFactoryIdToPeerType: any = {};\n private _peerFactoriesRegisteredByUs: { [index: string]: WindowFactory } = {};\n private _gw3Subscriptions: any[] = [];\n private _contextSubscriptions: any = {};\n private _activityTypesInitiatedFromMe: any = {};\n\n private _sessionJoinedPromise: Promise<GW3Bridge>;\n private _sessionJoinedPromiseResolve: (bridge: GW3Bridge) => void;\n private _activityJoinedPromise: Promise<object>;\n private _activityJoinedPromiseResolve: (obj: object) => void;\n private _config: ActivityConfig;\n\n constructor(config: ActivityConfig) {\n this._config = config;\n this._connection = config.connection;\n this._logger = config.logger;\n this._contexts = config.contexts;\n this._windows = config.windows;\n\n this._sessionJoinedPromise = new Promise<GW3Bridge>((resolve /* , reject */) => {\n this._sessionJoinedPromiseResolve = resolve;\n });\n\n this._activityJoinedPromise = new Promise<object>((resolve /* , reject */) => {\n this._activityJoinedPromiseResolve = resolve;\n });\n\n if (!this._config.activityId) {\n this._activityJoinedPromiseResolve({});\n }\n\n this._gw3Session = this._connection.domain(\n \"activity\",\n [\"joined\", \"initiated\", \"peer-created\", \"token\"]);\n\n if (typeof window !== \"undefined\") {\n\n const glue42gd = (window).glue42gd;\n\n // only execute if in activity\n if (glue42gd && glue42gd.activityInfo) {\n // G4E-1343\n if (typeof glue42gd.addRefreshHandler === \"function\") {\n\n glue42gd.addRefreshHandler((success: any, error: any) => {\n this._gw3Session\n .send(\n {\n type: \"reload\"\n })\n .then(\n (msg: any) => {\n if (!msg.token) {\n error(\"Expected gateway token for refreshing.\");\n return;\n }\n try {\n glue42gd.setGWToken(msg.token as string);\n } catch (e) {\n error(e.message || e);\n return;\n }\n success();\n },\n error);\n });\n }\n\n // JP_GD3-598\n if (glue42gd && typeof glue42gd.addWillNavigateHandler === \"function\") {\n\n glue42gd.addWillNavigateHandler((success: any, error: any) => {\n this._gw3Session\n .send(\n {\n type: \"reload\"\n })\n .then(\n (msg: any) => {\n if (!msg.token) {\n error(\"Expected gateway token for refreshing.\");\n return;\n }\n try {\n glue42gd.setGWToken(msg.token as string);\n } catch (e) {\n error(e.message || e);\n return;\n }\n success();\n },\n error);\n });\n }\n }\n }\n }\n\n public get bridgeType(): \"GW3\" {\n return \"GW3\";\n }\n\n public init() {\n // activity types\n this.forwardActivityTypeMessagesToStatusEventHandlers();\n\n // activities\n this.subscribe<ActivityGwMessage>(\n gwMessageActivityCreated,\n this.handleActivityCreatedMessage);\n\n this.subscribe<ActivityGwMessage>(\n gwMessageActivityDestroyed,\n this.handleActivityDestroyedMessage);\n\n this.forwardActivityMessagesToStatusEventHandlers();\n\n this.forwardActivityCreatedAndJoinedActivityToActivityWindowEventHandlers();\n\n // window types / peer factories\n\n // NB: this forward must happen before the handlePeerFactoriesRemoved subscription\n // since the latter clears state which is used by peerFactoryIdAndOwnerIdToWindowType\n this.forwardPeerFactoryMessagesToStatusEventHandlers();\n\n this.forwardPeerFactoryMessagesToPeerFactoryRequests();\n\n this.subscribe(\n gwMessagePeerFactoriesAdded,\n this.handlePeerFactoriesAdded);\n\n this.subscribe(\n gwMessagePeerFactoriesRemoved,\n this.handlePeerFactoriesRemoved);\n\n // activity windows\n\n this.forwardActivityWindowMessagesToEventHandlers();\n //\n\n this.subscribe(\n gwMessageDisposePeer,\n /* (msg)*/() => {\n if (this._config.disposeRequestHandling === \"dispose\") {\n this.dispose();\n return;\n }\n if (this._config.disposeRequestHandling === \"exit\") {\n if (this._windows && typeof this._windows.my() !== \"undefined\") {\n this._windows.my().close();\n return;\n }\n if (typeof window !== \"undefined\" && typeof (window).close === \"function\") {\n window.close();\n return;\n }\n if (typeof process !== \"undefined\" && typeof (process).exit === \"function\") {\n process.exit();\n return;\n }\n }\n });\n\n // start domain join handshake\n this._gw3Session.onJoined(() => {\n\n if (this._config.mode === \"trackMyOnly\" ||\n this._config.mode === \"trackMyTypeAndInitiatedFromMe\") {\n this._sessionJoinedPromiseResolve(this);\n } else {\n this._gw3Session\n .send(\n {\n type: \"subscribe\",\n activity_types:\n (this._config.mode === \"trackAll\" ? [] :\n this._config.mode === \"trackTypes\" ? this._config.typesToTrack : [])\n })\n .then(() => {\n this._sessionJoinedPromiseResolve(this);\n });\n }\n });\n this._gw3Session.join();\n }\n\n public dispose() {\n this._gw3Subscriptions.forEach((sub) => sub && this._connection.off(sub));\n this._gw3Subscriptions.length = 0;\n }\n\n // ActivityBridge interface\n\n public ready(): Promise<object> {\n return Promise.all([this._sessionJoinedPromise, this._activityJoinedPromise]);\n }\n\n public initReady(): Promise<ActivityBridge> {\n return this._sessionJoinedPromise;\n }\n\n public onActivityTypeStatusChange(callback: EventHandlerCallback<EntityEvent<ActivityType>>) {\n this._activityTypeStatusChangeCallbacks.push(callback);\n }\n\n public registerActivityType(\n activityTypeName: string,\n ownerWindow: WindowDefinition,\n helperWindows?: WindowDefinition[],\n config?: any,\n description?: string): Promise<ActivityType> {\n\n const entity: ActivityTypeGwMessageEntity = {};\n entity.name = activityTypeName;\n const toActivityPeerConfig = (windowDefinition: WindowDefinition) => ({ type: windowDefinition.type, name: windowDefinition.name, configuration: windowDefinition });\n\n entity.owner_type = toActivityPeerConfig(ownerWindow);\n entity.helper_types = helperWindows.map(toActivityPeerConfig);\n\n return this._gw3Session\n .send(\n {\n type: gwMessageAddActivityTypes,\n types: [entity]\n })\n .then(() => {\n const activityType = GW3Bridge.activityTypeGwMessageEntityToActivityType(entity, description);\n this.invokeCallbacks(\n this._activityTypeStatusChangeCallbacks,\n new EntityEvent<ActivityType>(\n activityType,\n new EntityEventContext(EntityEventType.Added)),\n gwMessageAddActivityTypes);\n return activityType;\n });\n }\n\n public unregisterActivityType(activityTypeName: string): Promise<void> {\n return this._gw3Session\n .send(\n {\n type: gwMessageRemoveActivityTypes,\n types: [activityTypeName]\n })\n .then(() => {\n const activityType = new ActivityType(activityTypeName, undefined, undefined, undefined);\n this.invokeCallbacks(\n this._activityTypeStatusChangeCallbacks,\n new EntityEvent<ActivityType>(\n activityType,\n new EntityEventContext(EntityEventType.Removed)),\n gwMessageAddActivityTypes);\n });\n }\n\n public onWindowTypeStatusChange(callback: EventHandlerCallback<EntityEvent<WindowType>>): void {\n this._windowTypeStatusChangeCallbacks.push(callback);\n }\n\n // NB: in GW3, peer factories have ids separate from the ids of the peers they create\n // in this implementation we keep the two equal for simplicity\n // NB: we assume only one peer will register a peer factory for a given type; otherwise the\n // add/remove window types event logic will get messy\n public registerWindowFactory(\n windowType: string,\n factory: WindowFactory,\n parameters?: any): Promise<void> {\n if (this._peerFactoriesRegisteredByUs[windowType]) {\n return Promise.reject(new Error(`Factory for windowType ${windowType} already registered.`));\n }\n\n this._peerFactoriesRegisteredByUs[windowType] = factory;\n\n // #deleteme TODO: review success/failure code paths\n // #deleteme TODO: review - should we create the window type here?\n const entity = {\n id: windowType,\n peer_type: windowType,\n configuration: parameters\n };\n return this._gw3Session.send({\n type: gwMessageAddPeerFactories,\n factories: [entity]\n })\n .then(() => {\n this.invokeCallbacks(\n this._windowTypeStatusChangeCallbacks,\n new EntityEvent(\n GW3Bridge.peerFactoryGwMessageEntityToWindowType(entity),\n new EntityEventContext(EntityEventType.Added)),\n gwMessageAddPeerFactories);\n })\n .catch(() => {\n delete this._peerFactoriesRegisteredByUs[windowType];\n });\n }\n\n public unregisterWindowFactory(windowType: string): Promise<void> {\n const factory = this._peerFactoriesRegisteredByUs[windowType];\n if (!factory) {\n return Promise.reject(new Error(`Factory for windowType ${windowType} not registered.`));\n }\n\n delete this._peerFactoriesRegisteredByUs[windowType];\n\n return this._gw3Session.send({\n type: gwMessageRemovePeerFactories,\n factory_ids: [windowType]\n }).then(() => {\n this.invokeCallbacks(\n this._windowTypeStatusChangeCallbacks,\n new EntityEvent(\n new WindowType(windowType, undefined),\n new EntityEventContext(EntityEventType.Removed)),\n gwMessageAddPeerFactories);\n });\n }\n\n public onActivityStatusChange(callback: EventHandlerCallback<EntityEvent<Activity>>) {\n this._activityChangeCallbacks.push(callback);\n }\n\n public initiateActivity(activityType: string, context?: object, configuration?: WindowDefinition[] | OverrideTypeDefinition): Promise<string> {\n const initiateMsg: any = {\n type: gwMessageCreateActivity,\n activity_type: activityType,\n initial_context: context,\n };\n\n if (this.isOverrideTypeDefinition(configuration)) {\n initiateMsg.types_override = {\n owner_type: { type: configuration.owner.type, name: configuration.owner.name, configuration: configuration.owner },\n helper_types: configuration.helpers && configuration.helpers.map((wd) => ({ type: wd.type, name: wd.name, configuration: wd }))\n };\n } else {\n initiateMsg.configuration = configuration && configuration.map((wd) => ({ type: wd.type, name: wd.name, configuration: wd }));\n }\n\n return this.sendCreateAndMapResultingMessagesToPromise(\n initiateMsg,\n gwMessageActivityInitiated,\n (msg, requestId) => msg.request_id === requestId,\n gwMessageActivityCreated,\n (msg, requestId, initMsg) => msg.activity_id === initMsg.activity_id,\n gwMessageActivityDestroyed,\n (msg, requestId, initMsg) => msg.activity_id === initMsg.activity_id,\n (msg) => msg.activity_id,\n null).then((id) => {\n if (this._config.mode === \"trackMyTypeAndInitiatedFromMe\") {\n if (!this._activityTypesInitiatedFromMe[activityType]) {\n this._activityTypesInitiatedFromMe[activityType] = true;\n\n return this._gw3Session\n .send(\n {\n type: \"subscribe\",\n activity_types: [activityType]\n })\n .then(() => {\n return id;\n });\n }\n }\n return id;\n });\n }\n\n public stopActivity(activity: Activity): Promise<boolean> {\n return this._gw3Session.send({\n type: gwMessageDestroyActivity,\n activity_id: activity.id,\n reason_uri: \"com.tick42.glue.activity.constants.destroyReason.general\",\n reason: \"Destroying activity\"\n }).then((_) => true);\n }\n\n public updateActivityContext(activity: Activity, context: any, fullReplace: boolean, removedKeys?: string[]): Promise<void> {\n if (fullReplace) {\n // this will currently fail on GW3\n return this._contexts.set(activity.id, context);\n } else {\n removedKeys = removedKeys || [];\n for (const x of removedKeys) {\n context[x] = null;\n }\n return this._contexts.update(activity.id, context);\n }\n }\n\n public announceWindow(windowType?: string, activityWindowId?: string) {\n // in the GW3 case we are only joined to an activity after we announce ourselves\n // so all announcement calls should go in 'registerWindow', not here\n // (registerWindow registers a window that's not part of an activity, at least yet)\n throw new Error(\"Invalid operation 'announceWindow' for GW3 protocol\");\n }\n\n public registerWindow(type: string, name: string, independent: boolean): Promise<string> {\n\n let shouldSendReady = typeof this._connection.gatewayToken !== \"undefined\";\n const peerId = this._connection.peerId;\n\n // if running in GD3 (glue42gd is there) we should send ready only if we have the activityInfo object in glue\n if (typeof window !== \"undefined\") {\n const glue42gd = window.glue42gd;\n if (glue42gd) {\n shouldSendReady = typeof glue42gd.activityInfo !== \"undefined\";\n }\n }\n\n if (shouldSendReady) {\n this._gw3Session.send({\n type: gwMessageReady,\n });\n }\n\n this.invokeCallbacks(\n this._activityWindowChangeCallbacks,\n new EntityEvent<ActivityWindow>(\n new ActivityWindow(peerId, name, type, undefined, this.getAgmInstance(peerId), independent, this.generateWindowGetter(peerId), undefined),\n new EntityEventContext(EntityEventType.Added)),\n \"register window\");\n\n return Promise.resolve(peerId);\n }\n\n public onActivityWindowChange(callback: EventHandlerCallback<EntityEvent<ActivityWindow>>) {\n this._activityWindowChangeCallbacks.push(callback);\n }\n\n public createWindow(activityId: string, windowDefinition: WindowDefinition): Promise<string> {\n\n // if the user hasn't provided a layout option but has some of left,top,width,height\n // insert a layout\n if (!windowDefinition.layout) {\n if (windowDefinition.left || windowDefinition.width || windowDefinition.height || windowDefinition.top) {\n windowDefinition.layout = {\n mode: \"pixels\",\n cellSize: 1,\n };\n }\n }\n\n const joinPeer = (id: string) => {\n if (!activityId) {\n return;\n }\n return this.joinActivity(activityId, id, windowDefinition.name)\n .then(() => {\n return id;\n });\n };\n\n return this.sendCreateAndMapResultingMessagesToPromise(\n {\n type: gwMessageCreatePeer,\n peer_type: windowDefinition.type,\n peer_name: windowDefinition.name || windowDefinition.type,\n configuration: windowDefinition,\n activity_id: activityId,\n },\n undefined,\n undefined,\n gwMessagePeerCreated,\n (msg, requestId) => msg.request_id === requestId,\n undefined,\n undefined,\n (msg) => msg.created_id,\n joinPeer)\n .then(joinPeer);\n }\n\n public closeWindow(id: string): Promise<void> {\n return this._gw3Session.send({\n type: gwMessageDestroyPeer,\n destroy_peer_id: id\n }).then((_) => undefined);\n }\n\n public getAnnouncementInfo(): AnnouncementInfo {\n let activityId = this._config.activityId || (this._config.announcementInfo && this._config.announcementInfo.activityId);\n let activityWindowType = (this._config.announcementInfo && this._config.announcementInfo.activityWindowType);\n let activityWindowIndependent = (this._config.announcementInfo && this._config.announcementInfo.activityWindowIndependent);\n let activityWindowName = (this._config.announcementInfo && this._config.announcementInfo.activityWindowName);\n\n if (typeof window !== \"undefined\" &&\n typeof window.location !== \"undefined\" &&\n window.location.search &&\n typeof URLSearchParams === \"function\") {\n const searchParams = new URLSearchParams(location.search.slice(1));\n activityWindowType = activityWindowType || searchParams.get(\"t42PeerType\");\n activityWindowType = activityWindowType || searchParams.get(\"t42ActivityWindowType\");\n if (typeof activityWindowIndependent === \"undefined\") {\n activityWindowIndependent = searchParams.get(\"t42ActivityWindowIndependent\");\n }\n activityWindowName = activityWindowName || searchParams.get(\"t42ActivityWindowName\");\n activityId = activityId || searchParams.get(\"t42ActivityId\");\n }\n\n activityWindowType = activityWindowType || \"unknown\";\n activityWindowIndependent = activityWindowIndependent || false;\n activityWindowName = activityWindowName || this._connection.peerId;\n\n return {\n activityWindowId: undefined, // not member of activity from the get go\n activityId,\n activityWindowType,\n activityWindowIndependent,\n activityWindowName,\n };\n }\n\n public joinActivity(activityId: string, windowId: string, name?: string): Promise<void> {\n const maybeName = (name && { name }) || {};\n return this._gw3Session.send({\n type: gwMmessageJoinActivity,\n target_id: windowId,\n activity_id: activityId,\n ...maybeName\n }).then(() => {\n this.invokeCallbacks(\n this._activityWindowChangeCallbacks,\n new EntityEvent<ActivityWindow>(\n new ActivityWindow(windowId, undefined, undefined, activityId, this.getAgmInstance(windowId), undefined, this.generateWindowGetter(windowId), undefined),\n new EntityEventContext(EntityEventType.ActivityWindowJoinedActivity)),\n \"activity joined - ActivityWindow\");\n\n this.invokeCallbacks(\n this._activityChangeCallbacks,\n new EntityEvent<Activity>(\n new Activity(activityId, undefined, new ActivityStatus(\"created\", undefined, undefined), undefined, undefined),\n new EntityEventContext(EntityEventType.Updated)),\n \"activity joined - Activity\");\n });\n }\n\n public leaveActivity(activityId: string, windowId: string): Promise<void> {\n return this._gw3Session.send({\n type: gwMessageLeaveActivity,\n target_id: windowId,\n activity_id: activityId\n }).then(() => {\n this.invokeCallbacks(\n this._activityWindowChangeCallbacks,\n new EntityEvent<ActivityWindow>(\n new ActivityWindow(windowId, undefined, undefined, null, this.getAgmInstance(windowId), undefined, this.generateWindowGetter(windowId), undefined),\n new EntityEventContext(EntityEventType.ActivityWindowLeftActivity)),\n \"activity left - ActivityWindow\");\n\n this.invokeCallbacks(\n this._activityChangeCallbacks,\n new EntityEvent<Activity>(\n new Activity(activityId, undefined, new ActivityStatus(\"created\", undefined, undefined), undefined, undefined),\n new EntityEventContext(EntityEventType.Updated)),\n \"activity left - Activity\");\n });\n }\n\n // purposefully returning empty arrays\n public getActivityTypes(): Promise<ActivityType[]> {\n return Promise.resolve([]);\n }\n\n public getWindowTypes(): Promise<WindowType[]> {\n return Promise.resolve([]);\n }\n\n public getActivities(): Promise<Activity[]> {\n return Promise.resolve([]);\n }\n\n public getActivityWindows(): Promise<ActivityWindow[]> {\n return Promise.resolve([]);\n }\n\n // N/A\n\n // ignore for now\n\n // POSTPONED\n public createStackedWindows(id: string, windowDefinitions: WindowDefinition[], timeout: number): Promise<string[]> {\n return undefined;\n }\n\n // POSTPONED\n public getWindowBounds(id: string): Promise<WindowBounds> {\n return undefined;\n }\n\n // POSTPONED\n public setWindowBounds(id: string, bounds: WindowBounds): Promise<void> {\n return undefined;\n }\n\n // POSTPONED\n public activateWindow(id: string, focus: boolean): Promise<void> {\n return undefined;\n }\n\n // POSTPONED\n public setWindowVisibility(id: string, visible: boolean): Promise<void> {\n return undefined;\n }\n\n // POSTPONED\n public cloneActivity(id: string, cloneOptions: CloneOptions): Promise<string> {\n return undefined;\n }\n\n // POSTPONED\n public attachActivities(from: string, to: string, tag: object): Promise<any> {\n return this._gw3Session.send({\n type: gwNmessageMergeActivities,\n into: to,\n merge: from\n });\n }\n\n // POSTPONED\n public detachActivities(activityId: string, newActivityInfo: ActivityDescriptor): Promise<string> {\n return this._gw3Session.send({\n type: gwMessageSplitActivities,\n from: activityId,\n // split: from\n }).then(() => \"\");\n }\n\n // POSTPONED\n public onActivitiesAttached(callback: (info: any) => void) {\n // POSTPONED\n }\n\n // POSTPONED\n public onActivitiesDetached(callback: (info: any) => void) {\n // POSTPONED\n }\n\n public onActivityAttachedDescriptorsRefreshed(callback: (info: any) => void): void {\n // POSTPONED\n }\n\n // POSTPONED\n public getAttachedDescriptors(): Promise<any[]> {\n return Promise.resolve([]);\n }\n\n // helpers\n\n // Protocol handling\n\n private getRandomRequestId() {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n return this._connection.peerId + \":\" + Math.floor(Math.random() * 1e9) + \"\";\n }\n\n private forwardAddedAndRemovedMessagesToEventHandler<TMessage, TEntity>(\n addedMessageType: string,\n removedMessageType: string,\n mapper: (msg: TMessage, isAdded: boolean) => TEntity[],\n handlers: EventHandlerCallback<EntityEvent<TEntity>>[]) {\n\n const getGetEntityEvent = (isAdded: boolean) => (entity: any) => new EntityEvent<TEntity>(\n entity,\n new EntityEventContext(\n isAdded ?\n EntityEventType.Added :\n EntityEventType.Removed));\n\n\n const sub1 = addedMessageType && this.forwardMessageToEventHandler<TMessage, TEntity>(\n addedMessageType,\n (msg) => mapper(msg, true),\n getGetEntityEvent(true),\n handlers);\n\n const sub2 = removedMessageType && this.forwardMessageToEventHandler<TMessage, TEntity>(\n removedMessageType,\n (msg) => mapper(msg, false),\n getGetEntityEvent(false),\n handlers);\n\n return [sub1, sub2].filter((x) => x);\n }\n\n private forwardMessageToEventHandler<TMessage, TEntity>(\n messageType: string,\n mapper: (msg: TMessage) => TEntity[],\n getEntityEvent: (entity: TEntity, msg: TMessage) => EntityEvent<TEntity>,\n handler: EventHandlerCallback<EntityEvent<TEntity>>[]) {\n return this.subscribe(\n messageType,\n (msg: TMessage) => {\n mapper(msg)\n .forEach((ent: any) =>\n handler.forEach((h) => h(getEntityEvent(ent, msg))));\n });\n }\n\n private sendCreateAndMapResultingMessagesToPromise<TCreatedMessage extends GwMessage, TPromiseType>(\n msg: any,\n initiatedMessageType: string,\n initiatedMessageFilter: (msg: any, requestId: string) => boolean,\n createdMessageType: string,\n createdMessageFilter: (msg: any, requestId: string, initMsg: any) => boolean,\n cancelledMessageType: string,\n cancelledMessageFilter: (msg: any, requestId: string, initMsg: any) => boolean,\n createdMessageToPromiseResolution: (TCreatedMessage: any) => TPromiseType,\n listenForRecreates: (result: TPromiseType) => void): Promise<TPromiseType> {\n\n const reqId = this.getRandomRequestId();\n\n let resolveCreatedPromise: (arg: any) => void;\n let rejectCreatedPromise: (arg: any) => void;\n const createdPromise = new Promise<TPromiseType>((resolve, reject) => {\n resolveCreatedPromise = resolve;\n rejectCreatedPromise = reject;\n });\n\n let initiatedMessageAck: any = null;\n\n let initiatedSubscription: any;\n let createdSubscription: any;\n let cancelledSubscription: any;\n let errorSubscription: any;\n\n const dropSubscriptions = () => {\n this.dropSubscription(initiatedSubscription);\n if (!listenForRecreates) {\n this.dropSubscription(createdSubscription);\n }\n this.dropSubscription(cancelledSubscription);\n this.dropSubscription(errorSubscription);\n };\n\n initiatedSubscription = initiatedMessageType &&\n this.subscribe(\n initiatedMessageType,\n (msg4: any) => {\n if (!initiatedMessageFilter(msg4, reqId)) {\n return;\n }\n initiatedMessageAck = msg4;\n this.dropSubscription(initiatedSubscription);\n });\n\n let recreated = false;\n createdSubscription =\n this.subscribe(\n createdMessageType,\n (msg1: TCreatedMessage) => {\n if (!createdMessageFilter(msg1, reqId, initiatedMessageAck)) {\n return;\n }\n if (recreated) {\n if (listenForRecreates) {\n listenForRecreates(createdMessageToPromiseResolution(msg1));\n }\n } else {\n recreated = true;\n resolveCreatedPromise(createdMessageToPromiseResolution(msg1));\n }\n });\n cancelledSubscription = cancelledMessageType &&\n this.subscribe(\n cancelledMessageType,\n (msg2: any) => {\n if (!cancelledMessageFilter(msg2, reqId, initiatedMessageAck)) {\n return;\n }\n rejectCreatedPromise(msg2);\n });\n errorSubscription = cancelledMessageType &&\n this.subscribe(\n gwMmessageError,\n (msg3: any) => {\n if (msg3.request_id !== reqId) {\n return;\n }\n rejectCreatedPromise(msg3);\n });\n\n msg.request_id = reqId;\n\n const toReturn = this._gw3Session\n .send(msg)\n .then(() => {\n return createdPromise;\n });\n toReturn.then(dropSubscriptions, dropSubscriptions);\n return toReturn;\n }\n\n // Entity Mapping\n\n private peerFactoryIdAndOwnerIdToWindowType(factoryId: string, ownerId: string) {\n const peerType = this._peerIdAndFactoryIdToPeerType[ownerId + \":\" + factoryId];\n if (!peerType) {\n return null;\n } else {\n return new WindowType(peerType, undefined);\n }\n }\n\n private subscribe<TMessage>(messageType: string, handler: (msg: TMessage) => void) {\n const sub = this._connection.on(\n messageType,\n (msg: TMessage) => handler.bind(this)(msg));\n\n this._gw3Subscriptions.push(sub);\n\n return sub;\n }\n\n private dropSubscription(subscription: any) {\n if (subscription) {\n this._connection.off(subscription);\n delete this._gw3Subscriptions[this._gw3Subscriptions.indexOf(subscription)];\n }\n }\n\n private invokeCallbacks<TEvent>(\n callbacks: EventHandlerCallback<EntityEvent<TEvent>>[],\n event: EntityEvent<TEvent>,\n description?: string) {\n callbacks.forEach((cb) => {\n try {\n cb(event);\n } catch (err) {\n this._logger.error(`Error in ${description || event.context.type} callback: ` + JSON.stringify(err));\n }\n });\n }\n\n private handleActivityCreatedMessage(msg: ActivityGwMessage) {\n if (!msg.context_id) {\n this._logger.error(\"Activity created with unknown context_id: \" + msg.activity_id);\n } else {\n if (!this._contextSubscriptions[msg.activity_id]) {\n this.subscribeToContext(msg);\n }\n }\n }\n\n private async subscribeToContext(msg: ActivityGwMessage): Promise<void> {\n const activityId = msg.activity_id;\n this._contextSubscriptions[activityId] =\n await this._contexts.subscribe(activityId,\n (data: any, updated: any, removed: string[]) => {\n const event = new EntityEvent<Activity>(\n new Activity(activityId, undefined, undefined, data, undefined),\n new ActivityContextChangedEventContext(data, updated, removed));\n\n this.invokeCallbacks(\n this._activityChangeCallbacks,\n event,\n \"context updated\");\n });\n }\n\n private handleActivityDestroyedMessage(msg: ActivityGwMessage) {\n const unsubscribeContext = this._contextSubscriptions[msg.activity_id];\n if (typeof unsubscribeContext === \"function\") {\n unsubscribeContext();\n }\n delete this._contextSubscriptions[msg.activity_id];\n }\n\n private handlePeerFactoriesAdded(msg: PeerFactoryGwMessage) {\n msg.factories.forEach((entity: PeerFactoryGwMessageEntity) => {\n this._peerIdAndFactoryIdToPeerType[msg.owner_id + \":\" + entity.id] = entity.peer_type;\n });\n }\n\n private handlePeerFactoriesRemoved(msg: PeerFactoryGwMessage) {\n msg.factory_ids.forEach((factoryId: string) => {\n delete this._peerIdAndFactoryIdToPeerType[msg.owner_id + \":\" + factoryId];\n });\n }\n\n private forwardActivityTypeMessagesToStatusEventHandlers() {\n this.forwardAddedAndRemovedMessagesToEventHandler<ActivityTypeGwMessage, ActivityType>(\n gwMmessageActivityTypesAdded,\n gwMessageActivityTypesRemoved,\n (msg: ActivityTypeGwMessage, isAdded) => isAdded\n ? msg.types.map((t) => GW3Bridge.activityTypeGwMessageEntityToActivityType(t, undefined))\n : msg.types.map((t) => new ActivityType(t.name, undefined, undefined, undefined)),\n this._activityTypeStatusChangeCallbacks);\n\n }\n\n private forwardActivityCreatedAndJoinedActivityToActivityWindowEventHandlers() {\n // if we're created as part of this activity, the JOINED ACTIVITY is\n\n // the first time we'll hear about it; so let's record the participants\n for (const activityCreatedMessage of [gwMessageActivityCreated, gwMessageJoinedActivity, gwMessageOwnerChanged]) {\n this.forwardMessageToEventHandler<ActivityGwMessage, ActivityWindow>(\n activityCreatedMessage,\n (msg) =>\n ([msg.owner || { ...msg, type: msg.peer_type, name: msg.peer_name, peer_id: msg.owner_id }])\n .concat(msg.participants || [])\n .map((info: any) => new ActivityWindow(info.peer_id, info.name, info.type, msg.activity_id, this.getAgmInstance(info.peer_id), undefined, this.generateWindowGetter(info.peer_id), undefined)),\n (ent, msg) => new EntityEvent<ActivityWindow>(ent, new EntityEventContext(EntityEventType.ActivityWindowJoinedActivity)),\n this._activityWindowChangeCallbacks);\n }\n }\n\n private forwardActivityMessagesToStatusEventHandlers() {\n\n // see dot-net-activity\\Activity\\ActivityState.cs\n\n for (const createdMessage of [gwMessageActivityCreated, gwMessageJoinedActivity]) {\n this.forwardMessageToEventHandler<ActivityGwMessage, Activity>(\n createdMessage,\n (msg) => [GW3Bridge.activityGwMessageToActivity(msg, new ActivityStatus(\"started\", \"\", new Date()))],\n (ent, msg) => GW3Bridge.activityToActivityStatusChangeEvent(ent),\n this._activityChangeCallbacks);\n }\n\n this.forwardMessageToEventHandler<ActivityGwMessage, Activity>(\n gwMessageActivityDestroyed,\n (msg) => [GW3Bridge.activityGwMessageToActivity(msg, new ActivityStatus(\"destroyed\", msg.reason, new Date()))],\n (ent, msg) => GW3Bridge.activityToActivityStatusChangeEvent(ent),\n this._activityChangeCallbacks);\n\n this.forwardMessageToEventHandler<ActivityGwMessage, Activity>(\n gwMessageActivityInitiated,\n (msg) => [GW3Bridge.activityGwMessageToActivity(msg, new ActivityStatus(\"created\", \"\", new Date()))],\n (ent, msg) => GW3Bridge.activityToActivityStatusChangeEvent(ent),\n this._activityChangeCallbacks);\n\n this.forwardMessageToEventHandler<ActivityGwMessage, Activity>(\n gwMessageOwnerChanged,\n (msg) => [GW3Bridge.activityGwMessageToActivity(msg, new ActivityStatus(\"created\", \"\", new Date()))],\n (ent, msg) => GW3Bridge.activityToActivityStatusChangeEvent(ent),\n this._activityChangeCallbacks);\n }\n\n private forwardPeerFactoryMessagesToStatusEventHandlers() {\n this.forwardAddedAndRemovedMessagesToEventHandler<PeerFactoryGwMessage, WindowType>(\n gwMessagePeerFactoriesAdded,\n gwMessagePeerFactoriesRemoved,\n (msg: PeerFactoryGwMessage, isAdded: boolean) => isAdded\n ? msg.factories.map(GW3Bridge.peerFactoryGwMessageEntityToWindowType)\n : msg.factory_ids.map((id) => this.peerFactoryIdAndOwnerIdToWindowType(id, msg.owner_id)).filter((x) => x != null),\n this._windowTypeStatusChangeCallbacks);\n }\n\n private forwardPeerFactoryMessagesToPeerFactoryRequests() {\n this.subscribe(\n gwMessagePeerRequested,\n (msg: PeerRequestedGwMessage) => {\n const factory = this._peerFactoriesRegisteredByUs[msg.peer_factory];\n if (!factory) {\n this._gw3Session.send(\n {\n type: gwMmessageError,\n request_id: msg.request_id,\n reason: `Unknown peer factory ${msg.peer_factory}`\n });\n return;\n }\n\n try {\n const configuration = msg.configuration || {};\n // NB: peer factories (or whoever they're delegating to) need to support whatever activity\n // environment (GW3, HC) we're targeting when they're creating peers\n // the manager is env agnostic, the bridge will augment the configuration with whatever's required\n\n // NB: also, since peers are requested in two ways (single peer with just its configuration,\n // or peer created as part of new activity, where the factory receives the aggregate config of\n // all peers, combined from ADD ACTIVITY TYPE and CREATE ACTIVITY), the peer factories need to\n // be able to handle both configuration structures intelligently.\n configuration.gateway_token = configuration.gateway_token || msg.gateway_token;\n configuration.peer_factory = configuration.peer_factory || msg.peer_factory;\n const promise = factory({\n activityId: msg.activity && msg.activity.id,\n activityType: msg.activity && msg.activity.type,\n type: msg.configuration && msg.configuration.type,\n gwToken: configuration.gateway_token,\n configuration\n });\n if (promise && promise.then && promise.catch) {\n promise.catch((err) => this._gw3Session.send(\n {\n type: gwMmessageError,\n request_id: msg.request_id,\n reason: err && (err.message || JSON.stringify(err))\n }));\n }\n } catch (err) {\n this._gw3Session.send(\n {\n type: gwMmessageError,\n request_id: msg.request_id,\n reason: err && (err.message || JSON.stringify(err))\n });\n }\n });\n }\n\n private forwardActivityWindowMessagesToEventHandlers() {\n for (const joinedMessage of [gwMessageActivityJoined, gwMessageJoinedActivity]) {\n this.subscribe(joinedMessage,\n (msg: any) => {\n const joinedId = (joinedMessage === gwMessageActivityJoined) ? msg.joined_id : msg.peer_id;\n const joinedType = (joinedMessage === gwMessageActivityJoined) ? msg.joined_type : msg.peer_type;\n const joinedName = (joinedMessage === gwMessageActivityJoined) ? msg.joined_name : msg.peer_name;\n\n const entity = new ActivityWindow(\n joinedId,\n joinedName,\n joinedType /* for ACTIVITY JOINED */,\n msg.activity_id,\n this.getAgmInstance(joinedId),\n undefined,\n this.generateWindowGetter(joinedId),\n undefined);\n\n // TODO review - what if it's our activity, do we\n // even need to subscribe\n if (!this._contextSubscriptions[msg.activity_id]) {\n this.subscribeToContext(msg).then(() => {\n if (joinedMessage === gwMessageJoinedActivity) {\n this._activityJoinedPromiseResolve({});\n }\n });\n } else if (joinedMessage === gwMessageJoinedActivity) {\n this._activityJoinedPromiseResolve({});\n }\n\n // TODO review: we might have the context data here already\n // why not update it here instead of waiting for subscribeToContext\n this.invokeCallbacks(\n this._activityWindowChangeCallbacks,\n new EntityEvent<ActivityWindow>(\n entity,\n new EntityEventContext(EntityEventType.ActivityWindowJoinedActivity)),\n joinedMessage);\n\n });\n }\n\n this.subscribe(\n gwMessageActivityLeft,\n (msg: any) => {\n const entity = new ActivityWindow(\n msg.left_id,\n undefined,\n undefined,\n null,\n this.getAgmInstance(msg.left_id),\n undefined,\n this.generateWindowGetter(msg.left_id),\n undefined);\n\n this.invokeCallbacks(\n this._activityWindowChangeCallbacks,\n new EntityEvent<ActivityWindow>(\n entity,\n new EntityEventContext(EntityEventType.ActivityWindowLeftActivity)),\n gwMessageActivityLeft);\n });\n\n this.forwardAddedAndRemovedMessagesToEventHandler<PeerCreatedGwMessage, ActivityWindow>(\n gwMessagePeerCreated,\n undefined,\n (msg) => [\n new ActivityWindow(\n msg.created_id,\n undefined /* #deleteme TODO: review - we should know the name if any */,\n undefined /* #deleteme TODO: review - we should know the type */,\n undefined,\n undefined,\n undefined,\n this.generateWindowGetter(msg.created_id),\n undefined)],\n this._activityWindowChangeCallbacks);\n }\n\n private getAgmInstance(id: string): IOConnectDesktop.AGM.Instance {\n return this._config.agm.servers().find((s) => s.peerId === id || s.windowId === id);\n }\n\n private generateWindowGetter(peerId: string): () => IOConnectDesktop.Windows.IOConnectWindow {\n return () => {\n const server = this.getAgmInstance(peerId);\n if (!server) {\n return;\n }\n const windowId = server.windowId;\n return this._config.windows.list().filter((w) => w.id === windowId)[0];\n };\n }\n\n private isOverrideTypeDefinition(value: OverrideTypeDefinition | WindowDefinition[]): value is OverrideTypeDefinition {\n if (typeof value === \"undefined\") {\n return false;\n }\n if ((value as OverrideTypeDefinition).owner) {\n return true;\n }\n return false;\n }\n}\n","/* eslint-disable @typescript-eslint/restrict-plus-operands */\nimport { EntityEventType } from \"./../contracts/entityEvent\";\nimport Activity from \"./../entities/activity\";\nimport ActivityWindow from \"./../entities/activityWindow\";\n\nimport ActivityManager from \"./../core/activityManager\";\nimport { Logger } from \"./../helpers/logger\";\nimport * as util from \"./../helpers/util\";\n\nimport { WindowDefinition } from \"./../entities/windowDefinition\";\nimport { CloneOptions } from \"../entities/cloneOptions\";\nimport { Callback } from \"../contracts/contracts\";\nimport { AttachedActivityDescriptor } from \"../entities/attachedActivityDescriptor\";\nimport { IOConnectDesktop } from \"../../../desktop\";\n\nexport interface My {\n\n activity: Activity;\n\n window: ActivityWindow;\n\n context: object;\n\n updateContext(context: object, callback?: any): Promise<object>;\n\n setContext(context: object, callback?: any): Promise<object>;\n\n onActivityJoined(callback: (activity: Activity) => void): void;\n\n onActivityLeft(callback: (activity: Activity) => void): void;\n\n onContextChanged(callback: (context: object, delta: object, removed: string[], activity: Activity) => void): void;\n\n clone(options: CloneOptions, callback: Callback<Activity>): Promise<Activity>;\n\n attach(activity: Activity | string, tag?: object): Promise<AttachedActivityDescriptor>;\n\n setFrameColor(color: string, callback: () => void): Promise<Activity>;\n\n getFrameColor(): string;\n\n onFrameColorChanged(callback: () => void): void;\n}\n\n/**\n * A lightweight, single activity oriented subset of the API which should be used by most activity applications.\n * Provides access to the activity of your application (my.activity) and shortcuts to the most commonly used methods\n * (e.g. my.createWindow is a shortcut for my.activity.createWindow)\n *\n * @module my\n */\nexport default class ActivityMy implements My {\n\n public _myAttached: ((state: AttachedActivityDescriptor) => void)[] = [];\n public _myDetached: ((state: AttachedActivityDescriptor) => void)[] = [];\n public _myAttachedTo: ((activity: Activity, state: AttachedActivityDescriptor) => void)[] = [];\n public _myDetachedFrom: ((detached: Activity, existing: Activity, state: AttachedActivityDescriptor) => void)[] = [];\n public _myActivityFrameColorChanged: ((frameColor: string) => void)[] = [];\n public _myActivityJoinedCallbacks: ((activity: Activity, event: any) => void)[] = [];\n public _myActivityRemovedCallbacks: ((activity: Activity, event: any) => void)[] = [];\n public _myContextUpdateCallbacks: ((context: object, delta: object, removed: string[], activity: Activity) => void)[] = [];\n public _w: ActivityWindow;\n public _m: ActivityManager;\n public _logger: Logger = Logger.Get(this);\n\n constructor(manager: ActivityManager, windows: any) {\n this._m = manager;\n manager.ready()\n .then((am) => {\n // Subscribe for events for driving \"my\" logic\n am.subscribeActivityContextChanged(this._subscribeMyContextChanged.bind(this));\n am.subscribeWindowEvents(this._subscribeMyWindowEvent.bind(this));\n am.subscribeActivitiesAttached(this._subscribeActivitiesAttached.bind(this));\n am.subscribeActivitiesDetached(this._subscribeActivitiesDetached.bind(this));\n if (windows) {\n windows.onWindowFrameColorChanged(this._subscribeWindowFrameColorChanged.bind(this));\n }\n });\n }\n\n /**\n * The current activity window; can be undefined (if the window is not part of any activity)\n *\n * @var {Window} window\n */\n public get window(): ActivityWindow {\n if (util.isUndefinedOrNull(this._w)) {\n const announcedWindows = this._m.announcedWindows;\n if (announcedWindows.length > 0) {\n this._w = announcedWindows[0];\n }\n }\n return this._w;\n }\n\n /**\n * The current activity that the application participates in.\n * Can be undefined (if currently not part of any activity)\n *\n * @var {module:activity} activity\n */\n public get activity(): Activity {\n const myWin = this.window;\n if (util.isUndefinedOrNull(myWin)) {\n return undefined;\n }\n return myWin.activity;\n }\n\n /**\n * Creates a new window and joins it to the activity\n *\n * @function createWindow\n * @param {string| windowDefinition} windowType The type of the window to be created\n * @returns {Promise<module:activityWindow>}\n */\n public createWindow(windowType: string | WindowDefinition): Promise<ActivityWindow> {\n return this._m.createWindow(this.activity, windowType);\n }\n\n /**\n * Creates a stacked set of windows and joins them to the\n *\n * @function createStackedWindows\n * @param {string[] | windowDefinition[]} windowTypes The types of the windows to be created\n * @param {number} timeout\n * @returns {Promise<module:activityWindow[]>}\n */\n public createStackedWindows(windowTypes: (string | WindowDefinition)[], timeout?: number): Promise<ActivityWindow[]> {\n return this._m.createStackedWindows(this.activity, windowTypes, timeout);\n }\n\n /**\n * The current activity context. To update use my.updateContext, to replace my.setContext\n *\n * @var {object} context\n */\n public get context(): object {\n const activity = this.activity;\n if (util.isUndefined(activity)) {\n return {};\n }\n\n return activity.context;\n }\n\n /**\n * Updates activity context using the properties from the context argument.\n * If old context is {a:1, b:2, c:3} and invoking updateContext({b:3, c:null}) will result a context\n * be {a:1, b:3}\n *\n * @function updateContext\n * @param {object} context\n * @return {Promise<object>}\n */\n public updateContext(context: object, callback?: any): Promise<object> {\n const activity = this.activity;\n if (util.isUndefined(activity)) {\n return new Promise<object>((resolve, reject) => {\n reject(\"Not in activity\");\n });\n }\n\n return activity.updateContext(context, callback);\n }\n\n /**\n * Replaces the activity context with a new one.\n *\n * @function setContext\n * @param {object} context The new context\n * @returns {Promise<Object>}\n */\n public setContext(context: object, callback?: any): Promise<object> {\n const activity = this.activity;\n if (util.isUndefined(activity)) {\n return new Promise((resolve, reject) => {\n reject(\"Not in activity\");\n });\n }\n\n return activity.setContext(context, callback);\n }\n\n public onActivityJoined(callback: (activity: Activity) => void) {\n this._myActivityJoinedCallbacks.push(callback);\n\n // replay joined event\n const myWin = this.window;\n if (!util.isUndefinedOrNull(myWin) && !util.isUndefinedOrNull(myWin.activity)) {\n callback(myWin.activity);\n }\n }\n\n public onActivityLeft(callback: (activity: Activity) => void) {\n this._myActivityRemovedCallbacks.push(callback);\n }\n\n /**\n * Subscribe for context updates\n *\n * @function onContextChanged\n * @param {contextChangedHandler} callback Handler function that will receive context related events\n */\n public onContextChanged(callback: (context: object, delta: object, removed: string[], activity: Activity) => void) {\n this._myContextUpdateCallbacks.push(callback);\n\n // publish initial event\n const myWin = this.window;\n if (util.isUndefinedOrNull(myWin)) {\n return;\n }\n\n const activity = myWin.activity;\n if (util.isUndefinedOrNull(activity)) {\n return;\n }\n\n // NB: either the callback is added before the activity is recorded in the API, or\n // the activity is recorded before the callback\n // in the former case, when the activity is seen, the callback will be invoked in _notifyMyContextChanged\n // in the latter, the callback will be invoked here\n // in both cases, the callback will be invoked at least once as soon as an activity is recorded\n\n // see \"long analysis for callback behavior in GW3: several cases\" for full explanation\n\n callback(activity.context, activity.context, [], activity);\n }\n\n public clone(options: CloneOptions, callback: Callback<Activity>): Promise<Activity> {\n const act = this.activity;\n return this._m.clone(act, options, callback);\n }\n\n public attach(activity: Activity | string, tag?: object): Promise<AttachedActivityDescriptor> {\n let activityId: string;\n if (typeof activity === \"string\") {\n activityId = activity;\n } else {\n activityId = activity.id;\n }\n return this._m.attachActivities(activityId, this.activity.id, tag);\n }\n\n public onActivityAttached(callback: (state: AttachedActivityDescriptor) => void) {\n this._myAttached.push(callback);\n }\n\n public onActivityDetached(callback: (state: AttachedActivityDescriptor) => void) {\n this._myDetached.push(callback);\n }\n\n public onAttachedToActivity(callback: (activity: Activity, state: AttachedActivityDescriptor) => void) {\n this._myAttachedTo.push(callback);\n }\n\n public onDetachedFromActivity(callback: (detached: Activity, existing: Activity, state: AttachedActivityDescriptor) => void) {\n this._myDetachedFrom.push(callback);\n }\n\n public get attached() {\n if (!this.activity) {\n return [];\n }\n\n return this.activity.attached;\n }\n\n public setFrameColor(color: string, callback: () => void): Promise<Activity> {\n\n if (this.activity) {\n return this.activity.setFrameColor(color, callback);\n } else {\n return Promise.resolve(null);\n }\n }\n\n public getFrameColor(): string {\n\n if (this.activity) {\n return this.activity.getFrameColor();\n }\n\n return \"\";\n }\n\n public onFrameColorChanged(callback: () => void) {\n this._myActivityFrameColorChanged.push(callback);\n }\n\n private _subscribeMyContextChanged(activity: Activity, context: object, delta: object, removed: string[]) {\n const myWin = this.window;\n if (util.isUndefinedOrNull(myWin)) {\n return;\n }\n\n const myActivity = myWin.activity;\n if (util.isUndefinedOrNull(myActivity)) {\n return;\n }\n\n // ignore events not related to my activity\n if (activity.id !== myActivity.id) {\n return;\n }\n\n this._notifyMyContextChanged(activity, context, delta, removed);\n }\n\n private _subscribeMyWindowEvent(activity: Activity, window: ActivityWindow, event: any) {\n\n if (util.isUndefinedOrNull(this.window)) {\n return;\n }\n\n // ignore events not related to my window\n if (this.window.id !== window.id) {\n return;\n }\n\n if (event === EntityEventType.ActivityWindowJoinedActivity) {\n this._notifyMyWindowEvent(activity, this._myActivityJoinedCallbacks);\n\n // NB: tick42-contexts doesn't raise automatically an update event on join if the snapshot matches\n // the currently recorded data\n // revisited: however, it is pushing an update on subscribe() (which is performed by js-activity)\n // long analysis for callback behavior in GW3: several cases\n // 1 client calls onContextChanged before joined-activity arrives\n // then callback is pushed but onContextChanged callback call is skipped\n // 1-1 js-activity handles joined-activity first; it calls js-context subscribe\n // 1-1-1 js-context has not seen the activity so far so it doesn't invoke an update\n // however, js-context then handles joined-activity and raises an update\n // 1-1-2 js-context has seen the activity, so it raises an update\n // js-context then handles joined-activity and doesn't raise a second update unless the received snapshot is\n // different from the last seen context value (can this even happen?)\n // 1-2 js-context handles joined-activity first\n // since js-activity is not subscribed, whether it raises an update or not, it's not propagated\n // js-activity then handles joined-activity, performs a subscribe and js-context raises an update\n // 2 joined-activity arrives, whatever updates are raised by js-activity's subscribe() or js-context's\n // message handler are not propagated since the callback is not pushed, client then calls onContextChanged,\n // and the callback is called inside that\n // also, the callback cannot be invoked first in 1 then 2 or first 2 then 1\n // => in all cases, a callback is called exactly once as soon as (it's subscribed && the activity is joined)\n // (in 1-1-2 it *might* be possible to be called twice, first with a slightly out of date context,\n // then with the joined-activity snapshot, see \"different from the last seen context value\", but it's unlikely,\n // and not a real issue anyway)\n // in the HC case, however, case 1 doesn't work since js-context doesn't raise updates on subscribe() nor\n // joining the activity (#deleteme TODO LATER MINOR: verify), so we need to raise it ourselves\n\n // 2017-09-08: final revisit (@vnikolov)\n // since SBGW_D-163 allows automatic subscription to contexts of pre-existing activities, 1-1-2 no longer works\n // (we might have already seen the latest state before joined-activity so no update will be raised)\n // for this reason I'm invoking notifyMyContextChanged unconditionally - so we might have multiple\n // invocations; if this turns into a problem we might add a guard inside notifyMyContextChanged that\n // checks we're not raising it twice with the same context value\n //\n // we might also get a duplicate raise if the sender of an update is also subscribed to the context\n // if (this._m.usingHc) {\n this._notifyMyContextChanged(activity, activity.context, null, null);\n // }\n\n // #deleteme TODO LATER MAJOR: what about the cases when we're not watching foreign activity contexts?\n } else if (event === EntityEventType.ActivityWindowLeftActivity) {\n this._notifyMyWindowEvent(activity, this._myActivityRemovedCallbacks);\n // #deleteme TODO LATER MINOR: should we send null update here?\n }\n }\n\n private _notifyMyWindowEvent(activity: Activity, callbackStore: ((activity: Activity, event: any) => void)[]) {\n callbackStore.forEach((element) => {\n try {\n element(activity, event);\n } catch (e) {\n this._logger.warn(\"error in user callback \" + e);\n }\n });\n }\n\n private _notifyMyContextChanged(activity: Activity, context: object, delta?: object, removed?: string[]) {\n delta = delta || {};\n removed = removed || [];\n\n this._myContextUpdateCallbacks.forEach((element) => {\n try {\n element(context, delta, removed, activity);\n } catch (e) {\n this._logger.warn(\"error in user callback \" + e);\n }\n });\n }\n\n private _notifyAttached(state: AttachedActivityDescriptor) {\n\n this._myAttached.forEach((cb) => {\n try {\n cb(state);\n } catch (e) {\n this._logger.warn(\"error in user callback \" + e);\n }\n });\n }\n\n private _notifyDetached(state: AttachedActivityDescriptor) {\n\n this._myDetached.forEach((cb) => {\n try {\n cb(state);\n } catch (e) {\n this._logger.warn(\"error in user callback \" + e);\n }\n });\n }\n\n private _notifyAttachedTo(state: AttachedActivityDescriptor) {\n\n this._myAttachedTo.forEach((cb) => {\n try {\n cb(this.activity, state);\n } catch (e) {\n this._logger.warn(\"error in user callback \" + e);\n }\n });\n }\n\n private _notifyDetachedFrom(detached: Activity, existing: Activity, state: AttachedActivityDescriptor) {\n\n this._myDetachedFrom.forEach((cb) => {\n try {\n cb(detached, existing, state);\n } catch (e) {\n this._logger.warn(\"error in user callback \" + e);\n }\n });\n }\n\n private _subscribeActivitiesAttached(newAct: Activity, state: AttachedActivityDescriptor) {\n const myWin = this.window;\n if (util.isUndefinedOrNull(myWin)) {\n return;\n }\n\n const myActivity = myWin.activity;\n if (util.isUndefinedOrNull(myActivity)) {\n return;\n }\n\n // ignore events not related to my activity\n if (newAct.id !== myActivity.id) {\n return;\n }\n\n if (state.windowIds.indexOf(myWin.id) >= 0) {\n this._notifyAttachedTo(state);\n return;\n }\n\n this._notifyAttached(state);\n }\n\n private _subscribeActivitiesDetached(newAct: Activity, oldAct: Activity, state: any) {\n const myWin = this.window;\n if (util.isUndefinedOrNull(myWin)) {\n return;\n }\n\n const myActivity = myWin.activity;\n if (util.isUndefinedOrNull(myActivity)) {\n return;\n }\n\n // ignore events not related to my activity\n if (oldAct.id === myActivity.id) {\n this._notifyDetached(state);\n }\n\n if (newAct.id === myActivity.id) {\n this._notifyDetachedFrom(newAct, oldAct, state);\n }\n }\n\n private _subscribeWindowFrameColorChanged(window: IOConnectDesktop.Windows.IOConnectWindow) {\n const act = this.activity;\n if (!act) {\n return;\n }\n\n if (!act.owner) {\n return;\n }\n\n if (act.owner.underlyingWindow.id === window.id) {\n this._myActivityFrameColorChanged.forEach((callback) => {\n callback(window.frameColor);\n });\n }\n }\n}\n","/* eslint-disable @typescript-eslint/restrict-plus-operands */\nimport { Logger } from \"./logger\";\nimport * as util from \"../helpers/util\";\n/**\n * Class that can be used as a marker for successful completion of a set of events\n * @private\n * @module readyMarker\n */\nexport class ReadyMarker {\n private _callbacks: ((err: any) => void)[];\n private _signals: number;\n private _error: any;\n private _logger: Logger;\n private _name: string;\n\n /**\n * Creates new marker\n * @param name Name of the marker, useful in logging\n * @param signalsToWait Number of signals(events) that needs to be signaled (completed) before the marker is set as completed\n */\n constructor(name: string, signalsToWait: number) {\n this._logger = Logger.Get(\"ReadyMarker [\" + name + \"]\");\n this._logger.debug(\"Initializing ready marker for '\" + name + \"' with \" + signalsToWait + \" signals to wait\");\n if (signalsToWait <= 0) {\n throw new Error(\"Invalid signal number. Should be > 0\");\n }\n this._signals = signalsToWait;\n this._callbacks = [];\n this._name = name;\n }\n\n /**\n * Adds a new callback that will be notified when the events are completed (success) or some error happened\n */\n public setCallback(callback: (err: any) => void) {\n if (this.isSet()) {\n callback(undefined);\n return;\n } else if (this.isError()) {\n callback(this._error);\n return;\n }\n this._callbacks.push(callback);\n }\n\n /**\n * Signals for a completion of an event. If this is the last event success callbacks will be called\n */\n public signal(message?: string) {\n this._logger.debug(\"Signaled - \" + message + \" - signals left \" + (this._signals - 1));\n this._signals--;\n if (this._signals < 0) {\n throw new Error(\"Error in ready marker '\" + this._name + \" - signals are \" + this._signals);\n }\n\n if (this.isSet()) {\n this._callbacks.forEach((callback) => {\n callback(undefined);\n });\n }\n }\n\n /**\n * Signals for an error in some of the events. This will notify all callbacks that the marker has failed\n */\n public error(error: string) {\n this._error = error;\n this._callbacks.forEach((errorCallback) => {\n errorCallback(error);\n });\n }\n\n /**\n * Checks if the marker is set (completed)\n */\n public isSet() {\n if (this.isError()) {\n return false;\n }\n return this._signals === 0;\n }\n\n /**\n * Checks if the marker has failed (some of the events has failed)\n */\n public isError() {\n return !util.isUndefined(this._error);\n }\n\n /**\n * Returns the last reported error (undefined if no error)\n */\n public getError() {\n return this._error;\n }\n}\n","import ActivityEntity from \"../entities/activityEntity\";\nimport {\n ActivityStatusChangeEventContext,\n EntityEvent,\n EntityEventContext,\n EntityEventType\n} from \"../contracts/entityEvent\";\nimport Activity from \"../entities/activity\";\nimport ActivityWindow from \"../entities/activityWindow\";\nimport { ActivityState } from \"..//contracts/entityEvent\";\n\ndeclare const htmlContainer: any;\n\n/**\n * Collection of ActivityEntities that provides change notifications\n * @module entityCollection\n * @private\n */\nexport class EntityObservableCollection<T extends ActivityEntity> {\n\n private _items: { [key: string]: T } = {};\n private _listeners: ((item: T, action: EntityEventContext) => void)[] = [];\n private _processNew: (entity: T) => void;\n\n constructor(processNew: (entity: T) => void) {\n this._processNew = processNew;\n }\n\n /**\n * Adds one item to the collection\n */\n public addOne(item: T) {\n this.add([item]);\n }\n\n /**\n * Adds an array of items to the collection\n */\n public add(items: T[]) {\n items.forEach((element) => {\n this.process(new EntityEvent<T>(element, new EntityEventContext(EntityEventType.Added)));\n });\n }\n\n /**\n * Process existing EntityEvent\n */\n public process(event: EntityEvent<T>): T {\n\n const context = event.context;\n const type = context.type;\n const entity = event.entity;\n\n // here we're populating some data which particular implementations (e.g.\n // GW3) can't provide\n\n // TODO: extract these cases into external filters\n\n // activity status change without old status?\n // grab it from the existing entity\n if (type === EntityEventType.StatusChange &&\n !(context as ActivityStatusChangeEventContext).oldStatus) {\n const act = this._items[entity.id] as any as Activity;\n if (act) {\n (context as ActivityStatusChangeEventContext).oldStatus = act.status;\n }\n }\n\n // the GW3 bridge notifies us of possible status changes (it's mostly stateless so\n // it can't/doesn't distinguish between JOINED ACTIVITY for an activity we already\n // know about vs a brand new activity. for this reason, we just coalesce status\n // updates which indicate the same state.\n if (type === EntityEventType.StatusChange &&\n (context as ActivityStatusChangeEventContext).oldStatus &&\n (context as ActivityStatusChangeEventContext).newStatus &&\n (context as ActivityStatusChangeEventContext).oldStatus.state ===\n (context as ActivityStatusChangeEventContext).newStatus.state) {\n context.type = EntityEventType.Updated;\n }\n\n // GW3: coalesce multiple joined/left events\n\n if (typeof htmlContainer === \"undefined\") {\n if (type === EntityEventType.ActivityWindowJoinedActivity &&\n this._items[entity.id] &&\n (this._items[entity.id] as any as ActivityWindow).activity) {\n context.type = EntityEventType.Updated;\n }\n if (type === EntityEventType.ActivityWindowLeftActivity &&\n this._items[entity.id] &&\n !(this._items[entity.id] as any as ActivityWindow).activity) {\n context.type = EntityEventType.Updated;\n }\n }\n\n // update internal collections (adding the entity or updating existing entity). From that\n // point start using the internalEntity\n // NB: undefined properties are coalesced, null properties represent removals\n const internalEntity = this._updateInternalCollections(entity, type, context);\n this._notifyListeners(internalEntity, context);\n return internalEntity;\n }\n\n /**\n * Gets all items from the collection.\n */\n public get(): T[] {\n const result = [];\n for (const key in this._items) {\n if (this._items.hasOwnProperty(key)) {\n const element = this._items[key];\n result.push(element);\n }\n }\n return result;\n }\n\n /**\n * Gets item by name/id\n * @param name Name/id of the item to get\n * @returns Item if found; undefined if not\n */\n public getByName(name: string) {\n // this does not work for some reason\n // return this._items[name];\n for (const key in this._items) {\n if (key === name) {\n return this._items[key];\n }\n }\n return undefined;\n }\n\n /**\n * Gets a item if in the collection or waits for it to appear\n * @param name\n * @returns {Promise<T>}\n */\n public getOrWait(name: string): Promise<T> {\n return new Promise<T>((resolve) => {\n const entityAddedHandler = (entity: T) => {\n if (entity.id !== name) {\n return;\n }\n resolve(entity);\n this.unsubscribe(entityAddedHandler);\n };\n this.subscribe(entityAddedHandler);\n\n // try to get right away - if not here wait for it to appear\n const window = this.getByName(name);\n if (window) {\n this.unsubscribe(entityAddedHandler);\n resolve(window);\n return;\n }\n });\n }\n\n /**\n * Subscribes a listener for changes\n * @param handler Callback for changes\n */\n public subscribe(handler: (act: T, action: EntityEventContext) => void): () => void {\n this._listeners.push(handler);\n // replay existing items for new subscribers\n Object.keys(this._items).forEach((key) => {\n const element = this._items[key];\n handler(element, new EntityEventContext(EntityEventType.Added.toString()));\n });\n\n return () => {\n this.unsubscribe(handler);\n };\n }\n\n /**\n * Unsubscribes a listener\n */\n public unsubscribe(handler: (act: T, action: EntityEventContext) => void) {\n const index = this._listeners.indexOf(handler);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Notify all listeners for some event\n */\n private _notifyListeners(entity: T, context: EntityEventContext) {\n this._listeners.forEach((listener) => {\n try {\n listener(entity, context);\n } catch (e) {\n return;\n }\n });\n }\n\n /**\n * Update internal collections (usually after some kind of modification event has arrived)\n */\n private _updateInternalCollections(entity: T, type: EntityEventType, context: any) {\n const entityAsAny = (entity as any);\n\n // #deleteme TODO: refactor - currently we apply some rules for each type\n const isActivityDestroy =\n (type === EntityEventType.StatusChange &&\n entityAsAny.status &&\n entityAsAny.status.state === ActivityState.Destroyed) ||\n (type === EntityEventType.StatusChange &&\n context &&\n context.newStatus &&\n context.newStatus.state === ActivityState.Destroyed);\n\n // #deleteme TODO: verify this stuff\n // windows have two states - removed from activity and closed (TODO: this only works in GD 2.1 and later)\n const isWindowClose = type === EntityEventType.Closed;\n const isTypeRemove = type === EntityEventType.Removed && typeof entityAsAny.isIndependent === \"undefined\";\n\n if (isTypeRemove || isWindowClose || isActivityDestroy) {\n\n const oldEntity = this._items[entity.id];\n delete this._items[entity.id];\n // on remove return the input entity\n this._processNew(entity);\n if (oldEntity) {\n entity._beforeDelete(oldEntity);\n }\n return entity;\n } else {\n const key = entity.id;\n // if new object add, otherwise clone object properties\n if (!this._items.hasOwnProperty(key)) {\n this._processNew(entity);\n this._items[entity.id] = entity;\n } else {\n this._items[entity.id]._update(entity);\n }\n }\n\n return this._items[entity.id];\n }\n}\n","/* eslint-disable @typescript-eslint/restrict-plus-operands */\n/* tslint:disable */\nimport { ActivityContextUpdateHandler, Callback } from \"../contracts/contracts\";\nimport { ActivityStatus } from \"../contracts/activityStatus\";\nimport {\n ActivityContextChangedEventContext,\n ActivityStatusChangeEventContext,\n EntityEvent,\n EntityEventContext,\n EntityEventType\n} from \"../contracts/entityEvent\";\n\nimport ActivityType from \"../entities/activityType\";\nimport WindowType from \"../entities/windowType\";\nimport Activity from \"../entities/activity\";\nimport ActivityEntity from \"../entities/activityEntity\";\nimport ActivityWindow from \"../entities/activityWindow\";\nimport WindowSource from \"../entities/windowSource\";\n\nimport { nodeify } from \"../helpers/promiseExtensions\";\nimport { ReadyMarker } from \"../helpers/readyMarker\";\nimport { EntityObservableCollection } from \"../helpers/entityObservableCollection\";\nimport { Logger } from \"../helpers/logger\";\nimport * as util from \"../helpers/util\";\n\nimport { ActivityBridge } from \"../bridges/activityBridge\";\nimport { WindowDefinition } from \"../entities/windowDefinition\";\nimport { WindowBounds } from \"../contracts/windowBounds\";\nimport { CloneOptions } from \"../entities/cloneOptions\";\nimport { AttachedActivityDescriptor } from \"../entities/attachedActivityDescriptor\";\nimport { ActivityDescriptor } from \"../entities/activityDescriptor\";\nimport { ActivityState } from \"../contracts/entityEvent\";\nimport { WindowFactory } from \"../contracts/windowFactory\";\nimport { IOConnectDesktop } from \"../../../desktop\";\n/* tslint:enable */\n\ntype OverrideTypeDefinition = IOConnectDesktop.Activities.OverrideTypeDefinition;\n\nexport default class ActivityManager {\n private _bridge: ActivityBridge;\n private _readyMarker: ReadyMarker;\n private _dataReadyMarker: ReadyMarker;\n private _descriptorsMarker: ReadyMarker;\n\n private _activityTypes: EntityObservableCollection<ActivityType>;\n private _windowTypes: EntityObservableCollection<WindowType>;\n private _activities: EntityObservableCollection<Activity>;\n private _windows: EntityObservableCollection<ActivityWindow>;\n private _logger: Logger = Logger.Get(\"activityManager\");\n private _announcedWindows: ActivityWindow[] = [];\n private _attachedCallbacks: ((newAct: any, descriptor: any) => void)[] = [];\n private _detachedCallbacks: ((newAct: any, oldAct: Activity, descriptor: any) => void)[] = [];\n private _frameColorChangesCallbacks: ((act: Activity, frameColor: string) => void)[] = [];\n private _windowHandlers: any[][] = [];\n\n public get usingHc(): boolean {\n return this._bridge.bridgeType === \"HC\";\n }\n\n public get announcedWindows(): ActivityWindow[] {\n return this._announcedWindows;\n }\n\n public set announcedWindows(v: ActivityWindow[]) {\n throw new Error(\"not allowed\");\n }\n\n constructor(bridge: ActivityBridge, autoAnnounce: boolean, windows: any) {\n this._bridge = bridge;\n this._activityTypes = new EntityObservableCollection<ActivityType>((e) => this._grabEntity(e));\n this._windowTypes = new EntityObservableCollection<WindowType>((e) => this._grabEntity(e));\n this._activities = new EntityObservableCollection<Activity>((e) => this._grabEntity(e));\n this._windows = new EntityObservableCollection<ActivityWindow>((e) => this._grabEntity(e));\n\n // signals to wait for - get AT, get WT, get Activities and get Windows\n this._dataReadyMarker = new ReadyMarker(\"Activity Manager Data\", [\"GetActivityTypes\", \"GetWindowTypes\", \"GetActivities\", \"GetWindows\"].length);\n this._descriptorsMarker = new ReadyMarker(\"Attached Activities Descriptors\", [\"GetDescriptors\"].length);\n\n // waiting for activity data first\n\n // NB: in the GW3 case, we don't have the ability to request data at will\n // but need wait for delta messages\n // So GW3Bridge returns empty arrays from the get() calls\n // We're relying on the fact that the GW3 bridge will wait\n // until resolving its .ready()\n\n if (autoAnnounce) {\n // if auto announce replace the ready marker, so:\n // 1) wait for data\n // 2) get descriptors\n // 3) announce the current window\n\n this._readyMarker = new ReadyMarker(\"Activity Manager Announce\", [\"Announcement\"].length);\n this._dataReadyMarker.setCallback((dataErr: any) => {\n if (dataErr) {\n this._readyMarker.error(dataErr);\n }\n\n this._descriptorsMarker.setCallback((err: any) => {\n\n if (err) {\n this._readyMarker.error(err);\n }\n\n this._logger.debug(\"Auto announcing window\");\n // signal no matter if it failed or not\n this.announceWindow()\n .then((w) => {\n // NB: this creates glue.activities.my.window\n this._announcedWindows.push(w);\n this._readyMarker.signal(\"Successfully announced window with id '\" + w.id + \"'\");\n })\n .catch((errCatch) => {\n this._logger.debug(\"Will not announce window - \" + errCatch);\n this._readyMarker.signal();\n });\n });\n\n this.refreshDescriptors();\n });\n } else {\n // TODO: not sure if this still works\n this._readyMarker = this._dataReadyMarker;\n }\n\n this._bridge.onActivitiesAttached((e) => {\n this._handleActivitiesAttached(e);\n });\n this._bridge.onActivitiesDetached((e) => {\n this._handleActivitiesDetached(e);\n });\n this._bridge.onActivityAttachedDescriptorsRefreshed((e) => {\n this._handleActivityDescriptorsRefreshed(e);\n });\n if (windows) {\n windows.onWindowFrameColorChanged(this._handleWindowFrameColorChanged.bind(this));\n }\n\n // initialize the bridge\n this._bridge.init();\n\n // NB: there is no race condition here.\n // Since browser/Node JS is a single-threaded environment, assuming no events on _bridge\n // fire inside .init(), this subscribe will catch anything that comes between it and the init() call\n this._subscribeForData();\n\n // NB: in GW3 case, the initial state messages after a JOIN come in before the JOIN's SUCCESS\n // message (see https://confluence.tick42.com:8443/display/TD/Global+Gateway+Domain#GlobalGatewayDomain-JOIN)\n // so the .initReady().then() callback will only get invoked after we've received the initial domain\n // state. We need to be ready to handle events before that, hence the _subscribeForData() above.\n // what's more, our own JOINED ACTIVITY will come only after we've sent our READY, hence waiting\n // for bridge.ready() in the manager's ready()\n\n // wait for it to become ready and then start getting/subscribing for data\n this._bridge\n .initReady()\n .then((aw) => {\n this._getInitialData();\n })\n .catch((error) => {\n // eslint-disable-next-line no-console\n console.log(error);\n });\n }\n\n public ready(callback?: (err: string, manager: ActivityManager) => void): Promise<ActivityManager> {\n const promise = new Promise<ActivityManager>((resolve, reject) => {\n this._readyMarker.setCallback(\n (err) => {\n if (!err) {\n resolve(this);\n } else {\n reject(this._readyMarker.getError());\n }\n });\n });\n\n return nodeify(Promise.all([this._bridge.ready(), promise]).then(() => this), callback);\n }\n\n /**\n * @returns All known activity types\n */\n public getActivityTypes(): ActivityType[] {\n return this._activityTypes.get();\n }\n\n /**\n * Gets ActivityType by name\n * @param name Name to search for\n * @returns If found the @type ActivityType; otherwise undefined\n */\n public getActivityType(name: string): ActivityType {\n return this._activityTypes.getByName(name);\n }\n\n /**\n * Registers a new activity type\n * @param activityTypeName The name of the activity type to be created\n * @param ownerWindowType The type of the owner window or a WindowDefinition for the owner window\n * @param helperWindowTypes Types of helper windows (or WindowDefinitions for helper windows) for that activity type\n * @param config (HC only, deprecated) Layout config\n * @param description (HC only, deprecated) Description for the new activity type\n * @param callback (Optional) Callback for results - if not specified the method will return a promise\n */\n public registerActivityType(\n activityTypeName: string,\n ownerWindowType: string | WindowDefinition,\n helperWindowTypes?: string[] | WindowDefinition[],\n config?: any,\n description?: string,\n callback?: Callback<ActivityType>): Promise<ActivityType> {\n const promise = new Promise<ActivityType>((resolve, reject) => {\n\n // activityTypeName checks\n if (util.isUndefinedOrNull(activityTypeName)) {\n reject(\"activityTypeName argument can not be undefined\");\n return;\n }\n if (!util.isString(activityTypeName)) {\n reject(\"activityTypeName should be string\");\n return;\n }\n // check if type is already defined\n const actType = this.getActivityType(activityTypeName);\n if (!util.isUndefinedOrNull(actType)) {\n reject(\"Activity type '\" + activityTypeName + \"' already exists\");\n return;\n }\n\n // ownerWindowType checks\n let ownerDefinition: WindowDefinition;\n if (util.isUndefined(ownerWindowType)) {\n reject(\"Owner window type can not be undefined\");\n return;\n }\n if (util.isString(ownerWindowType)) {\n ownerDefinition = { type: (ownerWindowType as string), name: \"\", isIndependent: false, arguments: {} };\n } else {\n ownerDefinition = (ownerWindowType as WindowDefinition);\n }\n\n // helperWindowTypes checks\n const helperDefinitions: WindowDefinition[] = [];\n if (!util.isUndefined(helperWindowTypes) && util.isArray(helperWindowTypes)) {\n // eslint-disable-next-line @typescript-eslint/no-for-in-array, guard-for-in\n for (const index in helperWindowTypes) {\n const item = helperWindowTypes[index];\n if (util.isString(item)) {\n const definition = {\n type: (item as string),\n name: \"\",\n isIndependent: false,\n arguments: {},\n relativeTo: \"\",\n relativeDirection: \"\",\n windowStyleAttributes: {}\n };\n helperDefinitions.push(definition);\n } else {\n helperDefinitions.push(item as WindowDefinition);\n }\n }\n }\n\n // redirect to bridge\n this._bridge\n .registerActivityType(activityTypeName,\n ownerDefinition,\n helperDefinitions,\n config,\n description)\n .then((activityType) => {\n // add to from collections\n this._grabEntity(activityType);\n resolve(activityType);\n })\n .catch((error) => {\n reject(error);\n });\n });\n\n return nodeify(promise, callback);\n }\n\n /**\n * Unregister existing activity type\n * @param type The name of the activity type to be removed\n */\n public unregisterActivityType(type: string, callback?: Callback<any>) {\n const promise = new Promise<ActivityType>((resolve, reject) => {\n // check if type is defined\n const actType = this.getActivityType(type);\n if (util.isUndefined(actType)) {\n reject(\"Activity type '\" + type + \"' does not exists\");\n return;\n }\n this._bridge.unregisterActivityType(type).then(() => resolve(actType), reject);\n });\n return nodeify(promise, callback);\n }\n\n /**\n * Initiates a new activity from the given type.\n * @param activityType The ActivityType to initiate\n * @param context The initial context of the activity\n * @param callback Callback for result\n * @param configuration Optional configuration passed to window/peer factories for the new activity's participants\n * @returns Promise for activity\n */\n public initiate(activityType: string, context?: object, callback?: Callback<Activity>, configuration?: WindowDefinition[] | OverrideTypeDefinition): Promise<Activity> {\n const promise = new Promise<Activity>((resolve, reject) => {\n // check if type is defined\n const actType = this.getActivityType(activityType);\n if (util.isUndefined(actType)) {\n reject(\"Activity type '\" + activityType + \"' does not exists\");\n return;\n }\n\n this._bridge\n .initiateActivity(activityType, context, configuration)\n .then((actId) => {\n\n this._activities\n .getOrWait(actId)\n .then((act: Activity) => {\n resolve(act);\n })\n .catch((err) => reject(err));\n })\n .catch((err) => {\n reject(err);\n });\n });\n return nodeify(promise, callback);\n }\n\n public subscribeActivityTypeEvents(handler: (act: ActivityType, action: string) => void) {\n this._activityTypes.subscribe((at, context) => {\n handler(at, context.type);\n });\n }\n\n /**\n * @returns All known WindowTypes\n */\n public getWindowTypes(): WindowType[] {\n return this._windowTypes.get();\n }\n\n /**\n * Gets WindowType by name\n * @param name The name of the type @type WindowType\n * @returns WindowType if found; undefined otherwise\n */\n public getWindowType(name: string): WindowType {\n return this._windowTypes.getByName(name);\n }\n\n /**\n * Registers a factory for a given WindowType. The factory will be called once window of that type is requested\n * @param windowType Window type that will be constructed from the factory. Can be a string (name of the window type)\n * or object that has name, description properties\n * @param factoryMethod The factory that will construct Windows of that type\n * @param description\n * @param callback\n * @param configuration\n * @returns {}\n */\n public registerWindowFactory(\n windowType: any,\n factoryMethod: WindowFactory,\n callback?: any): Promise<any> {\n const promise = new Promise<any>((resolve, reject) => {\n if (util.isUndefinedOrNull(windowType)) {\n reject(\"no windowType specified\");\n return;\n }\n\n if (util.isObject(windowType)) {\n windowType = windowType.getName();\n } else if (!util.isString(windowType)) {\n reject(\"windowType should be string or object that has getName method\");\n return;\n }\n\n this._bridge\n .registerWindowFactory(windowType, factoryMethod)\n .then((v) => {\n resolve(v);\n })\n .catch((err) => {\n reject(err);\n });\n });\n return nodeify(promise, callback);\n }\n\n /**\n * Unregisters all factories for a given WindowType.\n * @param windowType Window type that is constructed from the factory.\n * @param callback\n * @returns {}\n */\n public unregisterWindowFactory(windowType: string, callback?: any): Promise<any> {\n const promise = new Promise<any>((resolve, reject) => {\n if (util.isUndefinedOrNull(windowType)) {\n reject(\"no windowType specified\");\n return;\n }\n\n if (!util.isString(windowType)) {\n reject(\"windowType should be a string\");\n return;\n }\n\n this._bridge\n .unregisterWindowFactory(windowType)\n .then((v) => {\n resolve(v);\n })\n .catch((err) => {\n reject(err);\n });\n });\n return nodeify(promise, callback);\n }\n\n /**\n * @returns All started activities\n * @param activityType Can be a string or @type ActivityType. If string a new activityType will be created using the string for name.\n * @returns Array of Activity objects\n */\n public getActivities(activityType?: string | ActivityType | string[] | ActivityType[]): Activity[] {\n let act = this._activities.get();\n act = act.filter((a) => a._ownerId);\n if (!activityType) {\n return act;\n }\n let types: any = activityType;\n if (util.isString(activityType)) {\n types = [activityType];\n } else if (activityType instanceof ActivityType) {\n types = [activityType.name];\n } else if (activityType instanceof Array) {\n // TODO check if string array or array of ActivityTypes\n } else {\n throw new Error(\"Invalid input argument 'activityType' = \" + activityType);\n }\n\n return act.filter((at: Activity) => {\n const type = at.type;\n return util.some(types, (t: ActivityType) => {\n return type.id === t.id;\n });\n });\n }\n\n /**\n * Returns Activity by ID\n */\n public getActivityById(id: string): Activity {\n return this._activities.getByName(id);\n }\n\n /**\n * Initialises activity for the current window - by doing this the window is announced as activity aware to the other participants\n * @param windowType Type of window\n * @param activityWindowId The id of the window that was created\n * @returns {} Promise for an activity window (joined to an activity, if the activity creation fails the promise will be rejected)\n */\n public announceWindow(activityWindowId?: string, windowType?: string): Promise<ActivityWindow> {\n const promise = new Promise<ActivityWindow>((resolve, reject) => {\n\n // get the announcement info from the bridge (e.g. the context in HC) - this will be used if no arguments passed\n const announcementInfo = this._bridge.getAnnouncementInfo();\n if (util.isUndefined(activityWindowId)) {\n activityWindowId = announcementInfo.activityWindowId;\n }\n if (util.isUndefined(windowType)) {\n windowType = announcementInfo.activityWindowType;\n }\n if (util.isUndefinedOrNull(windowType)) {\n throw new Error(\"Can not announce - unknown windowType\");\n }\n\n const activityId = announcementInfo && announcementInfo.activityId;\n\n // We cover two cases here:\n // * no activityWindowId supplied (neither in arguments or announcement info) - in that case we register new window by type. Most of the time this is the case when an independent window is created outside activity\n // * activityWindowId supplied - window created as part of activity creation\n\n // NB: in GW3, windows are created standalone, and receive 'JOINED' after they send a 'READY'\n // so we always go in 'if' case, not 'else'\n if (util.isUndefinedOrNull(activityWindowId)) {\n this._logger.debug(\"Registering window with type:'\" + windowType + \"', name:'\" + announcementInfo.activityWindowName + \"', ind.:'\" + announcementInfo.activityWindowIndependent + \"'\");\n // register new window created outside activity\n this._bridge.registerWindow(windowType, announcementInfo.activityWindowName, announcementInfo.activityWindowIndependent)\n .then(this._windows.getOrWait.bind(this._windows))\n .then((w: any) => {\n if (activityId) {\n return this._activities.getOrWait(activityId).then((_: any) => w);\n } else {\n return w;\n }\n })\n .then((w: any) => {\n resolve(w);\n })\n .catch((err) => {\n this._logger.error(err);\n });\n\n } else {\n // announce new window created in an activity creation process\n this._logger.debug(\"Announcing window with id '\" + activityWindowId + \"' and type '\" + windowType + \"'\");\n\n // check if the window is already created -\n const currentWindow = this._windows.getByName(activityWindowId);\n if (!util.isUndefinedOrNull(currentWindow)) {\n this._logger.debug(\"Window with id '\" + activityWindowId + \"' already announced - reusing the window\");\n resolve(currentWindow);\n return;\n }\n\n // window events handler\n const windowEventHandler = (a: Activity, w: ActivityWindow, e: any) => {\n if (activityWindowId === w.id) {\n if (e === EntityEventType.ActivityWindowJoinedActivity) {\n const activity = w.activity;\n if (util.isUndefined(activity)) {\n reject(\"UNDEFINED ACTIVITY\");\n }\n this._logger.trace(\"Got joined event for id '\" + activityWindowId + \"'\");\n resolve(w);\n this.unsubscribeWindowEvents(windowEventHandler);\n }\n }\n };\n\n this.subscribeWindowEvents(windowEventHandler);\n this._logger.trace(\"Waiting for joined event for id '\" + activityWindowId + \"'\");\n this._bridge.announceWindow(windowType, activityWindowId);\n }\n });\n return promise;\n }\n\n /**\n * Allows you to subscribe for windows events, e.g. window type registered\n * @param handler The handler to receive notifications\n * @returns {}\n */\n public subscribeWindowTypeEvents(handler: (act: WindowType, event: string) => void) {\n this._windowTypes.subscribe((wt, context) => {\n handler(wt, context.type);\n });\n }\n\n /**\n * Subscribe for activity status events\n * @param handler Handler function that will receive status notifications\n * @returns {}\n */\n public subscribeActivityEvents(handler: (activity: Activity, newStatus: ActivityStatus, oldStatus: ActivityStatus) => void): () => void {\n return this._activities.subscribe((act, context) => {\n if (context.type === EntityEventType.StatusChange) {\n const p = (context as ActivityStatusChangeEventContext);\n handler(act, p.newStatus, p.oldStatus);\n }\n\n // implicitly leave the activity on destroy\n if (context.type === EntityEventType.Removed ||\n (context.type === EntityEventType.StatusChange &&\n (context as ActivityStatusChangeEventContext).newStatus.getState() === ActivityState.Destroyed)) {\n for (const window of this._windows.get()) {\n if (window.activity && window.activity.id === act.id) {\n this._windows.process(new EntityEvent<ActivityWindow>(window, new EntityEventContext(EntityEventType.ActivityWindowLeftActivity)));\n }\n }\n }\n });\n }\n\n /**\n * Allows you to subscribe for windows events, e.g. window joining to activity\n * @param handler The handler to receive notifications\n * @returns {}\n */\n public subscribeWindowEvents(handler: (activity: Activity, window: ActivityWindow, event: any) => void): () => void {\n const wrappingHandler = (window: ActivityWindow, context: any) => {\n let eventType = context.type;\n if (eventType === EntityEventType.Added) {\n // rename added to opened (because added is misleading - semantically it's the opposite of remove);\n eventType = \"opened\";\n }\n handler(window.activity, window, eventType);\n };\n this._windowHandlers.push([handler, wrappingHandler]);\n return this._windows.subscribe(wrappingHandler);\n }\n\n public unsubscribeWindowEvents(handler: (activity: Activity, window: ActivityWindow, event: any) => void) {\n const found = this._windowHandlers.find((pair) => pair[0] === handler);\n if (found) {\n this._windowHandlers.splice(this._windowHandlers.indexOf(found), 1);\n this._windows.unsubscribe(found[1]);\n }\n }\n\n /**\n * Creates a new window from a given type and joins it to an activity\n *\n * @param activity Activity to join the window to\n * @param windowType The window type to join (string or window definition)\n * @param callback (Optional) Result callback\n * @returns Promise for ActivityWindow\n */\n public createWindow(activity: Activity, windowTypeOrConfiguration: string | WindowDefinition | any, callback?: Callback<ActivityWindow>): Promise<ActivityWindow> {\n const promise = new Promise<ActivityWindow>((resolve, reject) => {\n if (util.isUndefinedOrNull(windowTypeOrConfiguration)) {\n reject(\"windowType is undefined\");\n }\n\n let windowDefinition: WindowDefinition;\n if (util.isString(windowTypeOrConfiguration)) {\n windowDefinition = { type: (windowTypeOrConfiguration as string), name: \"\", isIndependent: false, arguments: {} };\n } else if (windowTypeOrConfiguration instanceof WindowType) {\n windowDefinition = {\n type: (windowTypeOrConfiguration as any).type || windowTypeOrConfiguration.id,\n name: windowTypeOrConfiguration.name || (windowTypeOrConfiguration as any).type || windowTypeOrConfiguration.id,\n isIndependent: false\n };\n } else {\n // G4E-3178 When creating a window in activity, the loading animation doesn't hide - extra property URL\n const invalidKeys: string[] = [\"url\"];\n\n const filteredWindowTypeOrConfiguration: any = {};\n\n Object.keys(windowTypeOrConfiguration).forEach((key) => {\n if (invalidKeys.indexOf(key) === -1) {\n filteredWindowTypeOrConfiguration[key] = windowTypeOrConfiguration[key];\n }\n });\n windowDefinition = filteredWindowTypeOrConfiguration as WindowDefinition;\n }\n\n let relativeToWindow: string | WindowSource;\n if (!util.isUndefinedOrNull(windowDefinition.relativeTo)) {\n relativeToWindow = windowDefinition.relativeTo;\n if (typeof relativeToWindow === \"string\") {\n const windows = this.getWindows({ type: relativeToWindow });\n if (!util.isUndefinedOrNull(windows) && windows.length > 0) {\n windowDefinition.relativeTo = windows[0].id;\n }\n } else if (!util.isUndefinedOrNull(relativeToWindow.type)) {\n const windows = this.getWindows({ type: relativeToWindow.type });\n if (!util.isUndefinedOrNull(windows) && windows.length > 0) {\n windowDefinition.relativeTo = windows[0].id;\n }\n } else if (!util.isUndefinedOrNull(relativeToWindow.windowId)) {\n windowDefinition.relativeTo = relativeToWindow.windowId;\n }\n }\n\n this._bridge.createWindow(activity && activity.id, windowDefinition)\n .then((wid) => {\n\n this._logger.debug(\"Window created, waiting for window entity with id \" + wid);\n const handler = (window: ActivityWindow, context: EntityEventContext) => {\n // wait until the window has activity property (this means it was joined)\n if (window.id === wid && (!activity || window.activity)) {\n this._logger.debug(\"Got entity window with id \" + wid);\n resolve(window);\n this._windows.unsubscribe(handler);\n }\n };\n\n // if we can not get the window right away, wait for event\n this._windows.subscribe(handler);\n })\n .catch((err) => {\n reject(err);\n });\n\n });\n return nodeify(promise, callback);\n }\n\n /**\n * Creates relative windows from a given types and joins them to an activity\n *\n * @param activity Activity to join relative windows to\n * @param relativeWindowTypes Relative window types to join (string or window definitions array)\n * @param callback (Optional) Result callback\n * @returns Promise for ActivityWindow\n */\n public createStackedWindows(activity: Activity, relativeWindowTypes: (string | WindowDefinition)[], timeout?: number, callback?: Callback<ActivityWindow[]>): Promise<ActivityWindow[]> {\n const promise = new Promise<ActivityWindow[]>((resolve, reject) => {\n if (util.isUndefinedOrNull(activity)) {\n reject(\"activity is undefined\");\n }\n if (util.isUndefinedOrNull(relativeWindowTypes)) {\n reject(\"relativeWindowTypes is undefined\");\n }\n\n if (!Array.isArray(relativeWindowTypes)) {\n reject(\"relativeWindowTypes has to be an array\");\n }\n if (util.isUndefinedOrNull(timeout)) {\n timeout = 20000; // default timeout: 20 seconds\n }\n\n const windowDefinitions: WindowDefinition[] = [];\n relativeWindowTypes.forEach((element) => {\n let windowDefinition: WindowDefinition;\n if (util.isString(element)) {\n windowDefinition = { type: (element as string), name: \"\", isIndependent: false, arguments: {} };\n } else {\n windowDefinition = (element as WindowDefinition);\n }\n\n // a hint that this comes from createStackedWindows\n windowDefinition.stackedWindow = true;\n windowDefinition.timeout = timeout;\n\n let relativeToWindow: WindowSource;\n if (!util.isUndefinedOrNull(windowDefinition.relativeTo)) {\n // this can not be string, converted in the prev. layer\n relativeToWindow = windowDefinition.relativeTo as WindowSource;\n if (!util.isUndefinedOrNull(relativeToWindow.type)) {\n windowDefinition.relativeTo = relativeToWindow.type;\n } else if (!util.isUndefinedOrNull(relativeToWindow.windowId)) {\n const windows = this.getWindows({ id: relativeToWindow.windowId });\n if (!util.isUndefinedOrNull(windows) && windows.length > 0) {\n windowDefinition.relativeTo = windows[0].type.name;\n }\n }\n }\n windowDefinitions.push(windowDefinition);\n });\n\n const tasks: Promise<ActivityWindow>[] = [];\n windowDefinitions.forEach((wd) => tasks.push(this.createWindow(activity, wd)));\n\n Promise.all(tasks).then(resolve).catch(reject);\n });\n return nodeify(promise, callback);\n }\n\n /**\n * Joins a new window from a given type to the activity\n *\n * @param activity Activity to join the window to\n * @param window The window to join\n * @param callback (Optional) Result callback\n * @returns Promise for ActivityWindow\n */\n public addWindowToActivity(activity: Activity, window: ActivityWindow, callback?: Callback<ActivityWindow>): Promise<ActivityWindow> {\n const toReturn = this._bridge.joinActivity(activity.id, window.id)\n .then(() => window);\n nodeify(toReturn, callback);\n return toReturn;\n }\n\n /**\n * Removes a window from the activity\n *\n * @param activity Activity to remove the window from\n * @param The window to remove\n * @param (Optional) Result callback\n * @returns Promise for ActivityWindow\n */\n public leaveWindowFromActivity(activity: Activity, window: ActivityWindow, callback?: Callback<ActivityWindow>): Promise<ActivityWindow> {\n const toReturn = this._bridge.leaveActivity(activity.id, window.id)\n .then(() => window);\n nodeify(toReturn, callback);\n return toReturn;\n }\n\n /**\n * Replaces the activity context\n * @param activity Activity\n * @param context The new context\n * @param callback (Optional) Result callback\n * @returns Promise for Activity\n */\n public setActivityContext(activity: Activity, context: object, callback?: Callback<Activity>): Promise<Activity> {\n const promise = new Promise<Activity>((resolve, reject) => {\n if (util.isUndefinedOrNull(activity)) {\n reject(\"activity can not be null\");\n }\n\n // TODO: duplication with updateActivityContext\n\n // DONE: verify is the change visible here when 'updateActivityContext' resolves?\n this._bridge\n .updateActivityContext(activity, context, true)\n .then((_) => {\n resolve(activity);\n })\n .catch((err) => {\n reject(err);\n });\n });\n\n return nodeify(promise, callback);\n }\n\n /**\n * Updates activity context using the properties from context argument.\n * If old context is {a:1, b:2, c:3} and invoking updateContext({b:3, c:null}) will result a context\n * be {a:1, b:3}\n *\n * @param activity\n * @param context\n * @param callback\n */\n public updateActivityContext(activity: Activity, context: any, callback?: Callback<Activity>): Promise<Activity> {\n const promise = new Promise<Activity>((resolve, reject) => {\n if (util.isUndefinedOrNull(activity)) {\n reject(\"activity can not be null\");\n }\n\n const removedKeys = [];\n for (const key in context) {\n if (context.hasOwnProperty(key) && context[key] === null) {\n removedKeys.push(key);\n }\n }\n for (const removedKey of removedKeys) {\n delete context[removedKey];\n }\n\n this._bridge\n .updateActivityContext(activity, context, false, removedKeys)\n .then((_) => {\n // DONE: verify is the change already visible here when 'updateActivityContext' resolves?\n resolve(activity);\n })\n .catch((err) => {\n reject(err);\n });\n });\n\n return nodeify(promise, callback);\n }\n\n /**\n * Subscribe for activity context update events\n *\n * @param activity Activity\n * @param handler Handler function that will receive context related events\n * @returns {}\n */\n public subscribeActivityContextChanged(handler: ActivityContextUpdateHandler) {\n this._activities.subscribe((act, context) => {\n if (context.type === EntityEventType.ActivityContextChange) {\n const updateContext = context as ActivityContextChangedEventContext;\n handler(act, updateContext.context, updateContext.updated, updateContext.removed);\n }\n });\n }\n\n /**\n * Stops an activity\n * @returns {}\n */\n public stopActivity(activity: Activity, callback?: Callback<boolean>): Promise<boolean> {\n const promise = this._bridge.stopActivity(activity);\n return nodeify(promise, callback);\n }\n\n /**\n * Returns activity windows based on some filter. If no filter supplied all activity windows are returned.\n * @param filter Filter that\n * @returns Array of ActivityWindows that match the filter object\n */\n public getWindows(filter: { id?: string, type?: string, name?: string, activityId?: string }): ActivityWindow[] {\n if (util.isUndefined(filter)) {\n return this._windows.get();\n }\n\n if (!util.isUndefined(filter.id)) {\n return [this._windows.getByName(filter.id)];\n }\n\n const allWindows = this._windows.get();\n\n return allWindows.filter((w) => {\n\n if (!util.isUndefined(filter.type) && w.type.id !== filter.type) {\n return false;\n }\n\n if (!util.isUndefined(filter.name) && w.name !== filter.name) {\n return false;\n }\n\n if (!util.isUndefined(filter.activityId)) {\n if (util.isUndefinedOrNull(w.activity)) {\n return false;\n }\n\n if (w.activity.id !== filter.activityId) {\n return false;\n }\n }\n\n return true;\n });\n }\n\n public getWindowBounds(id: string): Promise<WindowBounds> {\n return this._bridge.getWindowBounds(id);\n }\n\n public setWindowBounds(id: string, bounds: WindowBounds, callback?: Callback<ActivityWindow>): Promise<any> {\n const promise = new Promise<void>((resolve, reject) => {\n this._bridge.setWindowBounds(id, bounds)\n .then(() => resolve())\n .catch((err) => reject(err));\n });\n\n return nodeify(promise, callback);\n }\n\n public closeWindow(id: string): Promise<any> {\n return this._bridge.closeWindow(id);\n }\n\n public activateWindow(id: string, focus: boolean): Promise<any> {\n return this._bridge.activateWindow(id, focus);\n }\n\n public setWindowVisibility(id: string, visible: boolean): Promise<any> {\n return this._bridge.setWindowVisibility(id, visible);\n }\n\n public clone(activity: Activity, cloneOptions: CloneOptions, callback?: Callback<Activity>) {\n const promise = new Promise<any>((resolve, reject) => {\n if (!activity) {\n reject(\"activity can not be null\");\n }\n\n this._bridge.cloneActivity(activity.id, cloneOptions)\n .then((activityId) => {\n this._activities\n .getOrWait(activityId)\n .then((act: Activity) => {\n resolve(act);\n })\n .catch((err) => reject(err));\n })\n .catch((err) => reject(err));\n });\n\n return nodeify(promise, callback);\n }\n\n public attachActivities(from: string, to: string, tag?: object, callback?: Callback<AttachedActivityDescriptor>): Promise<AttachedActivityDescriptor> {\n\n tag = tag || {};\n\n const promise = new Promise<AttachedActivityDescriptor>((resolve, reject) => {\n\n const fromActivity = this._activities.getByName(from);\n if (!fromActivity) {\n reject(\"can not find activity with id \" + from);\n return;\n }\n\n const toActivity = this._activities.getByName(to);\n if (!toActivity) {\n reject(\"can not find activity with id \" + to);\n return;\n }\n\n return this._bridge.attachActivities(from, to, tag)\n .then((data: any) => {\n const newActId = data.to;\n const state = data.descriptor;\n const allStates = data.descriptors;\n\n this._activities.getOrWait(newActId).then((act) => {\n act._updateDescriptors(allStates);\n const stateWrapped = act.attached.filter((u) => u.ownerId === state.ownerId)[0];\n\n resolve(stateWrapped);\n });\n })\n .catch((err) => {\n reject(err);\n });\n });\n\n return nodeify(promise, callback);\n }\n\n public detachActivities(\n activityId: string,\n descriptor: ActivityDescriptor,\n callback?: Callback<Activity>): Promise<Activity> {\n const promise = new Promise<Activity>((resolve, reject) => {\n return this._bridge.detachActivities(activityId, descriptor)\n .then(/* (params)*/() => {\n // #deleteme TODO: deal with this\n const oldActId: string = undefined; // params.oldActivityId;\n const newActId: string = undefined; // params.newActivityId;\n const descriptors: any = undefined; // params.descriptors;\n\n this._activities\n .getOrWait(oldActId)\n .then((oldAct: Activity) => {\n oldAct._updateDescriptors(descriptors);\n\n this._activities\n .getOrWait(newActId)\n .then((newAct: Activity) => {\n resolve(newAct);\n });\n })\n .catch((err) => reject(err));\n })\n .catch((err) => {\n reject(err);\n });\n });\n\n return nodeify(promise, callback);\n }\n\n public subscribeActivitiesAttached(callback: any) {\n this._attachedCallbacks.push(callback);\n }\n\n public subscribeActivitiesDetached(callback: any) {\n this._detachedCallbacks.push(callback);\n }\n\n public subscribeActivityFrameColorChanged(callback: () => void) {\n this._frameColorChangesCallbacks.push(callback);\n }\n\n /** Assigns a manager to a given ActivityEntity */\n private _grabEntity(entity: ActivityEntity) {\n entity._manager = this;\n }\n\n private _getInitialData() {\n this._logger.debug(\"Request initial data...\");\n\n // NB: there's no possibility for duplicate entities from events that have come\n // in between _bridge.init() and _bridge.ready()'s resolve, since the ObservableCollections\n // coalesce items by id.\n\n this._bridge.getActivityTypes()\n .then((at) => {\n this._activityTypes.add(at);\n this._dataReadyMarker.signal(\"Got act types\");\n })\n .catch((error) => {\n this._logger.error(error);\n this._dataReadyMarker.error(\"Can not initialize ActivityManager - error getting activity types -\" + error);\n });\n\n this._bridge.getWindowTypes()\n .then((wt) => {\n this._windowTypes.add(wt);\n this._dataReadyMarker.signal(\"Got window types\");\n })\n .catch((error) => {\n this._logger.error(error);\n this._dataReadyMarker.error(\"Can not initialize ActivityManager - error getting window types \" + error);\n });\n\n this._bridge.getActivities()\n .then((ac) => {\n this._activities.add(ac);\n this._dataReadyMarker.signal(\"Got activities\");\n })\n .catch((error) => {\n this._logger.error(error);\n this._dataReadyMarker.error(\"Can not initialize ActivityManager - error getting activity instances -\" + error);\n });\n\n this._bridge.getActivityWindows()\n .then((aw) => {\n this._windows.add(aw);\n this._dataReadyMarker.signal(\"Got windows\");\n })\n .catch((error) => {\n this._logger.error(error);\n this._dataReadyMarker.error(\"Can not initialize ActivityManager - error getting activity windows -\" + error);\n });\n }\n\n private _subscribeForData() {\n this._logger.debug(\"Subscribe for data...\");\n\n // NB: there's no possibility for duplicate entities from events that have come\n // in between _bridge.init() and _bridge.ready()'s resolve, since the ObservableCollections\n // coalesce items by id.\n\n this._bridge.onActivityTypeStatusChange((event) => {\n this._activityTypes.process(event);\n });\n\n this._bridge.onWindowTypeStatusChange((event) => {\n this._windowTypes.process(event);\n });\n\n this._bridge.onActivityWindowChange((event) => {\n this._windows.process(event);\n });\n\n this._bridge.onActivityStatusChange((event: EntityEvent<Activity>) => {\n this._activities.process(event);\n });\n }\n\n private _handleActivitiesAttached(data: any) {\n\n const newActId = data.to;\n const descriptor = data.descriptor;\n const descriptors = data.descriptors;\n\n this._activities.getOrWait(newActId).then((act) => {\n act._updateDescriptors(descriptors);\n const descriptorAsObjectFromAPI = act.attached.filter((u) => u.ownerId === descriptor.ownerId)[0];\n\n this._attachedCallbacks.forEach((callback) => {\n try {\n callback(act, descriptorAsObjectFromAPI);\n } catch (err) {\n return;\n }\n });\n\n });\n }\n\n private _handleActivitiesDetached(data: any) {\n const oldActId = data.oldActivityId;\n const newActId = data.newActivityId;\n const descriptors = data.descriptors;\n const descriptor = data.descriptor;\n\n this._activities.getOrWait(oldActId).then((oldAct) => {\n\n oldAct._updateDescriptors(descriptors);\n\n this._activities.getOrWait(newActId).then((newAct) => {\n\n this._detachedCallbacks.forEach((callback) => {\n try {\n callback(newAct, oldAct, descriptor);\n } catch (err) {\n return;\n }\n });\n });\n });\n }\n\n private _handleActivityDescriptorsRefreshed(data: any) {\n const id = data.id;\n const descriptors = data.descriptors;\n\n const act = this._activities.getByName(id);\n if (act) {\n act._updateDescriptors(descriptors);\n }\n }\n\n private refreshDescriptors() {\n this._bridge.getAttachedDescriptors()\n .then((map: any) => {\n\n // populate descriptors\n if (map) {\n Object.keys(map).forEach((key: string) => {\n const actId = key;\n const descriptors = map[key];\n\n const act = this._activities.getByName(actId);\n if (act) {\n act._updateDescriptors(descriptors);\n }\n });\n }\n\n this._descriptorsMarker.signal(\"Successfully got descriptors\");\n })\n .catch((err) => {\n this._descriptorsMarker.error(\"failed to get descriptors - \" + err);\n });\n }\n\n private _handleWindowFrameColorChanged(win: IOConnectDesktop.Windows.IOConnectWindow) {\n if (!win.activityId) {\n return;\n }\n\n const act = this._activities.getByName(win.activityId);\n if (!act) {\n return;\n }\n\n // notify for the owner only\n if (!act.owner) {\n return;\n }\n\n if (act.owner.underlyingWindow.id !== win.id) {\n return;\n }\n\n this._frameColorChangesCallbacks.forEach((callback) => {\n try {\n callback(act, win.frameColor);\n } catch (e) {\n return;\n }\n });\n }\n}\n","import ActivityType from \"./../entities/activityType\";\nimport WindowType from \"./../entities/windowType\";\nimport * as util from \"./../helpers/util\";\nimport ActivityManager from \"./../core/activityManager\";\nimport My from \"./activityMyAPI\";\nimport { WindowDefinition } from \"./../entities/windowDefinition\";\nimport { Callback } from \"./../contracts/contracts\";\nimport Activity from \"./../entities/activity\";\nimport ActivityWindow from \"./../entities/activityWindow\";\nimport { ActivityStatus } from \"./../contracts/activityStatus\";\nimport { WindowFactory } from \"../contracts/windowFactory\";\nimport { IOConnectDesktop } from \"../../../desktop\";\n\nexport interface ManagementAPI {\n activityTypes: IOConnectDesktop.Activities.ActivityTypesAPI;\n windowTypes: IOConnectDesktop.Activities.WindowTypesAPI;\n windows: IOConnectDesktop.Activities.WindowingAPI;\n instances: IOConnectDesktop.Activities.InstancesAPI;\n\n onAttached(callback: () => void): void;\n onDetached(callback: () => void): void;\n onActivityFrameColorChanged(callback: () => void): void;\n}\n\nexport class ActivityManagementAPI implements ManagementAPI {\n\n public _m: ActivityManager;\n\n public _my: My;\n\n public activityTypes: IOConnectDesktop.Activities.ActivityTypesAPI;\n\n public windowTypes: IOConnectDesktop.Activities.WindowTypesAPI;\n\n public windows: IOConnectDesktop.Activities.WindowingAPI;\n\n public instances: IOConnectDesktop.Activities.InstancesAPI;\n\n constructor(manager: ActivityManager, my: My) {\n this._m = manager;\n this._my = my;\n\n this.activityTypes = {\n get: this._getActivityTypesWrapper.bind(this),\n register: this._m.registerActivityType.bind(this._m),\n unregister: this._m.unregisterActivityType.bind(this._m),\n subscribe: this._m.subscribeActivityTypeEvents.bind(this._m),\n unsubscribe: undefined,\n initiate: this._m.initiate.bind(this._m)\n };\n\n this.windowTypes = {\n get: this._getWindowTypesWrapper.bind(this),\n registerFactory: this._m.registerWindowFactory.bind(this._m),\n unregisterFactory: this._m.unregisterWindowFactory.bind(this._m),\n subscribe: this._m.subscribeWindowTypeEvents.bind(this._m),\n unsubscribe: undefined\n };\n\n this.windows = {\n get: this._m.getWindows.bind(this._m),\n subscribe: this._m.subscribeWindowEvents.bind(this._m),\n announce: this._m.announceWindow.bind(this._m),\n unsubscribe: undefined,\n create: this._m.createWindow.bind(this._m)\n };\n\n this.instances = {\n get: this._m.getActivities.bind(this._m),\n subscribe: this._m.subscribeActivityEvents.bind(this._m),\n unsubscribe: undefined\n };\n }\n\n public onAttached(callback: () => void) {\n this._m.subscribeActivitiesAttached(callback);\n }\n\n public onDetached(callback: () => void) {\n this._m.subscribeActivitiesDetached(callback);\n }\n\n public onActivityFrameColorChanged(callback: () => void) {\n this._m.subscribeActivityFrameColorChanged(callback);\n }\n\n private _getActivityTypesWrapper(name?: string): ActivityType[] | ActivityType {\n if (util.isUndefined(name)) {\n return this._m.getActivityTypes();\n }\n return this._m.getActivityType(name);\n }\n\n private _getWindowTypesWrapper(name?: string): WindowType[] | WindowType {\n if (util.isUndefined(name)) {\n return this._m.getWindowTypes();\n }\n return this._m.getWindowType(name);\n }\n}\n","import ActivityManager from \"./../core/activityManager\";\nimport My from \"./activityMyAPI\";\nimport { nodeify } from \"./../helpers/promiseExtensions\";\nimport { ActivityManagementAPI, ManagementAPI } from \"./activityManagementAPI\";\nimport { ActivityAGM } from \"../core/activityAGM\";\n\nexport interface API {\n\n aware: boolean;\n\n inActivity: boolean;\n\n my: My;\n\n agm: ActivityAGM;\n\n all: ManagementAPI;\n\n ready(callback?: (api: API) => void): Promise<API>;\n\n getAvailableFrameColors(): string[];\n}\n\n/**\n * The entry points of activities API - accessible from glue.activities\n *\n * @module activities\n */\nexport class ActivityAPI implements API {\n\n public _mgr: ActivityManager;\n public _my: My;\n\n /**\n * Extended API that provides access to all running activities and windows and available activity and window types\n *\n * @var {module:all} all\n */\n public all: ManagementAPI;\n\n constructor(manager: ActivityManager, my: My) {\n this._mgr = manager;\n this._my = my;\n this.all = new ActivityManagementAPI(manager, my);\n }\n\n /**\n * The entry point for your activity code.\n *\n * @function ready\n * @returns {Promise<module:activities>} A promise for activity API\n */\n public ready(callback?: any): Promise<API> {\n const promise = new Promise<any>((resolve, reject) => {\n this._mgr.ready()\n .then(() => {\n resolve(this);\n })\n .catch((err) => {\n reject(err);\n });\n });\n return nodeify(promise, callback);\n }\n\n /**\n * A lightweight, single activity oriented subset of the API which should be used by most activity applications\n *\n * @var {module:my} my\n */\n public get my(): My {\n return this._my;\n }\n\n /**\n * True if the current window is activity aware - meaning that the window has been created as\n * an activity participant - either a helper or an independent window.\n * Check this after the API is ready.\n *\n * @var {bool} aware\n */\n public get aware(): boolean {\n return this._my.window !== undefined;\n }\n\n /**\n * Returns true if the current window is activity aware and is currently participating in activity\n *\n * @var {bool} inActivity\n */\n public get inActivity(): boolean {\n return this.aware && this._my.activity !== undefined;\n }\n\n /**\n * Defines an Activity-specific version of the AGM API which:\n * * restricts method registrations to activity-only windows\n * * restricts method discovery and invocation to activity-only methods, unless you explicitly specify otherwise\n * Other than that, the API is pretty much the same.\n *\n * @var {module:activityAGM} agm\n *\n */\n public get agm(): ActivityAGM {\n if (!this.aware) {\n // no agm if not activity aware\n return undefined;\n }\n if (!this.inActivity) {\n // if we're not in activity no\n return new ActivityAGM(null);\n }\n\n return this._my.activity.agm;\n }\n\n /**\n * Returns a list of frame colors that can be used as activity frame colors\n *\n * @returns {string[]}\n */\n public getAvailableFrameColors(): string[] {\n // TODO - not available in GD3\n return [];\n }\n}\n","import GW3Bridge from \"./bridges/gw3Bridge\";\n\nimport My from \"./API/activityMyAPI\";\nimport ActivityManager from \"./core/activityManager\";\n\nimport { ActivityBridge } from \"./bridges/activityBridge\";\n\nimport { ActivityConfig } from \"./activityConfig\";\nimport { ActivityAPI } from \"./API/activityAPI\";\nimport { ActivityAGM } from \"./core/activityAGM\";\nimport { Logger } from \"./helpers/logger\";\nimport * as util from \"./helpers/util\";\n\nimport { nodeify } from \"./helpers/promiseExtensions\";\nimport { IOConnectDesktop } from \"../../desktop\";\n\n/**\n * Activity context update handler - used when we want to subscribe for context changes in a specific activity\n *\n * @callback contextChangedHandler\n * @param {Object} context The full context of the activity after the update\n * @param {Object} delta The delta (contains the added/removed keys at top level)\n * @param {string[]} removed Array of keys that were removed from context\n * @param {module:activity} activity The activity instance that owns the context\n *\n */\n\n/**\n * @callback windowEventHandler Handler for ActivityWindow events - e.g window joined to activity, window removed from\n * activity\n * @param {module:activity} activity\n * @param {module:activityWindow} window\n * @param {string} event 'joined' or 'removed'\n */\n\n/**\n * @callback activityStatusChangeHandler Handler for activity status changed events\n * @param {module:activity} activity\n * @param {activityStatus} newStatus\n * @param {activityStatus} oldStatus\n *\n */\n\n/**\n * @typedef {Object} windowDefinition\n * @property {string} type\n * @property {string} name\n * @property {Object} arguments\n */\n\n/**\n * @typedef {Object} bounds\n * @param {number} top\n * @param {number} left\n * @param {number} width\n * @param {number} height\n *\n */\n\n/**\n * @typedef {Object} agmInstance\n * @param {string} application\n * @param {string} pid\n * @param {string} machine\n * @param {string} user\n * @param {string} environment\n * @param {string} region\n */\n\n// Factory function for activity API\nexport class ActivityModule {\n public static checkIsUsingGW3Implementation(connection: IOConnectDesktop.Connection.API) {\n return connection.protocolVersion === 3;\n }\n\n private _api: ActivityAPI;\n private _isUsingGW3Implementation: boolean;\n private _isUsingHCImplementation: boolean;\n private _readyPromise: Promise<ActivityModule>;\n\n get api(): ActivityAPI {\n return this._api;\n }\n\n set api(value: ActivityAPI) {\n this._api = value;\n }\n\n constructor(config: ActivityConfig) {\n if (!config) {\n throw new Error(\"config can not be null\");\n }\n\n // set log level\n if (!util.isUndefined(config.logLevel)) {\n Logger.Level = config.logLevel;\n }\n\n if (!util.isUndefinedOrNull(config.logger)) {\n Logger.GlueLogger = config.logger;\n }\n\n // choose the correct bridge\n let bridge: ActivityBridge;\n this._isUsingHCImplementation = config.gdMajorVersion === 2;\n this._isUsingGW3Implementation = ActivityModule.checkIsUsingGW3Implementation(config.connection);\n\n if (this._isUsingHCImplementation) {\n throw new Error(\"GD2 not supported\");\n } else if (this._isUsingGW3Implementation) {\n bridge = new GW3Bridge(config);\n } else {\n throw new Error(\"Unable to instantiate activity bridge implementation\");\n }\n\n if (!bridge) {\n throw new Error(\"A bridge to native activity is needed to create activity lib.\");\n }\n\n ActivityAGM.AGM = config.agm;\n const activityManager = new ActivityManager(bridge, !config.disableAutoAnnounce, config.windows);\n const my = new My(activityManager, config.windows);\n this._api = new ActivityAPI(activityManager, my);\n this._readyPromise = activityManager.ready().then((_) => this);\n }\n\n public get isUsingHCImplementation(): boolean {\n return this._isUsingHCImplementation;\n }\n\n public get isUsingGW3Implementation(): boolean {\n return this._isUsingGW3Implementation;\n }\n\n public ready(callback?: (err: string, module: ActivityModule) => void): Promise<void> {\n return nodeify(this._readyPromise, callback) as any as Promise<void>;\n }\n}\n","export const ShutdownMethodName = \"T42.ACS.Shutdown\";\nexport const OnGDShutdownMethodName = \"T42.ACS.OnGDShutdown\";\nexport const RestartMethodName = \"T42.ACS.Restart\";\n\nexport const FeedbackMethodName = \"T42.ACS.Feedback\";\n\nexport const GetConfigurationRegionMethodName = \"T42.ACS.GetConfigurationRegion\";\nexport const SetConfigurationRegionMethodName = \"T42.ACS.SetConfigurationRegion\";\n\nexport const GetUserMethodName = \"T42.ACS.GetUser\";\nexport const GetBranchesMethodName = \"T42.ACS.GetBranches\";\nexport const GetCurrentBranchMethodName = \"T42.ACS.GetCurrentBranch\";\nexport const SetCurrentBranchMethodName = \"T42.ACS.SetCurrentBranch\";\n\nexport const GetFunctionalEntitlementMethodName = \"T42.ACS.GetFunctionalEntitlement\";\nexport const CanIMethodName = \"T42.ACS.CanI\";\n\nexport const StartApplicationMethodName = \"T42.ACS.StartApplication\";\nexport const StopApplicationMethodName = \"T42.ACS.StopApplication\";\nexport const ActivateApplicationMethodName = \"T42.ACS.ActivateApplication\";\nexport const RunApplicationMethodName = \"T42.ACS.RunApplication\";\n\nexport const OnEventMethodName = \"T42.ACS.OnEvent\";\n\nexport const GetApplicationsMethodName = \"T42.ACS.GetApplications\";\n","\"use strict\";\nfunction createRegistry(options) {\n if (options && options.errorHandling\n && typeof options.errorHandling !== \"function\"\n && options.errorHandling !== \"log\"\n && options.errorHandling !== \"silent\"\n && options.errorHandling !== \"throw\") {\n throw new Error(\"Invalid options passed to createRegistry. Prop errorHandling should be [\\\"log\\\" | \\\"silent\\\" | \\\"throw\\\" | (err) => void], but \" + typeof options.errorHandling + \" was passed\");\n }\n var _userErrorHandler = options && typeof options.errorHandling === \"function\" && options.errorHandling;\n var callbacks = {};\n function add(key, callback, replayArgumentsArr) {\n var callbacksForKey = callbacks[key];\n if (!callbacksForKey) {\n callbacksForKey = [];\n callbacks[key] = callbacksForKey;\n }\n callbacksForKey.push(callback);\n if (replayArgumentsArr) {\n setTimeout(function () {\n replayArgumentsArr.forEach(function (replayArgument) {\n var _a;\n if ((_a = callbacks[key]) === null || _a === void 0 ? void 0 : _a.includes(callback)) {\n try {\n if (Array.isArray(replayArgument)) {\n callback.apply(undefined, replayArgument);\n }\n else {\n callback.apply(undefined, [replayArgument]);\n }\n }\n catch (err) {\n _handleError(err, key);\n }\n }\n });\n }, 0);\n }\n return function () {\n var allForKey = callbacks[key];\n if (!allForKey) {\n return;\n }\n allForKey = allForKey.reduce(function (acc, element, index) {\n if (!(element === callback && acc.length === index)) {\n acc.push(element);\n }\n return acc;\n }, []);\n if (allForKey.length === 0) {\n delete callbacks[key];\n }\n else {\n callbacks[key] = allForKey;\n }\n };\n }\n function execute(key) {\n var argumentsArr = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n argumentsArr[_i - 1] = arguments[_i];\n }\n var callbacksForKey = callbacks[key];\n if (!callbacksForKey || callbacksForKey.length === 0) {\n return [];\n }\n var results = [];\n callbacksForKey.forEach(function (callback) {\n try {\n var result = callback.apply(undefined, argumentsArr);\n results.push(result);\n }\n catch (err) {\n results.push(undefined);\n _handleError(err, key);\n }\n });\n return results;\n }\n function _handleError(exceptionArtifact, key) {\n var errParam = exceptionArtifact instanceof Error ? exceptionArtifact : new Error(exceptionArtifact);\n if (_userErrorHandler) {\n _userErrorHandler(errParam);\n return;\n }\n var msg = \"[ERROR] callback-registry: User callback for key \\\"\" + key + \"\\\" failed: \" + errParam.stack;\n if (options) {\n switch (options.errorHandling) {\n case \"log\":\n return console.error(msg);\n case \"silent\":\n return;\n case \"throw\":\n throw new Error(msg);\n }\n }\n console.error(msg);\n }\n function clear() {\n callbacks = {};\n }\n function clearKey(key) {\n var callbacksForKey = callbacks[key];\n if (!callbacksForKey) {\n return;\n }\n delete callbacks[key];\n }\n return {\n add: add,\n execute: execute,\n clear: clear,\n clearKey: clearKey\n };\n}\n;\ncreateRegistry.default = createRegistry;\nmodule.exports = createRegistry;\n//# sourceMappingURL=index.js.map","import { Configuration } from \"./types\";\n\nexport function objectValues(source: { [key: string]: any }): any[] {\n if (!source) {\n return [];\n }\n return Object.keys(source).map((key) => source[key]);\n}\n\nexport function objectClone(obj: { [key: string]: any }): any {\n let result;\n try {\n result = JSON.parse(JSON.stringify(obj || {}));\n } catch (error) {\n result = {};\n }\n\n return result;\n}\n\nexport function validate<T>(callback: (item: T) => any, configuration: Configuration) {\n if (configuration.throwErrors) {\n if (typeof callback !== \"function\") {\n throw new Error(\"Please provide the callback as a function!\");\n }\n }\n}\n","import * as AgmNames from \"./const/agm-names\";\nimport { default as CallbackRegistryFactory, CallbackRegistry, UnsubscribeFunction } from \"callback-registry\";\nimport { IOConnectDesktop } from \"../../desktop\";\nimport { AppProps, Configuration, StartAppResult } from \"./types\";\nimport AppManagerImpl from \"./app-manager\";\nimport { objectClone, validate } from \"./helper\";\nimport { isUndefinedOrNull } from \"../activity/helpers/util\";\n\nexport default class ApplicationImpl implements IOConnectDesktop.AppManager.Application {\n\n private _registry: CallbackRegistry = CallbackRegistryFactory();\n\n // Additional properties of the Application\n private _props: AppProps;\n\n constructor(private _appManager: AppManagerImpl, private _name: string, private _agm: IOConnectDesktop.Interop.API, private _configuration: () => Configuration) {\n\n // TODO: Replace string events with constants. The string declaration of the registry event name should only ever appear once. Ever. Period.\n\n // subscribe for events from app-manager\n _appManager.onInstanceStarted((instance) => {\n if (instance.application && instance.application.name !== this._name) {\n return;\n }\n\n this._registry.execute(\"instanceStarted\", instance);\n });\n\n _appManager.onInstanceStopped((instance) => {\n if (instance.application && instance.application.name !== this._name) {\n return;\n }\n\n this._registry.execute(\"instanceStopped\", instance);\n });\n\n _appManager.onAppRemoved((app) => {\n if (app.name !== this._name) {\n return;\n }\n\n this._registry.execute(\"appRemoved\", app);\n });\n\n _appManager.onAppChanged((app) => {\n if (app.name !== this._name) {\n return;\n }\n\n this._registry.execute(\"appChanged\", app);\n });\n\n _appManager.onAppAvailable((app) => {\n if (app.name !== this._name) {\n return;\n }\n this._props.IsReady = true;\n this._registry.execute(\"appAvailable\", app);\n });\n\n _appManager.onAppUnavailable((app) => {\n if (app.name !== this._name) {\n return;\n }\n this._props.IsReady = false;\n this._registry.execute(\"appUnavailable\", app);\n });\n }\n\n get name(): string { return this._name; }\n get title(): string { return this._props.Title; }\n get version(): string { return this._props.Version; }\n get autoStart(): boolean { return this._props.AutoStart; }\n get isShell(): boolean { return this._props.IsShell; }\n get caption(): string { return this._props.Caption; }\n get hidden(): boolean { return this._props.IsHidden; }\n get container(): string { return this._props.ApplicationName; }\n get activityType(): string { return this._props.ActivityType; }\n get activityWindowType(): string { return this._props.ActivityWindowType; }\n get windowSettings(): { [key: string]: any } {\n if (!this._props.Arguments) {\n return {};\n }\n return objectClone(this._props.Arguments);\n }\n get allowMultiple(): boolean { return this._props.AllowMultiple; }\n get available(): boolean { return this._props.IsReady || true; }\n get icon(): string { return this._props.Icon; }\n get iconURL(): string { return this._props.IconUrl; }\n get sortOrder(): number { return this._props.SortOrder; }\n\n get userProperties(): { [key: string]: any } {\n if (!this._props.UserProperties) {\n return {};\n }\n return objectClone(this._props.UserProperties);\n }\n\n get keywords(): string[] {\n if (!this._props.Keywords) {\n return [];\n }\n return this._props.Keywords;\n }\n\n get isActivity(): boolean {\n return this._props.ActivityType !== undefined && this._props.ActivityType !== \"\";\n }\n\n get configuration(): IOConnectDesktop.AppManager.LegacyAppConfigProperties {\n return {\n autoStart: this._props.AutoStart,\n caption: this._props.Caption,\n hidden: this._props.IsHidden,\n container: this._props.ApplicationName,\n activityType: this._props.ActivityType,\n allowMultiple: this._props.AllowMultiple\n };\n }\n\n get instances() {\n return this._appManager.instances().filter((instance: IOConnectDesktop.AppManager.Instance) => instance.application.name === this._name);\n }\n\n get type() {\n return this._props.Type;\n }\n\n get mode() {\n if (!this._props) {\n // no info about the app\n return \"unknown\";\n }\n\n // GD3 - we always have Mode from the stream object\n if (this._props.Mode && typeof this._props.Mode === \"string\") {\n return this._props.Mode.toLowerCase() as IOConnectDesktop.Windows.WindowMode;\n }\n\n // GD2\n // return unknown for activity applications\n if (this.isActivity) {\n return \"unknown\";\n }\n\n // check definition -> hc.args.mode\n if (this._props.Arguments && this._props.Arguments.mode && typeof this._props.Arguments.mode === \"string\") {\n return this._props.Arguments.mode.toLowerCase() as IOConnectDesktop.Windows.WindowMode;\n }\n\n // if no hc.args.mode, check hc.WindowStyleAttributes\n let styleAttributes = this._props.WindowStyleAttributes;\n if (styleAttributes) {\n // WindowStyleAttributes is not a valid JSON, we will need to find mode in the string\n styleAttributes = styleAttributes.split(\" \").join(\"\");\n const searchFor = \"mode:\\\"\";\n const modeIndex = styleAttributes.indexOf(searchFor);\n if (modeIndex !== -1) {\n const startModeIndex = modeIndex + searchFor.length;\n const stopModeIndex = styleAttributes.indexOf(\"\\\"\", startModeIndex);\n const style = styleAttributes.substr(startModeIndex, stopModeIndex - startModeIndex);\n if (style && typeof style === \"string\") {\n return style.toLowerCase() as IOConnectDesktop.Windows.WindowMode;\n }\n }\n }\n\n // default mode for GD2\n return \"flat\";\n }\n\n public async getConfiguration() {\n const result = await this._agm.invoke(AgmNames.GetApplicationsMethodName, { v2: { apps: [this._name] } });\n const config = result.returned.applications[0];\n return config;\n }\n\n public updateFromProps(props: AppProps) {\n if (!this._props) {\n this._props = { Name: props.Name };\n }\n\n Object.keys(props).forEach((key) => {\n (this._props as any)[key] = (props as any)[key];\n });\n }\n\n public start(context?: unknown, options?: IOConnectDesktop.AppManager.ApplicationStartOptions): Promise<IOConnectDesktop.AppManager.Instance> {\n return new Promise<IOConnectDesktop.AppManager.Instance>(async (resolve, reject) => {\n const name = this._name;\n let startTimeout = 60000;\n if (isUndefinedOrNull(context)) {\n context = {};\n } else if (this._configuration()?.throwErrors && typeof context !== \"object\" || Array.isArray(context)) {\n return reject(new Error(`Invalid \"context\" parameter - must be an object.`));\n }\n\n if (isUndefinedOrNull(options)) {\n options = {};\n } else if (this._configuration()?.throwErrors && typeof options !== \"object\") {\n return reject(new Error(`Invalid \"options\" parameter - must be an object.`));\n }\n\n let waitForAGMInstance = (options.awaitInterop ?? options.waitForAGMReady) ?? true;\n\n const waitForApplicationInstance = (id: string) => {\n let unsub: () => void;\n // reject after some timeout\n const timeout = setTimeout(() => {\n if (unsub) {\n unsub();\n }\n reject(`timed out while waiting for instance id ${id} for app ${this.name}`);\n }, startTimeout);\n\n const waitFunc = (i: IOConnectDesktop.AppManager.Instance) => {\n if (i.id !== id) {\n return;\n }\n if (unsub) {\n unsub();\n unsub = undefined;\n }\n clearTimeout(timeout);\n resolve(i);\n };\n\n if (waitForAGMInstance) {\n unsub = this._appManager.onInstanceAgmServerReady(waitFunc);\n } else {\n // if not there subscribe for instance events\n unsub = this._appManager.onInstanceStarted(waitFunc);\n }\n };\n\n try {\n const result = await this._agm.invoke<StartAppResult>(AgmNames.StartApplicationMethodName,\n {\n Name: name,\n Context: context,\n Options: options\n },\n \"best\",\n {\n methodResponseTimeoutMs: startTimeout\n });\n\n const acsResult: StartAppResult = result.returned;\n if (typeof acsResult.timeout !== \"undefined\") {\n startTimeout = acsResult.timeout * 1000;\n }\n if (typeof acsResult.waitForInterop !== \"undefined\" && (typeof options.waitForAGMReady === \"undefined\" && typeof options.awaitInterop === \"undefined\")) {\n waitForAGMInstance = acsResult.waitForInterop;\n }\n\n if (acsResult && acsResult.Id) {\n if (this._appManager.mode === \"startOnly\") {\n // we're in startOnly mode, no stream, so we will simulate the instance\n // based on the data received from GD\n const instance = this._appManager.handleInstanceStarted({\n ActivityId: undefined,\n IsActivityOwner: undefined,\n Context: undefined,\n Title: undefined,\n AgmServers: undefined,\n Id: acsResult.Id,\n Name: acsResult.Name,\n });\n resolve(instance);\n } else {\n // we received instance from ACS, let's wait until it appears on the stream\n waitForApplicationInstance(acsResult.Id);\n }\n } else {\n // we haven't received instance from ACS - this might happen if the app does not\n // support tracking instances (e.g. we start internet explorer with some url)\n resolve(undefined);\n }\n } catch (error) {\n reject(error.message ?? error);\n }\n });\n }\n\n public onInstanceStarted(callback: (instance: IOConnectDesktop.AppManager.Instance) => any): UnsubscribeFunction {\n validate(callback, this._configuration());\n return this._registry.add(\"instanceStarted\", callback);\n }\n\n public onInstanceStopped(callback: (instance: IOConnectDesktop.AppManager.Instance) => any): UnsubscribeFunction {\n validate(callback, this._configuration());\n return this._registry.add(\"instanceStopped\", callback);\n }\n\n public onAvailable(callback: (app: IOConnectDesktop.AppManager.Application) => any): UnsubscribeFunction {\n validate(callback, this._configuration());\n if (this._props.IsReady) {\n setTimeout(() => {\n this._registry.execute(\"appAvailable\", this);\n }, 0);\n }\n return this._registry.add(\"appAvailable\", callback);\n }\n\n public onUnavailable(callback: (app: IOConnectDesktop.AppManager.Application) => any): UnsubscribeFunction {\n validate(callback, this._configuration());\n if (this._props.IsReady === false) {\n setTimeout(() => {\n this._registry.execute(\"appUnavailable\", this);\n }, 0);\n }\n return this._registry.add(\"appUnavailable\", callback);\n }\n\n public onChanged(callback: (app: IOConnectDesktop.AppManager.Application) => any): void {\n validate(callback, this._configuration());\n this._registry.add(\"appChanged\", callback);\n }\n\n public onRemoved(callback: (app: IOConnectDesktop.AppManager.Application) => any): void {\n validate(callback, this._configuration());\n this._registry.add(\"appRemoved\", callback);\n }\n}\n","import * as AgmNames from \"./const/agm-names\";\nimport { default as CallbackRegistryFactory, CallbackRegistry, UnsubscribeFunction } from \"callback-registry\";\nimport { Configuration, InstanceProps, WindowContext } from \"./types\";\nimport AppManagerImpl from \"./app-manager\";\nimport { IOConnectDesktop } from \"../../desktop\";\nimport { isUndefinedOrNull } from \"../activity/helpers/util\";\nimport { validate } from \"./helper\";\n\nexport default class InstanceImpl implements IOConnectDesktop.AppManager.Instance {\n private _registry: CallbackRegistry = CallbackRegistryFactory();\n\n private _startUpContext: WindowContext;\n private _title: string;\n private _isActivityInstance: boolean;\n private _activityId: string;\n private _inActivity: boolean;\n private _isActivityOwner: boolean;\n private _agmInstance: Partial<IOConnectDesktop.Interop.Instance>;\n private _unsubscribeInstanceAgmServerReady: UnsubscribeFunction;\n private _unsubscribeInstanceStopped: UnsubscribeFunction;\n\n constructor(\n private _id: string,\n private _appName: string,\n private _appManager: AppManagerImpl,\n private _agm: IOConnectDesktop.Interop.API,\n private _activities: IOConnectDesktop.Activities.API,\n private _windows: IOConnectDesktop.Windows.API,\n startFailed: boolean,\n private _configuration: () => Configuration\n ) {\n if (startFailed) {\n return;\n }\n\n this._unsubscribeInstanceStopped = this._appManager.onInstanceStopped((instance: IOConnectDesktop.AppManager.Instance) => {\n if (instance.id !== this._id) {\n return;\n }\n\n this._registry.execute(\"stopped\", instance);\n });\n\n this._unsubscribeInstanceAgmServerReady = this._appManager.onInstanceAgmServerReady((instance) => {\n if (instance.id !== this._id) {\n return;\n }\n\n this._registry.execute(\"agmReady\", instance);\n });\n }\n\n get id(): string { return this._id; }\n\n get application(): IOConnectDesktop.AppManager.Application { return this._appManager.application(this._appName); }\n\n get activity(): IOConnectDesktop.Activities.Activity {\n if (!this._activities) {\n throw new Error(\"This method requires glue.activities library to be enabled.\");\n }\n return this._activities.all.instances.get()\n .filter((activityInstance: IOConnectDesktop.Activities.Activity) => activityInstance.id === this._activityId)[0];\n }\n\n get isActivityOwner(): boolean { return this._isActivityOwner; }\n\n // this property returns a list of activity window instances (not activity instances)\n get activityInstances(): IOConnectDesktop.AppManager.Instance[] {\n return this._appManager.instances().filter((i) =>\n i.application.type !== \"activity\" && // GD2 backward compatibility - do not show activity instances into the activity window instances list\n i.activityId && // glue js 2 and 3 bug and breaking change - they will show non activity window instances as activity in case of activityId === undefined\n i.activityId === this._activityId);\n }\n\n get activityOwnerInstance(): IOConnectDesktop.AppManager.Instance {\n if (!this._activityId) {\n return undefined;\n }\n return this.activityInstances.filter((inst) => (inst as InstanceImpl)?.isActivityOwner)[0];\n }\n\n get window(): IOConnectDesktop.Windows.IOConnectWindow {\n if (!this._windows) {\n throw new Error(\"This method requires glue.windows library to be enabled.\");\n }\n\n let win = this._windows.list().filter((w) => w.id === this._id)[0];\n if (!win && this._activities && this.activity && this.activityOwnerInstance) {\n // This is covering GD3 activity instance\n win = this.activityOwnerInstance.window;\n }\n\n return win;\n }\n\n get context(): WindowContext {\n return this._startUpContext ?? this.window?.context ?? {};\n }\n\n get title(): string { return this._title; }\n\n get isActivityInstance(): boolean { return this._isActivityInstance; }\n\n get activityId(): string { return this._activityId; }\n\n get inActivity(): boolean { return this._inActivity; }\n\n get isSingleWindowApp(): boolean { return !this._inActivity; }\n\n get agm(): Partial<IOConnectDesktop.AGM.Instance> {\n return this._agmInstance;\n }\n\n get interopInstance(): Partial<IOConnectDesktop.AGM.Instance> {\n return this._agmInstance;\n }\n\n public onInteropReady(callback: (instance: IOConnectDesktop.AppManager.Instance) => any) {\n validate(callback, this._configuration());\n if (this._agmInstance) {\n setTimeout(() => {\n this._registry.execute(\"agmReady\", this);\n }, 0);\n }\n return this._registry.add(\"agmReady\", callback);\n }\n\n public onAgmReady(callback: (instance: IOConnectDesktop.AppManager.Instance) => any) {\n return this.onInteropReady(callback);\n }\n\n public onStopped(callback: (instance: IOConnectDesktop.AppManager.Instance) => any) {\n validate(callback, this._configuration());\n return this._registry.add(\"stopped\", callback);\n }\n\n // uses this.window and waits for the window to appear if needed\n // we can not remove this.window for legacy reasons\n public getWindow(): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return new Promise((resolve, reject) => {\n // try to get it the normal way\n const result = this.window;\n if (result) {\n resolve(result);\n return;\n }\n\n // if we can not find it directly wait for it to appear\n const done = (error?: Error, window?: IOConnectDesktop.Windows.IOConnectWindow) => {\n if (error) {\n reject(error);\n }\n\n if (window) {\n resolve(window);\n }\n\n setTimeout(() => {\n clearTimeout(timeout);\n unsub();\n }, 0);\n };\n\n // if not found for 30 sec reject\n const timeout = setTimeout(() => {\n done(new Error(`can not find a window with id ${this._id}`));\n }, 30000);\n\n const unsub = this._windows.onWindowAdded((w) => {\n if (w.id === this._id) {\n done(undefined, w);\n }\n });\n });\n }\n\n public updateFromProps(props: InstanceProps): void {\n this._startUpContext = props.Context;\n this._title = props.Title;\n this._isActivityInstance = false;\n if (props.ActivityId && props.ActivityId !== \"\") {\n this._activityId = props.ActivityId;\n this._isActivityInstance = true;\n }\n this._isActivityOwner = props.IsActivityOwner;\n if (!this._activityId && this._startUpContext && this._startUpContext.activityId) {\n this._activityId = this._startUpContext.activityId;\n }\n this._inActivity = Boolean(this._activityId);\n\n this.updateAgmInstanceFromProps(props);\n }\n\n public updateAgmInstanceFromProps(props: InstanceProps) {\n if (!props.AgmServers) {\n return;\n }\n\n const agmInstances: IOConnectDesktop.Interop.Instance[] = props.AgmServers;\n if (agmInstances && agmInstances.length > 0 && !isUndefinedOrNull(agmInstances[0])) {\n this._agmInstance = agmInstances[0];\n }\n }\n\n public stop(): Promise<void> {\n return new Promise((resolve, reject) => {\n let idToResolve = this._id;\n if (this.isActivityOwner) {\n idToResolve = this.activityId;\n }\n const unsubscribe = this._appManager.onInstanceStopped((instance) => {\n if (instance.id === idToResolve) {\n unsubscribe();\n resolve();\n }\n });\n\n this._agm.invoke(\n AgmNames.StopApplicationMethodName,\n {\n Name: this._appName,\n Id: this._id\n })\n .then(() => {\n if (this._appManager.mode === \"startOnly\") {\n this._appManager.handleInstanceStopped({\n Name: this._appName,\n Id: this.id\n });\n // in startOnly mode, resolve stop as soon as we receive\n resolve();\n }\n })\n .catch((err: any) => reject(err));\n });\n }\n\n public activate(): Promise<IOConnectDesktop.Interop.InvocationResult<any>> {\n return this._agm.invoke(AgmNames.ActivateApplicationMethodName, { Name: this._appName, Id: this._id });\n }\n\n public done() {\n\n // remove all handlers\n this._registry.clear();\n // remove subscriptions\n this._unsubscribeInstanceAgmServerReady();\n this._unsubscribeInstanceStopped();\n }\n\n public getContext(): Promise<object> {\n return Promise.resolve(this.context);\n }\n}\n","import ApplicationImpl from \"./application\";\nimport { IOConnectDesktop } from \"../../desktop\";\nimport { AppProps, Configuration, InstanceProps } from \"./types\";\nimport { default as CallbackRegistryFactory, CallbackRegistry, UnsubscribeFunction } from \"callback-registry\";\nimport InstanceImpl from \"./instance\";\nimport { ApplicationConfig } from \"@glue42/schemas\";\nimport { GetApplicationsMethodName } from \"./const/agm-names\";\nimport { validate } from \"./helper\";\n\nexport default class AppManagerImpl implements IOConnectDesktop.AppManager.AppManager {\n\n private _apps: { [key: string]: ApplicationImpl } = {};\n private _instances: InstanceImpl[] = [];\n private _registry: CallbackRegistry = CallbackRegistryFactory();\n\n constructor(\n public mode: IOConnectDesktop.AppManager.Mode,\n private _agm: IOConnectDesktop.AGM.API,\n private _activities: IOConnectDesktop.Activities.API,\n private _windows: IOConnectDesktop.Windows.API,\n private _logger: IOConnectDesktop.Logger.API,\n private _gdMajorVersion: number,\n private _configuration: () => Configuration\n ) {\n //\n }\n\n public getConfigurations = async (apps?: string[]): Promise<ApplicationConfig[]> => {\n const args = {\n v2: {\n apps: undefined as undefined | string[]\n }\n };\n\n if (Array.isArray(apps)) {\n args.v2 = {\n apps\n };\n }\n const result = await this._agm.invoke(GetApplicationsMethodName, args);\n return result.returned.applications;\n }\n\n public application = (name: string) => {\n if (this._configuration()?.throwErrors && typeof name !== \"string\") {\n throw new Error(`\"name\" must be string`);\n }\n\n return this._apps[name];\n }\n\n public applications = () => {\n return Object.keys(this._apps).map((k: string) => this._apps[k]);\n }\n\n public instances = () => {\n return this._instances.map((i) => i);\n }\n\n public getMyInstance = () => {\n const glue42gd = typeof window !== \"undefined\" && (window as any).glue42gd;\n if (glue42gd) {\n if (this._gdMajorVersion >= 3) {\n // GD3 check\n const instanceId = glue42gd.appInstanceId;\n return this._instances.find((i) => i.id === instanceId);\n }\n } else {\n const instanceId = this._agm.instance.instance;\n return this._instances.find((i) => i.id === instanceId);\n }\n return undefined;\n }\n\n public getMyApplication = () => {\n if (this._agm.instance) {\n return this.application(this._agm.instance.application);\n }\n }\n\n public handleSnapshotAppsAdded = (newApps: AppProps[]) => {\n const currentApps = this.applications();\n if (currentApps.length > 0) {\n currentApps.forEach((item) => {\n const name = item.name;\n const alreadyExists = newApps.find((i) => i.Name === item.name);\n if (!alreadyExists) {\n // Check if app is present in glue.js but not in snapshot, remove apps which are no longer present in gd\n this.handleAppRemoved({ Name: name });\n }\n });\n }\n newApps.forEach((item: AppProps) => {\n const alreadyExists = currentApps.find((i) => i.name === item.Name);\n if (!alreadyExists) {\n // Check if app is already present within glue.js, add only missing ones\n this.handleAppAdded(item);\n }\n });\n }\n\n public handleSnapshotInstanceStarted = (newInstances: InstanceProps[]) => {\n const currentInstances = this.instances();\n if (currentInstances.length > 0) {\n currentInstances.forEach((item) => {\n const id = item.id;\n const alreadyExists = newInstances.find((i) => i.Id === id);\n if (!alreadyExists) {\n // Check if the instance is present in glue.js but not in snapshot, remove the instance which are no longer present in gd\n this.handleInstanceStopped({ Name: item.application.name, Id: id });\n }\n });\n }\n newInstances.forEach((item) => {\n const alreadyExists = currentInstances.find((i) => i.id === item.Id);\n if (!alreadyExists) {\n // Check if the instance is already present within glue.js, add only missing ones\n this.handleInstanceStarted(item);\n }\n });\n }\n\n public handleAppAdded = (props: AppProps) => {\n const id = this._getAppId(props);\n this._logger.trace(`adding app ${id}`);\n this._apps[id] = new ApplicationImpl(this, id, this._agm, this._configuration);\n const app = this._updateAppFromProps(props);\n\n this._registry.execute(\"appAdded\", app);\n // keeps backwards compatibility\n this._registry.execute(\"appAvailable\", app);\n }\n\n public handleAppUpdated = (props: AppProps) => {\n // TODO: check side effects, is this._apps updated?\n\n const app = this._updateAppFromProps(props);\n\n this._registry.execute(\"appChanged\", app);\n }\n\n public handleAppRemoved = (props: AppProps) => {\n const id = this._getAppId(props);\n this._logger.trace(`removing app ${id}`);\n const app = this.application(id);\n\n // remove all instances related to the app\n this._instances = this._instances.filter((i) => i.application.name !== app.name);\n\n delete this._apps[id];\n\n this._registry.execute(\"appRemoved\", app);\n }\n\n // not called from GD3\n public handleAppReady = (props: AppProps) => {\n const id = this._getAppId(props);\n const app = this._getAppOrThrow(id);\n app.updateFromProps(props);\n\n if (app.available) {\n this._registry.execute(\"appAvailable\", app);\n } else {\n this._registry.execute(\"appUnavailable\", app);\n }\n }\n\n public handleInstanceStarted = (props: InstanceProps): InstanceImpl => {\n this._logger.trace(`started app ${props.Name} ${props.Id}`);\n const id = this._getInstanceId(props);\n const appName = this._getInstanceAppName(props);\n\n const instance = new InstanceImpl(id, appName, this, this._agm, this._activities, this._windows, false, this._configuration);\n\n this._updateInstanceFromProps(instance, props);\n\n this._instances.push(instance);\n\n this._registry.execute(\"instanceStarted\", instance);\n return instance;\n }\n\n public handleInstanceStopped = (props: Pick<InstanceProps, \"Name\" | \"Id\">) => {\n this._logger.trace(`failed to start app ${props.Name} ${props.Id}`);\n\n const id = this._getInstanceId(props);\n const appName = this._getInstanceAppName(props);\n const instance = this._getInstanceOrThrow(id, appName);\n\n this._instances = this._instances.filter((i) => !this._matchInstance(i, id, appName));\n\n this._registry.execute(\"instanceStopped\", instance);\n instance.done();\n }\n\n public handleInstanceAgmServerReady = (props: InstanceProps) => {\n\n const id = this._getInstanceId(props);\n const appName = this._getInstanceAppName(props);\n const instance = this._getInstanceOrThrow(id, appName);\n\n instance.updateAgmInstanceFromProps(props);\n\n this._registry.execute(\"instanceAgmServerReady\", instance);\n }\n\n public handleInstanceStartFailed = (props: InstanceProps) => {\n\n const id = this._getInstanceId(props);\n const appName = this._getInstanceAppName(props);\n const startFailed = true;\n const instance = new InstanceImpl(id, appName, undefined, undefined, undefined, undefined, startFailed, this._configuration);\n\n this._updateInstanceFromProps(instance, props);\n\n this._registry.execute(\"instanceStartFailed\", instance);\n }\n\n public handleInstanceUpdated = (props: InstanceProps) => {\n\n const id = this._getInstanceId(props);\n const app = this._getInstanceAppName(props);\n const instance = this._getInstanceOrThrow(id, app);\n\n this._updateInstanceFromProps(instance, props);\n }\n\n /** Event subscription methods */\n public onInstanceStarted = (callback: (item: IOConnectDesktop.AppManager.Instance) => any): UnsubscribeFunction => {\n validate(callback, this._configuration());\n return this._registry.add(\"instanceStarted\", callback, this._instances);\n }\n\n public onInstanceStartFailed = (callback: (item: IOConnectDesktop.AppManager.Instance) => any): UnsubscribeFunction => {\n validate(callback, this._configuration());\n return this._registry.add(\"instanceStartFailed\", callback);\n }\n\n public onInstanceStopped = (callback: (item: IOConnectDesktop.AppManager.Instance) => any): UnsubscribeFunction => {\n validate(callback, this._configuration());\n return this._registry.add(\"instanceStopped\", callback);\n }\n\n public onInstanceUpdated = (callback: (item: IOConnectDesktop.AppManager.Instance) => any): UnsubscribeFunction => {\n validate(callback, this._configuration());\n return this._registry.add(\"instanceChanged\", callback);\n }\n\n public onInstanceAgmServerReady = (callback: (item: IOConnectDesktop.AppManager.Instance) => any): UnsubscribeFunction => {\n validate(callback, this._configuration());\n return this._registry.add(\"instanceAgmServerReady\", callback);\n }\n\n public onAppAdded = (callback: (item: IOConnectDesktop.AppManager.Application) => any): UnsubscribeFunction => {\n validate(callback, this._configuration());\n return this._registry.add(\"appAdded\", callback, Object.values(this._apps));\n }\n\n public onAppRemoved = (callback: (item: IOConnectDesktop.AppManager.Application) => any): UnsubscribeFunction => {\n validate(callback, this._configuration());\n return this._registry.add(\"appRemoved\", callback);\n }\n\n public onAppAvailable = (callback: (item: IOConnectDesktop.AppManager.Application) => any): UnsubscribeFunction => {\n validate(callback, this._configuration());\n return this._registry.add(\"appAvailable\", callback);\n }\n\n public onAppUnavailable = (callback: (item: IOConnectDesktop.AppManager.Application) => any): UnsubscribeFunction => {\n validate(callback, this._configuration());\n return this._registry.add(\"appUnavailable\", callback);\n }\n\n public onAppChanged = (callback: (item: IOConnectDesktop.AppManager.Application) => any): UnsubscribeFunction => {\n validate(callback, this._configuration());\n return this._registry.add(\"appChanged\", callback);\n }\n\n private _getAppOrThrow(id: string) {\n const result = this.application(id);\n if (!result) {\n throw Error(`app with id ${id} not found`);\n }\n return result;\n }\n\n private _getAppId(props: AppProps) {\n return props.Name;\n }\n\n private _matchInstance(instance: IOConnectDesktop.AppManager.Instance, id: string, appName: string) {\n return instance.id === id && instance.application.name === appName;\n }\n\n private _getInstanceByIdAndName(id: string, appName: string) {\n return this._instances.filter((i) => this._matchInstance(i, id, appName))[0];\n }\n\n private _getInstanceOrThrow(id: string, appName: string) {\n const result = this._getInstanceByIdAndName(id, appName);\n if (!result) {\n throw Error(`instance with id ${id} not found`);\n }\n return result;\n }\n\n private _getInstanceId(props: Pick<InstanceProps, \"Id\">) {\n return props.Id;\n }\n\n private _getInstanceAppName(props: Pick<InstanceProps, \"Name\">) {\n return props.Name;\n }\n\n private _updateAppFromProps(props: AppProps) {\n const id = this._getAppId(props);\n this._logger.trace(`updating app with + ${id}, ${JSON.stringify(props)}`);\n const app = this._getAppOrThrow(id);\n\n app.updateFromProps(props);\n\n return app;\n }\n\n private _updateInstanceFromProps(instance: InstanceImpl, props: InstanceProps) {\n this._logger.trace(\"updating instance with \" + this._getInstanceId(props) + \" for app \" + this._getInstanceAppName(props));\n instance.updateFromProps(props);\n }\n}\n","import * as AgmNames from \"./const/agm-names\";\nimport { default as CallbackRegistryFactory, CallbackRegistry, UnsubscribeFunction } from \"callback-registry\";\nimport { IOConnectDesktop } from \"../../desktop\";\nimport { OnGDShutdownMethodName } from \"./const/agm-names\";\n\nfunction promisify(promise: Promise<any>, successCallback: (arg?: any) => void, errorCallback: (err?: any) => void) {\n const isFunction = (arg: any) => {\n return !!(arg && arg.constructor && arg.call && arg.apply);\n };\n\n if (!isFunction(successCallback) && !isFunction(errorCallback)) {\n return promise;\n }\n\n if (!isFunction(successCallback)) {\n successCallback = () => {\n // EMPTY\n };\n } else if (!isFunction(errorCallback)) {\n errorCallback = () => {\n // EMPTY\n };\n }\n\n return promise.then(successCallback, errorCallback);\n}\n\nexport default class EntitlementsImpl implements IOConnectDesktop.AppManager.Entitlements {\n\n private _registry: CallbackRegistry = CallbackRegistryFactory();\n private _isMethodRegistered = false;\n\n constructor(\n private _agm: IOConnectDesktop.Interop.API\n ) {\n //\n }\n\n public handleBranchModified = (branch: IOConnectDesktop.AppManager.Branch) => {\n this._registry.execute(\"branchChanged\", branch);\n }\n\n public handleBranchesModified = (branches: IOConnectDesktop.AppManager.Branch[]) => {\n this._registry.execute(\"branchesChanged\", branches);\n }\n\n public getRegion = (success?: (region: string) => any, error?: (err: any) => any): void | Promise<string> => {\n return promisify(\n this._agmInvoke(\n AgmNames.GetConfigurationRegionMethodName,\n (e: IOConnectDesktop.Interop.InvocationResult<{ Region: string }>) => e.returned.Region\n ),\n success,\n error\n );\n }\n\n public getBranches = (success?: (branches: IOConnectDesktop.AppManager.Branch[]) => any, error?: (err: any) => any): void | Promise<IOConnectDesktop.AppManager.Branch[]> => {\n const promise = this._agmInvoke(\n AgmNames.GetBranchesMethodName,\n (e) => {\n const obj = e.returned.Branches as { [key: string]: IOConnectDesktop.AppManager.Branch };\n return Object.keys(obj).map((key) => obj[key]);\n }\n );\n\n return promisify(promise, success, error);\n }\n\n public getCurrentBranch = (success?: (branch: IOConnectDesktop.AppManager.Branch) => any, error?: (err: any) => any): void | Promise<IOConnectDesktop.AppManager.Branch> => {\n const promise = this._agmInvoke(\n AgmNames.GetCurrentBranchMethodName,\n (e) => e.returned.Branch,\n undefined\n );\n\n return promisify(promise, success, error);\n }\n\n public setRegion = (region: string, success?: (resMsg: string) => any, error?: (err: any) => any): void | Promise<string> => {\n const promise = this._agmInvoke(\n AgmNames.SetConfigurationRegionMethodName,\n (e) => e.returned.ResultMessage,\n { Region: region }\n );\n\n return promisify(promise, success, error);\n }\n\n public setCurrentBranch = (branch: string, success?: (resMsg: string) => any, error?: (err: any) => any): void | Promise<string> => {\n const promise = this._agmInvoke(\n AgmNames.SetCurrentBranchMethodName,\n (e) => e.returned.ResultMessage,\n { Branch: branch }\n );\n\n return promisify(promise, success, error);\n }\n\n public currentUser = (success?: (user: IOConnectDesktop.AppManager.UserInfo) => any, error?: (err: any) => any): void | Promise<IOConnectDesktop.AppManager.UserInfo> => {\n const promise = this._agmInvoke(AgmNames.GetUserMethodName);\n return promisify(promise, success, error);\n }\n\n public getFunctionalEntitlement = (funct: string, success?: (entitlement: string) => any, error?: (err: any) => any): void | Promise<string> => {\n const promise = this._agmInvoke(\n AgmNames.GetFunctionalEntitlementMethodName,\n (e) => e.returned.Entitlement,\n { Function: funct }\n );\n\n return promisify(promise, success, error);\n }\n\n public getFunctionalEntitlementBranch = (funct: string, branch: string, success?: (entitlement: string) => any, error?: (err: any) => any): void | Promise<string> => {\n const promise = this._agmInvoke(\n AgmNames.GetFunctionalEntitlementMethodName,\n (e) => e.returned.Entitlement,\n { Function: funct, Branch: branch }\n );\n return promisify(promise, success, error);\n }\n\n public canI = (func: string, success?: (allowed: boolean) => any, error?: (err: any) => any): void | Promise<boolean> => {\n const promise = this._agmInvoke(\n AgmNames.CanIMethodName,\n (e) => e.returned.Result,\n { Function: func }\n );\n\n return promisify(promise, success, error);\n }\n\n public canIBranch = (func: string, branch: string, success?: (allowed: boolean) => any, error?: (err: any) => any): void | Promise<boolean> => {\n const promise = this._agmInvoke(\n AgmNames.CanIMethodName,\n (e) => e.returned.Result,\n { Function: func, Branch: branch }\n );\n\n return promisify(promise, success, error);\n }\n\n public onBranchesChanged = (callback: (branches: IOConnectDesktop.AppManager.Branch[]) => any): UnsubscribeFunction => {\n return this._registry.add(\"branchesChanged\", callback);\n }\n\n public onBranchChanged = (callback: (branch: IOConnectDesktop.AppManager.Branch) => any): UnsubscribeFunction => {\n return this._registry.add(\"branchChanged\", callback);\n }\n\n public exit = (options?: IOConnectDesktop.AppManager.ExitOpts): Promise<any> => {\n return this._agmInvoke(\n AgmNames.ShutdownMethodName,\n null,\n options\n );\n }\n\n public onShuttingDown = (callback: (args: IOConnectDesktop.AppManager.ShuttingDownEventArgs) => Promise<{ prevent: boolean }>) => {\n this.registerMethod();\n return this._registry.add(\"onShuttingDown\", callback);\n }\n\n public restart = (options?: IOConnectDesktop.AppManager.ExitOpts): Promise<any> => {\n return this._agmInvoke(\n AgmNames.RestartMethodName,\n null,\n options\n );\n }\n\n private registerMethod() {\n if (!this._isMethodRegistered) {\n this._agm.register(OnGDShutdownMethodName, async (args) => {\n try {\n const results = await Promise.all(this._registry.execute(\"onShuttingDown\", args)) as { prevent: boolean }[];\n const prevent = results.some((r) => r.prevent);\n return { prevent };\n } catch (error) {\n //\n }\n });\n this._isMethodRegistered = true;\n }\n }\n\n private _agmInvoke = (\n method: string,\n transformFunction?: (res: IOConnectDesktop.Interop.InvocationResult<any>) => any,\n args?: object\n ): Promise<any> => {\n args = args || {};\n return new Promise((resolve, reject) => {\n const errHandler: IOConnectDesktop.Interop.InvokeErrorHandler = (error) => reject(error);\n this._agm.invoke(method, args)\n .then((result) => {\n if (!transformFunction) {\n transformFunction = (d: IOConnectDesktop.Interop.InvocationResult<any>) => d.returned;\n }\n resolve(transformFunction(result));\n })\n .catch(errHandler);\n });\n }\n}\n","import { IOConnectDesktop } from \"../../desktop\";\n\nexport const InMemoryStoreCommandMethodName = \"T42.ACS.InMemoryStoreCommand\";\n\nexport type InMemoryStoreCommandArgs = InMemoryImportCommand | InMemoryExportCommand | InMemoryRemoveCommand | InMemoryClearCommand;\n\nexport interface GenericInMemoryCommand<C, A> {\n command: C;\n args?: A;\n}\n\ntype InMemoryImportCommand = GenericInMemoryCommand<\"import\", InMemoryImportArgs>;\ninterface InMemoryImportArgs {\n apps: IOConnectDesktop.AppManager.Definition[];\n mode?: \"merge\" | \"replace\";\n}\n\ntype InMemoryRemoveCommand = GenericInMemoryCommand<\"remove\", { apps: string[] }>;\nexport interface InMemoryRemoveArgs {\n apps: string[];\n}\n\ntype InMemoryExportCommand = GenericInMemoryCommand<\"export\", undefined>;\ntype InMemoryClearCommand = GenericInMemoryCommand<\"clear\", undefined>;\n\nexport interface InMemoryExportResult {\n apps: IOConnectDesktop.AppManager.Definition[];\n}\n\nexport class InMemoryStore implements IOConnectDesktop.AppManager.InMemoryStore {\n\n constructor(private interop: IOConnectDesktop.Interop.API) {\n }\n\n public import(apps: IOConnectDesktop.AppManager.Definition[], mode?: \"replace\" | \"merge\"): Promise<IOConnectDesktop.AppManager.ImportResult> {\n if (!apps || !Array.isArray(apps)) {\n return Promise.reject(\"invalid apps argument - should be an array of application definitions\");\n }\n if (mode && mode !== \"replace\" && mode !== \"merge\") {\n return Promise.reject(\"invalid mode argument - should be 'replace' or 'merge'\");\n }\n\n mode = mode ?? \"replace\";\n const command: InMemoryImportCommand = {\n command: \"import\",\n args: {\n apps,\n mode\n }\n };\n return this.interop.invoke<IOConnectDesktop.AppManager.ImportResult>(InMemoryStoreCommandMethodName, command)\n .then((r) => r.returned);\n }\n\n public export(): Promise<IOConnectDesktop.AppManager.Definition[]> {\n return this.interop.invoke<InMemoryExportResult>(InMemoryStoreCommandMethodName, { command: \"export\" })\n .then((r) => r.returned.apps);\n }\n\n public remove(app: string): Promise<void> {\n if (!app || typeof app !== \"string\") {\n return Promise.reject(\"invalid app name, should be a string value\");\n }\n const command: InMemoryRemoveCommand = {\n command: \"remove\",\n args: {\n apps: [app]\n }\n };\n return this.interop.invoke<void>(InMemoryStoreCommandMethodName, command).then((r) => r.returned);\n }\n\n public clear(): Promise<void> {\n const command: InMemoryClearCommand = {\n command: \"clear\"\n };\n return this.interop.invoke<void>(InMemoryStoreCommandMethodName, command).then((r) => r.returned);\n }\n\n public createAppDef(name: string, url: string): IOConnectDesktop.AppManager.Definition {\n if (!url) {\n url = \"https://google.com\";\n }\n return {\n name,\n type: \"window\",\n title: name,\n details: {\n url\n }\n };\n }\n}\n","import AppManagerImpl from \"./app-manager\";\nimport EntitlementsImpl from \"./entitlements\";\nimport snapshot from \"./snapshot\";\nimport subscriptionFactory from \"./data-subscription\";\nimport { IOConnectDesktop } from \"../../desktop\";\nimport { InMemoryStore } from \"./in-memory\";\nimport { Configuration } from \"./types\";\n\nexport default (config: IOConnectDesktop.AppManager.Config): IOConnectDesktop.AppManager.API => {\n\n if (!config) {\n throw Error(\"config not set\");\n }\n\n if (!config.agm) {\n throw Error(\"config.agm is missing\");\n }\n\n const START_ONLY: IOConnectDesktop.AppManager.Mode = \"startOnly\";\n const SKIP_ICONS: IOConnectDesktop.AppManager.Mode = \"skipIcons\";\n const FULL: IOConnectDesktop.AppManager.Mode = \"full\";\n\n const mode: IOConnectDesktop.AppManager.Mode = config.mode || START_ONLY;\n if (mode !== START_ONLY && mode !== SKIP_ICONS && mode !== FULL) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw new Error(`Invalid mode for appManager lib - ${mode} is not supported`);\n }\n\n const activities = config.activities;\n const agm = config.agm;\n const logger = config.logger;\n const windows = config.windows;\n let configuration: Configuration = {};\n const appManager = new AppManagerImpl(mode, agm, activities, windows, logger.subLogger(\"applications\"), config.gdMajorVersion, () => configuration);\n const entitlements = new EntitlementsImpl(agm);\n\n let readyPromise: Promise<Configuration>;\n if (mode === START_ONLY) {\n readyPromise = snapshot(agm, appManager);\n } else {\n const subscription = subscriptionFactory(agm, appManager, entitlements, mode === SKIP_ICONS);\n readyPromise = subscription.start();\n }\n\n const api: IOConnectDesktop.AppManager.API = {\n ready: () => readyPromise.then((c) => { configuration = c; }),\n\n applications: appManager.applications,\n application: appManager.application,\n getConfigurations: appManager.getConfigurations,\n\n onAppAdded: appManager.onAppAdded,\n onAppRemoved: appManager.onAppRemoved,\n onAppChanged: appManager.onAppChanged,\n onAppAvailable: appManager.onAppAvailable,\n onAppUnavailable: appManager.onAppUnavailable,\n\n instances: appManager.instances,\n get myInstance() {\n return appManager.getMyInstance();\n },\n get myApplication() {\n return appManager.getMyApplication();\n },\n\n onInstanceStarted: appManager.onInstanceStarted,\n onInstanceStopped: appManager.onInstanceStopped,\n onInstanceUpdated: appManager.onInstanceUpdated,\n onInstanceStartFailed: appManager.onInstanceStartFailed,\n\n getRegion: entitlements.getRegion,\n getBranches: entitlements.getBranches,\n getCurrentBranch: entitlements.getCurrentBranch,\n getFunctionalEntitlement: entitlements.getFunctionalEntitlement,\n getFunctionalEntitlementBranch: entitlements.getFunctionalEntitlementBranch,\n\n setCurrentBranch: entitlements.setCurrentBranch,\n setRegion: entitlements.setRegion,\n\n currentUser: entitlements.currentUser,\n\n canI: entitlements.canI,\n canIBranch: entitlements.canIBranch,\n\n onBranchesChanged: entitlements.onBranchesChanged,\n\n exit: entitlements.exit,\n restart: entitlements.restart,\n\n onShuttingDown: entitlements.onShuttingDown,\n\n inMemory: new InMemoryStore(agm)\n };\n\n return api;\n};\n","import * as AgmNames from \"./const/agm-names\";\nimport { objectValues } from \"./helper\";\nimport AppManagerImpl from \"./app-manager\";\nimport { Configuration, GetApplicationsMethodResult } from \"./types\";\nimport { IOConnectDesktop } from \"../../desktop\";\n\n/** Retrieves application snapshot from ACS */\nexport default function snapshot(interop: IOConnectDesktop.Interop.API, appManager: AppManagerImpl): Promise<Configuration> {\n return new Promise<Configuration>((resolve, reject) => {\n interop.invoke<GetApplicationsMethodResult>(AgmNames.GetApplicationsMethodName, { skipIcon: true })\n .then((response) => {\n const data = response.returned;\n const configuration = response.returned.configuration ?? {};\n if (!data) {\n resolve(configuration);\n }\n\n const applications = data.applications;\n if (!applications) {\n resolve(configuration);\n }\n\n objectValues(applications).map((item) => appManager.handleAppAdded(item));\n\n resolve(configuration);\n })\n .catch((err: Error) => reject(`Error getting application snapshot: ${err.message}`));\n });\n}\n","import * as AgmNames from \"./const/agm-names\";\nimport * as EventNames from \"./const/event-names\";\nimport { objectValues } from \"./helper\";\nimport { IOConnectDesktop } from \"../../desktop\";\nimport { AppProps, Configuration, InstanceProps } from \"./types\";\nimport AppManagerImpl from \"./app-manager\";\nimport EntitlementsImpl from \"./entitlements\";\n\n/** Subscribe for the AGM stream published by ACS and distributes events to applications and instances components */\nexport default function createDataSubscription(agm: IOConnectDesktop.Interop.API, applications: AppManagerImpl, entitlements: EntitlementsImpl, skipIcons: boolean) {\n let subscription: IOConnectDesktop.Interop.Subscription;\n let initiated = false;\n const start = () => {\n let resolveFunc: (config: Configuration) => void;\n let rejectFunc: (error?: any) => void;\n\n const resultPromise = new Promise<Configuration>((resolve, reject) => {\n resolveFunc = resolve;\n rejectFunc = reject;\n });\n\n agm.subscribe(AgmNames.OnEventMethodName, { arguments: { skipIcon: skipIcons }, waitTimeoutMs: 10000 })\n .then((s) => {\n subscription = s;\n subscription.onData((streamData: IOConnectDesktop.Interop.StreamData) => {\n const events: any = streamData.data;\n const configuration = events.configuration ?? {};\n\n const onApplicationAddedEventArgs: AppProps[] = objectValues(events[EventNames.OnApplicationAddedEvent]);\n if (streamData.data.isSnapshot) {\n applications.handleSnapshotAppsAdded(onApplicationAddedEventArgs);\n } else {\n onApplicationAddedEventArgs.forEach((item: AppProps) => applications.handleAppAdded(item));\n }\n\n objectValues(events[EventNames.OnApplicationChangedEvent])\n .forEach((item: AppProps) => applications.handleAppUpdated(item));\n\n objectValues(events[EventNames.OnApplicationRemovedEvent])\n .forEach((item: AppProps) => applications.handleAppRemoved(item));\n\n objectValues(events[EventNames.OnApplicationReadyEvent])\n .forEach((item: AppProps) => applications.handleAppReady(item));\n\n const onApplicationStartedEventArgs: InstanceProps[] = objectValues(events[EventNames.OnApplicationStartedEvent]);\n\n if (streamData.data.isSnapshot) {\n applications.handleSnapshotInstanceStarted(onApplicationStartedEventArgs);\n } else {\n onApplicationStartedEventArgs.forEach((item: InstanceProps) => applications.handleInstanceStarted(item));\n }\n\n objectValues(events[EventNames.OnApplicationStartFailedEvent])\n .forEach((item: InstanceProps) => applications.handleInstanceStartFailed(item));\n\n objectValues(events[EventNames.OnApplicationStoppedEvent])\n .forEach((item: InstanceProps) => applications.handleInstanceStopped(item));\n\n objectValues(events[EventNames.OnApplicationUpdatedEvent])\n .forEach((item: InstanceProps) => applications.handleInstanceUpdated(item));\n\n objectValues(events[EventNames.OnApplicationAgmServerReadyEvent])\n .forEach((item: InstanceProps) => applications.handleInstanceAgmServerReady(item));\n\n objectValues(events[EventNames.OnBranchChangedEvent])\n .forEach((item: IOConnectDesktop.AppManager.Branch) => entitlements.handleBranchModified(item));\n\n objectValues(events[EventNames.OnBranchesModifiedEvent])\n .forEach((item: IOConnectDesktop.AppManager.Branch[]) => entitlements.handleBranchesModified(item));\n\n if (!initiated) {\n initiated = true;\n const hasMyAppInSnapShot = onApplicationAddedEventArgs.some((a) => a.Name === agm.instance.application);\n const hasMyInstanceInSnapShot = onApplicationStartedEventArgs.some((i) => i.Id === agm.instance.instance);\n if (hasMyAppInSnapShot) {\n if (hasMyInstanceInSnapShot) {\n resolveFunc(configuration);\n } else {\n const un = applications.onInstanceStarted((i) => {\n if (i.id === agm.instance.instance) {\n un();\n resolveFunc(configuration);\n }\n });\n }\n } else {\n resolveFunc(configuration);\n }\n }\n });\n\n subscription.onFailed((err: any) => rejectFunc(err));\n\n })\n .catch((err: Error) => rejectFunc(`Error subscribing for ${AgmNames.OnEventMethodName} stream. Err: ${err.message ?? JSON.stringify(err)}`));\n\n return resultPromise;\n };\n\n const stop = () => {\n if (subscription) {\n subscription.close();\n }\n };\n\n return {\n start,\n stop\n };\n}\n","'use strict';\n\n// Found this seed-based random generator somewhere\n// Based on The Central Randomizer 1.3 (C) 1997 by Paul Houle (houle@msc.cornell.edu)\n\nvar seed = 1;\n\n/**\n * return a random number based on a seed\n * @param seed\n * @returns {number}\n */\nfunction getNextValue() {\n seed = (seed * 9301 + 49297) % 233280;\n return seed/(233280.0);\n}\n\nfunction setSeed(_seed_) {\n seed = _seed_;\n}\n\nmodule.exports = {\n nextValue: getNextValue,\n seed: setSeed\n};\n","'use strict';\n\nvar randomFromSeed = require('./random/random-from-seed');\n\nvar ORIGINAL = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-';\nvar alphabet;\nvar previousSeed;\n\nvar shuffled;\n\nfunction reset() {\n shuffled = false;\n}\n\nfunction setCharacters(_alphabet_) {\n if (!_alphabet_) {\n if (alphabet !== ORIGINAL) {\n alphabet = ORIGINAL;\n reset();\n }\n return;\n }\n\n if (_alphabet_ === alphabet) {\n return;\n }\n\n if (_alphabet_.length !== ORIGINAL.length) {\n throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. You submitted ' + _alphabet_.length + ' characters: ' + _alphabet_);\n }\n\n var unique = _alphabet_.split('').filter(function(item, ind, arr){\n return ind !== arr.lastIndexOf(item);\n });\n\n if (unique.length) {\n throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. These characters were not unique: ' + unique.join(', '));\n }\n\n alphabet = _alphabet_;\n reset();\n}\n\nfunction characters(_alphabet_) {\n setCharacters(_alphabet_);\n return alphabet;\n}\n\nfunction setSeed(seed) {\n randomFromSeed.seed(seed);\n if (previousSeed !== seed) {\n reset();\n previousSeed = seed;\n }\n}\n\nfunction shuffle() {\n if (!alphabet) {\n setCharacters(ORIGINAL);\n }\n\n var sourceArray = alphabet.split('');\n var targetArray = [];\n var r = randomFromSeed.nextValue();\n var characterIndex;\n\n while (sourceArray.length > 0) {\n r = randomFromSeed.nextValue();\n characterIndex = Math.floor(r * sourceArray.length);\n targetArray.push(sourceArray.splice(characterIndex, 1)[0]);\n }\n return targetArray.join('');\n}\n\nfunction getShuffled() {\n if (shuffled) {\n return shuffled;\n }\n shuffled = shuffle();\n return shuffled;\n}\n\n/**\n * lookup shuffled letter\n * @param index\n * @returns {string}\n */\nfunction lookup(index) {\n var alphabetShuffled = getShuffled();\n return alphabetShuffled[index];\n}\n\nmodule.exports = {\n characters: characters,\n seed: setSeed,\n lookup: lookup,\n shuffled: getShuffled\n};\n","'use strict';\n\nvar crypto = typeof window === 'object' && (window.crypto || window.msCrypto); // IE 11 uses window.msCrypto\n\nfunction randomByte() {\n if (!crypto || !crypto.getRandomValues) {\n return Math.floor(Math.random() * 256) & 0x30;\n }\n var dest = new Uint8Array(1);\n crypto.getRandomValues(dest);\n return dest[0] & 0x30;\n}\n\nmodule.exports = randomByte;\n","'use strict';\n\nvar randomByte = require('./random/random-byte');\n\nfunction encode(lookup, number) {\n var loopCounter = 0;\n var done;\n\n var str = '';\n\n while (!done) {\n str = str + lookup( ( (number >> (4 * loopCounter)) & 0x0f ) | randomByte() );\n done = number < (Math.pow(16, loopCounter + 1 ) );\n loopCounter++;\n }\n return str;\n}\n\nmodule.exports = encode;\n","'use strict';\nvar alphabet = require('./alphabet');\n\n/**\n * Decode the id to get the version and worker\n * Mainly for debugging and testing.\n * @param id - the shortid-generated id.\n */\nfunction decode(id) {\n var characters = alphabet.shuffled();\n return {\n version: characters.indexOf(id.substr(0, 1)) & 0x0f,\n worker: characters.indexOf(id.substr(1, 1)) & 0x0f\n };\n}\n\nmodule.exports = decode;\n","'use strict';\n\nvar encode = require('./encode');\nvar alphabet = require('./alphabet');\n\n// Ignore all milliseconds before a certain time to reduce the size of the date entropy without sacrificing uniqueness.\n// This number should be updated every year or so to keep the generated id short.\n// To regenerate `new Date() - 0` and bump the version. Always bump the version!\nvar REDUCE_TIME = 1459707606518;\n\n// don't change unless we change the algos or REDUCE_TIME\n// must be an integer and less than 16\nvar version = 6;\n\n// Counter is used when shortid is called multiple times in one second.\nvar counter;\n\n// Remember the last time shortid was called in case counter is needed.\nvar previousSeconds;\n\n/**\n * Generate unique id\n * Returns string id\n */\nfunction build(clusterWorkerId) {\n\n var str = '';\n\n var seconds = Math.floor((Date.now() - REDUCE_TIME) * 0.001);\n\n if (seconds === previousSeconds) {\n counter++;\n } else {\n counter = 0;\n previousSeconds = seconds;\n }\n\n str = str + encode(alphabet.lookup, version);\n str = str + encode(alphabet.lookup, clusterWorkerId);\n if (counter > 0) {\n str = str + encode(alphabet.lookup, counter);\n }\n str = str + encode(alphabet.lookup, seconds);\n\n return str;\n}\n\nmodule.exports = build;\n","'use strict';\nvar alphabet = require('./alphabet');\n\nfunction isShortId(id) {\n if (!id || typeof id !== 'string' || id.length < 6 ) {\n return false;\n }\n\n var characters = alphabet.characters();\n var len = id.length;\n for(var i = 0; i < len;i++) {\n if (characters.indexOf(id[i]) === -1) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = isShortId;\n","'use strict';\n\nvar alphabet = require('./alphabet');\nvar encode = require('./encode');\nvar decode = require('./decode');\nvar build = require('./build');\nvar isValid = require('./is-valid');\n\n// if you are using cluster or multiple servers use this to make each instance\n// has a unique value for worker\n// Note: I don't know if this is automatically set when using third\n// party cluster solutions such as pm2.\nvar clusterWorkerId = require('./util/cluster-worker-id') || 0;\n\n/**\n * Set the seed.\n * Highly recommended if you don't want people to try to figure out your id schema.\n * exposed as shortid.seed(int)\n * @param seed Integer value to seed the random alphabet. ALWAYS USE THE SAME SEED or you might get overlaps.\n */\nfunction seed(seedValue) {\n alphabet.seed(seedValue);\n return module.exports;\n}\n\n/**\n * Set the cluster worker or machine id\n * exposed as shortid.worker(int)\n * @param workerId worker must be positive integer. Number less than 16 is recommended.\n * returns shortid module so it can be chained.\n */\nfunction worker(workerId) {\n clusterWorkerId = workerId;\n return module.exports;\n}\n\n/**\n *\n * sets new characters to use in the alphabet\n * returns the shuffled alphabet\n */\nfunction characters(newCharacters) {\n if (newCharacters !== undefined) {\n alphabet.characters(newCharacters);\n }\n\n return alphabet.shuffled();\n}\n\n/**\n * Generate unique id\n * Returns string id\n */\nfunction generate() {\n return build(clusterWorkerId);\n}\n\n// Export all other functions as properties of the generate function\nmodule.exports = generate;\nmodule.exports.generate = generate;\nmodule.exports.seed = seed;\nmodule.exports.worker = worker;\nmodule.exports.characters = characters;\nmodule.exports.decode = decode;\nmodule.exports.isValid = isValid;\n","'use strict';\nmodule.exports = require('./lib/index');\n","import shortid from \"shortid\";\nimport { IOConnectDesktop } from \"../../../desktop\";\nimport { Executor, JumpListUpdateActionSettings, JumpListUpdateSettings, JumpListSettingsInternal } from \"../types\";\n\nconst T42JumpListAction = \"T42.JumpList.Action\";\n\nexport interface ActionCallback {\n callbackId: string;\n callback: () => Promise<void>;\n}\n\nexport class JumpListManager {\n\n private _executor: Executor;\n private _agm: IOConnectDesktop.AGM.API;\n private _logger: IOConnectDesktop.Logger.API;\n private _groupActionCallbacks: Map<string, ActionCallback[]> = new Map<string, ActionCallback[]>();\n private _registered = false;\n\n public init(executor: Executor, agm: IOConnectDesktop.AGM.API, logger: IOConnectDesktop.Logger.API) {\n this._executor = executor;\n this._agm = agm;\n this._logger = logger;\n\n this.registerCallbackMethod();\n }\n\n public setEnabled(windowId: string, enabled: boolean): Promise<void> {\n const settings: JumpListUpdateSettings = {\n enabled\n };\n\n return this._executor.updateJumpList(windowId, settings);\n }\n\n public createCategory(windowId: string, title: string, actions: IOConnectDesktop.Windows.JumpListActionSettings[]): Promise<void> {\n this.validateActions(title, actions);\n const settings: JumpListUpdateSettings = {\n category: {\n title,\n operation: \"create\",\n actions: this.toUpdateActions(windowId, \"create\", title, actions)\n }\n };\n\n return this._executor.updateJumpList(windowId, settings);\n }\n\n public removeCategory(windowId: string, title: string) {\n const settings: JumpListUpdateSettings = {\n category: {\n title,\n operation: \"remove\",\n actions: []\n }\n };\n\n this.manageActionCallback(windowId, settings.category.operation, title);\n\n return this._executor.updateJumpList(windowId, settings);\n }\n\n public createActions(windowId: string, categoryTitle: string, actions: IOConnectDesktop.Windows.JumpListActionSettings[]): Promise<void> {\n this.validateActions(categoryTitle, actions);\n const settings: JumpListUpdateSettings = {\n category: {\n title: categoryTitle,\n operation: \"update\",\n actions: this.toUpdateActions(windowId, \"create\", categoryTitle, actions)\n }\n };\n\n return this._executor.updateJumpList(windowId, settings);\n }\n\n public removeActions(windowId: string, categoryTitle: string, actions: IOConnectDesktop.Windows.JumpListActionSettings[]): Promise<void> {\n const settings: JumpListUpdateSettings = {\n category: {\n title: categoryTitle,\n operation: \"update\",\n actions: this.toUpdateActions(windowId, \"remove\", categoryTitle, actions)\n }\n };\n\n return this._executor.updateJumpList(windowId, settings);\n }\n\n public async getActions(windowId: string, catgoryTitle: string): Promise<IOConnectDesktop.Windows.JumpListActionSettings[]> {\n const actions: IOConnectDesktop.Windows.JumpListActionSettings[] = [];\n const configuration = await this.getJumpListSettings(windowId);\n const currentCategory = configuration.categories.find((category) => category.title === catgoryTitle);\n if (currentCategory) {\n currentCategory.actions.forEach((action) => {\n const actionCallback = this.getActionCallback(action.callbackId);\n if (actionCallback) {\n action.callback = actionCallback.callback;\n }\n actions.push({\n icon: action.icon,\n callback: action.callback,\n singleInstanceTitle: action.singleInstanceTitle,\n multiInstanceTitle: action.multiInstanceTitle\n } as IOConnectDesktop.Windows.JumpListActionSettings);\n });\n }\n return Promise.resolve(actions);\n }\n\n public getJumpListSettings(windowId: string): Promise<JumpListSettingsInternal> {\n return this._executor.getJumpList(windowId);\n }\n\n private toUpdateActions(windowId: string, operation: string, categoryTitle: string, actions: IOConnectDesktop.Windows.JumpListActionSettings[]): JumpListUpdateActionSettings[] {\n return actions.map((action) => {\n const updateAction = {\n icon: action.icon,\n callback: action.callback,\n callbackId: shortid.generate(),\n singleInstanceTitle: action.singleInstanceTitle,\n multiInstanceTitle: action.multiInstanceTitle,\n operation\n } as JumpListUpdateActionSettings;\n\n this.manageActionCallback(windowId, operation, categoryTitle, updateAction);\n\n return updateAction;\n });\n }\n\n private manageActionCallback(windowId: string, operation: string, categoryTitle: string, updateAction?: JumpListUpdateActionSettings) {\n const groupCallbacksKey = `${categoryTitle}-${windowId}`;\n if (operation === \"create\") {\n if (!this._groupActionCallbacks.has(groupCallbacksKey)) {\n this._groupActionCallbacks.set(groupCallbacksKey, []);\n }\n\n const categoryActionCallbacks = this._groupActionCallbacks.get(groupCallbacksKey);\n categoryActionCallbacks.push({\n callbackId: updateAction.callbackId,\n callback: updateAction.callback\n });\n\n } else if (operation === \"remove\") {\n if (updateAction) {\n let categoryActionCallbacks = this._groupActionCallbacks.get(groupCallbacksKey) ?? [];\n categoryActionCallbacks = categoryActionCallbacks.filter((accCal) => accCal.callbackId !== updateAction.callbackId);\n if (categoryActionCallbacks.length === 0) {\n this._groupActionCallbacks.delete(groupCallbacksKey);\n } else {\n this._groupActionCallbacks.set(groupCallbacksKey, categoryActionCallbacks);\n }\n } else {\n this._groupActionCallbacks.delete(groupCallbacksKey);\n }\n }\n }\n\n private registerCallbackMethod() {\n if (this._registered) {\n return;\n }\n this._registered = true;\n\n try {\n this._agm.register(T42JumpListAction, (args: any, caller: any) => {\n const actionCallback = this.getActionCallback(args.callbackId);\n if (actionCallback) {\n try {\n actionCallback.callback();\n } catch (e) {\n this._logger.error(\"Unable to execute user callback for jump list action!\", e);\n }\n }\n });\n } catch (e) {\n this._logger.error(`Unable to register method ${T42JumpListAction} for invoking jump list action callbacks!`, e);\n return Promise.reject(e);\n }\n }\n\n private getActionCallback(callbackId: string): ActionCallback {\n let callbackAction: ActionCallback;\n [...this._groupActionCallbacks.values()].forEach((callbacks: ActionCallback[]) => {\n const callback = callbacks.find((cal) => cal.callbackId === callbackId);\n if (callback) {\n callbackAction = callback;\n }\n });\n return callbackAction;\n }\n\n private validateActions(category: string, actions: IOConnectDesktop.Windows.JumpListActionSettings[]) {\n if (!(actions && actions.length > 0)) {\n throw new Error(`Category '${category}' doesn't contain any actions!`);\n }\n\n actions.forEach((action) => {\n if (!action.singleInstanceTitle) {\n throw new Error(`Category '${category}' contains an action with undefined singleInstanceTitle!`);\n }\n if (!action.multiInstanceTitle) {\n throw new Error(`Category '${category}' contains an action with undefined multiInstanceTitle!`);\n }\n if (!action.callback) {\n throw new Error(`Category '${category}' contains an action with undefined callback function!`);\n }\n });\n }\n}\n\nexport default new JumpListManager();\n","import { CallbackRegistry, UnsubscribeFunction, default as CallbackFactory } from \"callback-registry\";\nimport { PendingWindowState, WindowWrapper } from \"./types\";\nimport { IOConnectDesktop } from \"../../desktop\";\n\nexport class WindowStore {\n private readonly waitForTimeoutInMilliseconds: number = 60000;\n private _windows: { [key: string]: WindowWrapper } = {};\n private _pendingWindows: { [key: string]: WindowWrapper } = {};\n private _pendingWindowsStates: { [key: string]: PendingWindowState } = {};\n private _registry: CallbackRegistry;\n private _logger: IOConnectDesktop.Logger.API;\n\n constructor() {\n this._registry = CallbackFactory();\n }\n\n public init(logger: IOConnectDesktop.Logger.API) {\n this._logger = logger;\n }\n\n // Returns a window which either in Ready OR NOT 'ready' state (when the window is NOT marked with readyToShow)\n public get(id: string): WindowWrapper {\n return this._windows[id] || this._pendingWindows[id];\n }\n\n // Returns a window which is in 'ready' state (when the window is marked with readyToShow)\n public getIfReady(id: string): WindowWrapper {\n return this._windows[id];\n }\n\n public get list(): { [key: string]: WindowWrapper } {\n return this._windows;\n }\n\n public add(window: WindowWrapper) {\n const isExist = this._pendingWindows[window.API.id] ? true : false;\n if (isExist) {\n this._logger.error(`trying to add window with id ${window.API.id} from windowStore, which already exists`);\n return;\n }\n const remote = window.API.windowType === \"remote\";\n this._pendingWindows[window.API.id] = window;\n this._pendingWindowsStates[window.API.id] = {\n ready: false,\n urlChanged: remote, // remote windows don't have url events\n };\n\n this._registry.execute(\"on-added\", window);\n }\n\n public remove(window: WindowWrapper) {\n delete this._windows[window.API.id];\n delete this._pendingWindows[window.API.id];\n delete this._pendingWindowsStates[window.API.id];\n this._registry.execute(\"on-removed\", window);\n }\n\n public setReadyState(windowId: string) {\n const targetWindowState = this._pendingWindowsStates[windowId];\n\n if (typeof targetWindowState === \"undefined\") {\n return;\n }\n\n targetWindowState.ready = true;\n\n if (targetWindowState.urlChanged) {\n this.markReadyToShow(windowId);\n }\n }\n\n public setUrlChangedState(windowId: string) {\n const targetWindowState = this._pendingWindowsStates[windowId];\n\n if (typeof targetWindowState === \"undefined\") {\n return;\n }\n\n targetWindowState.urlChanged = true;\n\n if (targetWindowState.ready) {\n this.markReadyToShow(windowId);\n }\n }\n\n public setCompositionChangedState(windowId: string, windowAvailableOnURLChanged: boolean) {\n // returning window obj earlier than urlChanged, if windowAvailableOnURLChanged is missing a value (older versions of GlueDesktop), the window obj is returned on URL changed\n const targetWindowState = this._pendingWindowsStates[windowId];\n\n if (typeof targetWindowState === \"undefined\") {\n return;\n }\n\n if (windowAvailableOnURLChanged === false) {\n this.markReadyToShow(windowId);\n }\n }\n\n public waitFor(id: string): Promise<WindowWrapper> {\n return new Promise((resolve, reject) => {\n\n let un: UnsubscribeFunction;\n\n const timeout = setTimeout(() => {\n un();\n reject(\"waitFor timed out.\");\n }, this.waitForTimeoutInMilliseconds);\n\n const win = this._windows[id];\n if (win) {\n clearTimeout(timeout);\n resolve(win);\n } else {\n un = this.onReadyWindow((w: WindowWrapper) => {\n if (w.API.id !== id) {\n return;\n }\n clearTimeout(timeout);\n un();\n resolve(w);\n });\n }\n });\n }\n\n public onReadyWindow(callback: (win: WindowWrapper) => void): UnsubscribeFunction {\n return this._registry.add(\"on-ready\", callback);\n }\n\n public onAdded(callback: (win: WindowWrapper) => void): UnsubscribeFunction {\n return this._registry.add(\"on-added\", callback);\n }\n\n public onRemoved(callback: (win: WindowWrapper) => void): UnsubscribeFunction {\n return this._registry.add(\"on-removed\", callback);\n }\n\n // newly created windows now need to hear both \"ready\" and \"urlChanged\" events in otder to be markedReadyToShow\n public markReadyToShow(windowId: string) {\n if (this._pendingWindows[windowId]) {\n this._windows[windowId] = this._pendingWindows[windowId];\n delete this._pendingWindows[windowId];\n delete this._pendingWindowsStates[windowId];\n }\n\n this._registry.execute(\"on-ready\", this._windows[windowId]);\n }\n}\n\nexport default new WindowStore();\n","import { IOConnectDesktop } from \"../desktop\";\n\nexport default class Utils {\n public static getGDMajorVersion() {\n if (typeof window === \"undefined\") {\n return -1;\n }\n if (!window.glueDesktop) {\n return -1;\n }\n if (!window.glueDesktop.version) {\n return -1;\n }\n const ver = Number(window.glueDesktop.version.substr(0, 1));\n return isNaN(ver) ? -1 : ver;\n }\n\n public static callbackifyPromise<T>(\n action: () => Promise<T>,\n successCallback?: (args?: T) => void,\n errorCallback?: (errorMessage: string) => void): Promise<T> {\n\n const fail = (error: any) => {\n let msg = error;\n if (error instanceof Error) {\n msg = error.message;\n }\n if (typeof errorCallback === \"function\") {\n errorCallback(msg);\n return;\n }\n\n return Promise.reject(msg);\n };\n\n try {\n return action()\n .then((result) => {\n if (typeof successCallback === \"function\") {\n successCallback(result);\n }\n return result;\n })\n .catch((error) => {\n return fail(error);\n });\n } catch (err) {\n return fail(err);\n }\n }\n\n public static getMonitor(bounds: IOConnectDesktop.Windows.Bounds, displays?: IOConnectDesktop.Screen[]): IOConnectDesktop.Screen {\n const monitorsSortedByOverlap = displays.map((m) => {\n const { left, top, workingAreaWidth: width, workingAreaHeight: height } = m;\n const overlap = this.calculateTotalOverlap({ left, top, width, height }, bounds);\n return {\n monitor: m,\n totalOverlap: overlap\n };\n }).sort((a, b) => b.totalOverlap - a.totalOverlap);\n\n return monitorsSortedByOverlap[0].monitor;\n }\n\n public static getDisplayCenterOfScreen(a: Partial<IOConnectDesktop.Windows.Bounds>, currentDisplay: IOConnectDesktop.Displays.Display, primaryDisplay: IOConnectDesktop.Displays.Display) {\n const physicalWidth = a.width / currentDisplay.scaleFactor;\n const physicalHeight = a.height / currentDisplay.scaleFactor;\n const physicalDisplayLeft = currentDisplay.workArea.left / primaryDisplay.scaleFactor;\n const physicalDisplayTop = currentDisplay.workArea.top / primaryDisplay.scaleFactor;\n const physicalDisplayWidth = currentDisplay.workArea.width / currentDisplay.scaleFactor;\n const physicalDisplayHeight = currentDisplay.workArea.height / currentDisplay.scaleFactor;\n\n const physicalHOffset = Math.max((physicalDisplayWidth - physicalWidth) / 2, 0);\n const physicalVOffset = Math.max((physicalDisplayHeight - physicalHeight) / 2, 0);\n const centeredPhysicalLeft = Math.floor(physicalDisplayLeft + physicalHOffset);\n const centeredPhysicalTop = Math.floor(physicalDisplayTop + physicalVOffset);\n const left = centeredPhysicalLeft * primaryDisplay.scaleFactor;\n const top = centeredPhysicalTop * primaryDisplay.scaleFactor;\n\n return {\n left,\n top,\n width: a.width,\n height: a.height\n };\n }\n\n public static isNode() {\n if (typeof Utils._isNode !== \"undefined\") {\n return Utils._isNode;\n }\n\n if (typeof window !== \"undefined\") {\n Utils._isNode = false;\n return false;\n }\n\n // Only Node.JS has a process variable that is of [[Class]] process\n try {\n Utils._isNode = Object.prototype.toString.call(global.process) === \"[object process]\";\n } catch (e) {\n Utils._isNode = false;\n }\n return Utils._isNode;\n }\n\n private static _isNode?: boolean;\n\n private static calculateTotalOverlap(r1: IOConnectDesktop.Windows.Bounds, r2: IOConnectDesktop.Windows.Bounds) {\n const r1x = r1.left;\n const r1y = r1.top;\n const r1xMax = r1x + r1.width;\n const r1yMax = r1y + r1.height;\n\n const r2x = r2.left;\n const r2y = r2.top;\n const r2xMax = r2x + r2.width;\n const r2yMax = r2y + r2.height;\n\n const xOverlap = Math.max(0, Math.min(r1xMax, r2xMax) - Math.max(r1x, r2x));\n const yOverlap = Math.max(0, Math.min(r1yMax, r2yMax) - Math.max(r1y, r2y));\n\n return xOverlap * yOverlap;\n }\n}\n","import { IOConnectDesktop } from \"../../../desktop\";\nimport jumpListManager from \"./manager\";\n\nexport default class JumpListActions implements IOConnectDesktop.Windows.JumpListActionsAPI {\n\n private _categoryTitle: string;\n\n constructor(private windowId: string, configuration: IOConnectDesktop.Windows.JumpListCategorySettings) {\n this._categoryTitle = configuration.title;\n }\n\n public list(): Promise<IOConnectDesktop.Windows.JumpListActionSettings[]> {\n return jumpListManager.getActions(this.windowId, this._categoryTitle);\n }\n\n public create(actions: IOConnectDesktop.Windows.JumpListActionSettings[]): Promise<void> {\n return jumpListManager.createActions(this.windowId, this._categoryTitle, actions);\n }\n\n public remove(actions: IOConnectDesktop.Windows.JumpListActionSettings[]): Promise<void> {\n return jumpListManager.removeActions(this.windowId, this._categoryTitle, actions);\n }\n}\n","import { IOConnectDesktop } from \"../../../desktop\";\nimport JumpListActions from \"./actions\";\nimport jumpListManager from \"./manager\";\n\nexport default class JumpListCategories implements IOConnectDesktop.Windows.JumpListCategoriesAPI {\n\n constructor(private windowId: string) {\n }\n\n public list(): Promise<IOConnectDesktop.Windows.JumpListCategory[]> {\n return this.getCategories();\n }\n\n public create(title: string, actions: IOConnectDesktop.Windows.JumpListActionSettings[]): Promise<void> {\n return jumpListManager.createCategory(this.windowId, title, actions);\n }\n\n public remove(title: string): Promise<void> {\n return jumpListManager.removeCategory(this.windowId, title);\n }\n\n public async find(title: string): Promise<IOConnectDesktop.Windows.JumpListCategory> {\n const categories = await this.getCategories();\n return categories.find((cat) => cat.title === title);\n }\n\n private async getCategories(): Promise<IOConnectDesktop.Windows.JumpListCategory[]> {\n const result: IOConnectDesktop.Windows.JumpListCategory[] = [];\n\n const configuration = await jumpListManager.getJumpListSettings(this.windowId);\n configuration.categories.forEach((category) => {\n result.push({\n title: category.title,\n actions: new JumpListActions(this.windowId, category)\n });\n });\n return result;\n }\n}\n","import { IOConnectDesktop } from \"../../../desktop\";\nimport JumpListCategories from \"./categories\";\nimport jumpListManager from \"./manager\";\n\nexport default class JumpList implements IOConnectDesktop.Windows.JumpList {\n\n private _categories: IOConnectDesktop.Windows.JumpListCategoriesAPI;\n\n constructor(private windowId: string) {\n this._categories = new JumpListCategories(windowId);\n }\n\n get categories(): IOConnectDesktop.Windows.JumpListCategoriesAPI {\n return this._categories;\n }\n\n public async isEnabled(): Promise<boolean> {\n const configuration = await jumpListManager.getJumpListSettings(this.windowId);\n return configuration.enabled;\n }\n\n public setEnabled(enabled: boolean): Promise<void> {\n return jumpListManager.setEnabled(this.windowId, enabled);\n }\n}\n","import CallbackFactory, { Callback, CallbackRegistry, UnsubscribeFunction } from \"callback-registry\";\nimport { IOConnectDesktop } from \"../../desktop\";\nimport {\n Executor,\n FrameButton,\n Neighbours,\n WindowConstructorOptions,\n WindowEvents,\n WindowWrapper,\n FlashOptions,\n DetachTabOptions,\n FlashTabOptions,\n} from \"./types\";\nimport * as util from \"../activity/helpers/util\";\nimport utils from \"../utils\";\n\nimport { default as windowStore } from \"./store\";\nimport GDWindow = IOConnectDesktop.Windows.IOConnectWindow;\nimport { CompositionChangedData } from \"./environment/gd/types\";\nimport JumpList from \"./jumpList/main\";\n\nexport default (id: string, options: WindowConstructorOptions, executor: Executor, logger: IOConnectDesktop.Logger.API, appManagerGetter: () => IOConnectDesktop.AppManager.API, displayAPIGetter: () => IOConnectDesktop.Displays.API, channelsAPIGetter: () => IOConnectDesktop.Channels, agm: IOConnectDesktop.AGM.API): WindowWrapper => {\n const _registry: CallbackRegistry = CallbackFactory();\n const getChannels = () => {\n const channels = channelsAPIGetter();\n if (!channels) {\n throw new Error(`To use this method you need to enable channels API - set the channels property to true when initializing the Glue42 library`);\n }\n return channels;\n };\n\n const _id = id;\n const _name: string = options.name;\n const _mode: IOConnectDesktop.Windows.WindowMode = options.mode;\n let _bounds: IOConnectDesktop.Windows.Bounds = options.bounds;\n let _url: string = options.url;\n let _title: string = options.title;\n let _context: any = options.context ?? {};\n let _frameColor: string = options.frameColor;\n let _focus: boolean = options.focus;\n let _neighbours: Neighbours = options.neighbours ?? {};\n let _groupId: string = options.groupId;\n let _isGroupHeaderVisible: boolean = options.isGroupHeaderVisible;\n let _isTabHeaderVisible: boolean = options.isTabHeaderVisible;\n let _isTabSelected: boolean = options.isTabSelected ?? false;\n let _settings: IOConnectDesktop.Windows.WindowSettings = options.settings;\n const _applicationName = options.applicationName;\n\n // is Window visible\n let _isVisible: boolean = options.isVisible;\n\n // is Window sticky enable\n let _isSticky: boolean = options.isSticky;\n\n // Window state Collapsed | Expanded\n let _isCollapsed: boolean = options.isCollapsed;\n\n // Window state normal | maximized | minimized\n let _windowState: IOConnectDesktop.Windows.WindowState = options.state;\n\n // tabGroupId only for window with 'Tab' mode\n let _tabGroupId: string = options.tabGroupId;\n let _tabIndex: number = options.tabIndex;\n\n let _frameId: string = options.frameId;\n // window is locked or unlocked;\n let _isLocked: boolean = options.isLocked;\n\n let _group: IOConnectDesktop.Windows.Group;\n\n // Holding all frame buttons\n let _frameButtons: IOConnectDesktop.Windows.ButtonInfo[] = options.frameButtons ?? [];\n\n // Holding the current zoom factor\n let _zoomFactor = options.zoomFactor;\n\n let _placementSettings: IOConnectDesktop.Windows.PlacementSettings = options.placementSettings;\n\n const _jumpList: JumpList = new JumpList(id);\n\n // #region \"AGM methods\"\n function close(closeOptions?: IOConnectDesktop.Windows.CloseOptions): Promise<boolean>;\n function close(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow>;\n function close(cbOrOptions?: IOConnectDesktop.Windows.CloseOptions | ((window: IOConnectDesktop.Windows.IOConnectWindow) => void), error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow | boolean> {\n if (typeof cbOrOptions === \"undefined\" || typeof cbOrOptions === \"function\") {\n return utils.callbackifyPromise(() => {\n if (!id) {\n throw new Error(\"The window is already closed.\");\n }\n return executor.close(resultWindow);\n }, cbOrOptions, error);\n } else {\n return executor.close(resultWindow, cbOrOptions);\n }\n }\n\n function navigate(newUrl: string, loadURLOptions: IOConnectDesktop.Windows.LoadURLOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow>;\n function navigate(newUrl: string, success?: (window: GDWindow) => void, error?: (error: string) => void): Promise<GDWindow>;\n function navigate(newUrl: string, optionsOrCallback: IOConnectDesktop.Windows.LoadURLOptions | ((window: IOConnectDesktop.Windows.IOConnectWindow) => void), error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n if (typeof optionsOrCallback === \"function\") {\n return utils.callbackifyPromise(() => {\n if (util.isNullOrWhiteSpace(newUrl)) {\n throw new Error(\"The new URL must be a non-empty string.\");\n }\n return executor.navigate(resultWindow, newUrl);\n }, optionsOrCallback, error);\n }\n if (util.isNullOrWhiteSpace(newUrl)) {\n throw new Error(\"The new URL must be a non-empty string.\");\n }\n return executor.navigate(resultWindow, newUrl, optionsOrCallback);\n }\n\n function setStyle(style: IOConnectDesktop.Windows.WindowStyle, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (!style || Object.keys(style).length === 0 || Object.keys(style).every((key) => !key)) {\n throw new Error(\"Invalid style arguments: \" + JSON.stringify(style));\n }\n if (style && style.focus !== undefined) {\n if (typeof style.focus !== \"boolean\") {\n throw new Error(\"Focus must be a boolean value. Currently, only `focus: true` is supported.\");\n } else if (style.focus === false) {\n // eslint-disable-next-line no-console\n console.warn(\"`focus: false` is not supported!\");\n }\n }\n if (style && style.hidden !== undefined && typeof style.hidden !== \"boolean\") {\n throw new Error(\"The `hidden` property must hold a boolean value.\");\n }\n for (const prop of [\"minHeight\", \"maxHeight\", \"minWidth\", \"maxWidth\"]) {\n const styleAsAny = style as any;\n const value = styleAsAny[prop];\n if (prop in style) {\n if (util.isUndefinedOrNull(value)) {\n delete styleAsAny[prop];\n continue;\n }\n if (!util.isNumber(styleAsAny[prop])) {\n throw new Error(`\"${prop}\" must be a number`);\n }\n }\n }\n return executor.setStyle(resultWindow, style);\n }, success, error);\n }\n\n function resetButtons(buttons: IOConnectDesktop.Windows.WindowButtons, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(\n () => executor.resetButtons(resultWindow, buttons),\n success,\n error\n );\n }\n\n function getButtons(): Promise<IOConnectDesktop.Windows.WindowButtons> {\n return executor.getButtons(resultWindow);\n }\n\n function setOnTop(onTop: boolean | \"always\", success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (typeof onTop === \"string\") {\n if (onTop !== \"always\") {\n throw new Error(\"`onTop` must hold a `always` value.\");\n }\n } else if (typeof onTop !== \"boolean\") {\n throw new Error(\"`onTop` must hold a boolean or `always` value.\");\n }\n return executor.setOnTop(resultWindow, onTop);\n }, success, error);\n }\n\n function setSizeConstraints(constraints: IOConnectDesktop.Windows.SizeConstraints, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (!constraints || Object.keys(constraints).every((value) => value === undefined)) {\n throw new Error(\"The properties of `constraints` cannot be null or undefined.\");\n }\n return executor.setSizeConstraints(resultWindow, constraints);\n }, success, error);\n }\n\n function getSizeConstraints(): Promise<IOConnectDesktop.Windows.SizeConstraints> {\n return executor.getSizeConstraints(resultWindow);\n }\n\n function setTitle(newTitle: string, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (util.isUndefinedOrNull(newTitle)) {\n throw new Error(\"`newTitle` must not be null or undefined.\");\n }\n if (newTitle === _title) {\n return Promise.resolve(resultWindow);\n }\n return executor.setTitle(resultWindow, newTitle);\n }, success, error);\n }\n\n function setSticky(isSticky: boolean, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (typeof isSticky !== \"boolean\") {\n throw new Error(\"`isSticky` must hold a boolean value.\");\n }\n return executor.setSticky(resultWindow, isSticky);\n }, success, error);\n }\n\n function moveResize(bounds: Partial<IOConnectDesktop.Windows.Bounds>, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (util.isUndefinedOrNull(bounds)) {\n throw new Error(\"The properties of `bounds` cannot be null or undefined.\");\n }\n return executor.moveResize(resultWindow, bounds);\n }, success, error);\n }\n\n function addFrameButton(buttonInfo: IOConnectDesktop.Windows.ButtonInfo, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (typeof buttonInfo === \"undefined\" || Object.keys(buttonInfo).length === 0) {\n throw new Error(\"Button info is not available.\");\n }\n if (util.isNullOrWhiteSpace(buttonInfo.buttonId)) {\n throw new Error(\"`buttonId` must not be null or undefined.\");\n }\n if (util.isNullOrWhiteSpace(buttonInfo.imageBase64)) {\n throw new Error(\"`imageBase64` must not be null or undefined.\");\n }\n return executor.addFrameButton(resultWindow, buttonInfo);\n }, success, error);\n }\n\n function removeFrameButton(buttonId: string, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (util.isNullOrWhiteSpace(buttonId)) {\n throw new Error(\"`buttonId` must not be null or undefined.\");\n }\n return executor.removeFrameButton(resultWindow, buttonId);\n }, success, error);\n }\n\n function activate(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (_focus) {\n return Promise.resolve(resultWindow);\n }\n return executor.activate(resultWindow);\n }, success, error);\n }\n\n function focus(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (_focus) {\n return Promise.resolve(resultWindow);\n }\n return executor.focus(resultWindow);\n }, success, error);\n }\n\n function maximizeRestore(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n return executor.maximizeRestore(resultWindow);\n }, success, error);\n }\n\n function maximize(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (_windowState === \"maximized\") {\n return Promise.resolve(resultWindow);\n }\n return executor.maximize(resultWindow);\n }, success, error);\n }\n\n function restore(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (_windowState === \"normal\") {\n return Promise.resolve(resultWindow);\n }\n return executor.restore(resultWindow);\n }, success, error);\n }\n\n function minimize(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (_windowState === \"minimized\") {\n return Promise.resolve(resultWindow);\n }\n return executor.minimize(resultWindow);\n }, success, error);\n }\n\n function collapse(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (_isCollapsed) {\n return Promise.resolve(resultWindow);\n }\n return executor.collapse(resultWindow);\n }, success, error);\n }\n\n function expand(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (!_isCollapsed) {\n return Promise.resolve(resultWindow);\n }\n return executor.expand(resultWindow);\n }, success, error);\n }\n\n function toggleCollapse(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n return executor.toggleCollapse(resultWindow);\n }, success, error);\n }\n\n function snap(target: string | IOConnectDesktop.Windows.IOConnectWindow, direction: IOConnectDesktop.Windows.RelativeDirection, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow>;\n function snap(target: string | IOConnectDesktop.Windows.IOConnectWindow, snappingOptions: IOConnectDesktop.Windows.SnappingOptions, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow>;\n function snap(target: string | IOConnectDesktop.Windows.IOConnectWindow, direction: IOConnectDesktop.Windows.RelativeDirection | IOConnectDesktop.Windows.SnappingOptions, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (util.isUndefinedOrNull(target)) {\n throw new Error(`A target window is not specified - ${typeof target === \"string\" ? target : JSON.stringify(target)}`);\n }\n\n if (typeof target === \"string\") {\n const win = windowStore.get(target);\n if (!win) {\n throw new Error(`Invalid \"target\" parameter or no such window. Invoked with: ${target}`);\n }\n target = win.API;\n }\n if (typeof direction === \"string\") {\n direction = {\n direction,\n autoAlign: true\n };\n }\n return executor.snap(resultWindow, target, direction);\n }, success, error);\n }\n\n function attachTab(tab: IOConnectDesktop.Windows.IOConnectWindow | string, opt: number | IOConnectDesktop.Windows.AttachOptions, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n const errorMessage = `Invalid \"tab\" parameter - must be an object with an \"id\" property or a string. Invoked for source window with ID:`;\n if (util.isUndefinedOrNull(tab)) {\n const errMsg = `${errorMessage} ${typeof tab === \"string\" ? tab : JSON.stringify(tab)}`;\n throw new Error(errMsg);\n }\n // tab === sourceWindow\n let sourceWindow;\n if (typeof tab === \"string\") {\n sourceWindow = windowStore.get(tab)?.API;\n if (util.isUndefinedOrNull(sourceWindow)) {\n const errMsg = `${errorMessage} ${typeof sourceWindow === \"string\" ? sourceWindow : JSON.stringify(sourceWindow)}`;\n throw new Error(errMsg);\n }\n } else if (!util.isUndefinedOrNull(tab.id)) {\n sourceWindow = tab;\n } else {\n throw new Error(errorMessage);\n }\n const attachOptions: IOConnectDesktop.Windows.AttachOptions = {};\n if (!util.isUndefinedOrNull(opt)) {\n if (typeof opt === \"number\") {\n attachOptions.index = opt;\n } else {\n attachOptions.selected = opt.selected;\n attachOptions.index = opt.index;\n }\n }\n\n return executor.attachTab(resultWindow, sourceWindow, attachOptions);\n }, success, error);\n }\n\n function detachTab(opt: IOConnectDesktop.Windows.DetachOptions = {}, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n const argsForSend: DetachTabOptions = {};\n function isDetachRelative(o: IOConnectDesktop.Windows.DetachOptions) {\n return o.relativeTo !== undefined;\n }\n if (isDetachRelative(opt)) {\n if (typeof opt.relativeTo === \"string\") {\n argsForSend.relativeTo = opt.relativeTo;\n } else if (!util.isUndefinedOrNull(opt.relativeTo.id)) {\n argsForSend.relativeTo = opt.relativeTo.id;\n }\n if (!util.isUndefinedOrNull(opt.relativeDirection)) {\n argsForSend.relativeDirection = opt.relativeDirection;\n }\n if (!util.isUndefinedOrNull(opt.width)) {\n argsForSend.width = opt.width;\n }\n if (!util.isUndefinedOrNull(opt.height)) {\n argsForSend.height = opt.height;\n }\n } else {\n if (!util.isUndefinedOrNull(opt.bounds)) {\n argsForSend.bounds = opt.bounds;\n }\n }\n if (!util.isUndefinedOrNull(opt.hideTabHeader)) {\n argsForSend.hideTabHeader = opt.hideTabHeader;\n }\n return executor.detachTab(resultWindow, argsForSend);\n }, success, error);\n }\n\n function setVisible(toBeVisible?: boolean, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n return executor.setVisible(resultWindow, toBeVisible);\n }, success, error);\n }\n\n async function center(display?: IOConnectDesktop.Displays.Display) {\n if (display) {\n validateCenterArguments(display);\n }\n return executor.center(resultWindow, display);\n }\n\n function validateCenterArguments(display?: IOConnectDesktop.Displays.Display) {\n if (typeof display !== \"object\") {\n throw Error(\"display argument must be a valid display object\");\n }\n if (!display.workArea || !display.scaleFactor) {\n throw Error(\"display argument is not a valid display object\");\n }\n }\n function showLoader(loader?: IOConnectDesktop.Windows.Loader): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return executor.showLoader(resultWindow, loader);\n }\n\n function hideLoader(): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return executor.hideLoader(resultWindow);\n }\n\n function updateContext(context: any, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (util.isUndefinedOrNull(context)) {\n throw new Error(`\"context\" must not be null or undefined.`);\n }\n\n return executor.updateContext(resultWindow, context, false);\n }, success, error);\n }\n\n function lock(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n return executor.lock(resultWindow);\n }, success, error);\n }\n\n function unlock(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n return executor.unlock(resultWindow);\n }, success, error);\n }\n\n function getIcon(success?: (icon: string) => void, error?: (error: string) => void): Promise<string> {\n return utils.callbackifyPromise(() => {\n return executor.getIcon(resultWindow);\n }, success, error);\n }\n\n function setIcon(base64Image: string, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (util.isNullOrWhiteSpace(base64Image)) {\n throw new Error(`\"base64Image\" must be a non-empty string.`);\n }\n return executor.setIcon(resultWindow, base64Image);\n }, success, error);\n }\n\n function setFrameColor(frameColor: string, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (util.isNullOrWhiteSpace(frameColor)) {\n throw new Error(`\"frameColor\" must be a non-empty string`);\n }\n return executor.setFrameColor(resultWindow, frameColor);\n }, success, error);\n }\n\n function setTabHeaderVisible(toBeTabHeaderVisible: boolean, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (typeof toBeTabHeaderVisible !== \"boolean\") {\n throw new Error(`\"toBeTabHeaderVisible\" must hold a boolean value.`);\n }\n return executor.setTabHeaderVisible(resultWindow, toBeTabHeaderVisible);\n }, success, error);\n }\n\n async function setTabTooltip(tooltip: string): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n if (util.isNullOrWhiteSpace(tooltip)) {\n throw new Error(`\"${tooltip}\" must not be null or undefined`);\n }\n return executor.setTabTooltip(resultWindow, tooltip);\n }\n\n async function getTabTooltip(): Promise<string> {\n return executor.getTabTooltip(resultWindow);\n }\n\n function showPopup(config: IOConnectDesktop.Windows.PopupOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return executor.showPopup(resultWindow, config);\n }\n\n function createFlydown(config: IOConnectDesktop.Windows.FlydownOptions): Promise<IOConnectDesktop.Windows.Flydown> {\n return executor.createFlydown(resultWindow.id, config);\n }\n\n function setModalState(isModal: boolean): Promise<void> {\n return executor.setModalState(resultWindow.id, isModal || false);\n }\n\n function zoomIn(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise<IOConnectDesktop.Windows.IOConnectWindow>(() => {\n return executor.zoomIn(resultWindow);\n }, success, error);\n }\n\n function zoomOut(success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise<IOConnectDesktop.Windows.IOConnectWindow>(() => {\n return executor.zoomOut(resultWindow);\n }, success, error);\n }\n\n function setZoomFactor(zoomFactor: number, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise<IOConnectDesktop.Windows.IOConnectWindow>(() => {\n if (isNaN(zoomFactor)) {\n throw new Error(`zoomFactor is not a number`);\n }\n return executor.setZoomFactor(resultWindow, zoomFactor);\n }, success, error);\n }\n\n function showDevTools() {\n return executor.showDevTools(resultWindow);\n }\n\n function capture(captureOptions: IOConnectDesktop.Windows.CaptureOptions): Promise<string> {\n return executor.capture(resultWindow, captureOptions);\n }\n\n function flash(suppliedOptions?: boolean, mode?: IOConnectDesktop.Windows.FlashMode): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n const flashOptions: FlashOptions = {\n shouldFlash: true,\n mode: \"auto\"\n };\n\n if (typeof suppliedOptions === \"boolean\") {\n flashOptions.shouldFlash = suppliedOptions;\n }\n\n if (typeof mode !== \"undefined\") {\n flashOptions.mode = mode;\n }\n\n return executor.flash(resultWindow, flashOptions);\n }\n\n function flashTab(suppliedOptions?: boolean): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n const flashOptions: FlashTabOptions = {\n shouldFlash: true,\n };\n\n if (typeof suppliedOptions === \"boolean\") {\n flashOptions.shouldFlash = suppliedOptions;\n }\n\n return executor.flashTab(resultWindow, flashOptions);\n }\n\n function print(printOptions: IOConnectDesktop.Windows.PrintOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return executor.print(resultWindow, printOptions);\n }\n\n function printToPDF(printToPDFOptions: IOConnectDesktop.Windows.PrintToPDFOptions): Promise<string> {\n return executor.printToPDF(resultWindow, printToPDFOptions);\n }\n\n function ungroup(ungroupOptions?: IOConnectDesktop.Windows.UngroupOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return new Promise((resolve, reject) => {\n const unGroupChanged = onGroupChanged(\n (win: IOConnectDesktop.Windows.IOConnectWindow, newGroup: IOConnectDesktop.Windows.Group, oldGroup: IOConnectDesktop.Windows.Group) => {\n if (id === win.id) {\n unGroupChanged();\n resolve(resultWindow);\n }\n });\n\n executor.ungroup(resultWindow, ungroupOptions)\n .catch((e: string) => {\n unGroupChanged();\n reject(e);\n });\n });\n }\n\n function place(placementSettings: IOConnectDesktop.Windows.PlacementSettings): Promise<void> {\n return executor.place(resultWindow, placementSettings);\n }\n\n function refresh(ignoreCache: boolean) {\n return executor.refresh(resultWindow, ignoreCache);\n }\n\n function download(url: string, opts: IOConnectDesktop.Windows.DownloadOptions) {\n return executor.download(resultWindow, url, opts);\n }\n\n function configure(settings: IOConnectDesktop.Windows.WindowConfiguration) {\n return executor.configureWindow(resultWindow, settings);\n }\n\n function getConfiguration() {\n return executor.getWindowConfiguration(resultWindow);\n }\n\n // #endregion \"AGM methods\"\n\n // #region \"Events\"\n\n function onTitleChanged(callback: (title: string, window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n if (!util.isFunction(callback)) {\n throw new Error(\"callback should be a function\");\n }\n callback(resultWindow.title, resultWindow);\n return onEventCore(\"onTitleChanged\", callback);\n }\n\n function onClose(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n if (!util.isFunction(callback)) {\n throw new Error(\"callback should be a function\");\n }\n if (id === undefined) {\n callback(resultWindow);\n }\n return _registry.add(\"onClose\", callback);\n }\n\n function onUrlChanged(callback: (url: string, window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"onUrlChanged\", callback);\n }\n\n function onFrameButtonAdded(callback: (btnInfo: IOConnectDesktop.Windows.ButtonInfo, window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"onFrameButtonAdded\", callback);\n }\n\n function onFrameButtonRemoved(callback: (btnInfo: IOConnectDesktop.Windows.ButtonInfo, window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"onFrameButtonRemoved\", callback);\n }\n\n function onFrameButtonClicked(callback: (btnInfo: IOConnectDesktop.Windows.ButtonInfo, window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"onFrameButtonClicked\", callback);\n }\n\n function onCollapsed(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n if (!util.isFunction(callback)) {\n throw new Error(\"callback should be a function\");\n }\n if (_isCollapsed) {\n callback(resultWindow);\n }\n return _registry.add(\"collapsed\", callback);\n }\n\n function onExpanded(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n if (!util.isFunction(callback)) {\n throw new Error(\"callback should be a function\");\n }\n if (!_isCollapsed) {\n callback(resultWindow);\n }\n return _registry.add(\"expanded\", callback);\n }\n\n function onMaximized(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n if (_windowState === \"maximized\") {\n return onEventCore(\"maximized\", callback, [resultWindow]);\n } else {\n return onEventCore(\"maximized\", callback);\n }\n }\n\n function onMinimized(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n if (_windowState === \"minimized\") {\n return onEventCore(\"minimized\", callback, [resultWindow]);\n } else {\n return onEventCore(\"minimized\", callback);\n }\n }\n\n function onNormal(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n if (_windowState === \"normal\") {\n return onEventCore(\"normal\", callback, [resultWindow]);\n } else {\n return onEventCore(\"normal\", callback);\n }\n }\n\n function onAttached(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"attached\", callback);\n }\n\n function onDetached(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"detached\", callback);\n }\n\n function onVisibilityChanged(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"visibility-changed\", callback);\n }\n\n function onContextUpdated(callback: (context: any, window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"context-updated\", callback);\n }\n\n function onLockingChanged(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"lock-changed\", callback);\n }\n\n function onBoundsChanged(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"bounds-changed\", callback);\n }\n\n function onFocusChanged(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"focus-changed\", callback);\n }\n\n function onStickyChanged(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"sticky-changed\", callback);\n }\n\n function onFrameColorChanged(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"frame-color-changed\", callback);\n }\n\n function onTabHeaderVisibilityChanged(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"tab-header-visibility-changed\", callback);\n }\n\n function onWindowAttached(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"window-attached\", callback);\n }\n\n function onWindowDetached(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"window-detached\", callback);\n }\n\n function onGroupChanged(callback: (window: IOConnectDesktop.Windows.IOConnectWindow, newGroup: IOConnectDesktop.Windows.Group, oldGroup: IOConnectDesktop.Windows.Group) => void): UnsubscribeFunction {\n return onEventCore(\"group-changed\", callback);\n }\n\n function onTabSelectionChanged(callback: (selectedWindow: IOConnectDesktop.Windows.IOConnectWindow, previousWindow: IOConnectDesktop.Windows.IOConnectWindow, window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"tab-selection-changed\", callback);\n }\n\n function onClosing(callback: (prevent: (options: IOConnectDesktop.Windows.PreventClosingOptions) => void) => Promise<void>): UnsubscribeFunction {\n if (!util.isFunction(callback)) {\n throw new Error(\"callback must be a function\");\n }\n\n type GDHandler = (success: () => void, error: () => void, prevent: (options: IOConnectDesktop.Windows.PreventClosingOptions) => void) => void;\n const callbackWrap: GDHandler = (success: () => void, error: () => void, prevent: (options: IOConnectDesktop.Windows.PreventClosingOptions) => void) => {\n const promise = callback(prevent);\n if (promise?.then) {\n promise.then(success).catch(error);\n } else {\n success();\n }\n };\n return executor.onClosing(callbackWrap, resultWindow);\n }\n\n function onRefreshing(callback: (prevent: () => void) => Promise<void>): UnsubscribeFunction {\n if (!util.isFunction(callback)) {\n throw new Error(\"callback must be a function\");\n }\n\n type GDRefreshHandler = (success: () => void, error: () => void, prevent: () => void) => void;\n const callbackWrap: GDRefreshHandler = (success: () => void, error: () => void, prevent: () => void) => {\n const promise = callback(prevent);\n if (promise?.then) {\n promise.then(success).catch(error);\n } else {\n success();\n }\n };\n return executor.onRefreshing(callbackWrap, resultWindow);\n }\n\n function onNavigating(callback: (args: { newUrl: string }) => Promise<void>): UnsubscribeFunction {\n if (!util.isFunction(callback)) {\n throw new Error(\"callback must be a function\");\n }\n\n type Handler = (success: () => void, error: () => void, prevent: () => void, args: { newUrl: string }) => void;\n const callbackWrap: Handler = (success: () => void, error: () => void, prevent: () => void, args: { newUrl: string }) => {\n const promise = callback(args);\n if (promise?.then) {\n promise.then(success).catch(error);\n } else {\n success();\n }\n };\n return executor.onNavigating(callbackWrap, resultWindow);\n }\n\n function onZoomFactorChanged(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"zoom-factor-changed\", callback);\n }\n\n function onPlacementSettingsChanged(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"placementSettingsChanged\", callback);\n }\n\n function onNeighboursChanged(callback: (neighbours: IOConnectDesktop.Windows.Neighbours, window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return onEventCore(\"neighbours-changed\", callback);\n }\n\n function onEventCore(key: string, callback: Callback, replayArguments?: any[]) {\n if (!util.isFunction(callback)) {\n throw new Error(\"callback must be a function\");\n }\n\n return _registry.add(key, callback, replayArguments);\n }\n\n function goBack() {\n return executor.goBack(resultWindow);\n }\n\n function goForward() {\n return executor.goForward(resultWindow);\n }\n\n function startDrag(option: IOConnectDesktop.Windows.StartDragOptions) {\n return executor.startDrag(resultWindow, option);\n }\n\n function showDialog<T>(dialogOptions: IOConnectDesktop.Windows.DialogOptions): Promise<T> {\n if (dialogOptions?.timerDuration && isNaN(dialogOptions?.timerDuration)) {\n throw new Error(\"timerDuration must be a number\");\n }\n if (dialogOptions?.showTimer && typeof dialogOptions?.showTimer !== \"boolean\") {\n throw new Error(\"showTimer must be a boolean\");\n }\n return executor.showDialog(resultWindow, dialogOptions);\n }\n\n // #endregion \"Events\"\n\n // #region \"Stream function\"\n\n function handleUpdate(updated: WindowConstructorOptions) {\n _url = updated.url;\n _title = updated.title;\n _context = updated.context || {};\n _bounds = updated.bounds;\n _frameColor = updated.frameColor;\n _focus = updated.focus;\n _neighbours = updated.neighbours || {};\n _groupId = updated.groupId;\n _isGroupHeaderVisible = updated.isGroupHeaderVisible;\n _isTabHeaderVisible = updated.isTabHeaderVisible;\n _isTabSelected = updated.isTabSelected;\n _settings = updated.settings;\n _isVisible = updated.isVisible;\n _isSticky = updated.isSticky;\n _isCollapsed = updated.isCollapsed;\n _windowState = updated.state;\n _tabGroupId = updated.tabGroupId;\n _frameId = updated.frameId;\n _isLocked = updated.isLocked;\n // _frameButtons = updated.fra;\n // _group: Glue42.Windows.Group;\n _zoomFactor = updated.zoomFactor;\n _placementSettings = updated.placementSettings;\n }\n\n function handleTitleChanged(newTitle: string): void {\n _title = newTitle;\n executor.finished\n .finally(() => {\n _registry.execute(\"onTitleChanged\", newTitle, resultWindow);\n });\n }\n\n function handleUrlChanged(newUrl: string): void {\n _url = newUrl;\n _registry.execute(\"onUrlChanged\", newUrl, resultWindow);\n }\n\n function handleVisibilityChanged(isVisible: boolean) {\n if (isVisible === _isVisible) {\n return;\n }\n _isVisible = isVisible;\n _registry.execute(\"visibility-changed\", resultWindow);\n }\n\n function handleWindowSettingsChanged(settings: IOConnectDesktop.Windows.WindowSettings): void {\n _settings = settings;\n _registry.execute(\"settings-changed\", resultWindow);\n }\n\n function handleContextUpdated(context: any): void {\n _context = context;\n _registry.execute(\"context-updated\", _context, resultWindow);\n }\n\n function handleWindowClose(): void {\n if (id === undefined) {\n return;\n }\n _registry.execute(\"onClose\", resultWindow);\n id = undefined;\n }\n\n function handleFrameButtonAdded(frameButton: FrameButton): void {\n const buttonObj = [\"buttonId\", \"imageBase64\", \"order\", \"tooltip\"].reduce((memo: any, k) => {\n memo[k] = frameButton[k];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return memo;\n }, {}) as IOConnectDesktop.Windows.ButtonInfo;\n\n const frameButtonsIds = _frameButtons.map((btn) => {\n return btn.buttonId;\n });\n\n if (frameButtonsIds.indexOf(frameButton.buttonId) === -1) {\n _frameButtons.push(buttonObj);\n }\n\n _registry.execute(\"onFrameButtonAdded\", buttonObj, resultWindow);\n }\n\n function handleFrameButtonRemoved(frameButtonId: string): void {\n let button: IOConnectDesktop.Windows.ButtonInfo;\n _frameButtons = _frameButtons.reduce<IOConnectDesktop.Windows.ButtonInfo[]>((memo, btn) => {\n if (btn.buttonId === frameButtonId) {\n button = btn;\n } else {\n memo.push(btn);\n }\n return memo;\n }, []);\n\n if (button !== undefined) {\n _registry.execute(\"onFrameButtonRemoved\", button, resultWindow);\n }\n }\n\n function handleFrameButtonClicked(frameButton: FrameButton): void {\n const button = _frameButtons.filter((btn) => {\n return btn.buttonId === frameButton.buttonId;\n });\n\n if (button.length > 0) {\n _registry.execute(\"onFrameButtonClicked\", button[0], resultWindow);\n }\n }\n\n async function handleWindowChangeState(state: string): Promise<void> {\n if (state === \"collapsed\") {\n _isCollapsed = true;\n } else if (state === \"expanded\") {\n _isCollapsed = false;\n } else {\n _windowState = state as IOConnectDesktop.Windows.WindowState;\n }\n await executor.finished;\n _registry.execute(state, resultWindow);\n }\n\n function handleFrameIsLockedChanged(isLocked: boolean): void {\n _isLocked = isLocked;\n _registry.execute(\"lock-changed\", resultWindow);\n }\n\n function handleBoundsChanged(bounds: IOConnectDesktop.Windows.Bounds): void {\n if (_bounds.top === bounds.top && _bounds.left === bounds.left && _bounds.width === bounds.width && _bounds.height === bounds.height) {\n return;\n }\n _bounds = bounds;\n _registry.execute(\"bounds-changed\", resultWindow);\n }\n\n function handleFocusChanged(isFocused: boolean): void {\n _focus = isFocused;\n _registry.execute(\"focus-changed\", resultWindow);\n }\n\n function handleIsStickyChanged(isSticky: boolean): void {\n _isSticky = isSticky;\n _registry.execute(\"sticky-changed\", isSticky, resultWindow);\n }\n\n function handleFrameColorChanged(frameColor: string): void {\n _frameColor = frameColor;\n _registry.execute(\"frame-color-changed\", resultWindow);\n }\n\n function handleFrameAttached(tabGroupId: string, frameId: string, isTabHeaderVisible: boolean): void {\n _tabGroupId = tabGroupId;\n _frameId = frameId;\n _isTabHeaderVisible = isTabHeaderVisible;\n _registry.execute(\"frame-attached\", resultWindow);\n }\n\n function handleCompositionChanged(state: CompositionChangedData): void {\n _neighbours = state.neighbors || {};\n _tabIndex = state.index;\n _registry.execute(\"neighbours-changed\", _neighbours, resultWindow);\n }\n\n function handleGroupHeaderVisibilityChanged(isGroupHeaderVisible: boolean): void {\n _isGroupHeaderVisible = isGroupHeaderVisible;\n }\n\n function handleTabHeaderVisibilityChanged(isTabHeaderVisible: boolean): void {\n if (_isTabHeaderVisible !== isTabHeaderVisible) {\n _isTabHeaderVisible = isTabHeaderVisible;\n _registry.execute(\"tab-header-visibility-changed\", resultWindow);\n }\n }\n\n async function handleFrameSelectionChanged(newWindow: string, prevWindow: string) {\n let selectedWindow: IOConnectDesktop.Windows.IOConnectWindow;\n if (newWindow === id) {\n _isTabSelected = true;\n selectedWindow = resultWindow;\n } else {\n _isTabSelected = false;\n selectedWindow = windowStore.get(newWindow) ? windowStore.get(newWindow).API : undefined;\n }\n const previousWindow = windowStore.get(prevWindow) ? windowStore.get(prevWindow).API : undefined;\n await executor.finished;\n _registry.execute(\"tab-selection-changed\", selectedWindow, previousWindow, resultWindow);\n }\n\n async function handleAttached(newTabGroupId: string, newFrameId: string, tabHeaderVisible: boolean, isLocked: boolean, winsToBeNotified: WindowWrapper[]): Promise<void> {\n _tabGroupId = newTabGroupId;\n _isTabHeaderVisible = tabHeaderVisible;\n _frameId = newFrameId;\n if (typeof isLocked !== \"undefined\") {\n _isLocked = isLocked;\n }\n await executor.finished;\n winsToBeNotified.forEach((w) => {\n w.Events.handleWindowAttached(resultWindow);\n });\n _registry.execute(\"attached\", resultWindow);\n }\n\n function handleWindowAttached(win: IOConnectDesktop.Windows.IOConnectWindow): void {\n _registry.execute(\"window-attached\", win);\n }\n\n async function handleDetached(isLocked: boolean, winsToBeNotified: WindowWrapper[]): Promise<void> {\n _tabGroupId = undefined;\n _isTabSelected = false;\n if (typeof isLocked !== \"undefined\") {\n _isLocked = isLocked;\n }\n await executor.finished;\n winsToBeNotified.forEach((w) => {\n w.Events.handleWindowDetached(resultWindow);\n });\n _registry.execute(\"detached\", resultWindow);\n }\n\n function handleWindowDetached(win: IOConnectDesktop.Windows.IOConnectWindow): void {\n _registry.execute(\"window-detached\", win);\n }\n\n function handleZoomFactorChanged(zoomFactor: number): void {\n _zoomFactor = zoomFactor;\n _registry.execute(\"zoom-factor-changed\", resultWindow);\n }\n\n function handlePlacementSettingsChanged(placementSettings: IOConnectDesktop.Windows.PlacementSettings): void {\n let promise: Promise<IOConnectDesktop.Displays.Display>;\n const copy = placementSettings as any;\n if (!copy.display) {\n promise = Promise.resolve(undefined);\n } else {\n const displayAPI = displayAPIGetter();\n if (!displayAPI) {\n // display API is disabled\n promise = Promise.resolve(undefined);\n } else {\n const index = copy.display - 1;\n promise = new Promise((resolve, reject) => {\n displayAPI.all().then((displays) => {\n const display = displays.find((d) => d.index === index);\n resolve(display);\n }).catch(reject);\n });\n }\n }\n\n void promise.then((d) => {\n copy.display = d;\n _placementSettings = copy;\n _registry.execute(\"placementSettingsChanged\", resultWindow);\n });\n }\n\n // #endregion \"Stream function\"\n\n // #region \"Group Events\"\n function handleGroupChanged(newGroup: IOConnectDesktop.Windows.Group, oldGroup: IOConnectDesktop.Windows.Group) {\n _group = newGroup;\n _groupId = newGroup?.id;\n\n if (!util.isUndefinedOrNull(newGroup) && !util.isUndefinedOrNull(oldGroup)) {\n _registry.execute(\"group-changed\", resultWindow, newGroup, oldGroup);\n }\n }\n\n // #region \"Internal function\"\n\n function getAllTabs(): IOConnectDesktop.Windows.IOConnectWindow[] {\n const allWindows = windowStore.list;\n if (_mode.toLowerCase() !== \"tab\") {\n return [];\n }\n const tabs = Object.keys(allWindows).reduce<GDWindow[]>((memo, win) => {\n const window: WindowWrapper = allWindows[win];\n if (window\n && window.API.tabGroupId\n && typeof window.API.tabGroupId !== \"undefined\"\n && typeof resultWindow.tabGroupId !== \"undefined\"\n && window.API.tabGroupId === resultWindow.tabGroupId) {\n memo.push(window.API);\n }\n return memo;\n }, []);\n return tabs.sort((w1, w2) => {\n if (w1.tabIndex !== w2.tabIndex) {\n if (w1.tabIndex === -1) {\n return Number.MAX_SAFE_INTEGER;\n }\n if (w2.tabIndex === -1) {\n return Number.MIN_SAFE_INTEGER;\n }\n }\n return w1.tabIndex - w2.tabIndex;\n });\n }\n\n function mapWindowIdsToWindowObjects(windowIdArr: string[]): IOConnectDesktop.Windows.IOConnectWindow[] {\n return windowIdArr.reduce<IOConnectDesktop.Windows.IOConnectWindow[]>((memo, winId) => {\n const window = windowStore.get(winId);\n if (window) {\n memo.push(window.API);\n }\n return memo;\n }, []);\n }\n\n function getNeighboursByDirection(direction: string): IOConnectDesktop.Windows.IOConnectWindow[] {\n const windowIds = _neighbours[direction];\n if (typeof windowIds !== \"undefined\") {\n return mapWindowIdsToWindowObjects(windowIds);\n }\n }\n\n function getApplicationName(): string {\n if (_applicationName) {\n return _applicationName;\n }\n if (_context._APPLICATION_NAME) {\n return _context._APPLICATION_NAME as string;\n }\n if (_context && _context._t42 && _context._t42.application) {\n return _context._t42.application as string;\n }\n const info = getWindowInfo();\n if (info && info.applicationName) {\n return info.applicationName;\n }\n\n // last try (NodeJS apps)\n const appManager = appManagerGetter();\n if (appManager) {\n const instance = appManager.instances().find((i) => id === i.id);\n if (instance) {\n return instance.application?.name;\n }\n }\n\n return undefined;\n }\n\n function getWindowInfo() {\n if (typeof window !== \"undefined\" && window.glue42gd && window.glue42gd.getWindowInfo) {\n const info = window.glue42gd.getWindowInfo(id);\n if (!info) {\n return undefined;\n } else {\n return info;\n }\n }\n }\n\n // #endregion \"Internal function\"\n\n // #region \"API\"\n\n const resultWindow = {\n get id() {\n return _id;\n },\n get name() {\n return _name;\n },\n get application() {\n const appManager = appManagerGetter();\n const appName = getApplicationName();\n if (appName && appManager) {\n return appManager.application(appName);\n }\n },\n get hostInstance() {\n return executor.hostInstance;\n },\n get interopInstance() {\n const instance = agm.servers().find((s) => s.windowId === this.id);\n if (instance) {\n return instance;\n } else {\n const appName = getApplicationName();\n if (appName) {\n return { application: appName };\n }\n }\n },\n get agmInstance() {\n return resultWindow.interopInstance;\n },\n get url() {\n return _url;\n },\n get title() {\n return _title;\n },\n get windowStyleAttributes() {\n return _settings;\n },\n get settings() {\n return _settings;\n },\n get tabGroupId() {\n return _mode.toLowerCase() === \"tab\" ? _tabGroupId : undefined;\n },\n get tabIndex() {\n return _mode.toLowerCase() === \"tab\" ? _tabIndex : undefined;\n },\n get frameId() {\n return _frameId;\n },\n get frameButtons() {\n return _frameButtons.sort((b1, b2) => b1.order - b2.order);\n },\n get mode() {\n return _mode;\n },\n get state() {\n return _windowState;\n },\n get isCollapsed() {\n return _isCollapsed;\n },\n get isVisible() {\n return _isVisible;\n },\n get isLocked() {\n return _isLocked;\n },\n get context() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return _context;\n },\n get bounds() {\n return _bounds;\n },\n get minHeight() {\n return _settings.minHeight;\n },\n get maxHeight() {\n return _settings.maxHeight;\n },\n get minWidth() {\n return _settings.minWidth;\n },\n get maxWidth() {\n return _settings.maxWidth;\n },\n get isFocused() {\n return _focus;\n },\n get frameColor() {\n return _frameColor;\n },\n get opened() {\n return resultWindow.id !== undefined;\n },\n get group() {\n return _group;\n },\n get groupId() {\n return _groupId;\n },\n get isSticky() {\n return _isSticky;\n },\n get topNeighbours() {\n return getNeighboursByDirection(\"top\");\n },\n get leftNeighbours() {\n return getNeighboursByDirection(\"left\");\n },\n get rightNeighbours() {\n return getNeighboursByDirection(\"right\");\n },\n get bottomNeighbours() {\n return getNeighboursByDirection(\"bottom\");\n },\n get isGroupHeaderVisible() {\n return _isGroupHeaderVisible;\n },\n get activityId() {\n if (_context._t42) {\n return _context._t42.activityId as string;\n }\n const info = getWindowInfo();\n if (!info) {\n return undefined;\n }\n return info.activityId;\n },\n get activityWindowId(): string {\n if (_context._t42) {\n return _context._t42.activityWindowId as string;\n }\n const info = getWindowInfo();\n if (!info) {\n return undefined;\n }\n return info.activityWindowId;\n },\n get windowType() {\n return options.windowType || \"electron\";\n },\n get zoomFactor() {\n return _zoomFactor;\n },\n get screen() {\n if (typeof window !== \"undefined\" && window.glue42gd) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return utils.getMonitor(resultWindow.bounds, (window.glue42gd as any).monitors);\n }\n return undefined;\n },\n get placementSettings(): IOConnectDesktop.Windows.PlacementSettings {\n return Object.assign({}, _placementSettings);\n },\n get jumpList(): JumpList {\n return _jumpList;\n },\n maximize,\n restore,\n minimize,\n maximizeRestore,\n collapse,\n expand,\n toggleCollapse,\n focus,\n activate,\n moveResize,\n setTitle,\n setStyle,\n setOnTop,\n resetButtons,\n getButtons,\n setSizeConstraints,\n getSizeConstraints,\n navigate,\n addFrameButton,\n removeFrameButton,\n setVisible,\n show: () => setVisible(true),\n hide: () => setVisible(false),\n center,\n close,\n snap,\n showLoader,\n hideLoader,\n updateContext,\n lock,\n unlock,\n getIcon,\n setIcon,\n setFrameColor,\n setTabTooltip,\n getTabTooltip,\n attachTab,\n detachTab,\n setTabHeaderVisible,\n showPopup,\n createFlydown,\n setModalState,\n setZoomFactor,\n zoomIn,\n zoomOut,\n showDevTools,\n capture,\n flash,\n flashTab,\n setSticky,\n print,\n printToPDF,\n place,\n ungroup,\n refresh,\n goBack,\n goForward,\n download,\n configure,\n getConfiguration,\n getChannel: async () => {\n const wins = await getChannels().getWindowsWithChannels({ windowIds: [_id] });\n return wins[0]?.channel;\n },\n startDrag,\n showDialog,\n\n onClose,\n onUrlChanged,\n onTitleChanged,\n onFrameButtonAdded,\n onFrameButtonRemoved,\n onFrameButtonClicked,\n onCollapsed,\n onExpanded,\n onMinimized,\n onMaximized,\n onNormal,\n onAttached,\n onDetached,\n onVisibilityChanged,\n onContextUpdated,\n onLockingChanged,\n onBoundsChanged,\n onFrameColorChanged,\n onFocusChanged,\n onStickyChanged,\n onGroupChanged,\n onWindowAttached,\n onWindowDetached,\n onTabSelectionChanged,\n onTabHeaderVisibilityChanged,\n onClosing,\n onRefreshing,\n onZoomFactorChanged,\n onPlacementSettingsChanged,\n onNeighboursChanged,\n onNavigating,\n\n get tabs() {\n return getAllTabs();\n },\n\n get isTabHeaderVisible() {\n return _isTabHeaderVisible;\n },\n\n get isTabSelected() {\n return _isTabSelected;\n },\n\n // @glue42/web compatibility layer\n getURL() {\n return Promise.resolve(_url);\n },\n\n getTitle() {\n return Promise.resolve(_title);\n },\n\n getBounds(): Promise<IOConnectDesktop.Windows.Bounds> {\n return Promise.resolve(_bounds);\n },\n\n getContext(): Promise<any> {\n return Promise.resolve(_context);\n },\n\n setContext(context: any): Promise<GDWindow> {\n if (util.isUndefinedOrNull(context)) {\n throw new Error(`\"context\" must not be null or undefined, set to empty object if you want to clear it out.`);\n }\n\n return executor.updateContext(resultWindow, context, true);\n },\n\n getDisplay(): Promise<IOConnectDesktop.Displays.Display> {\n const displayAPI = displayAPIGetter();\n return displayAPI.getByWindowId(id);\n },\n\n resizeTo(width?: number, height?: number): Promise<GDWindow> {\n return moveResize({ width, height });\n },\n\n moveTo(top?: number, left?: number): Promise<GDWindow> {\n return moveResize({ top, left });\n },\n\n async getParentWindow() {\n const myParentId = (_settings as any).parentInstanceId;\n if (!myParentId) {\n return undefined;\n }\n return windowStore.list[myParentId]?.API;\n },\n\n async getChildWindows() {\n return Object.keys(windowStore.list)\n .map((key) => windowStore.list[key].API)\n .filter((w) => {\n const parentId = (w.settings as any).parentInstanceId;\n return parentId === id;\n });\n },\n\n joinChannel: (name: string) => {\n return getChannels().join(name, id);\n },\n\n leaveChannel: () => {\n return getChannels().leave(id);\n }\n };\n\n // #endregion \"API\"\n\n // #endregion \"Group Events\"\n\n const events: WindowEvents = {\n handleUpdate,\n handleWindowClose,\n handleWindowChangeState,\n handleTitleChanged,\n handleVisibilityChanged,\n handleUrlChanged,\n handleWindowSettingsChanged,\n handleContextUpdated,\n handleFrameIsLockedChanged,\n handleBoundsChanged,\n handleFocusChanged,\n handleFrameButtonAdded,\n handleFrameButtonRemoved,\n handleFrameButtonClicked,\n handleFrameColorChanged,\n handleFrameAttached,\n handleFrameSelectionChanged,\n handleCompositionChanged,\n handleGroupHeaderVisibilityChanged,\n handleTabHeaderVisibilityChanged,\n handleGroupChanged,\n handleAttached,\n handleDetached,\n handleWindowAttached,\n handleWindowDetached,\n handleZoomFactorChanged,\n handleIsStickyChanged,\n handlePlacementSettingsChanged\n };\n\n return {\n API: resultWindow,\n Events: events\n };\n};\n","import { default as windowStore } from \"../store\";\nimport { WindowWrapper } from \"../types\";\n\nexport function getWindowsByTabGroupId(windowId: string, tabGroupId: string): WindowWrapper[] {\n const windows = windowStore.list;\n return Object.keys(windows).reduce<WindowWrapper[]>((memo, id) => {\n const win = windows[id];\n if (win.API.tabGroupId === tabGroupId && win.API.id !== windowId) {\n memo.push(win);\n }\n return memo;\n }, []);\n}\n\nexport function isEmpty(object: any): boolean {\n if (!object || Object.keys(object).every((value) => object[value] === undefined)) {\n return true;\n }\n return false;\n}\n","import { IOConnectDesktop } from \"../../../../desktop\";\nimport { ConfigurationData, DetachTabOptions, Executor, FlashOptions, FlashTabOptions, JumpListSettingsInternal, JumpListUpdateSettings } from \"../../types\";\nimport { ShowFlydownData, ReformatedFlydownOptions, ReformatedFlydownZone, ReformatedPopupOptions, DialogResult } from \"./types\";\nimport { CallbackRegistry, default as CallbackFactory, UnsubscribeFunction } from \"callback-registry\";\nimport shortid from \"shortid\";\nimport windowStore from \"../../store\";\nimport { isNullOrWhiteSpace, isUndefinedOrNull } from \"../../../activity/helpers/util\";\nimport { isEmpty } from \"../helpers\";\n\nexport class GDExecutor implements Executor {\n\n private readonly GroupMethodName = \"T42.Group.Execute\";\n private readonly WndMethodName = \"T42.Wnd.Execute\";\n\n private agm: IOConnectDesktop.Interop.API;\n private agmTarget: IOConnectDesktop.Interop.InstanceTarget;\n private _registry: CallbackRegistry = CallbackFactory();\n private _finished: Promise<void> = Promise.resolve();\n private _configuration: ConfigurationData;\n private unsubCallbacks: { [key: string]: ((success: () => void, error: () => void, prevent?: (args?: any) => void, args?: { newUrl: string }) => void)[] } = {};\n\n public get hostInstance() {\n return this.agmTarget as IOConnectDesktop.Interop.Instance;\n }\n\n public get finished() {\n return this._finished;\n }\n\n public init(agm: IOConnectDesktop.AGM.API, instance: IOConnectDesktop.AGM.Instance, config?: ConfigurationData) {\n this.agm = agm;\n this.agmTarget = instance;\n this._configuration = config;\n this._registry.add(\"event\", (data: { windowId: string, type: string }) => {\n if (data.type === \"Closed\") {\n const keys = Object.keys(this.unsubCallbacks);\n keys.forEach((key) => {\n const isSameWindow = key.startsWith(data.windowId);\n if (isSameWindow) {\n delete this.unsubCallbacks[key];\n }\n });\n }\n });\n }\n // refactor\n public handleEvent(data: any) {\n this._registry.execute(\"event\", data);\n }\n\n public async open(options: IOConnectDesktop.Windows.WindowCreateOptions) {\n let finishedResolve: () => void;\n this._finished = new Promise((resolve) => {\n finishedResolve = resolve;\n });\n try {\n const result = await this.agm.invoke<{ id: string }>(\"T42.Wnd.Create\", options, this.agmTarget);\n if (result.returned === undefined) {\n throw new Error(\"failed to execute T42.Wnd.Create - unknown reason\");\n }\n\n const id = result.returned.id;\n const win = await windowStore.waitFor(id);\n if (!this._configuration || this._configuration.windowAvailableOnURLChanged) {\n setTimeout(() => {\n if (win.API.windowType === \"electron\") {\n // on normal windows urlCHanged has to be detected first in order for the window to be ready\n // that causes the user callbacks to miss urlChanged since they are not registered yet\n // here we 'replay' the urlChanged event\n win.Events.handleUrlChanged(win.API.url);\n }\n }, 0);\n }\n return win.API;\n } catch (error) {\n throw error;\n } finally {\n finishedResolve();\n }\n }\n\n public async close(w: IOConnectDesktop.Windows.IOConnectWindow, options: IOConnectDesktop.Windows.CloseOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow | boolean> {\n const result = await this.execute(\"close\", { windowId: w.id, options }, `Closed`);\n if (options) {\n return result.closed;\n }\n return w;\n }\n\n public async navigate(w: IOConnectDesktop.Windows.IOConnectWindow, newUrl: string, urlLoadOptions: IOConnectDesktop.Windows.LoadURLOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"navigate\", { windowId: w.id, options: { url: newUrl, urlLoadOptions } }, \"UrlChanged\");\n return w;\n }\n // Calls the public methods of the window. No Call to GD is made\n public async setStyle(w: IOConnectDesktop.Windows.IOConnectWindow, style: IOConnectDesktop.Windows.WindowSettings): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n const stylePromises: Promise<any>[] = [];\n const wait = (promise: Promise<any>) => stylePromises.push(promise);\n\n if (!isUndefinedOrNull(style.focus) && !w.isFocused) {\n wait(w.focus());\n }\n\n // Todo: only if !isRestoring (hopefully setVisible does this check)\n if (!isUndefinedOrNull(style.hidden)) {\n const toBeVisible = !style.hidden;\n wait(w.setVisible(toBeVisible));\n }\n\n if (!isUndefinedOrNull(style.onTop)) {\n wait(w.setOnTop(style.onTop));\n }\n\n if (!isNullOrWhiteSpace(style.tabTooltip) || !isNullOrWhiteSpace((style as any).tabToolTip)) {\n const toolTip = style.tabTooltip ?? (style as any).tabToolTip;\n wait(w.setTabTooltip(toolTip));\n }\n\n if (!isNullOrWhiteSpace(style.tabTitle)) {\n wait(this.execute(\"setTabTitle\", { windowId: w.id, options: { tabTitle: style.tabTitle } }));\n }\n\n const constraints: IOConnectDesktop.Windows.SizeConstraints = {\n minHeight: style.minHeight,\n minWidth: style.minWidth,\n maxHeight: style.maxHeight,\n maxWidth: style.maxWidth,\n };\n\n const hasConstraints = !isEmpty(constraints);\n if (hasConstraints) {\n wait(w.setSizeConstraints(constraints));\n }\n\n const buttons: IOConnectDesktop.Windows.WindowButtons = {\n allowClose: style.allowClose,\n allowCollapse: style.allowCollapse,\n allowLockUnlock: style.allowLockUnlock,\n allowMaximize: style.allowMaximize,\n allowMinimize: style.allowMinimize\n };\n const hasButtons = !isEmpty(buttons);\n if (hasButtons) {\n wait(w.resetButtons(buttons));\n }\n\n await Promise.all(stylePromises);\n\n return w;\n }\n\n public async setSizeConstraints(w: IOConnectDesktop.Windows.IOConnectWindow, constraints: IOConnectDesktop.Windows.SizeConstraints): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"setSizeConstraints\", { windowId: w.id, options: constraints });\n return w;\n }\n\n public async getSizeConstraints(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.SizeConstraints> {\n const sizeConstraint = await this.execute(\"getSizeConstraints\", { windowId: w.id });\n return sizeConstraint;\n }\n\n public async setTabTooltip(w: IOConnectDesktop.Windows.IOConnectWindow, tabTooltip: string): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"setTabTooltip\", { windowId: w.id, options: { tabTooltip } });\n return w;\n }\n\n public async getTabTooltip(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<string> {\n const result = await this.execute(\"getTabTooltip\", { windowId: w.id });\n return result.tabTooltip;\n }\n\n public async resetButtons(w: IOConnectDesktop.Windows.IOConnectWindow, buttonsConfig: IOConnectDesktop.Windows.WindowButtons): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"resetButtons\", { windowId: w.id, options: buttonsConfig });\n return w;\n }\n\n public async getButtons(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.WindowButtons> {\n const buttons = await this.execute(\"getButtons\", { windowId: w.id });\n return buttons;\n }\n\n public async setOnTop(w: IOConnectDesktop.Windows.IOConnectWindow, onTop: boolean): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"setOnTop\", { windowId: w.id, options: { onTop } });\n return w;\n }\n\n public async setTitle(w: IOConnectDesktop.Windows.IOConnectWindow, newTitle: string): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n const options = {\n windowId: w.id,\n options: {\n title: newTitle\n }\n };\n await this.execute(\"setTitle\", options, \"TitleChanged\");\n return w;\n }\n\n public async setSticky(w: IOConnectDesktop.Windows.IOConnectWindow, isSticky: boolean): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n const options = {\n windowId: w.id,\n options: {\n isSticky\n }\n };\n await this.execute(\"setSticky\", options);\n return w;\n }\n\n public async moveResize(w: IOConnectDesktop.Windows.IOConnectWindow, bounds: Partial<IOConnectDesktop.Windows.Bounds>): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n if (typeof window !== \"undefined\" && (window.glueDesktop as any).versionNum < 31200) {\n return new Promise(async (res, rej) => {\n const resolveImmediately = this.areBoundsEqual(bounds, w);\n let isDone = false;\n const done = () => {\n if (isDone) {\n return;\n }\n isDone = true;\n\n if (unsubscribeBoundsChanged) {\n unsubscribeBoundsChanged();\n unsubscribeBoundsChanged = undefined;\n }\n res(w);\n if (resolveTimeout) {\n clearTimeout(resolveTimeout);\n resolveTimeout = undefined;\n }\n };\n let resolveTimeout: any;\n let unsubscribeBoundsChanged: () => void;\n if (!resolveImmediately) {\n unsubscribeBoundsChanged = w.onBoundsChanged((win: IOConnectDesktop.Windows.IOConnectWindow) => {\n if (!this.areBoundsEqual(bounds, win)) {\n return;\n }\n done();\n });\n }\n\n try {\n // always execute moveResize (we might have old bounds and prevent calls that are actually valid)\n await this.execute(\"moveResize\", { windowId: w.id, options: { bounds } });\n } catch (error) {\n rej(error);\n return;\n }\n\n // if we're trying to resize with the bounds we already have\n if (resolveImmediately) {\n done();\n return;\n }\n\n // if no bounds change in the next 1s resolve\n resolveTimeout = setTimeout(() => {\n done();\n }, 1000);\n });\n } else {\n await this.execute(\"moveResize\", { windowId: w.id, options: { bounds } });\n }\n return w;\n }\n\n public async addFrameButton(w: IOConnectDesktop.Windows.IOConnectWindow, buttonInfo: IOConnectDesktop.Windows.ButtonInfo): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"addButton\", { windowId: w.id, options: buttonInfo }, \"ButtonAdded\");\n return w;\n }\n\n public async removeFrameButton(w: IOConnectDesktop.Windows.IOConnectWindow, buttonId: string): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"removeButton\", { windowId: w.id, options: buttonId }, \"ButtonRemoved\");\n return w;\n }\n\n public async activate(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n let un: UnsubscribeFunction;\n try {\n const done = new Promise<void>((resolve, reject) => {\n un = w.onFocusChanged(() => {\n resolve();\n });\n });\n await Promise.all([this.execute(\"activate\", { windowId: w.id }, \"FocusChanged\"), done]);\n return w;\n } catch (error) {\n throw error;\n } finally {\n if (un) {\n un();\n }\n }\n }\n\n public async focus(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n let un: UnsubscribeFunction;\n try {\n const done = new Promise<void>((resolve, reject) => {\n un = w.onFocusChanged(() => {\n resolve();\n });\n });\n await Promise.all([this.execute(\"focus\", { windowId: w.id }, \"FocusChanged\"), done]);\n return w;\n } catch (error) {\n throw error;\n } finally {\n if (un) {\n un();\n }\n }\n }\n\n public async maximizeRestore(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"maximizeRestore\", { windowId: w.id }, \"StateChanged\");\n return w;\n }\n\n public async maximize(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"maximize\", { windowId: w.id }, \"StateChanged\");\n return w;\n }\n\n public async restore(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"restore\", { windowId: w.id }, \"StateChanged\");\n return w;\n }\n\n public async minimize(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"minimize\", { windowId: w.id }, \"StateChanged\");\n return w;\n }\n\n public async collapse(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"collapse\", { windowId: w.id }, \"StateChanged\");\n return w;\n }\n\n public async expand(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"expand\", { windowId: w.id }, \"StateChanged\");\n return w;\n }\n\n public async toggleCollapse(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"toggleCollapse\", { windowId: w.id }, \"StateChanged\");\n return w;\n }\n\n public async snap(w: IOConnectDesktop.Windows.IOConnectWindow, targetWindow: IOConnectDesktop.Windows.IOConnectWindow, options: IOConnectDesktop.Windows.SnappingOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n const args: { targetWindowId: string, autoAlign?: boolean, snappingEdge?: string | undefined } = {\n targetWindowId: targetWindow.id\n };\n\n args.snappingEdge = options.direction;\n args.autoAlign = options.autoAlign;\n\n await this.execute(\"snap\", { windowId: w.id, options: args }, \"CompositionChanged\", `CompositionChanged-${targetWindow.id}`);\n return w;\n }\n\n public async attachTab(w: IOConnectDesktop.Windows.IOConnectWindow, sourceWindow: IOConnectDesktop.Windows.IOConnectWindow, options: IOConnectDesktop.Windows.AttachOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"attachTab\", {\n windowId: w.id,\n options: {\n index: options,\n sourceWindowId: sourceWindow.id,\n targetWindowId: w.id,\n }\n }, `WindowFrameAdded-${sourceWindow.id}`, `WindowFrameRemoved-${sourceWindow.id}`);\n return w;\n }\n\n public async detachTab(w: IOConnectDesktop.Windows.IOConnectWindow, options: DetachTabOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n const eventKeys: string[] = [\"WindowFrameRemoved\", `WindowFrameAdded`];\n if (!isUndefinedOrNull(options?.relativeTo)) {\n eventKeys.push(`CompositionChanged`);\n eventKeys.push(`CompositionChanged-${options.relativeTo}`);\n } else {\n eventKeys.push(\"BoundsChanged\");\n }\n await this.execute(\"detachTab\", { windowId: w.id, options }, ...eventKeys);\n return w;\n }\n\n public async setVisible(w: IOConnectDesktop.Windows.IOConnectWindow, toBeVisible = true): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n let command: string;\n if (toBeVisible) {\n command = \"show\";\n } else {\n command = \"hide\";\n }\n\n await this.execute(command, { windowId: w.id }, \"VisibilityChanged\");\n return w;\n }\n\n public async center(w: IOConnectDesktop.Windows.IOConnectWindow, display?: IOConnectDesktop.Displays.Display): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"center\", { windowId: w.id, options: display });\n return w;\n }\n\n public async showLoader(w: IOConnectDesktop.Windows.IOConnectWindow, loader?: IOConnectDesktop.Windows.Loader): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"showLoadingAnimation\", { windowId: w.id, options: loader });\n return w;\n }\n\n public async hideLoader(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"hideLoadingAnimation\", { windowId: w.id });\n return w;\n }\n\n public async updateContext(w: IOConnectDesktop.Windows.IOConnectWindow, context: any, replace: boolean): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n let un: UnsubscribeFunction;\n try {\n // as undefined values do not go through interop, setting a prop to undefined will lead to no change\n // set this to null so it actually removes the prop\n const contextWithoutUndefinedValues = this.swapUndefinedToNull(context);\n\n const done = new Promise<void>((resolve, reject) => {\n un = w.onContextUpdated(() => {\n resolve();\n });\n });\n await Promise.all([this.execute(\"updateContext\", {\n windowId: w.id, context: contextWithoutUndefinedValues, replace\n }), done]);\n return w;\n } catch (error) {\n throw error;\n } finally {\n if (un) {\n un();\n }\n }\n }\n\n public async lock(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"lockUnlock\", { windowId: w.id, options: { lock: true } }, \"FrameIsLockedChanged\");\n return w;\n }\n\n public async unlock(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"lockUnlock\", { windowId: w.id, options: { lock: false } }, \"FrameIsLockedChanged\");\n return w;\n }\n\n public async getIcon(w: IOConnectDesktop.Windows.IOConnectWindow): Promise<string> {\n const result = await this.execute(\"getIcon\", {\n windowId: w.id,\n options: {}\n });\n return result.icon;\n }\n\n public async setIcon(w: IOConnectDesktop.Windows.IOConnectWindow, base64Image: string): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"setIcon\", {\n windowId: w.id,\n options: {\n dataURL: base64Image\n }\n });\n return w;\n }\n\n public async setFrameColor(w: IOConnectDesktop.Windows.IOConnectWindow, frameColor: string): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"setFrameColor\", { windowId: w.id, options: { frameColor } }, \"FrameColorChanged\");\n return w;\n }\n\n public async setTabHeaderVisible(w: IOConnectDesktop.Windows.IOConnectWindow, toBeTabHeaderVisible: boolean): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"setTabHeaderVisible\", {\n windowId: w.id,\n options: {\n toShow: toBeTabHeaderVisible\n }\n }, \"TabHeaderVisibilityChanged\");\n return w;\n }\n\n public async showPopup(targetWindow: IOConnectDesktop.Windows.IOConnectWindow, options: IOConnectDesktop.Windows.PopupOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n if (!options) {\n throw new Error(\"The options object is not valid!\");\n }\n\n const optionsCopy = { ...options };\n\n if (!optionsCopy.targetLocation) {\n optionsCopy.targetLocation = \"bottom\" as IOConnectDesktop.Windows.PopupTargetLocation;\n }\n\n const reformatedOptions: ReformatedPopupOptions & { targetId: string } = {\n ...optionsCopy,\n popupBounds: optionsCopy.size,\n targetId: targetWindow.id,\n popupId: optionsCopy.windowId\n };\n\n await this.execute(\"showPopupWindow\", {\n windowId: targetWindow.id,\n options: reformatedOptions\n });\n\n return targetWindow;\n }\n\n public async createFlydown(windowId: string, options: IOConnectDesktop.Windows.FlydownOptions) {\n if (!options) {\n throw new Error(\"The options object is not valid!\");\n }\n\n const optionsCopy = { ...options };\n\n if (!optionsCopy.horizontalOffset) {\n optionsCopy.horizontalOffset = 0;\n }\n\n if (!optionsCopy.verticalOffset) {\n optionsCopy.verticalOffset = 0;\n }\n\n const fullOptions: IOConnectDesktop.Windows.FlydownOptions & { targetId: string, flydownBounds: IOConnectDesktop.Windows.FlydownOptions[\"size\"] } = this.reformatFlydownOptions(windowId, optionsCopy);\n\n return this.execute(\"setFlydownArea\", { windowId, options: fullOptions }).then(() => {\n const zoneIds = fullOptions.zones.map((z) => z.id);\n\n fullOptions.zones.forEach((z) => {\n let callback: (...args: any[]) => any = typeof (z.flydownSize) === \"function\" ?\n z.flydownSize : () => z.flydownSize;\n\n if (options.size instanceof Function && z.flydownSize) {\n callback = async (data: IOConnectDesktop.Windows.ShowFlydownData, cancel: () => void) => {\n let result;\n // The options callback must be always invoked\n // If the property in the zone is null it will be automatically\n // assigned to the same callback from the code above reformatFlydownOptions\n if (options.size instanceof Function) {\n result = await options.size(data, cancel);\n }\n\n // If both are callbacks the zone has higher priority\n // If they are the same only one should be invoked\n if (z.flydownSize instanceof Function && z.flydownSize !== options.size) {\n return await z.flydownSize(data, cancel) || result;\n }\n\n // The options callback overwrites the bounds object specified in the zone\n return result || z.flydownSize;\n };\n }\n this._registry.clearKey(`${fullOptions.targetId}_${z.id}`);\n this._registry.add(`${fullOptions.targetId}_${z.id}`, callback);\n });\n\n return {\n destroy: () => this.clearFlydownArea(fullOptions.targetId, zoneIds),\n options: optionsCopy\n };\n });\n }\n\n public async setModalState(windowId: string, isModal: boolean): Promise<void> {\n return this.execute(\"setModalState\", { windowId, options: { isModal } });\n }\n\n public async handleFlydownBoundsRequested(targetId: string, data: ShowFlydownData) {\n const cancelCallback = () => data.cancel = true;\n\n const callbackData: IOConnectDesktop.Windows.ShowFlydownData = {\n zoneId: data.flydownId,\n flydownWindowBounds: data.flydownWindowBounds,\n flydownWindowId: data.flydownWindowId,\n };\n\n const responses = await Promise.all(this._registry.execute(`${targetId}_${data.flydownId}`, callbackData, cancelCallback));\n\n if (responses.length === 1) {\n const defaultResponse = { height: 0, width: 0, top: 0, left: 0 };\n const response = typeof (responses[0]) === \"object\" && !Array.isArray(responses[0]) ? responses[0] : defaultResponse;\n const responseOptions: ShowFlydownData = { ...data, flydownWindowBounds: response };\n\n return responseOptions;\n }\n }\n\n public async handleOnEventRequested(callbackId: string, args?: { newUrl: string }) {\n const callbacks = this.unsubCallbacks[callbackId] ?? [];\n let prevented = false;\n const preventArgs: any[] = [];\n await Promise.all(callbacks.map((cb) => {\n return new Promise<void>((resolve, reject) => {\n cb(() => {\n resolve();\n }, () => {\n reject();\n }, (pArgs: any) => {\n prevented = true;\n preventArgs.push(pArgs);\n }, args);\n });\n }));\n return { prevented, preventArgs };\n }\n\n public async zoomIn(window: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"zoomIn\", {\n windowId: window.id,\n });\n return window;\n }\n\n public async zoomOut(window: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"zoomOut\", {\n windowId: window.id,\n });\n return window;\n }\n\n public async setZoomFactor(window: IOConnectDesktop.Windows.IOConnectWindow, zoomFactor: number): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"setZoomFactor\", {\n windowId: window.id,\n options: {\n zoomFactor\n }\n });\n return window;\n }\n\n public async showDevTools(window: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"showDevTools\", {\n windowId: window.id,\n });\n\n return window;\n }\n\n public async capture(window: IOConnectDesktop.Windows.IOConnectWindow, options: IOConnectDesktop.Windows.CaptureOptions): Promise<string> {\n const base64screenshot = (await this.execute(\n \"captureScreenshot\",\n { windowId: window.id, options: { ...options } }\n )).data;\n\n return base64screenshot;\n }\n\n public async captureGroup(windowIds: string[], options: IOConnectDesktop.Windows.CaptureOptions): Promise<string> {\n const base64screenshot: string = (await this.execute(\n \"captureGroupScreenshot\",\n { windowId: windowIds[0], options: { groupWindowIds: windowIds, ...options } }\n )).data;\n\n return base64screenshot;\n }\n\n public async flash(resultWindow: IOConnectDesktop.Windows.IOConnectWindow, options: FlashOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\n \"flash\",\n { windowId: resultWindow.id, options: { ...options } }\n );\n\n return resultWindow;\n }\n\n public async flashTab(resultWindow: IOConnectDesktop.Windows.IOConnectWindow, options: FlashTabOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\n \"flashTab\",\n { windowId: resultWindow.id, options: { ...options } }\n );\n\n return resultWindow;\n }\n\n public async configure(windowId: string, options: IOConnectDesktop.Windows.WindowsConfiguration): Promise<void> {\n return this.execute(\n \"configure\",\n { windowId, options: { ...options } }\n );\n }\n\n public async print(resultWindow: IOConnectDesktop.Windows.IOConnectWindow, options: IOConnectDesktop.Windows.PrintOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\n \"print\",\n { windowId: resultWindow.id, options: { ...options } }\n );\n return resultWindow;\n }\n\n public async printToPDF(resultWindow: IOConnectDesktop.Windows.IOConnectWindow, options: IOConnectDesktop.Windows.PrintToPDFOptions): Promise<string> {\n const filePath: string = (await this.execute(\n \"printToPDF\",\n { windowId: resultWindow.id, options: { ...options } }\n )).filePath;\n\n return filePath;\n }\n\n public async place(window: IOConnectDesktop.Windows.IOConnectWindow, options: IOConnectDesktop.Windows.PlacementSettings): Promise<void> {\n const copy = { ...options } as { display: string | number | IOConnectDesktop.Displays.Display };\n if (!options.display || options.display === \"current\") {\n copy.display = await window.getDisplay();\n }\n // Glue42.Displays.API works with zero based array of displays, which means that the first monitor has index 0\n // whereas GD works with non zero based array of displays, which means that the first monitor has index 1\n if (copy.display && typeof copy.display !== \"string\" && typeof copy.display !== \"number\") {\n copy.display = copy.display.index + 1;\n }\n\n return this.execute(\n \"place\",\n { windowId: window.id, options: { ...copy } }\n );\n }\n\n public async refresh(resultWindow: IOConnectDesktop.Windows.IOConnectWindow, ignoreCache: boolean): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"refresh\", { windowId: resultWindow.id, options: { ignoreCache } });\n return resultWindow;\n }\n\n public async download(resultWindow: IOConnectDesktop.Windows.IOConnectWindow, url: string, options: IOConnectDesktop.Windows.DownloadOptions & { enableDownloadBar?: boolean } = {}): Promise<IOConnectDesktop.Windows.DownloadResult> {\n options.enableDownloadBar = !options.silent;\n const result: { fileSize: number, fullPath: string, success: boolean } = await this.execute(\"downloadURL\", { windowId: resultWindow.id, options: { url, options } });\n return {\n url,\n path: result.fullPath,\n size: result.fileSize,\n };\n }\n\n public async configureWindow(resultWindow: IOConnectDesktop.Windows.IOConnectWindow, options: IOConnectDesktop.Windows.WindowConfiguration): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"configureWindow\", { windowId: resultWindow.id, options });\n return resultWindow;\n }\n\n public async getWindowConfiguration(resultWindow: IOConnectDesktop.Windows.IOConnectWindow): Promise<IOConnectDesktop.Windows.WindowConfiguration> {\n const config = await this.execute(\"getWindowConfiguration\", { windowId: resultWindow.id });\n return config;\n }\n\n public async startDrag(resultWindow: IOConnectDesktop.Windows.IOConnectWindow, options: IOConnectDesktop.Windows.StartDragOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n await this.execute(\"startDrag\", { windowId: resultWindow.id, options });\n return resultWindow;\n }\n\n public showDialog<T>(resultWindow: IOConnectDesktop.Windows.IOConnectWindow, options: IOConnectDesktop.Windows.DialogOptions): Promise<T> {\n return new Promise((res, rej) => {\n const token = shortid.generate();\n const un = this._registry.add(\"event\", (args: { windowId: string, type: string, data: DialogResult<T>[\"data\"] }) => {\n if (args.type === \"DialogResult\" && args.windowId === resultWindow.id && args.data.token === token) {\n un();\n const data = args.data;\n if (\"status\" in data) {\n if (data.status === \"failed\") {\n rej(data.message);\n } else if (data.status === \"successful\") {\n res(data.result);\n }\n }\n }\n });\n this.execute(\"showDialog\", { windowId: resultWindow.id, options: Object.assign({}, { ...options }, { token }) });\n });\n }\n\n /**\n * Invokes the container\n * @param command\n * @param options\n * @param {...string} eventKeys which events types to be awaited before resolving - used only < GD 3.12\n * @returns Invocation result\n */\n public async execute(command: string, options: any, ...eventKeys: string[]): Promise<any> {\n return this.executeCore(this.WndMethodName, command, options, ...eventKeys);\n }\n\n public async executeGroup(command: string, options: any, ...eventKeys: string[]): Promise<any> {\n return this.executeCore(this.GroupMethodName, command, options, ...eventKeys);\n }\n\n public async ungroup(w: IOConnectDesktop.Windows.IOConnectWindow, options: IOConnectDesktop.Windows.UngroupOptions): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n const args = {\n windowId: w.id,\n options\n };\n await this.execute(\"ungroup\", args);\n return w;\n }\n\n public async updateJumpList(windowId: string, options: JumpListUpdateSettings): Promise<void> {\n const args = {\n windowId,\n options\n };\n await this.execute(\"updateJumplist\", args);\n }\n\n public async getJumpList(windowId: string): Promise<JumpListSettingsInternal> {\n const args = {\n windowId,\n };\n const result = await this.execute(\"getJumplist\", args);\n return result;\n }\n\n public onClosing(callback: (success: () => void, error: () => void, prevent: (options?: IOConnectDesktop.Windows.PreventClosingOptions) => void) => void, gdWindow: IOConnectDesktop.Windows.IOConnectWindow): () => void {\n const glue42gd = typeof window !== \"undefined\" && (window as any).glue42gd;\n if (glue42gd && gdWindow.windowType === \"electron\") {\n return glue42gd.addCloseHandler(callback, gdWindow.id);\n } else {\n return this.nonWindowHandlers(callback, gdWindow.id, \"OnClosing\");\n }\n }\n\n public onRefreshing(callback: (success: () => void, error: () => void, prevent: () => void) => void, gdWindow: IOConnectDesktop.Windows.IOConnectWindow): () => void {\n const glue42gd = typeof window !== \"undefined\" && (window as any).glue42gd;\n if (glue42gd && gdWindow.windowType === \"electron\") {\n return glue42gd.addRefreshHandler(callback, gdWindow.id);\n } else {\n return this.nonWindowHandlers(callback, gdWindow.id, \"OnRefreshing\");\n }\n }\n\n public onNavigating(callback: (success: () => void, error: () => void, prevent: () => void, args: { newUrl: string }) => void, gdWindow: IOConnectDesktop.Windows.IOConnectWindow): () => void {\n const glue42gd = typeof window !== \"undefined\" && (window as any).glue42gd;\n if (glue42gd && gdWindow.windowType === \"electron\") {\n return glue42gd.addWillNavigateHandler(callback, gdWindow.id);\n } else {\n return this.nonWindowHandlers(callback, gdWindow.id, \"OnNavigating\");\n }\n }\n\n public async goBack(resultWindow: IOConnectDesktop.Windows.IOConnectWindow): Promise<void> {\n await this.execute(\"goBack\", { windowId: resultWindow.id });\n }\n\n public async goForward(resultWindow: IOConnectDesktop.Windows.IOConnectWindow): Promise<void> {\n await this.execute(\"goForward\", { windowId: resultWindow.id });\n }\n\n private nonWindowHandlers(callback: (success: () => void, error: () => void, prevent?: (options?: IOConnectDesktop.Windows.PreventClosingOptions) => void, args?: { newUrl: string }) => void, winId: string, type: string): () => void {\n const id = `${winId}-${type}`;\n const unsub = () => {\n if (this.unsubCallbacks[id]) {\n const callbacks = this.unsubCallbacks[id];\n this.unsubCallbacks[id] = callbacks.filter((cb) => cb !== callback);\n }\n const cbs = this.unsubCallbacks[id];\n if (cbs.length === 0) {\n this.execute(type, {\n windowId: winId,\n options: {\n unsubscribe: true\n }\n });\n }\n };\n if (this.unsubCallbacks[id]) {\n this.unsubCallbacks[id].push(callback);\n return unsub;\n } else {\n this.unsubCallbacks[id] = [callback];\n }\n const args = {\n windowId: winId\n };\n this.execute(type, args);\n return unsub;\n }\n\n private reformatFlydownOptions(windowId: string, options: IOConnectDesktop.Windows.FlydownOptions) {\n const assignGeneralIfUnassigned = (zone: IOConnectDesktop.Windows.FlydownZone, prop: keyof IOConnectDesktop.Windows.FlydownZone & keyof IOConnectDesktop.Windows.FlydownOptions) => {\n if (options[prop] && (zone[prop] === undefined || zone[prop] === null)) {\n const valueFromOptions = options[prop];\n (zone[prop] as any) = valueFromOptions;\n }\n };\n\n const zones: ReformatedFlydownOptions[\"zones\"] = options.zones.map((z) => {\n assignGeneralIfUnassigned(z, \"windowId\");\n assignGeneralIfUnassigned(z, \"targetLocation\");\n\n if (options.size && (z.flydownSize === undefined || z.flydownSize === null)) {\n z.flydownSize = options.size;\n }\n\n (z as ReformatedFlydownZone).flydownBounds = z.flydownSize as any;\n (z as ReformatedFlydownZone).flydownId = z.windowId;\n\n if (!z.targetLocation) {\n z.targetLocation = \"bottom\" as IOConnectDesktop.Windows.PopupTargetLocation.Bottom;\n }\n\n return z;\n });\n\n return {\n ...options,\n zones,\n targetId: windowId,\n flydownBounds: options.size,\n flydownActiveArea: options.activeArea\n };\n }\n\n private clearFlydownArea(windowId: string, areaIds: string[]) {\n return this.execute(\"clearFlydownWindowArea\", {\n windowId,\n options: {}\n }).then(() => {\n areaIds.forEach((id) => {\n this._registry.clearKey(`${windowId}_${id}`);\n });\n });\n }\n\n private executeWithoutToken(params: { windowId: string }, ...eventKeys: string[]) {\n const uns: UnsubscribeFunction[] = [];\n const executed = eventKeys?.filter((k) => !isUndefinedOrNull(k)).map((key) => {\n return new Promise<void>((r) => {\n const [type, windowId = params.windowId] = key.split(\"-\");\n uns.push(this._registry.add(\"event\", (data: { windowId: string, type: string }) => {\n if (data.type === type && data.windowId === windowId) {\n r();\n }\n }));\n });\n });\n const action = new Promise<any>((resolve, reject) => {\n this.agm.invoke<any>(\"T42.Wnd.Execute\", params, this.agmTarget)\n .then((i) => {\n if (i.returned && i.returned.errorMsg) {\n reject(i);\n } else {\n resolve(i.returned);\n }\n })\n .catch((e) => reject(e));\n });\n return Promise.all([action, ...executed])\n .then((r) => {\n return r[0];\n })\n .finally(() => {\n uns.forEach((un) => un());\n });\n }\n\n private async executeCore(methodName: string, command: string, options: any, ...eventKeys: string[]): Promise<any> {\n const params = {\n ...options,\n command,\n };\n let finishedResolve: () => void;\n this._finished = new Promise((resolve) => {\n finishedResolve = resolve;\n });\n try {\n if (typeof window !== \"undefined\" && (window.glueDesktop as any).versionNum < 31200) {\n return await this.executeWithoutToken(params, ...eventKeys);\n } else {\n return await this.executeWithToken(methodName, params);\n }\n } finally {\n finishedResolve();\n }\n }\n\n private async executeWithToken(methodName: string, options: any) {\n let un: UnsubscribeFunction;\n try {\n const token = shortid.generate();\n const event = new Promise<void>((r) => {\n un = this._registry.add(\"event\", (data: any) => {\n if (data.token === token) {\n r();\n }\n });\n });\n const execute = new Promise<any>((resolve, reject) => {\n options.token = token;\n this.agm.invoke<any>(methodName, options, this.agmTarget)\n .then((i) => {\n if (i.returned && i.returned.errorMsg) {\n reject(i);\n } else {\n resolve(i.returned);\n }\n })\n .catch((i) => {\n reject(i);\n });\n });\n\n const result = await Promise.all([execute, event]);\n return result[0];\n } catch (error) {\n throw error;\n } finally {\n if (un) {\n un();\n }\n }\n }\n\n private areBoundsEqual(requested: Partial<IOConnectDesktop.Windows.Bounds>, w: IOConnectDesktop.Windows.IOConnectWindow) {\n const current = w.bounds;\n const settings = w.settings;\n let height = requested.height;\n let width = requested.width;\n if (requested.height < settings.minHeight) {\n height = settings.minHeight;\n }\n if (requested.height > settings.maxHeight) {\n height = settings.maxHeight;\n }\n if (requested.width < settings.minWidth) {\n width = settings.minWidth;\n }\n if (requested.width > settings.maxWidth) {\n width = settings.maxWidth;\n }\n\n const areHeightsEqual = height ? current.height === height : true;\n const areWidthsEqual = width ? current.width === width : true;\n const areLeftsEqual = requested.left ? current.left === requested.left : true;\n const areTopsEqual = requested.top ? current.top === requested.top : true;\n\n return areHeightsEqual && areWidthsEqual && areLeftsEqual && areTopsEqual;\n }\n\n private swapUndefinedToNull(context: any) {\n try {\n // swap top level undefined values to null-s\n const copy: any = {};\n for (const key of Object.keys(context)) {\n let value = context[key];\n if (typeof value === \"undefined\") {\n value = null;\n }\n copy[key] = value;\n }\n return copy;\n } catch {\n return context;\n }\n }\n}\n\nexport default new GDExecutor();\n","import { IOConnectDesktop } from \"../../../../desktop\";\nimport { default as windowStore } from \"../../store\";\nimport { Environment, Executor, WindowsAPIConfiguration, WindowConstructorOptions, WindowEvents, WindowWrapper } from \"../../types\";\nimport windowFactory from \"../../window\";\nimport { default as executor } from \"./executor\";\nimport { CallbackRegistry, UnsubscribeFunction, default as CallbackFactory } from \"callback-registry\";\nimport {\n FullInfoEvent,\n StreamEvent,\n WindowInfo,\n GroupHeaderVisibilityChanged,\n UrlChanged,\n TitleChanged,\n BoundsChanged,\n FocusChanged,\n CompositionChanged,\n ExtendedStreamEvent,\n EventWithResponseData,\n ResponseTypes,\n IsStickyChanged,\n GroupVisibilityChanged,\n} from \"./types\";\nimport { getWindowsByTabGroupId } from \"../helpers\";\n\nexport default class GDEnvironment implements Environment {\n\n private _registry: CallbackRegistry = CallbackFactory();\n private _agm: IOConnectDesktop.AGM.API;\n private _logger: IOConnectDesktop.Logger.API;\n private _waitTimeout = 10000;\n private _agmInstance: IOConnectDesktop.Interop.Instance;\n private _windowId: string;\n private _configuration: WindowsAPIConfiguration;\n private _appManagerGetter: () => IOConnectDesktop.AppManager.API;\n private _displayAPIGetter: () => IOConnectDesktop.Displays.API;\n private _channelsAPIGetter: () => IOConnectDesktop.Channels;\n\n constructor(agm: IOConnectDesktop.AGM.API, logger: IOConnectDesktop.Logger.API, appManagerGetter: () => IOConnectDesktop.AppManager.API, displayAPIGetter: () => IOConnectDesktop.Displays.API, channelsAPIGetter: () => IOConnectDesktop.Channels, wndId?: string) {\n this._agm = agm;\n this._logger = logger.subLogger(\"gd-env\");\n this._windowId = wndId;\n this._appManagerGetter = appManagerGetter;\n this._displayAPIGetter = displayAPIGetter;\n this._channelsAPIGetter = channelsAPIGetter;\n }\n\n public init(): Promise<GDEnvironment> {\n return new Promise((resolve, reject) => {\n this._agm.register(\"T42.Wnd.OnEventWithResponse\", (args, caller) => {\n return this.respondToEvent(args);\n });\n\n const streamPromise = new Promise<void>((streamResolve, streamReject) => {\n this._agm.subscribe(\"T42.Wnd.OnEvent\", {\n waitTimeoutMs: this._waitTimeout,\n target: \"best\",\n arguments: {\n withConfig: true\n },\n onData: (streamData: any) => {\n if (streamData.data.type === \"Configuration\") {\n this._configuration = streamData.data;\n return;\n }\n this.updateWindow(streamData.data, resolve);\n executor.handleEvent(streamData.data);\n executor.init(this._agm, this._agmInstance, this._configuration);\n },\n onConnected: (instance) => {\n this._agmInstance = instance;\n // Init the executor\n executor.init(this._agm, this._agmInstance);\n }\n }).catch((error: { message: string, method: { name: string }, called_with: unknown }) => {\n const message = `${error?.method?.name} - ${JSON.stringify(error?.called_with)} - ${error?.message}`;\n reject(new Error(message));\n });\n });\n });\n }\n\n public get executor(): Executor {\n return executor;\n }\n\n public open(name: string, url: string, options: any): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n options = options || {};\n const copyOptions = { ...options };\n\n if (copyOptions.relativeTo !== undefined && typeof copyOptions.relativeTo !== \"string\") {\n copyOptions.relativeTo = copyOptions.relativeTo.id || \"\";\n }\n\n copyOptions.name = name;\n copyOptions.url = url;\n\n // This is for compatibility between gd2 and gd3\n copyOptions.windowState = options.windowState || options.state;\n // Otherwise glue desktop throws an error for extra properties\n delete copyOptions.state;\n return this.executor.open(copyOptions);\n }\n\n public createFlydown(windowId: string, options: IOConnectDesktop.Windows.FlydownOptions): Promise<IOConnectDesktop.Windows.Flydown> {\n return this.executor.createFlydown(windowId, options);\n }\n\n public async showPopup(windowId: string, options: IOConnectDesktop.Windows.PopupOptions): Promise<void> {\n const window = windowStore.get(windowId);\n await this.executor.showPopup(window.API, options);\n }\n\n public tabAttached(callback: (tabWindow: IOConnectDesktop.Windows.IOConnectWindow, newTabGroupId: string, tabHeaderVisible: boolean) => void): UnsubscribeFunction {\n return this._registry.add(\"tab-attached\", callback);\n }\n\n public tabDetached(callback: (window: IOConnectDesktop.Windows.IOConnectWindow, tabGroupId: string, oldTabGroupId: string) => void): UnsubscribeFunction {\n return this._registry.add(\"tab-detached\", callback);\n }\n\n public onWindowFrameColorChanged(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void) {\n return this._registry.add(\"frame-color-changed\", callback);\n }\n\n public onEvent(callback: (windowInfo: any) => void): UnsubscribeFunction {\n return this._registry.add(\"window-event\", callback);\n }\n\n public my(): string {\n return this._windowId;\n }\n\n public execute<T>(command: string, windowId: string, options: any): Promise<IOConnectDesktop.AGM.InvocationResult<T>> {\n return this._agm.invoke<T>(\"T42.Wnd.Execute\", {\n command,\n options,\n windowId,\n });\n }\n\n /** Groups */\n public onCompositionChanged(callback: (windowInfo: any) => void): UnsubscribeFunction {\n return this._registry.add(\"composition-changed\", callback);\n }\n\n public onGroupHeaderVisibilityChanged(callback: (stream: any) => void): UnsubscribeFunction {\n return this._registry.add(\"group-header-changed\", callback);\n }\n\n public onGroupVisibilityChanged(callback: (stream: any) => void): UnsubscribeFunction {\n return this._registry.add(\"group-visibility-changed\", callback);\n }\n\n public onGroupStateChanged(callback: (stream: any) => void): UnsubscribeFunction {\n return this._registry.add(\"group-state-changed\", callback);\n }\n\n public onWindowGotFocus(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return this._registry.add(\"got-focus\", callback);\n }\n\n public onWindowLostFocus(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return this._registry.add(\"lost-focus\", callback);\n }\n\n private respondToEvent(args: EventWithResponseData): Promise<ResponseTypes> {\n if (args.type === \"ShowFlydownBoundsRequested\") {\n return this.executor.handleFlydownBoundsRequested(args.data.windowId, args.data);\n } else if (args.type === \"OnClosing\" || args.type === \"OnRefreshing\" || args.type === \"OnNavigating\") {\n return this.executor.handleOnEventRequested(args.data.callbackId, args.data.args);\n }\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n return Promise.reject(`There isn't a handler for ${(args as any).type}`);\n }\n\n private updateWindow(windowInfo: StreamEvent, readyResolve: (env: GDEnvironment) => void) {\n const extendedStreamEvent = this.getExtendedStreamEvent(windowInfo);\n\n // this is the snapshot of all windows\n if (windowInfo.type === \"Snapshot\") {\n const windowInfoFullInfoEvent = (windowInfo as FullInfoEvent);\n windowInfoFullInfoEvent.windows.forEach((w) => {\n const existingWindow = windowStore.get(w.id);\n if (existingWindow) {\n existingWindow.Events.handleUpdate(this.mapToWindowConstructorOptions(w));\n } else {\n const win = this.createWindow(w.id, w);\n windowStore.markReadyToShow(win.API.id);\n }\n this._registry.execute(\"window-event\", extendedStreamEvent);\n });\n readyResolve(this);\n return;\n }\n\n // global event\n if (windowInfo.type === \"CommandExecuted\") {\n this._registry.execute(\"window-event\", extendedStreamEvent);\n return;\n }\n\n // if new window handle it separately\n if (windowInfo.type === \"Created\") {\n const windowInfoCreatedEvent = (windowInfo);\n const win = this.createWindow(windowInfoCreatedEvent.windowId, windowInfoCreatedEvent.data || {});\n windowStore.setReadyState(win.API.id);\n this._registry.execute(\"window-event\", extendedStreamEvent);\n return;\n }\n\n if (windowInfo.type === \"OnGroupVisibilityChanged\") {\n const info = windowInfo as GroupVisibilityChanged;\n this._registry.execute(\"group-visibility-changed\", info.data);\n this._registry.execute(\"window-event\", windowInfo);\n return;\n }\n\n if (windowInfo.type === \"OnGroupStateChanged\") {\n const info = windowInfo as GroupVisibilityChanged;\n this._registry.execute(\"group-state-changed\", info.data);\n this._registry.execute(\"window-event\", windowInfo);\n return;\n }\n\n // otherwise check if the window is in our internal collections and update its state\n const windowObjectAndEvents: WindowWrapper = windowStore.get((windowInfo).windowId);\n if (!windowObjectAndEvents) {\n this._logger.error(`received update for unknown window. Stream:', ${JSON.stringify(windowInfo, null, 4)}`);\n return;\n }\n\n const theWindow: IOConnectDesktop.Windows.IOConnectWindow = windowObjectAndEvents.API;\n const theWindowEvents: WindowEvents = windowObjectAndEvents.Events;\n\n // handle bounds changed\n if (windowInfo.type === \"BoundsChanged\") {\n const windowInfoBoundsChangedEvent = (windowInfo as BoundsChanged);\n theWindowEvents.handleBoundsChanged(windowInfoBoundsChangedEvent.data);\n }\n\n // handle url changed\n if (windowInfo.type === \"UrlChanged\") {\n const windowInfoUrlChangedEvent = (windowInfo as UrlChanged);\n windowStore.setUrlChangedState(windowInfoUrlChangedEvent.windowId);\n theWindowEvents.handleUrlChanged(windowInfoUrlChangedEvent.data);\n }\n\n // handle title changed\n if (windowInfo.type === \"TitleChanged\") {\n const windowInfoTitleChanged = (windowInfo as TitleChanged);\n theWindowEvents.handleTitleChanged(windowInfoTitleChanged.data);\n }\n\n // handle isSticky changed\n if (windowInfo.type === \"IsStickyChanged\") {\n const windowInfoIsStickyChangedChanged = (windowInfo as IsStickyChanged);\n theWindowEvents.handleIsStickyChanged(windowInfoIsStickyChangedChanged.data);\n }\n\n // handle visibility changed\n if (windowInfo.type === \"VisibilityChanged\") {\n theWindowEvents.handleVisibilityChanged(windowInfo.data);\n }\n\n // handle context changed\n if (windowInfo.type === \"ContextChanged\") {\n theWindowEvents.handleContextUpdated(windowInfo.data);\n }\n\n // handle window state changed\n if (windowInfo.type === \"StateChanged\") {\n theWindowEvents.handleWindowChangeState(windowInfo.data);\n }\n\n // handle frame color changed\n if (windowInfo.type === \"FrameColorChanged\") {\n theWindowEvents.handleFrameColorChanged(windowInfo.data);\n this._registry.execute(\"frame-color-changed\", theWindow);\n }\n\n // handle composition changed - groups API\n if (windowInfo.type === \"CompositionChanged\") {\n const windowInfoCompositionChanged = windowInfo as CompositionChanged;\n theWindowEvents.handleCompositionChanged(windowInfoCompositionChanged.data);\n windowStore.setCompositionChangedState(windowInfoCompositionChanged.data.windowId, this._configuration?.windowAvailableOnURLChanged);\n this._registry.execute(\"composition-changed\", windowInfoCompositionChanged.data);\n }\n\n if (windowInfo.type === \"GroupHeaderVisibilityChanged\") {\n const info = windowInfo as GroupHeaderVisibilityChanged;\n theWindowEvents.handleGroupHeaderVisibilityChanged(info.data.groupHeaderVisible);\n this._registry.execute(\"group-header-changed\", info.data);\n }\n\n // handle focus changed\n if (windowInfo.type === \"FocusChanged\") {\n const windowInfoFocusChanged = (windowInfo as FocusChanged);\n this.focusChanged(theWindowEvents, theWindow, windowInfoFocusChanged.data);\n }\n\n if (windowInfo.type === \"WindowFrameChanged\") {\n theWindowEvents.handleFrameAttached(windowInfo.data.frameId, windowInfo.data.frameId, windowInfo.data.isTabHeaderVisible);\n this._registry.execute(\"frame-changed\");\n }\n\n if (windowInfo.type === \"WindowFrameAdded\") {\n const winsToBeNotified = getWindowsByTabGroupId(theWindow.id, windowInfo.data.frameId);\n const data = windowInfo.data;\n theWindowEvents.handleAttached(data.frameId, data.frameId, data.isTabHeaderVisible, data.isLocked, winsToBeNotified)\n .then(async () => {\n // don't fire the event if it is the first window\n if (winsToBeNotified.length > 0) {\n await executor.finished;\n this._registry.execute(\"tab-attached\", theWindow, windowInfo.data.frameId, windowInfo.data.isTabHeaderVisible);\n }\n });\n }\n\n if (windowInfo.type === \"WindowFrameRemoved\") {\n // In the event, tabGroupId is empty, will be update on the next event FrameAttached\n const oldTabGroupId = theWindow.tabGroupId;\n const winsToBeNotified = getWindowsByTabGroupId(theWindow.id, oldTabGroupId);\n theWindowEvents.handleDetached(windowInfo.data.isLocked, winsToBeNotified)\n .then(async () => {\n // don't fire the event if it is the first window\n if (winsToBeNotified.length > 0) {\n await executor.finished;\n this._registry.execute(\"tab-detached\", theWindow, windowInfo.data.frameId, theWindow.tabGroupId);\n }\n });\n }\n\n if (windowInfo.type === \"TabHeaderVisibilityChanged\") {\n theWindowEvents.handleTabHeaderVisibilityChanged(windowInfo.data.isTabHeaderVisible);\n }\n\n if (windowInfo.type === \"FrameSelectionChanged\") {\n theWindowEvents.handleFrameSelectionChanged(windowInfo.data.newWindowId, windowInfo.data.prevWindowId);\n }\n\n if (windowInfo.type === \"ButtonClicked\") {\n theWindowEvents.handleFrameButtonClicked(windowInfo.data);\n }\n\n if (windowInfo.type === \"ButtonAdded\") {\n theWindowEvents.handleFrameButtonAdded(windowInfo.data);\n }\n\n if (windowInfo.type === \"ButtonRemoved\") {\n theWindowEvents.handleFrameButtonRemoved(windowInfo.data);\n }\n\n if (windowInfo.type === \"WindowZoomFactorChanged\") {\n theWindowEvents.handleZoomFactorChanged(windowInfo.data);\n }\n\n // Clear the window on close event\n if (windowInfo.type === \"Closed\") {\n windowStore.remove(windowObjectAndEvents);\n theWindowEvents.handleWindowClose();\n }\n\n if (windowInfo.type === \"FrameIsLockedChanged\") {\n theWindowEvents.handleFrameIsLockedChanged(windowInfo.data);\n }\n\n if (windowInfo.type === \"PlacementSettingsChanged\") {\n theWindowEvents.handlePlacementSettingsChanged(windowInfo.data);\n }\n\n // expose to external listeners\n this._registry.execute(\"window-event\", extendedStreamEvent);\n }\n\n private createWindow(windowId: string, options: WindowInfo): WindowWrapper {\n const windowObjAndEvents: WindowWrapper = windowFactory(windowId, this.mapToWindowConstructorOptions(options), executor, this._logger, this._appManagerGetter, this._displayAPIGetter, this._channelsAPIGetter, this._agm);\n windowStore.add(windowObjAndEvents);\n return windowObjAndEvents;\n }\n\n private async focusChanged(theWindowEvents: WindowEvents, theWindow: IOConnectDesktop.Windows.IOConnectWindow, focus: boolean) {\n theWindowEvents.handleFocusChanged(focus);\n await windowStore.waitFor(theWindow.id);\n if (focus) {\n this._registry.execute(\"got-focus\", theWindow);\n } else {\n this._registry.execute(\"lost-focus\", theWindow);\n }\n }\n\n private mapToWindowConstructorOptions(args: WindowInfo): WindowConstructorOptions {\n // TODO\n return {\n name: args.name,\n context: args.context,\n bounds: args.bounds,\n url: args.url,\n title: args.title,\n isVisible: args.isVisible,\n focus: args.isFocused,\n state: args.state,\n frameColor: args.frameColor,\n groupId: args.groupId,\n neighbours: args.neighbors,\n isFocused: args.isFocused,\n isGroupHeaderVisible: args.groupHeaderVisible,\n isCollapsed: args.isCollapsed,\n tabGroupId: args.frameId,\n frameId: args.frameId,\n mode: args.mode,\n isTabHeaderVisible: args.isTabHeaderVisible,\n isTabSelected: args.isActiveTab,\n settings: args.settings,\n windowType: args.windowType,\n zoomFactor: args.zoomFactor,\n // focus: args.focus,\n isLocked: args.isLocked,\n placementSettings: args.placementSettings,\n isSticky: args.isSticky,\n tabIndex: args.tabIndex,\n // settings: windowStyleAttributes,\n frameButtons: args.frameButtons,\n jumpListOptions: args.jumpList,\n applicationName: args.applicationName\n };\n }\n\n private getExtendedStreamEvent(streamEvent: StreamEvent): StreamEvent | ExtendedStreamEvent {\n try {\n // some events (e.g. Snapshot) do not have windowIds\n if (!streamEvent.windowId) {\n return streamEvent;\n }\n\n // try to get the window, if not there return the original event\n const window = windowStore.get(streamEvent.windowId);\n if (!window) {\n return streamEvent;\n }\n\n const result: ExtendedStreamEvent = {\n state: streamEvent.type,\n windowName: window.API.name,\n ...streamEvent\n };\n\n if (result.state === \"WindowFrameAdded\") {\n result.state = \"TabAttached\";\n }\n\n if (result.state === \"StateChanged\") {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n result.state = result.data.charAt(0).toUpperCase() + result.data.slice(1);\n }\n\n if (result.state === \"ButtonAdded\") {\n result.state = \"FrameButtonAdded\";\n }\n\n if (result.state === \"ButtonRemoved\") {\n result.state = \"FrameButtonRemoved\";\n }\n\n return result;\n } catch (error) {\n return streamEvent;\n }\n }\n}\n","import { Environment } from \"./../types\";\nimport { default as GD } from \"./gd/gd\";\nimport { IOConnectDesktop } from \"../../../desktop\";\n\nexport default (agm: IOConnectDesktop.AGM.API, logger: IOConnectDesktop.Logger.API, appManagerGetter: () => IOConnectDesktop.AppManager.API, displayAPIGetter: () => IOConnectDesktop.Displays.API, channelsAPIGetter: () => IOConnectDesktop.Channels, gdMajorVersion: number): Promise<Environment> => {\n const _logger = logger;\n if (gdMajorVersion === 2) {\n // We are running in HC\n _logger.trace(\"running in HC\");\n throw new Error(\"GD2 not supported\");\n } else if (gdMajorVersion >= 3) {\n // We are running in GD 3\n _logger.trace(\"running in GD 3\");\n return new GD(agm, _logger, appManagerGetter, displayAPIGetter, channelsAPIGetter, window.glue42gd.windowId).init();\n } else {\n // We are running in Browser or Node, we should check which stream is available\n // But we need to pass the container as dependency\n return new GD(agm, _logger, appManagerGetter, displayAPIGetter, channelsAPIGetter).init();\n }\n};\n","import callbackRegistry, { CallbackRegistry } from \"callback-registry\";\nimport { IOConnectDesktop } from \"../../desktop\";\nimport { default as windowStore } from \"./store\";\nimport { Executor, GroupInternal, GroupWrapper, WindowWrapper } from \"./types\";\nimport { isBoolean, isNullOrWhiteSpace, isUndefinedOrNull } from \"../activity/helpers/util\";\nimport utils from \"../utils\";\n\nexport default (id: string, executor: Executor): GroupWrapper => {\n\n const _registry: CallbackRegistry = callbackRegistry();\n\n const _windowsId: string[] = [];\n\n let _isHibernatedFlag = false;\n let _isVisible = true;\n\n // #region \"API functions\"\n\n async function addWindow(winId: string): Promise<void> {\n if (_windowsId.indexOf(winId) === -1) {\n _windowsId.push(winId);\n const win: WindowWrapper = windowStore.get(winId);\n win.Events.handleGroupChanged(groupObject, undefined);\n await executor.finished;\n _registry.execute(\"window-added\", groupObject, win.API);\n }\n }\n\n async function removeWindow(win: WindowWrapper): Promise<void> {\n const index: number = _windowsId.indexOf(win.API.id);\n if (index !== -1) {\n _windowsId.splice(index, 1);\n win.Events.handleGroupChanged(undefined, groupObject);\n await executor.finished;\n _registry.execute(\"window-removed\", groupObject, win.API);\n }\n }\n\n function find(window: string | IOConnectDesktop.Windows.IOConnectWindow, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): IOConnectDesktop.Windows.IOConnectWindow {\n let winId: string;\n if (typeof window === \"string\") {\n winId = window;\n } else if (!isUndefinedOrNull(window)) {\n winId = window.id;\n }\n\n const win = _mapToWindowObject(winId);\n if (win) {\n if (typeof success === \"function\") {\n success(win);\n }\n return win;\n } else {\n if (typeof error === \"function\") {\n error(`No window with ID: ${winId}`);\n }\n }\n }\n\n function windows(success?: (windows: IOConnectDesktop.Windows.IOConnectWindow[]) => void): IOConnectDesktop.Windows.IOConnectWindow[] {\n const mappedWindows: IOConnectDesktop.Windows.IOConnectWindow[] = _mapToWindowObjects();\n if (typeof success === \"function\") {\n success(mappedWindows);\n }\n return mappedWindows;\n }\n\n async function execute(command: string, options: any & { windowId: string }, ...keys: string[]): Promise<IOConnectDesktop.Windows.Group> {\n await executor.execute<IOConnectDesktop.Windows.Group>(command, options, ...keys);\n return groupObject;\n }\n\n // #endregion \"API functions\"\n\n // #region \"Stream function\"\n\n function handleGroupHeaderVisibilityChanged(windowInfo: any): void {\n _registry.execute(\"header-visibility-changed\", groupObject);\n }\n\n function handleGroupVisibilityChanged(visibile: boolean): void {\n _isVisible = visibile;\n _registry.execute(\"group-visibility-changed\", groupObject);\n }\n\n function handleGroupHibernateChanged(isHibernatedFlag: boolean): void {\n _isHibernatedFlag = isHibernatedFlag;\n }\n\n // #endregion \"Stream function\"\n\n // #region \"Internal function\"\n\n function _mapToWindowObjects(): IOConnectDesktop.Windows.IOConnectWindow[] {\n const winObjects: IOConnectDesktop.Windows.IOConnectWindow[] = [];\n\n _windowsId.forEach((winId) => {\n const windowObject = _mapToWindowObject(winId);\n if (typeof windowObject !== \"undefined\") {\n winObjects.push(windowObject);\n }\n });\n\n return winObjects;\n }\n\n function _mapToWindowObject(windowId: string): IOConnectDesktop.Windows.IOConnectWindow {\n return windowStore.get(windowId) ? windowStore.get(windowId).API : undefined;\n }\n\n function _getGroupHeaderVisibility(): boolean {\n // if one of the windows has a flag hideGroupHeader the group header should be off.\n const windowWithHiddenHeader = _mapToWindowObjects().find((w) => !w.isGroupHeaderVisible);\n const _isGroupHeaderVisible = windowWithHiddenHeader === undefined;\n\n return _isGroupHeaderVisible;\n }\n\n function _isHibernated(): boolean {\n return _isHibernatedFlag;\n }\n\n // #endregion \"Internal function\"\n\n // #region \"Events\"\n\n function onHeaderVisibilityChanged(callback?: (group: IOConnectDesktop.Windows.Group) => void): () => void {\n return _registry.add(\"header-visibility-changed\", callback);\n }\n\n function onWindowAdded(callback?: (group: IOConnectDesktop.Windows.Group, window: IOConnectDesktop.Windows.IOConnectWindow) => void): () => void {\n return _registry.add(\"window-added\", callback);\n }\n\n function onWindowRemoved(callback?: (group: IOConnectDesktop.Windows.Group, window: IOConnectDesktop.Windows.IOConnectWindow) => void): () => void {\n return _registry.add(\"window-removed\", callback);\n }\n\n function onVisibilityChanged(callback?: (group: IOConnectDesktop.Windows.Group) => void): () => void {\n if (!callback) {\n throw new Error(\"Callback argument is required\");\n }\n if (callback && typeof callback !== \"function\") {\n throw new Error(\"Callback argument must be a function\")\n }\n return _registry.add(\"group-visibility-changed\", callback);\n }\n\n // #endregion \"Events\"\n\n // #region \"API\"\n\n const groupObject: IOConnectDesktop.Windows.Group = {\n id,\n get windows() {\n return windows();\n },\n find,\n get isHeaderVisible() {\n return _getGroupHeaderVisibility();\n },\n get isHibernated() {\n return _isHibernated();\n },\n get isVisible() {\n return _isVisible;\n },\n showHeader: (success, error) => {\n return utils.callbackifyPromise(() => {\n return execute(\"setGroupHeaderVisibility\", { windowId: _windowsId[0], options: { toShow: true } }, ..._windowsId.map((w) => `GroupHeaderVisibilityChanged-${w}`));\n }, success, error);\n },\n hideHeader: (success, error) => {\n return utils.callbackifyPromise(() => {\n return execute(\"setGroupHeaderVisibility\", { windowId: _windowsId[0], options: { toShow: false } }, ..._windowsId.map((w) => `GroupHeaderVisibilityChanged-${w}`));\n }, success, error);\n },\n getTitle: async () => {\n const r = await executor.execute<{ title: string }>(\"getGroupTitle\", { windowId: _windowsId[0] });\n return r.title;\n },\n setTitle: async (title: string) => {\n if (isNullOrWhiteSpace(title)) {\n throw new Error(\"`title` must not be null or undefined.\");\n }\n return execute(\"setGroupTitle\", { windowId: _windowsId[0], options: { title } });\n },\n capture: (captureOptions: IOConnectDesktop.Windows.CaptureOptions) => {\n return executor.captureGroup(_windowsId, captureOptions);\n },\n maximize: (success, error) => {\n return utils.callbackifyPromise(() => {\n return execute(\"maximizeGroup\", { windowId: _windowsId[0] }, ..._windowsId.map((w) => `StateChanged-${w}`));\n }, success, error);\n },\n restore: (success, error) => {\n return utils.callbackifyPromise(() => {\n return execute(\"restoreGroup\", { windowId: _windowsId[0] }, ..._windowsId.map((w) => `StateChanged-${w}`));\n }, success, error);\n },\n show: (activate?: boolean) => {\n if (!isUndefinedOrNull(activate) && !isBoolean(activate)) {\n throw new Error(\"Activate flag must be a boolean!\");\n }\n activate = !isUndefinedOrNull(activate) ? activate : true;\n return executor.executeGroup(\"showGroup\", {\n groupId: id,\n options: { activate }\n });\n },\n hide: () => {\n return executor.executeGroup(\"hideGroup\", {\n groupId: id\n });\n },\n onHeaderVisibilityChanged,\n onWindowAdded,\n onWindowRemoved,\n onVisibilityChanged\n };\n\n const internal: GroupInternal = {\n get windows() {\n return _windowsId;\n },\n addWindow,\n removeWindow,\n handleGroupHeaderVisibilityChanged,\n handleGroupVisibilityChanged,\n handleGroupHibernateChanged\n };\n\n return {\n groupAPI: groupObject,\n groupInternal: internal,\n };\n\n // #endregion \"API\"\n};\n","import callbackRegistry, { CallbackRegistry, UnsubscribeFunction } from \"callback-registry\";\nimport { IOConnectDesktop } from \"../../desktop\";\nimport { isBoolean, isNullOrWhiteSpace, isUndefinedOrNull } from \"../activity/helpers/util\";\nimport { CompositionChangedData } from \"./environment/gd/types\";\nimport groupFactory from \"./group\";\nimport { default as windowStore } from \"./store\";\nimport {\n Environment,\n GroupsInternal,\n GroupsWrapper,\n GroupWrapper,\n WindowWrapper\n} from \"./types\";\nimport executor from \"./environment/gd/executor\";\n\nexport default (environment: Environment, logger: IOConnectDesktop.Logger.API): GroupsWrapper => {\n const _registry: CallbackRegistry = callbackRegistry();\n const _groups: { [key: string]: GroupWrapper } = {};\n let heardForWindowsCounter = -1;\n\n // Getting already existing windows and create Group API for each window\n const windows = windowStore.list;\n Object.keys(windows).forEach((k) => {\n const win = windows[k];\n const groupId = win.API.groupId;\n const winId = win.API.id;\n // hidden windows doesn't have groupId\n if (!isNullOrWhiteSpace(groupId)) {\n addWindow(groupId, winId);\n }\n });\n\n windowStore.onRemoved((w) => {\n const group = findGroupWrapperByWindow(w.API);\n removeWindow(group, w);\n });\n\n environment.onCompositionChanged((windowInfo: CompositionChangedData) => {\n handleCompositionChanged(windowInfo);\n });\n\n environment.onGroupHeaderVisibilityChanged((windowInfo) => {\n const windowId = windowInfo.windowId;\n const group: IOConnectDesktop.Windows.Group = findGroupByWindow(windowId);\n if (typeof group !== \"undefined\") {\n const groupEvents: GroupWrapper = _groups[group.id];\n\n if (heardForWindowsCounter === -1) {\n heardForWindowsCounter = group.windows.length;\n }\n\n heardForWindowsCounter--;\n if (heardForWindowsCounter === 0) {\n heardForWindowsCounter = -1;\n groupEvents.groupInternal.handleGroupHeaderVisibilityChanged(windowInfo);\n }\n }\n });\n\n environment.onGroupVisibilityChanged((data) => {\n const groupEvents: GroupWrapper = _groups[data.groupId];\n if (groupEvents) {\n groupEvents.groupInternal.handleGroupVisibilityChanged(data.visible);\n }\n });\n\n environment.onGroupStateChanged((data) => {\n const groupWrapper = _groups[data.groupId];\n if (data.state === \"hibernated\") {\n if (groupWrapper && groupWrapper.groupAPI) {\n groupWrapper.groupInternal.handleGroupHibernateChanged(true);\n }\n _registry.execute(\"group-hibernated\", data.groupId);\n } else if (data.state === \"resumed\") {\n if (groupWrapper && groupWrapper.groupAPI) {\n groupWrapper.groupInternal.handleGroupHibernateChanged(false);\n }\n _registry.execute(\"group-resumed\", groupWrapper.groupAPI);\n }\n });\n\n // Methods\n\n function my(): IOConnectDesktop.Windows.Group {\n return findGroupByWindow(environment.my());\n }\n\n function list(success?: (groups: IOConnectDesktop.Windows.Group[]) => void): IOConnectDesktop.Windows.Group[] {\n const result: IOConnectDesktop.Windows.Group[] = Object.keys(_groups).map((groupId) => {\n if (_groups[groupId]) {\n return _groups[groupId].groupAPI;\n }\n\n });\n\n if (typeof success === \"function\") {\n success(result);\n }\n return result;\n }\n\n function findGroupByWindow(winId: string | IOConnectDesktop.Windows.IOConnectWindow, success?: (group: IOConnectDesktop.Windows.Group) => void, error?: (error: string) => void): IOConnectDesktop.Windows.Group {\n let windowId: string;\n if (typeof winId === \"string\") {\n windowId = winId;\n } else if (!isUndefinedOrNull(winId)) {\n windowId = winId.id;\n }\n const result = Object.values(_groups).find((groupObj) => {\n const group: IOConnectDesktop.Windows.Group = groupObj.groupAPI;\n const wins = group.windows.filter((w) => w.id === windowId);\n return wins.length;\n });\n if (result) {\n if (typeof success === \"function\") {\n success(result.groupAPI);\n }\n return result.groupAPI;\n } else {\n if (typeof error === \"function\") {\n error(`Cannot find the group of the window.`);\n }\n }\n }\n\n function waitForGroup(groupId: string): Promise<IOConnectDesktop.Windows.Group> {\n if (!groupId) {\n return Promise.reject(`groupId must be defined`);\n }\n return new Promise((res, rej) => {\n const groupWrapper = _groups[groupId];\n if (groupWrapper) {\n res(groupWrapper.groupAPI);\n } else {\n const un = onGroupAdded((group) => {\n if (group.id === groupId) {\n un();\n res(group);\n }\n });\n }\n });\n }\n\n async function resume(groupId: string, activate?: boolean): Promise<void> {\n if (!isUndefinedOrNull(activate) && !isBoolean(activate)) {\n throw new Error(\"Activate flag must be a boolean!\");\n }\n activate = !isUndefinedOrNull(activate) ? activate : true;\n await executor.executeGroup(\"resumeGroup\", {\n groupId,\n options: { activate }\n });\n }\n\n async function hibernate(groupId: string): Promise<string> {\n await executor.executeGroup(\"hibernateGroup\", {\n groupId\n });\n return groupId;\n }\n\n // Events\n function onGroupAdded(callback: (group: IOConnectDesktop.Windows.Group) => void): UnsubscribeFunction {\n return _registry.add(\"group-added\", callback);\n }\n\n function onGroupRemoved(callback: (group: IOConnectDesktop.Windows.Group) => void): UnsubscribeFunction {\n return _registry.add(\"group-removed\", callback);\n }\n\n function onWindowMoved(callback?: (windowId: string, oldTabGroupId: string, newGroupId: string) => void): UnsubscribeFunction {\n return _registry.add(\"window-moved\", callback);\n }\n\n function onHibernated(callback?: (groupId: string) => void): () => void {\n if (!callback) {\n throw new Error(\"Callback argument is required\");\n }\n if (callback && typeof callback !== \"function\") {\n throw new Error(\"Callback argument must be a function\")\n }\n return _registry.add(\"group-hibernated\", callback);\n }\n\n function onResumed(callback?: (group: IOConnectDesktop.Windows.Group) => void): () => void {\n if (!callback) {\n throw new Error(\"Callback argument is required\");\n }\n if (callback && typeof callback !== \"function\") {\n throw new Error(\"Callback argument must be a function\")\n }\n return _registry.add(\"group-resumed\", callback);\n }\n\n // Private\n function createOrGet(groupId: string): GroupWrapper {\n if (!_groups.hasOwnProperty(groupId)) {\n\n const createdGroupWrapper: GroupWrapper = groupFactory(groupId, environment.executor);\n _groups[groupId] = createdGroupWrapper;\n\n const group = createdGroupWrapper.groupAPI;\n _registry.execute(\"group-added\", group);\n\n return createdGroupWrapper;\n } else {\n return _groups[groupId];\n }\n }\n\n function deleteIfEmpty(groupWrapper: GroupWrapper): void {\n const group = groupWrapper.groupAPI;\n if (group.windows.length === 0) {\n delete _groups[group.id];\n _registry.execute(\"group-removed\", group);\n }\n }\n\n // hidden window doesn't have a groupId\n function addWindow(groupId: string, winId: string) {\n const group = createOrGet(groupId);\n group.groupInternal.addWindow(winId);\n return group;\n }\n\n function removeWindow(group: GroupWrapper, win: WindowWrapper) {\n if (!group) {\n return;\n }\n group.groupInternal.removeWindow(win);\n deleteIfEmpty(group);\n }\n\n function handleCompositionChanged(state: CompositionChangedData): void {\n const groupId = state.groupId;\n const windowId = state.windowId;\n const win = windowStore.get(windowId);\n if (!win) {\n return;\n }\n const currentGroup = findGroupWrapperByWindow(win.API);\n // if the window's visibility is changed to hidden, remove from the group\n // or the window is closed.\n if (isUndefinedOrNull(groupId)) {\n removeWindow(currentGroup, win);\n return;\n }\n // if the window's visibility is changed to visible, addOrCreate the group\n if (isUndefinedOrNull(currentGroup) && !isUndefinedOrNull(groupId)) {\n addWindow(groupId, win.API.id);\n return;\n }\n\n if (currentGroup.groupAPI.id !== groupId) {\n moveWindow(win, currentGroup.groupAPI.id, groupId);\n }\n }\n\n function moveWindow(win: WindowWrapper, from: string, to: string) {\n const winId = win.API.id;\n const fromGroup = _groups[from];\n removeWindow(fromGroup, win);\n const toGroup = addWindow(to, winId);\n win.Events.handleGroupChanged(toGroup.groupAPI, fromGroup.groupAPI);\n _registry.execute(\"window-moved\", winId, from, to);\n }\n\n function findGroupWrapperByWindow(winId: string | IOConnectDesktop.Windows.IOConnectWindow): GroupWrapper {\n let windowId: string;\n if (typeof winId === \"string\") {\n windowId = winId;\n } else if (!isUndefinedOrNull(winId)) {\n windowId = winId.id;\n }\n return Object.values(_groups).find((groupObj) => {\n const groupInternal = groupObj.groupInternal;\n const wins = groupInternal.windows.filter((id) => id === windowId);\n return wins.length;\n });\n }\n\n // #region \"API\"\n\n const groups = {\n get my() {\n return my();\n },\n list,\n findGroupByWindow,\n waitForGroup,\n onGroupAdded,\n onGroupRemoved,\n hibernate,\n resume,\n onHibernated,\n onResumed\n };\n\n // #endregion \"API\n\n const events: GroupsInternal = { onWindowMoved };\n\n return {\n groupsAPI: groups,\n groupsEvents: events,\n };\n};\n","import { CallbackRegistry, UnsubscribeFunction, default as CallbackFactory } from \"callback-registry\";\nimport { IOConnectDesktop } from \"../../desktop\";\nimport { Environment, GroupsWrapper, WindowWrapper } from \"./types\";\nimport jumpListManager from \"./jumpList/manager\";\n\nimport { default as envDetector } from \"./environment/detector\";\nimport groupsFactory from \"./groups\";\nimport { default as windowStore } from \"./store\";\nimport executor from \"./environment/gd/executor\";\nimport * as util from \"../activity/helpers/util\";\nimport utils from \"../utils\";\n\nexport default (agm: IOConnectDesktop.AGM.API, logger: IOConnectDesktop.Logger.API, appManagerGetter: () => IOConnectDesktop.AppManager.API, displayAPIGetter: () => IOConnectDesktop.Displays.API, channelsGetter: () => IOConnectDesktop.Channels, gdMajorVersion: number): IOConnectDesktop.Windows.API => {\n const _registry: CallbackRegistry = CallbackFactory();\n const _logger = logger;\n let groups: GroupsWrapper;\n let environment: Environment;\n\n windowStore.init(_logger);\n\n const isReady = new Promise<void>((resolve, reject) => {\n envDetector(agm, _logger, appManagerGetter, displayAPIGetter, channelsGetter, gdMajorVersion)\n .then((env) => {\n environment = env;\n groups = groupsFactory(env, _logger);\n jumpListManager.init(env.executor, agm, _logger);\n resolve();\n })\n .catch((e: Error) => {\n const err = `Timed out waiting for connection to Glue42 Enterprise: Error: ${e.message}`;\n _logger.error(err, e);\n reject(new Error(err));\n });\n });\n\n function ready() {\n return isReady;\n }\n\n function my(): IOConnectDesktop.Windows.IOConnectWindow {\n const myWindow = windowStore.getIfReady(environment.my());\n return myWindow ? myWindow.API : undefined;\n }\n\n function open(name: string, url: string, options?: IOConnectDesktop.Windows.WindowSettings, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): Promise<IOConnectDesktop.Windows.IOConnectWindow> {\n return utils.callbackifyPromise(() => {\n if (util.isNullOrWhiteSpace(name)) {\n throw new Error(\"The window name is missing.\");\n }\n if (util.isNullOrWhiteSpace(url)) {\n throw new Error(\"The window URL is missing.\");\n }\n\n if (!util.isUndefinedOrNull(options)) {\n const optionsAsAny = options as any;\n for (const prop of [\"minHeight\", \"maxHeight\", \"minWidth\", \"maxWidth\", \"width\", \"height\", \"top\", \"left\"]) {\n if (prop in optionsAsAny) {\n const value = optionsAsAny[prop];\n if (util.isUndefinedOrNull(value)) {\n delete optionsAsAny[prop];\n continue;\n }\n if (!util.isNumber(value)) {\n const errMessage = `${prop} must be a number`;\n throw new Error(errMessage);\n }\n if (optionsAsAny[prop] === \"width\" || optionsAsAny[prop] === \"height\") {\n if (value <= 0) {\n const errMessage = `${prop} must be a positive number`;\n throw new Error(errMessage);\n }\n }\n }\n }\n }\n return environment.open(name, url, options);\n }, success, error);\n }\n\n function find(name: string, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): IOConnectDesktop.Windows.IOConnectWindow {\n const windows: { [key: string]: WindowWrapper } = windowStore.list;\n\n const windowsForListing = Object.keys(windows).reduce<IOConnectDesktop.Windows.IOConnectWindow[]>((memo, winId) => {\n const window: WindowWrapper = windows[winId];\n if (window?.API?.name === name) {\n memo.push(window.API);\n }\n return memo;\n }, []);\n\n const win = windowsForListing[0];\n if (win) {\n if (typeof success === \"function\") {\n success(windowsForListing[0]);\n }\n return windowsForListing[0];\n } else {\n if (typeof error === \"function\") {\n error(\"There is no window with name:\" + name);\n }\n }\n }\n\n function findById(id: string, success?: (window: IOConnectDesktop.Windows.IOConnectWindow) => void, error?: (error: string) => void): IOConnectDesktop.Windows.IOConnectWindow {\n const windows: { [key: string]: WindowWrapper } = windowStore.list;\n const windowsForListing = Object.keys(windows).reduce<IOConnectDesktop.Windows.IOConnectWindow[]>((memo, winId) => {\n const window: WindowWrapper = windows[winId];\n if (typeof window !== \"undefined\" && window.API.id === id) {\n memo.push(window.API);\n }\n return memo;\n }, []);\n const win = windowsForListing[0];\n if (win) {\n if (typeof success === \"function\") {\n success(windowsForListing[0]);\n }\n return windowsForListing[0];\n } else {\n if (typeof error === \"function\") {\n error(\"There is no window with such id:\" + id);\n }\n }\n }\n\n function list(success?: (window: IOConnectDesktop.Windows.IOConnectWindow[]) => void): IOConnectDesktop.Windows.IOConnectWindow[] {\n const windows: { [key: string]: WindowWrapper } = windowStore.list;\n\n const windowsForListing: IOConnectDesktop.Windows.IOConnectWindow[] = Object.keys(windows)\n .map((k) => {\n return windows[k].API;\n });\n\n if (typeof success !== \"function\") {\n return windowsForListing;\n }\n\n success(windowsForListing);\n }\n\n function configure(options: IOConnectDesktop.Windows.WindowsConfiguration): Promise<void> {\n const win = my();\n const winId = win ? win.id : \"\";\n return executor.configure(winId, options);\n }\n\n function windowAdded(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return _registry.add(\"window-added\", callback);\n }\n\n function windowRemoved(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n return _registry.add(\"window-removed\", callback);\n }\n\n function tabAttached(callback: (tabWindow: IOConnectDesktop.Windows.IOConnectWindow, newTabGroupId: string, tabHeaderVisible: boolean) => void): UnsubscribeFunction {\n let unsubFunc: UnsubscribeFunction;\n let unsubscribed = false;\n isReady.then(() => {\n if (unsubscribed) {\n return;\n }\n unsubFunc = environment.tabAttached(callback);\n });\n\n return () => {\n unsubscribed = true;\n if (unsubFunc) {\n unsubFunc();\n }\n };\n }\n\n function tabDetached(callback: (window: IOConnectDesktop.Windows.IOConnectWindow, tabGroupId: string, oldTabGroupId: string) => void): UnsubscribeFunction {\n let unsubFunc: UnsubscribeFunction;\n let unsubscribed = false;\n isReady.then(() => {\n if (unsubscribed) {\n return;\n }\n unsubFunc = environment.tabDetached(callback);\n });\n\n return () => {\n unsubscribed = true;\n if (unsubFunc) {\n unsubFunc();\n }\n };\n }\n\n function onWindowFrameColorChanged(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void): UnsubscribeFunction {\n let unsubFunc: UnsubscribeFunction;\n let unsubscribed = false;\n isReady.then(() => {\n if (unsubscribed) {\n return;\n }\n unsubFunc = environment.onWindowFrameColorChanged(callback);\n });\n\n return () => {\n unsubscribed = true;\n if (unsubFunc) {\n unsubFunc();\n }\n };\n }\n\n function onWindowGotFocus(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void) {\n let unsubFunc: UnsubscribeFunction;\n let unsubscribed = false;\n isReady.then(() => {\n if (unsubscribed) {\n return;\n }\n unsubFunc = environment.onWindowGotFocus(callback);\n });\n\n return () => {\n unsubscribed = true;\n if (unsubFunc) {\n unsubFunc();\n }\n };\n }\n\n function onWindowLostFocus(callback: (window: IOConnectDesktop.Windows.IOConnectWindow) => void) {\n let unsubFunc: UnsubscribeFunction;\n let unsubscribed = false;\n isReady.then(() => {\n if (unsubscribed) {\n return;\n }\n unsubFunc = environment.onWindowLostFocus(callback);\n });\n\n return () => {\n unsubscribed = true;\n if (unsubFunc) {\n unsubFunc();\n }\n };\n }\n\n function onEvent(callback: (stream: any) => void): UnsubscribeFunction {\n let unsubFunc: UnsubscribeFunction;\n let unsubscribed = false;\n isReady.then(() => {\n if (unsubscribed) {\n return;\n }\n unsubFunc = environment.onEvent(callback);\n });\n\n return () => {\n unsubscribed = true;\n if (unsubFunc) {\n unsubFunc();\n }\n };\n }\n\n function createFlydown(targetId: string, config: IOConnectDesktop.Windows.FlydownOptions): Promise<IOConnectDesktop.Windows.Flydown> {\n return environment.createFlydown(targetId, config);\n }\n\n function showPopup(targetId: string, config: IOConnectDesktop.Windows.PopupOptions): Promise<void> {\n return environment.showPopup(targetId, config);\n }\n\n function handleWindowAdded(w: WindowWrapper) {\n _registry.execute(\"window-added\", w.API);\n }\n\n function handleWindowRemoved(w: WindowWrapper) {\n _registry.execute(\"window-removed\", w.API);\n }\n\n windowStore.onReadyWindow(handleWindowAdded);\n windowStore.onRemoved(handleWindowRemoved);\n\n // The API itself\n return {\n my,\n open,\n find,\n findById,\n list,\n ready,\n onWindowAdded: windowAdded,\n windowAdded,\n onWindowRemoved: windowRemoved,\n windowRemoved,\n onTabAttached: tabAttached,\n onTabDetached: tabDetached,\n onWindowFrameColorChanged,\n\n get groups() {\n return groups.groupsAPI;\n },\n onWindowGotFocus,\n onWindowLostFocus,\n onEvent,\n createFlydown,\n showPopup,\n configure\n };\n};\n","import { IOConnectDesktop } from \"../../desktop\";\n\n// provides a unified way to access layouts array\nexport class LayoutStore {\n private layouts: IOConnectDesktop.Layouts.Layout[] = [];\n\n public removeWhere(condition: (l: IOConnectDesktop.Layouts.Layout) => boolean) {\n this.layouts = this.layouts.filter(condition);\n }\n\n public removeAll() {\n this.layouts = [];\n }\n\n public add(item: IOConnectDesktop.Layouts.Layout) {\n this.layouts.push(item);\n }\n\n public get all(): IOConnectDesktop.Layouts.Layout[] {\n return this.layouts;\n }\n\n public where(condition: (l: IOConnectDesktop.Layouts.Layout) => boolean): IOConnectDesktop.Layouts.Layout[] {\n return this.layouts.filter(condition);\n }\n\n public first(condition: (l: IOConnectDesktop.Layouts.Layout) => boolean): IOConnectDesktop.Layouts.Layout {\n return this.where(condition)[0];\n }\n}\n\nexport default new LayoutStore();\n","import { IOConnectDesktop } from \"../../desktop\";\nimport { CallbackRegistry } from \"callback-registry\";\nimport { LayoutsLibConfiguration } from \"./types\";\n\nconst SaveContextMethodName = \"T42.HC.GetSaveContext\";\ndeclare let htmlContainer: any;\n\n/**\n * Logic for apps that want to provide custom context on save\n */\nexport default class ContextProvider {\n\n private interop: IOConnectDesktop.Interop.API;\n\n constructor(private config: LayoutsLibConfiguration, private activitiesGetter: () => IOConnectDesktop.Activities.API, private callbacks: CallbackRegistry, private logger: IOConnectDesktop.Logger.API) {\n this.interop = config.agm;\n this.registerRequestMethods();\n }\n\n public onSaveRequested(callback: (info?: IOConnectDesktop.Layouts.SaveRequestContext) => IOConnectDesktop.Layouts.SaveRequestResponse) {\n return this.callbacks.add(\"saveRequested\", callback);\n }\n\n private isActivityOwner() {\n // fallback for GD2 - remove once the bellow code is tested\n if (typeof htmlContainer !== \"undefined\") {\n const context = htmlContainer.getContext();\n return context && context._t42 && context._t42.activityIsOwner;\n }\n\n // check if we're the activity owners\n const activities = this.activitiesGetter();\n if (!activities) {\n return false;\n }\n\n if (!activities.inActivity) {\n return false;\n }\n\n const myWindow = activities.my.window;\n const myActivity = activities.my.activity;\n\n if (!myActivity && !myWindow) {\n return false;\n }\n\n return myActivity.owner.id === myWindow.id;\n }\n\n private registerRequestMethods() {\n this.interop.register<IOConnectDesktop.Layouts.SaveRequestContext>(SaveContextMethodName, (args) => {\n const usersCbs = this.callbacks.execute(\"saveRequested\", args);\n if (usersCbs?.length > 1) {\n this.logger.warn(`Multiple subscriptions for \"glue.layouts.onSaveRequested\" - only the first one will be used`);\n }\n const requestResult = usersCbs[0] as IOConnectDesktop.Layouts.SaveRequestResponse;\n const autoSaveWindowContext = this.config.autoSaveWindowContext;\n\n if (typeof autoSaveWindowContext === \"boolean\" && autoSaveWindowContext) {\n return { autoSaveWindowContext };\n } else if (Array.isArray(autoSaveWindowContext) && autoSaveWindowContext.length > 0) {\n return { autoSaveWindowContext };\n }\n // always include the window context\n const result: IOConnectDesktop.Layouts.SaveRequestResponse = { windowContext: requestResult?.windowContext, activityContext: undefined };\n\n // if we're the activity owner put the context too\n if (this.isActivityOwner()) {\n result.activityContext = requestResult?.activityContext;\n }\n\n return result;\n });\n }\n}\n","// A simple transformation that makes object to start with lowercase\n// Note that this is not full implementation as it supports only:\n// undefined, null, arrays, number, string, bool. Anything out of this\n// list is considered Object\nexport default function transformACSLayout(something: { [key: string]: any }): { [key: string]: any } {\n if (!something) {\n return something;\n }\n\n if (Array.isArray(something)) {\n return something.map((item) => {\n return transformACSLayout(item);\n });\n }\n\n if (typeof something === \"string\" || typeof something === \"number\" || typeof something === \"boolean\") {\n return something;\n }\n\n const initial: { [key: string]: any } = {};\n return Object.keys(something).reduce((accumulator, current) => {\n const value = something[current];\n const convertedValue = transformACSLayout(value);\n\n let key = current;\n if (current[0]?.toLowerCase() !== current[0]) {\n key = current[0].toLowerCase() + current.substr(1);\n }\n\n accumulator[key] = convertedValue;\n return accumulator;\n }, initial);\n}\n","import { IOConnectDesktop } from \"../../desktop\";\n\nexport default class LayoutImpl implements IOConnectDesktop.Layouts.Layout {\n /** Name of the layout */\n public name: string;\n\n /** Type of the layout */\n public type: IOConnectDesktop.Layouts.LayoutType;\n\n /** Array of components describing the applications that are saved in the layout */\n public components: IOConnectDesktop.Layouts.LayoutComponent[];\n\n /** Context passed when the layout was saved */\n public context: any;\n\n /** Metadata passed when the layout was saved */\n public metadata: any;\n\n /** Version of the layout */\n public version: number;\n\n /** Displays of the layout */\n public displays: any;\n\n constructor(data: any) {\n this.name = data.name;\n this.type = data.type;\n this.components = data.components;\n this.context = data.context;\n this.metadata = data.metadata;\n this.version = data.version;\n this.displays = data.displays;\n }\n}\n","import { IOConnectDesktop } from \"../../desktop\";\nimport { CallbackRegistry, UnsubscribeFunction } from \"callback-registry\";\nimport { LayoutsStream, HibernationResumeMessage, UpdateLayoutComponentContextMessage, LayoutsLibConfiguration } from \"./types\";\nimport store from \"./store\";\nimport generate from \"shortid\";\nimport { ACSSaveLayoutMessage, ACSRestoreMessage, ACSRestoreOptionsMessage, ACSMessage, ACSRenameMessage, ACSRemoveLayoutMessage, ACSImportMessage, ExportResultMessage } from \"./types\";\nimport ContextProvider from \"./contextProvider\";\nimport transformACSLayout from \"./transform\";\nimport LayoutImpl from \"./layout\";\nimport { isBoolean, isNullOrWhiteSpace, isObject, isUndefinedOrNull } from \"../activity/helpers/util\";\n\nconst LayoutsCommandMethod = \"T42.ACS.Command\";\n\nexport default class LayoutsAPIImpl implements IOConnectDesktop.Layouts.API {\n private appManager: IOConnectDesktop.AppManager.API;\n private provider: ContextProvider;\n private isRegisterMethodForLayoutModified = false;\n\n constructor(private config: LayoutsLibConfiguration, private stream: LayoutsStream, private callbacks: CallbackRegistry, logger: IOConnectDesktop.Logger.API) {\n this.appManager = config.appManager;\n this.provider = new ContextProvider(config, config.activityGetter, callbacks, logger);\n stream.subscribe();\n }\n\n public async setDefaultGlobal(name: string): Promise<void> {\n const methodName = \"SelectDefaultLayout\";\n await this.invokeMethodCore(methodName, { name });\n return;\n }\n\n public async clearDefaultGlobal(): Promise<void> {\n const methodName = \"DeselectDefaultLayout\";\n this.invokeMethodCore(methodName);\n return;\n }\n\n public async getDefaultGlobal(): Promise<IOConnectDesktop.Layouts.Layout | undefined> {\n const methodName = \"GetDefaultLayout\";\n const result = await this.invokeMethodCore(methodName);\n const layout = result.returned;\n if (!layout) {\n return undefined;\n }\n if (this.isSlimMode()) {\n return layout;\n }\n return this.list().find((l) => l.name === layout.name && l.type === \"Global\");\n }\n\n public ready(): Promise<void> {\n if (this.config.mode === \"fullWaitSnapshot\") {\n return this.stream.gotSnapshot;\n }\n return this.stream.ready;\n }\n\n public save(layout: IOConnectDesktop.Layouts.NewLayoutOptions): Promise<IOConnectDesktop.Layouts.Layout> {\n return new Promise<IOConnectDesktop.Layouts.Layout>((resolve, reject) => {\n\n this.verifyNotSlimMode();\n\n if (isUndefinedOrNull(layout)) {\n return reject(new Error(\"layout is required\"));\n }\n\n if (isNullOrWhiteSpace(layout.name)) {\n return reject(new Error(\"layout.name argument is required\"));\n }\n\n if (isNullOrWhiteSpace(layout.type)) {\n layout.type = \"Global\";\n }\n\n if (!isNullOrWhiteSpace(layout.activityId)) {\n layout.type = \"Activity\";\n }\n\n const layoutObject: ACSSaveLayoutMessage = {\n name: layout.name,\n type: layout.type,\n context: layout.context ?? {},\n metadata: layout.metadata ?? {},\n options: {},\n };\n\n if (layout.type === \"Activity\") {\n let actId = layout.activityId;\n if (!actId) {\n if (!this.appManager.myInstance.inActivity) {\n return reject(new Error(\"Current application is not in activity. Cannot save activity layout for it.\"));\n }\n actId = this.appManager.myInstance.activityId;\n }\n layoutObject.activityId = actId;\n } else if (layout.type === \"Global\") {\n if (Array.isArray(layout.ignoreInstances)) {\n layoutObject.options.ignoreInstances = layout.ignoreInstances;\n }\n if (Array.isArray(layout.instances)) {\n layoutObject.options.instances = layout.instances;\n }\n } else {\n return reject(new Error(`layout type ${layout.type} is not supported`));\n }\n\n this.invokeMethodAndTrack(\"SaveLayout\", layoutObject, resolve, reject);\n });\n }\n\n public restore(options: IOConnectDesktop.Layouts.RestoreOptions): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.verifyNotSlimMode();\n // TODO add validations...\n if (isUndefinedOrNull(options)) {\n return reject(new Error(\"options argument is required\"));\n }\n\n if (isNullOrWhiteSpace(options.name)) {\n return reject(new Error(\"options.name argument is required\"));\n }\n\n if (isNullOrWhiteSpace(options.type)) {\n options.type = \"Global\";\n }\n\n if (!isNullOrWhiteSpace(options.activityIdToJoin)) {\n options.type = \"Activity\";\n }\n\n if (options.type === \"Activity\") {\n if (isUndefinedOrNull(options.setActivityContext)) {\n options.setActivityContext = true;\n }\n if (typeof options.setActivityContext !== \"boolean\") {\n return reject(new Error(\"`setActivityContext` must hold a boolean value.\"));\n }\n options.activityIdToJoin = options.activityIdToJoin ?? this.appManager.myInstance.activityId;\n }\n\n // backwards compatibility\n if (!isUndefinedOrNull(options.closeRunningInstance)) {\n options.closeRunningInstances = options.closeRunningInstance;\n }\n\n if (isUndefinedOrNull(options.closeRunningInstances)) {\n options.closeRunningInstances = true;\n }\n\n if (!isBoolean(options.closeRunningInstances)) {\n return reject(new Error(\"`closeRunningInstances` must hold a boolean value.\"));\n }\n\n if (isUndefinedOrNull(options.closeMe)) {\n options.closeMe = options.closeRunningInstances;\n }\n\n if (!isBoolean(options.closeMe)) {\n return reject(new Error(\"`closeMe` must hold a boolean value.\"));\n }\n\n if (!isUndefinedOrNull(options.context) && !isObject(options.context)) {\n return reject(new Error(\"`context` must hold an object value.\"));\n }\n\n if (!isUndefinedOrNull(options.timeout) && typeof options.timeout !== \"number\") {\n return reject(new Error(\"`timeout` must hold an number value.\"));\n }\n\n options.context = options.context ?? {};\n\n const restoreOptions: ACSRestoreOptionsMessage = {\n activityToJoin: options.activityIdToJoin,\n setActivityContext: options.setActivityContext,\n ignoreActivityWindowTypes: options.ignoreActivityWindowTypes,\n // not used in GD3\n // restoreActivityOwner: options.restoreActivityOwner,\n // closeOldWindows: options.closeRunningInstance,\n reuseExistingWindows: options.reuseWindows,\n\n closeRunningInstances: options.closeRunningInstances, // new\n excludeFromClosing: options.closeMe ? [] : [this.appManager.myInstance?.id]\n };\n\n const arg: ACSRestoreMessage = {\n type: options.type,\n name: options.name,\n context: options.context,\n options: restoreOptions\n };\n if (options.timeout) {\n arg.timeout = options.timeout;\n }\n\n this.invokeMethodAndTrack(\"RestoreLayout\", arg, resolve, reject, true);\n });\n }\n\n public remove(type: string, name: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.verifyNotSlimMode();\n\n if (!name) {\n return reject(new Error(\"name argument is required\"));\n }\n\n if (!type) {\n return reject(new Error(\"type argument is required\"));\n }\n\n const msg: ACSRemoveLayoutMessage = {\n type,\n name,\n };\n\n this.invokeMethodAndTrack(\"RemoveLayout\", msg, resolve, reject);\n });\n }\n\n public list(): IOConnectDesktop.Layouts.Layout[] {\n this.verifyNotSlimMode();\n return store.all;\n }\n\n public import(layouts: IOConnectDesktop.Layouts.Layout[], mode?: IOConnectDesktop.Layouts.ImportMode): Promise<IOConnectDesktop.Layouts.ImportLayoutResult> {\n return new Promise<IOConnectDesktop.Layouts.ImportLayoutResult>((resolve, reject) => {\n this.verifyNotSlimMode();\n if (!isUndefinedOrNull(mode)) {\n if (mode !== \"merge\" && mode !== \"replace\") {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n return reject(new Error(`${mode} is not supported - only \"merge\" and \"replace\"`));\n }\n }\n if (!Array.isArray(layouts)) {\n return reject(new Error(\"layouts arguments is not an array\"));\n }\n const msg: ACSImportMessage = {\n mode: mode || \"replace\",\n layouts\n };\n\n this.invokeMethodAndTrack(\"ImportLayouts\", msg, resolve, reject, true);\n });\n }\n\n public export(layoutType?: IOConnectDesktop.Layouts.LayoutType): Promise<IOConnectDesktop.Layouts.Layout[]> {\n return new Promise<IOConnectDesktop.Layouts.Layout[]>((resolve, reject) => {\n const handleResult = (result: ExportResultMessage) => {\n let layouts: IOConnectDesktop.Layouts.Layout[] = this.getObjectValues(result.Layouts).map((t) => new LayoutImpl(transformACSLayout(t)));\n if (layoutType) {\n layouts = layouts.filter((l) => l.type === layoutType);\n }\n resolve(layouts);\n };\n\n this.invokeMethodAndTrack(\"ExportLayouts\", {}, handleResult, reject, true);\n });\n }\n\n public rename(layout: IOConnectDesktop.Layouts.Layout, newName: string): Promise<IOConnectDesktop.Layouts.LayoutResult> {\n return new Promise<{ status: string }>((resolve, reject) => {\n this.verifyNotSlimMode();\n\n if (!layout) {\n return reject(new Error(\"layout argument is required\"));\n }\n\n if (!layout.name) {\n return reject(new Error(\"name argument is required\"));\n }\n\n if (!layout.type) {\n return reject(new Error(\"type argument is required\"));\n }\n\n const msg: ACSRenameMessage = { type: layout.type, oldName: layout.name, newName };\n\n this.invokeMethodAndTrack(\"RenameLayout\", msg, resolve, reject);\n });\n }\n\n public updateMetadata(layout: IOConnectDesktop.Layouts.Layout): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!layout) {\n return reject(new Error(\"layout argument is required\"));\n }\n\n if (!layout.name) {\n return reject(new Error(\"name argument is required\"));\n }\n\n if (!layout.type) {\n return reject(new Error(\"type argument is required\"));\n }\n\n if (!layout.metadata) {\n return reject(new Error(\"metadata argument is required\"));\n }\n\n const layoutObject: any = {\n name: layout.name,\n type: layout.type,\n metadata: layout.metadata\n };\n\n this.invokeMethodAndTrack(\"UpdateMetadata\", layoutObject, resolve, reject, true);\n });\n }\n\n public hibernate(name: string, options?: IOConnectDesktop.Layouts.HibernationOptions): Promise<IOConnectDesktop.Layouts.HibernateResult> {\n return new Promise((resolve, reject) => {\n if (!name) {\n return reject(new Error(\"name cannot be empty\"));\n }\n options = options || {};\n const request: HibernationResumeMessage = {\n name,\n type: \"Global\",\n context: options.context || {},\n metadata: options.metadata || {},\n };\n this.invokeMethodAndTrack(\"HibernateLayout\", request, resolve, reject, true);\n });\n }\n\n public resume(name: string, context?: any, options?: IOConnectDesktop.Layouts.ResumeOptions): Promise<IOConnectDesktop.Layouts.ResumeResult> {\n return new Promise((resolve, reject) => {\n if (!name) {\n return reject(new Error(\"name cannot be empty\"));\n }\n const request: HibernationResumeMessage = {\n name,\n type: \"Global\",\n context,\n ...options\n };\n this.invokeMethodAndTrack(\"ResumeLayout\", request, resolve, reject, true);\n });\n }\n\n public async getCurrentLayout(): Promise<IOConnectDesktop.Layouts.Layout | undefined> {\n const methodName = \"GetCurrentLayout\";\n const result = await this.invokeMethodCore(methodName);\n let layout = result.returned.layout;\n if (!layout) {\n return undefined;\n }\n if (!this.isSlimMode()) {\n // we have internal if we track layouts (so not slim mode), if not return the object we received from GD\n layout = this.list().find((l) => l.name === layout.name && l.type === layout.type);\n }\n return layout;\n }\n\n public onAdded(callback: (layout: IOConnectDesktop.Layouts.Layout) => void): UnsubscribeFunction {\n const result = this.callbacks.add(\"added\", callback);\n\n if (store.all.length > 0) {\n store.all.forEach((layout) => {\n try {\n callback(layout);\n } catch (err) { /** */ }\n });\n }\n\n return result;\n }\n\n public onRemoved(callback: (layout: IOConnectDesktop.Layouts.Layout) => void) {\n return this.callbacks.add(\"removed\", callback);\n }\n\n public onChanged(callback: (layout: IOConnectDesktop.Layouts.Layout) => void) {\n return this.callbacks.add(\"changed\", callback);\n }\n\n public onRestored(callback: (layout: IOConnectDesktop.Layouts.Layout) => void) {\n return this.callbacks.add(\"restored\", callback);\n }\n\n public onRenamed(callback: (layout: IOConnectDesktop.Layouts.Layout) => void) {\n return this.callbacks.add(\"renamed\", callback);\n }\n\n public onEvent(callback: (event: any) => void) {\n return this.stream.onEvent(callback);\n }\n\n public onSaveRequested(callback: (info?: IOConnectDesktop.Layouts.SaveRequestContext) => IOConnectDesktop.Layouts.SaveRequestResponse): UnsubscribeFunction {\n return this.provider.onSaveRequested(callback);\n }\n\n public onLayoutModified(callback: (info: IOConnectDesktop.Layouts.LayoutModifiedEvent) => void): UnsubscribeFunction {\n if (this.isRegisterMethodForLayoutModified === false) {\n this.isRegisterMethodForLayoutModified = true;\n this.registerMethodForLayoutModified();\n }\n return this.callbacks.add(\"layout-modified\", callback);\n }\n\n public updateAppContextInCurrent(context: object): Promise<void> {\n return new Promise((resolve, reject) => {\n if (context && typeof context !== \"object\") {\n return reject(new Error(\"context must be an object\"));\n }\n context = context ?? {};\n const request: UpdateLayoutComponentContextMessage = {\n context\n };\n this.invokeMethodAndTrack(\"UpdateLayoutComponentContext\", request, resolve, reject, true);\n });\n }\n\n public updateDefaultContext(context: object): Promise<IOConnectDesktop.Layouts.LayoutResult> {\n return new Promise((resolve, reject) => {\n if (context && typeof context !== \"object\") {\n return reject(new Error(\"context must be an object\"));\n }\n context = context ?? {};\n const request: UpdateLayoutComponentContextMessage = {\n context\n };\n this.invokeMethodAndTrack(\"UpdateDefaultContext\", request, resolve, reject, true);\n });\n }\n\n public async get(name: string, type: IOConnectDesktop.Layouts.LayoutType): Promise<IOConnectDesktop.Layouts.Layout> {\n const matching = this.list().find((l) => l.name === name && l.type === type);\n if (!matching) {\n throw new Error(`cannot find layout with name=${name} and type=${type}`);\n }\n return matching;\n }\n\n public async getAll(type: IOConnectDesktop.Layouts.LayoutType): Promise<IOConnectDesktop.Layouts.LayoutSummary[]> {\n const matching = this.list().filter((l) => type === l.type);\n return matching;\n }\n\n public async forceRefresh(): Promise<void> {\n const methodName = \"RefreshLayouts\";\n await this.invokeMethodCore(methodName);\n }\n\n private isSlimMode() {\n return this.config.mode === \"slim\";\n }\n\n private verifyNotSlimMode() {\n if (this.isSlimMode()) {\n throw Error(\"Operation not allowed in slim mode. Run in full mode.\");\n }\n }\n\n private async registerMethodForLayoutModified() {\n await this.config.agm.register(\"T42.ACS.LayoutModified\", (args: unknown, caller: IOConnectDesktop.Interop.Instance) => {\n this.callbacks.execute(\"layout-modified\", args);\n });\n }\n\n private invokeMethodAndTrack(methodName: string, args: ACSMessage, resolve: (result: any) => void, reject: (err: any) => void, skipStreamEvent?: boolean) {\n let streamEventReceived = skipStreamEvent;\n let agmResult: any;\n\n const token = generate();\n args.token = token;\n\n const handleResult = () => {\n if (streamEventReceived && agmResult) {\n resolve(agmResult);\n }\n };\n\n const methodResponseTimeoutMs = 120 * 1000;\n\n if (!skipStreamEvent) {\n this.stream.waitFor(token, methodResponseTimeoutMs)\n .then(() => {\n streamEventReceived = true;\n handleResult();\n })\n .catch((err: any) => {\n reject(err);\n });\n }\n\n const responseHandler = (result: IOConnectDesktop.AGM.InvocationResult<{ status?: string, failed?: string }>) => {\n if (!result.returned) {\n return reject(new Error(\"No result from method \" + methodName));\n }\n\n if (result.returned.status && (result.returned.status !== \"Success\" && result.returned.status !== \"PartialSuccess\")) {\n if (typeof (result.returned) === \"string\") {\n return reject(new Error(result.returned));\n } else if (typeof (result.returned) === \"object\") {\n if (result.returned.status && result.returned.failed) {\n return reject(new Error(`${result.returned.status}: ${JSON.stringify(result.returned.failed)}`));\n } else {\n return reject(new Error(result.returned as string));\n }\n }\n }\n\n agmResult = result.returned;\n handleResult();\n };\n this.invokeMethodCore(methodName, args, \"best\", { methodResponseTimeoutMs })\n .then(responseHandler)\n .catch((err: any) => reject(err));\n }\n\n private async invokeMethodCore(methodName: string, args?: object, target?: IOConnectDesktop.Interop.InstanceTarget, options?: IOConnectDesktop.Interop.InvokeOptions) {\n if (this.isCommandMethodPresent()) {\n return await this.config.agm.invoke(LayoutsCommandMethod, { command: methodName, data: args }, target, options);\n } else {\n return await this.config.agm.invoke(`T42.ACS.${methodName}`, args, target, options);\n }\n }\n\n private getObjectValues(obj: any) {\n if (!obj) {\n return [];\n }\n\n return Object.keys(obj).map((k) => obj[k]);\n }\n\n private isCommandMethodPresent(): boolean {\n return this.config.agm.methods().some((method) => method.name === LayoutsCommandMethod);\n }\n}\n","import { LayoutsStream } from \"../types\";\nimport store from \"../store\";\nimport { ACSStreamData } from \"./messages\";\nimport LayoutImpl from \"../layout\";\nimport { CallbackRegistry, UnsubscribeFunction } from \"callback-registry\";\nimport transformACSLayout from \"../transform\";\nimport { IOConnectDesktop } from \"../../../desktop\";\n\n/**\n * ACS event stream related to layouts\n */\nexport default class ACSStream implements LayoutsStream {\n\n public ready: Promise<void>;\n public gotSnapshot: Promise<void>;\n\n private resolveReady: () => void;\n private rejectReady: (err: any) => void;\n\n private resolveGotSnapshot: () => void;\n private rejectGotSnapshot: (err: any) => void;\n\n private readonly StreamName = \"T42.ACS.OnLayoutEvent\";\n\n constructor(private agm: IOConnectDesktop.AGM.API, private callbacks: CallbackRegistry) {\n\n this.ready = new Promise<void>((resolve, reject) => {\n this.resolveReady = resolve;\n this.rejectReady = reject;\n });\n\n this.gotSnapshot = new Promise<void>((resolve, reject) => {\n this.resolveGotSnapshot = resolve;\n this.rejectGotSnapshot = reject;\n });\n }\n\n public subscribe(noRetry?: boolean) {\n const transform = (obj: object) => {\n return this.getObjectValues(obj).map((t) => transformACSLayout(t));\n };\n\n // if we don't have OnLayoutEvent stream we're running pre 2.1 GD version or outside GD,\n if (!this.checkForLayoutEventMethod()) {\n // if no retry resolve right away\n if (noRetry) {\n this.resolveReady();\n }\n\n // if we should retry, schedule one more time\n setTimeout(() => {\n this.subscribe(true);\n }, 500);\n } else {\n this.agm.subscribe(this.StreamName, { waitTimeoutMs: 10000 })\n .then((subs) => {\n subs.onData((args) => {\n const data = args.data as ACSStreamData;\n if (data.IsSnapshot) {\n this.resolveGotSnapshot();\n }\n this.addLayouts(transform(data.OnLayoutAdded), data.IsSnapshot);\n this.removeLayouts(transform(data.OnLayoutRemoved));\n this.changeLayouts(transform(data.OnLayoutChanged));\n this.renameLayouts(transform(data.OnLayoutRenamed));\n this.restoredLayout(transform(data.OnLayoutRestored));\n this.callbacks.execute(\"streamEvent\", data);\n });\n\n subs.onFailed((err) => {\n const msg = `Can not subscribe to \"${this.StreamName}\" stream - ${JSON.stringify(err)}`;\n this.rejectReady(msg);\n this.rejectGotSnapshot(msg);\n });\n\n this.resolveReady();\n })\n .catch((err) => {\n const msg = `Error subscribing to \"${this.StreamName}\" stream - ${JSON.stringify(err)}`;\n this.rejectReady(msg);\n this.rejectGotSnapshot(msg);\n });\n }\n }\n\n public onEvent(callback: (streamEvent: ACSStreamData) => void): UnsubscribeFunction {\n return this.callbacks.add(\"streamEvent\", callback);\n }\n\n public waitFor(token: string, timeout?: number): Promise<void> {\n if (!timeout) {\n timeout = 30000; // default timeout is 30 seconds\n }\n return new Promise<void>((resolve, reject) => {\n let done = false;\n const unsubscribe = this.onEvent((streamEvent) => {\n if (streamEvent.Token === token) {\n done = true;\n unsubscribe();\n resolve();\n }\n });\n\n setTimeout(() => {\n if (!done) {\n reject(\"timed out\");\n }\n }, timeout);\n });\n }\n\n private checkForLayoutEventMethod() {\n try {\n return this.agm\n .methods()\n .map((m) => m.name)\n .indexOf(this.StreamName) !== -1;\n } catch (e) {\n return false;\n }\n }\n\n private addLayouts(layoutsData: any[], isSnapshot: boolean) {\n if (!layoutsData) {\n return;\n }\n const createAndNotifyLayout = (layoutData: any) => {\n const layout = new LayoutImpl(layoutData);\n store.add(layout);\n this.callbacks.execute(\"added\", layout);\n };\n\n layoutsData.forEach((layoutData) => {\n if (isSnapshot) {\n const found = store.first((existingLayout) => this.compareLayouts(existingLayout, layoutData));\n if (!found) {\n createAndNotifyLayout(layoutData);\n }\n } else {\n createAndNotifyLayout(layoutData);\n }\n });\n }\n\n private removeLayouts(removedLayouts: any[]) {\n if (!removedLayouts) {\n return;\n }\n removedLayouts.forEach((removedLayout) => {\n store.removeWhere((existingLayout) => !this.compareLayouts(existingLayout, removedLayout));\n\n this.callbacks.execute(\"removed\", removedLayout);\n });\n }\n\n private changeLayouts(changedLayouts: any[]) {\n if (!changedLayouts) {\n return;\n }\n\n changedLayouts.forEach((changedLayout) => {\n // removed the changed layout and push it again\n store.removeWhere((existingLayout) => !this.compareLayouts(existingLayout, changedLayout));\n store.add(new LayoutImpl(changedLayout));\n // execute callback\n this.callbacks.execute(\"changed\", changedLayout);\n });\n\n }\n\n private renameLayouts(renamedLayouts: any[]) {\n if (!renamedLayouts) {\n return;\n }\n\n renamedLayouts.forEach((renamedLayout) => {\n const existingLayout = store.first((current) => this.compareLayouts(current, { type: renamedLayout.type, name: renamedLayout.oldName }));\n\n if (!existingLayout) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n throw Error(`received rename event for unknown layout with type ${renamedLayout.type} and name ${renamedLayout.oldName}`);\n }\n\n existingLayout.name = renamedLayout.newName;\n\n this.callbacks.execute(\"renamed\", existingLayout);\n });\n }\n\n private compareLayouts(layout1: { name: string, type: string }, layout2: { name: string, type: string }) {\n return layout1.name === layout2.name && layout1.type === layout2.type;\n }\n\n private getObjectValues(obj: any) {\n if (!obj) {\n return [];\n }\n\n return Object.keys(obj).map((k) => obj[k]);\n }\n\n private restoredLayout(restoredLayouts: any[]) {\n\n if (!restoredLayouts) {\n return;\n }\n\n restoredLayouts.forEach((restoredLayout) => {\n const existingLayout = store.first((current) => this.compareLayouts(current, { type: restoredLayout.type, name: restoredLayout.name }));\n this.callbacks.execute(\"restored\", existingLayout);\n });\n }\n}\n","import Layouts from \"./layouts\";\nimport ACSStream from \"./stream/acsStream\";\nimport streamNull from \"./stream/nullStream\";\nimport {LayoutsLibConfiguration, LayoutsStream } from \"./types\";\nimport callbackRegistry, { CallbackRegistry } from \"callback-registry\";\n\nexport default function(config: LayoutsLibConfiguration): Layouts {\n\n if (!config.agm) {\n throw Error(\"config.agm is required\");\n }\n\n if (!config.logger) {\n throw Error(\"config.logger is required\");\n }\n\n // default mode to slim\n config.mode = config.mode || \"slim\";\n\n const logger = config.logger;\n const callbacks: CallbackRegistry = callbackRegistry();\n\n let acsStream: LayoutsStream;\n\n if (config.mode === \"full\" || \"fullWaitSnapshot\") {\n acsStream = new ACSStream(config.agm, callbacks);\n } else {\n acsStream = streamNull();\n }\n\n return new Layouts(config, acsStream, callbacks, logger);\n}\n","import { IOConnectDesktop } from \"../../desktop\";\nimport CallbackFactory, { CallbackRegistry } from \"callback-registry\";\nimport CaptureOptions = IOConnectDesktop.Displays.CaptureOptions;\n\nconst T42DisplayCommand = \"T42.Displays.Command\";\nconst T42DisplayOnEvent = \"T42.Displays.OnEvent\";\n\nexport default class DisplayManager implements IOConnectDesktop.Displays.API {\n private _registry: CallbackRegistry = CallbackFactory();\n private _registered = false;\n\n constructor(\n private _agm: IOConnectDesktop.AGM.API,\n private _logger: IOConnectDesktop.Logger.API,\n ) {\n //\n }\n\n public all = async (): Promise<IOConnectDesktop.Displays.Display[]> => {\n const displays = await this.callGD<IOConnectDesktop.Displays.Display[]>(DisplayCommand.GetAll, {});\n return displays.map(this.decorateDisplay);\n }\n\n public get = async (id: number): Promise<IOConnectDesktop.Displays.Display> => {\n const display = await this.callGD<IOConnectDesktop.Displays.Display>(DisplayCommand.Get, { id });\n return this.decorateDisplay(display);\n }\n\n public getPrimary = async (): Promise<IOConnectDesktop.Displays.Display> => {\n const primary = (await this.all()).find((d) => d.isPrimary);\n return primary;\n }\n\n public getByWindowId(id: string): Promise<IOConnectDesktop.Displays.Display> {\n const current = this.callGD<IOConnectDesktop.Displays.Display>(DisplayCommand.GetByWindowId, { id });\n return current;\n }\n\n public capture = async (options: CaptureOptions): Promise<string> => {\n const screenshot = await this.callGD<string>(DisplayCommand.Capture, { ...options });\n return screenshot;\n }\n\n public captureAll = async (options: IOConnectDesktop.Displays.CaptureAllOptions): Promise<string | string[]> => {\n const screenshots = await this.callGD<string | string[]>(DisplayCommand.CaptureAll, { ...options });\n return screenshots;\n }\n\n public getMousePosition = async (): Promise<IOConnectDesktop.Displays.Point> => {\n const point = await this.callGD<IOConnectDesktop.Displays.Point>(DisplayCommand.GetMousePosition);\n return point;\n }\n\n public onDisplayChanged(cb: (displays: IOConnectDesktop.Displays.Display[]) => void) {\n this.register();\n return this._registry.add(\"on-display-changed\", cb);\n }\n\n private callGD = async <T>(command: string, options?: object): Promise<T> => {\n // Consider targeting only GD\n const invocationResult = await this._agm.invoke(T42DisplayCommand, { options: { ...options }, command });\n return invocationResult.returned.data;\n }\n\n private decorateDisplay = (original: IOConnectDesktop.Displays.Display): IOConnectDesktop.Displays.Display => {\n const decoratedDisplay = {\n ...original,\n capture: (size: SizeOptions) => this.capture({ id: original.id, size })\n };\n const workAreaAsAny = decoratedDisplay.workArea as any;\n workAreaAsAny.x = workAreaAsAny.left;\n workAreaAsAny.y = decoratedDisplay.workArea.top;\n return decoratedDisplay;\n }\n\n private register() {\n if (this._registered) {\n return;\n }\n this._registered = true;\n this._agm.register<{ event: string, data: any }>(T42DisplayOnEvent, (args, caller) => {\n const event = args.event;\n const data = args.data;\n switch (event) {\n case \"display-changed\":\n this._registry.execute(\"on-display-changed\", data.displays.map(this.decorateDisplay));\n break;\n default:\n this._logger.warn(`unknown event - ${event}`);\n break;\n }\n });\n }\n}\n\ntype SizeOptions = IOConnectDesktop.Displays.ScaleOptions | IOConnectDesktop.Displays.AbsoluteSizeOptions;\n\nenum DisplayCommand {\n Capture = \"capture\",\n CaptureAll = \"captureAll\",\n GetAll = \"getAll\",\n Get = \"get\",\n GetByWindowId = \"getByWindowId\",\n GetMousePosition = \"getMousePosition\",\n}\n","import { IOConnectDesktop } from \"../../desktop\";\nimport { ChannelsImpl } from \"./channels\";\n\nlet interop: IOConnectDesktop.Interop.API;\nlet windowId: string;\nconst T42_ANNOUNCE_METHOD_NAME = \"T42.Channels.Announce\";\n\nexport interface WindowsWithChannels {\n windows: { windowId: string, channel: string, application: string }[];\n}\n\nexport async function setupInterop(interopLib: IOConnectDesktop.Interop.API, channels: ChannelsImpl) {\n interop = interopLib;\n\n if (typeof window !== \"undefined\") {\n if (window.glue42gd) {\n windowId = window.glue42gd.windowId;\n }\n }\n\n if (!windowId) {\n // not supported\n return;\n }\n\n await interop.register<{ command: string, channel: string }>(\"T42.Channels.Command\", (args) => {\n const command = args.command;\n if (!command) {\n throw new Error(\"missing command argument\");\n }\n if (command === \"join\") {\n const id = args.channel;\n if (!id) {\n throw new Error(\"missing argument id\");\n }\n // this is coming from GD (which means from selector switch, join without triggering selection change again)\n channels.joinNoSelectorSwitch(id);\n return;\n }\n if (command === \"leave\") {\n channels.leaveNoSelectorSwitch();\n return;\n }\n if (command === \"get\") {\n const id = channels.current();\n return { id };\n }\n throw new Error(`unknown command ${command}`);\n });\n\n // agm interface is available for SW windows only\n await interop.invoke(\"T42.Channels.Announce\", { swId: windowId, instance: interop.instance.instance });\n}\n\nexport async function switchChannel(channel?: string, id?: string) {\n interop.invoke(\"T42.Channels.Announce\", {\n swId: id ?? windowId,\n command: \"switchChannel\",\n data: { newChannel: channel }\n });\n}\n\nexport async function getWindowsWithChannels(filter: IOConnectDesktop.Channels.WindowWithChannelFilter): Promise<WindowsWithChannels> {\n const result = await interop.invoke<WindowsWithChannels>(T42_ANNOUNCE_METHOD_NAME, { command: \"getChannelsInfo\", data: { filter } });\n return result.returned;\n}\n\nexport async function addOrRemoveChannel(command: \"addChannel\" | \"removeChannel\", id: string, color?: string) {\n await interop.invoke(T42_ANNOUNCE_METHOD_NAME, { command, data: { id, color } });\n}\n","import { IOConnectDesktop } from \"../../desktop\";\n\nconst CONTEXT_PREFIX = \"___channel___\";\nconst LATEST_FDC3_TYPE = \"latest_fdc3_type\";\n\nexport class SharedContextSubscriber {\n private unsubscribeFunc: () => void;\n private callback: any;\n\n constructor(private contexts: IOConnectDesktop.Contexts.API) {\n }\n\n public subscribe(callback: any): void {\n this.callback = callback;\n }\n\n public subscribeFor(name: string, callback: (data: object, context: IOConnectDesktop.Channels.ChannelContext, updaterId: string) => void): Promise<() => void> {\n if (!this.isChannel(name)) {\n return Promise.reject(new Error(`Channel with name: ${name} doesn't exist!`));\n }\n\n const contextName = this.createContextName(name);\n\n return this.contexts.subscribe(contextName, (data, _, __, ___, extraData) => {\n callback(data.data, data, extraData?.updaterId);\n });\n }\n\n /** Unsubscribes from the current shared context, and subscribe to the passed one */\n public async switchChannel(name: string): Promise<void> {\n this.unsubscribe();\n const contextName = this.createContextName(name);\n this.unsubscribeFunc = await this.contexts.subscribe(contextName, (data, _, __, ___, extraData) => {\n if (this.callback) {\n this.callback(data.data, data, extraData?.updaterId);\n }\n });\n }\n\n public leave() {\n if (this.callback) {\n this.callback({}, undefined);\n }\n this.unsubscribe();\n }\n\n public all(): string[] {\n const contextNames = this.contexts.all();\n const channelContextNames = contextNames.filter((contextName) => contextName.startsWith(CONTEXT_PREFIX));\n const channelNames = channelContextNames.map((channelContextName) => channelContextName.substr(CONTEXT_PREFIX.length));\n return channelNames;\n }\n\n public async getContextData(name: string): Promise<IOConnectDesktop.Channels.ChannelContext> {\n if (!this.isChannel(name)) {\n throw new Error(`A channel with name: ${name} doesn't exist!`);\n }\n\n const contextName = this.createContextName(name);\n\n const contextData = await this.contexts.get(contextName);\n\n if (contextData[LATEST_FDC3_TYPE]) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { latest_fdc3_type, ...data } = contextData;\n\n return data;\n }\n\n return contextData;\n }\n\n public updateChannel(name: string, data: { name: string, meta: any, data: any }): Promise<void> {\n const contextName = this.createContextName(name);\n return this.contexts.update(contextName, data);\n }\n\n public updateData(name: string, data: any) {\n const contextName = this.createContextName(name);\n const fdc3Type = this.getFDC3Type(data);\n\n if (this.contexts.setPathSupported) {\n const pathValues: IOConnectDesktop.Contexts.PathValue[] = Object.keys(data).map((key) => {\n return {\n path: `data.` + key,\n value: data[key]\n };\n });\n\n if (fdc3Type) {\n pathValues.push({ path: LATEST_FDC3_TYPE, value: fdc3Type });\n }\n\n return this.contexts.setPaths(contextName, pathValues);\n } else {\n if (fdc3Type) {\n data[LATEST_FDC3_TYPE] = fdc3Type;\n }\n\n // pre 3.10, note that we update the data property only\n return this.contexts.update(contextName, { data });\n }\n }\n\n public isChannel(name: string): boolean {\n return this.all().some((channelName) => channelName === name);\n }\n\n public async remove(name: string) {\n if (!this.isChannel(name)) {\n throw new Error(`A channel with name: ${name} doesn't exist!`);\n }\n\n const contextName = this.createContextName(name);\n await this.contexts.destroy(contextName);\n }\n\n private unsubscribe(): void {\n if (this.unsubscribeFunc) {\n this.unsubscribeFunc();\n }\n }\n\n private createContextName(name: string): string {\n return CONTEXT_PREFIX + name;\n }\n\n private getFDC3Type(data: any): string | undefined {\n const fdc3PropsArr = Object.keys(data).filter((key: string) => key.indexOf(\"fdc3_\") === 0);\n\n if (fdc3PropsArr.length === 0) {\n return;\n }\n\n if (fdc3PropsArr.length > 1) {\n throw new Error(\"FDC3 does not support updating of multiple context keys\");\n }\n\n return fdc3PropsArr[0].split(\"_\").slice(1).join(\"_\");\n }\n}\n","import { IOConnectDesktop } from \"../../desktop\";\nimport { default as CallbackRegistryFactory, CallbackRegistry } from \"callback-registry\";\nimport { SharedContextSubscriber } from \"./contexts\";\nimport { addOrRemoveChannel, getWindowsWithChannels, switchChannel } from \"./agm\";\nimport shortid from \"shortid\";\nexport class ChannelsImpl implements IOConnectDesktop.Channels.API {\n private subsKey = \"subs\";\n private changedKey = \"changed\";\n private isInitialJoin = true;\n\n private registry: CallbackRegistry = CallbackRegistryFactory();\n private currentContext: string;\n private lastUpdate: { context: IOConnectDesktop.Channels.ChannelContext, updaterId?: string };\n private pendingReplays: any = {};\n\n constructor(private shared: SharedContextSubscriber, private interop: IOConnectDesktop.Interop.API, private getWindows: () => IOConnectDesktop.Windows.API, private logger: IOConnectDesktop.Logger.API) {\n this.shared.subscribe(this.handler.bind(this));\n\n if (typeof window !== \"undefined\" && typeof window.glue42gd !== \"undefined\") {\n this.currentContext = (window.glue42gd as any).initialChannel;\n if (this.currentContext) {\n this.joinNoSelectorSwitch(this.currentContext);\n }\n }\n }\n\n public subscribe(callback: (data: object, context: IOConnectDesktop.Channels.ChannelContext, updaterId: string) => void): () => void {\n if (typeof callback !== \"function\") {\n throw new Error(\"Please provide the callback as a function!\");\n }\n\n // We want to replay the current context for late joiners\n // Some caveats:\n // 1. We need to consider that unsub might be called before we replay the initial set - in which case we should not do the replay - we wrap unsubscribe\n // and use pendingReplays to handle this well)\n // 2. We need to prevent double context updated calls with the same value. This might happen if you do subscirbe -> publish fast - we use pendingReplays to prevent double calls.\n // 3. We don't use replay args of callback registry, as they might reorder updates in case of fast updates (e.g. subscribe -> leave might result in [undefined, context] updates,\n // instead of [context, undefined]\n const id = shortid();\n this.pendingReplays[id] = true;\n if (this.lastUpdate) {\n let lastUpdate = Object.assign({}, this.lastUpdate);\n setTimeout(() => {\n if (this.pendingReplays[id]) {\n if (this.lastUpdate) {\n lastUpdate = this.lastUpdate;\n }\n callback(lastUpdate.context.data, lastUpdate.context, lastUpdate.updaterId);\n }\n delete this.pendingReplays[id];\n }, 0);\n }\n\n const unsub = this.registry.add(this.subsKey, callback);\n return () => {\n this.pendingReplays[id] = false;\n unsub();\n };\n }\n\n public async subscribeFor(name: string, callback: (data: object, context: IOConnectDesktop.Channels.ChannelContext, updaterId: string) => void): Promise<() => void> {\n if (typeof name !== \"string\") {\n throw new Error(\"Please provide the name as a string!\");\n }\n if (typeof callback !== \"function\") {\n throw new Error(\"Please provide the callback as a function!\");\n }\n const unsubscribeFunc = await this.shared.subscribeFor(name, callback);\n return unsubscribeFunc;\n }\n\n public async publish(data: object, name?: string): Promise<void> {\n if (typeof data !== \"object\") {\n throw new Error(\"Please provide the data as an object!\");\n }\n\n if (name) {\n if (typeof name !== \"string\") {\n throw new Error(\"Please provide the name as a string!\");\n }\n\n if (!this.shared.isChannel(name)) {\n return Promise.reject(new Error(`A channel with name: ${name} doesn't exist!`));\n }\n\n return this.shared.updateData(name, data);\n }\n\n if (!this.currentContext) {\n throw new Error(\"Not joined to any channel!\");\n }\n return this.shared.updateData(this.currentContext, data);\n }\n\n public all(): Promise<string[]> {\n const channelNames = this.shared.all();\n return Promise.resolve(channelNames);\n }\n\n public async list(): Promise<IOConnectDesktop.Channels.ChannelContext[]> {\n const channelNames = await this.all();\n const channelContexts = await Promise.all(channelNames.map((channelName) => this.get(channelName)));\n return channelContexts;\n }\n\n public get(name: string): Promise<IOConnectDesktop.Channels.ChannelContext> {\n if (typeof name !== \"string\") {\n return Promise.reject(new Error(\"Please provide the channel name as a string!\"));\n }\n\n return this.shared.getContextData(name);\n }\n\n /* Returns info about my channel */\n public getMy(): Promise<IOConnectDesktop.Channels.ChannelContext> {\n if (!this.currentContext) {\n return Promise.resolve(undefined);\n }\n return this.get(this.currentContext);\n }\n\n public async join(name: string, windowId?: string): Promise<void> {\n if (windowId) {\n return switchChannel(name, windowId);\n }\n return this.joinCore(name);\n }\n\n public async joinNoSelectorSwitch(name: string): Promise<void> {\n return this.joinCore(name, false);\n }\n\n public leave(windowId?: string) {\n if (windowId) {\n return switchChannel(undefined, windowId);\n }\n return this.leaveCore();\n }\n\n public leaveNoSelectorSwitch() {\n return this.leaveCore(false);\n }\n\n public current(): string {\n return this.currentContext;\n }\n\n public my(): string {\n return this.current();\n }\n\n public changed(callback: (channel: string) => void): () => void {\n if (typeof callback !== \"function\") {\n throw new Error(\"Please provide the callback as a function!\");\n }\n\n // don't use replay args as they might fail if changed->leave\n const current = this.current();\n if (current) {\n setTimeout(() => {\n callback(this.current());\n }, 0);\n }\n\n return this.registry.add(this.changedKey, callback);\n }\n\n public onChanged(callback: (channel: string) => void): () => void {\n return this.changed(callback);\n }\n\n public async add(info: IOConnectDesktop.Channels.ChannelContext): Promise<IOConnectDesktop.Channels.ChannelContext> {\n if (typeof info !== \"object\") {\n throw new Error(\"Please provide the info as an object!\");\n }\n if (typeof info.name === \"undefined\") {\n throw new Error(\"info.name is missing!\");\n }\n if (typeof info.name !== \"string\") {\n throw new Error(\"Please provide the info.name as a string!\");\n }\n if (typeof info.meta === \"undefined\") {\n throw new Error(\"info.meta is missing!\");\n }\n if (typeof info.meta !== \"object\") {\n throw new Error(\"Please provide the info.meta as an object!\");\n }\n if (typeof info.meta.color === \"undefined\") {\n throw new Error(\"info.meta.color is missing!\");\n }\n if (typeof info.meta.color !== \"string\") {\n throw new Error(\"Please provide the info.meta.color as a string!\");\n }\n\n const context: IOConnectDesktop.Channels.ChannelContext = {\n name: info.name,\n meta: info.meta || {},\n data: info.data || {}\n };\n\n // Note that we use `update` instead of `add` so that if the channel already exists we don't overwrite it.\n await this.shared.updateChannel(info.name, context);\n\n await addOrRemoveChannel(\"addChannel\", info.name, info.meta.color);\n\n return context;\n }\n\n public async remove(channel: string): Promise<void> {\n if (typeof channel !== \"string\") {\n throw new Error(\"Please provide the channel name as a string!\");\n }\n\n await this.shared.remove(channel);\n\n await addOrRemoveChannel(\"removeChannel\", channel);\n }\n\n public async getWindowsOnChannel(channel: string): Promise<IOConnectDesktop.Windows.IOConnectWindow[]> {\n if (typeof channel !== \"string\") {\n throw new Error(\"Please provide the channel name as a string!\");\n }\n const windowInfos = await this.getWindowsWithChannels({ channels: [channel] });\n return windowInfos.map((w) => w.window);\n }\n\n public async getWindowsWithChannels(filter: IOConnectDesktop.Channels.WindowWithChannelFilter): Promise<IOConnectDesktop.Channels.WindowOnChannelInfo[]> {\n try {\n const info = await getWindowsWithChannels(filter);\n const windows = this.getWindows();\n if (info?.windows) {\n return info.windows.map((windowInfo) => {\n const window = windows.findById(windowInfo.windowId);\n return {\n window,\n channel: windowInfo.channel,\n application: windowInfo.application\n };\n });\n }\n } catch (er) {\n this.logger.error(`Error getting all channel enabled windows. This method is available since Glue42 3.12`, er);\n }\n return [];\n }\n\n private handler(data: object, context: IOConnectDesktop.Channels.ChannelContext, updaterId: string): any {\n if (!context && !updaterId) {\n this.lastUpdate = undefined;\n return;\n }\n\n this.lastUpdate = { context, updaterId };\n this.pendingReplays = {};\n this.registry.execute(this.subsKey, data, context, updaterId);\n }\n\n private async joinCore(name: string, changeSelector = true) {\n if (typeof name !== \"string\") {\n throw new Error(\"Please provide the channel name as a string!\");\n }\n\n if (!this.isInitialJoin && name === this.currentContext) {\n // ignore joining the channel that we're already on, except when this is the very first call\n return;\n }\n this.isInitialJoin = false;\n\n // Checks if a channel exists with the provided name.\n const doesChannelExist = (channelName: string): boolean => {\n const channelNames = this.shared.all();\n return channelNames.includes(channelName);\n };\n\n // Wait for 3k ms for the channel to appear if it doesn't already exist.\n if (!doesChannelExist(name)) {\n const channelExistsPromise = new Promise<void>((resolve, reject) => {\n // Check every 100 ms for a channel with the provided name.\n const intervalId = setInterval(() => {\n if (doesChannelExist(name)) {\n clearTimeout(timeoutId);\n clearInterval(intervalId);\n resolve();\n }\n }, 100);\n\n const timeoutId = setTimeout(() => {\n clearInterval(intervalId);\n\n return reject(new Error(`A channel with name: ${name} doesn't exist!`));\n }, 3000);\n });\n\n await channelExistsPromise;\n }\n\n this.currentContext = name;\n this.lastUpdate = undefined;\n\n await this.shared.switchChannel(name);\n if (changeSelector) {\n switchChannel(name);\n }\n this.registry.execute(this.changedKey, name);\n }\n\n private leaveCore(changeSelector = true): Promise<void> {\n this.currentContext = undefined;\n this.registry.execute(this.changedKey, undefined);\n this.shared.leave();\n if (changeSelector) {\n switchChannel();\n }\n return Promise.resolve();\n }\n}\n","import { IOConnectDesktop } from \"../../desktop\";\nimport { setupInterop } from \"./agm\";\nimport { SharedContextSubscriber } from \"./contexts\";\nimport { ChannelsImpl } from \"./channels\";\n\nexport function factory(contexts: IOConnectDesktop.Contexts.API, agm: IOConnectDesktop.AGM.API, getWindows: () => IOConnectDesktop.Windows.API, logger: IOConnectDesktop.Logger.API): IOConnectDesktop.Channels.API & { ready: () => Promise<void>; } {\n const sharedContexts = new SharedContextSubscriber(contexts);\n const channels = new ChannelsImpl(sharedContexts, agm, getWindows, logger);\n\n const setupInteropPromise = setupInterop(agm, channels);\n\n return {\n subscribe: channels.subscribe.bind(channels),\n subscribeFor: channels.subscribeFor.bind(channels),\n publish: channels.publish.bind(channels),\n all: channels.all.bind(channels),\n list: channels.list.bind(channels),\n get: channels.get.bind(channels),\n join: channels.join.bind(channels),\n leave: channels.leave.bind(channels),\n // @ignore-ed, but kept for backwards compatibility.\n current: channels.current.bind(channels),\n my: channels.my.bind(channels),\n // @ignore-ed, but kept for backwards compatibility.\n changed: channels.changed.bind(channels),\n onChanged: channels.onChanged.bind(channels),\n add: channels.add.bind(channels),\n remove: channels.remove.bind(channels),\n getWindowsOnChannel: channels.getWindowsOnChannel.bind(channels),\n getWindowsWithChannels: channels.getWindowsWithChannels.bind(channels),\n getMy: channels.getMy.bind(channels),\n ready: async () => {\n await Promise.all([(contexts as any).ready(), setupInteropPromise]);\n }\n };\n}\n","import { IOConnectDesktop } from \"../../desktop\";\r\nimport { default as CallbackRegistryFactory, CallbackRegistry, UnsubscribeFunction } from \"callback-registry\";\r\n\r\nconst CommandMethod = \"T42.Hotkeys.Command\";\r\nconst InvokeMethod = \"T42.Hotkeys.Invoke\";\r\n\r\nconst RegisterCommand = \"register\";\r\nconst UnregisterCommand = \"unregister\";\r\nconst UnregisterAllCommand = \"unregisterAll\";\r\n\r\nexport class HotkeysImpl implements IOConnectDesktop.Hotkeys.API {\r\n\r\n private registry: CallbackRegistry = CallbackRegistryFactory();\r\n private firstHotkey = true;\r\n private hotkeys = new Map<string, IOConnectDesktop.Hotkeys.HotkeyInfo>();\r\n\r\n constructor(private agm: IOConnectDesktop.AGM.API) {\r\n }\r\n\r\n public async register(info: string | IOConnectDesktop.Hotkeys.HotkeyInfo, callback: IOConnectDesktop.Hotkeys.HotkeyCallback): Promise<void> {\r\n if (typeof info === \"undefined\") {\r\n throw new Error(\"Hotkey parameter missing\");\r\n }\r\n\r\n if (typeof info === \"string\") {\r\n info = {\r\n hotkey: info\r\n };\r\n } else {\r\n if (!info.hotkey) {\r\n throw new Error(\"Info's hotkey parameter missing\");\r\n }\r\n\r\n info = {\r\n hotkey: info.hotkey,\r\n description: info.description\r\n };\r\n }\r\n\r\n const hkToLower = this.formatHotkey(info.hotkey);\r\n if (this.hotkeys.has(hkToLower)) {\r\n throw new Error(`Shortcut for ${hkToLower} already registered`);\r\n }\r\n\r\n // if very first a hotkey is registered by this application register invoke AGM method\r\n if (this.firstHotkey) {\r\n this.firstHotkey = false;\r\n await this.registerInvokeAGMMethod();\r\n }\r\n // store the callback\r\n this.registry.add(hkToLower, callback);\r\n\r\n // invoke GD method\r\n await this.agm.invoke(CommandMethod, { command: RegisterCommand, hotkey: hkToLower, description: info.description });\r\n\r\n this.hotkeys.set(hkToLower, info);\r\n }\r\n\r\n public async unregister(hotkey: string): Promise<void> {\r\n if (typeof hotkey === \"undefined\") {\r\n throw new Error(\"hotkey parameter missing\");\r\n }\r\n\r\n if (typeof hotkey !== \"string\") {\r\n throw new Error(\"hotkey parameter must be string\");\r\n }\r\n\r\n const hkToLower = this.formatHotkey(hotkey);\r\n await this.agm.invoke(CommandMethod, { command: UnregisterCommand, hotkey: hkToLower });\r\n this.hotkeys.delete(hkToLower);\r\n this.registry.clearKey(hkToLower);\r\n }\r\n\r\n public async unregisterAll(): Promise<void> {\r\n await this.agm.invoke(CommandMethod, { command: UnregisterAllCommand });\r\n this.hotkeys.clear();\r\n this.registry.clear();\r\n }\r\n\r\n /**\r\n * Whether this application has registered accelerator.\r\n * @param hotkey\r\n */\r\n public isRegistered(hotkey: string): boolean {\r\n const hkToLower = this.formatHotkey(hotkey);\r\n return this.hotkeys.has(hkToLower);\r\n }\r\n\r\n private registerInvokeAGMMethod() {\r\n return this.agm.register(InvokeMethod, (args: {\r\n key: string;\r\n }) => {\r\n const hkToLower = args.key.toLowerCase();\r\n const info = this.hotkeys.get(hkToLower);\r\n this.registry.execute(hkToLower, info);\r\n });\r\n }\r\n\r\n private formatHotkey(hotkey: string): string {\r\n if (hotkey) {\r\n return hotkey.replace(/\\s/g, \"\").toLowerCase();\r\n }\r\n }\r\n}\r\n","import { IOConnectDesktop } from \"../desktop\";\nimport { ActivitiesLibConfigObject, LibConfigObject, InternalConfig, LayoutsLibConfigObject, AppManagerLibConfigObject } from \"./types\";\nimport Utils from \"./utils\";\n\ninterface InputModeObject {\n mode?: boolean | string;\n logger?: IOConnectDesktop.LoggerConfig;\n}\n\nexport default (options: IOConnectDesktop.Config): InternalConfig => {\n\n // Possible options per lib (this is InputLibConfig type)\n // * false - library is disabled (e.g. config.appManager = false)\n // * true - library is enabled in running in default mode (e.g config.appManager = true).\n // Exception is if default mode is false - in that case it runs default true mode.\n // * string - start in some mode (e.g. config.appManager = \"full\")\n // * object - allows further customization (e.g config.appManager = {mode: \"full\", someSetting: 42})\n //\n // Some libs support different running modes, some do not.\n //\n // Currently defaults are:\n // appManager: disabled\n // layouts: enabled in 'slim' mode\n // activities: enabled in 'trackMyTypeAndInitiatedFromMe' mode\n // windows: enabled (does not support modes)\n //\n // InputLibConfig is transformed to LibConfigObject\n\n type InputLibConfig = boolean | string | InputModeObject;\n\n /**\n * Transforms InputLibConfig (the config as specified from the user)\n * to LibConfigObject(internal library configuration)\n */\n function getLibConfig<T extends LibConfigObject<boolean | string>>(value: InputLibConfig, defaultMode: boolean | string, trueMode: boolean | string): T {\n\n // if value is false return undefined\n if (typeof value === \"boolean\" && !value) {\n return undefined;\n }\n\n // find the mode of the library\n const mode = getModeAsString(value, defaultMode, trueMode);\n\n if (typeof mode === \"undefined\") {\n return undefined;\n }\n\n // if object we will replace the mode because appManager = {mode: true, setting: 42}\n // should be turned into appManager = {mode: 'slim', setting: 42}\n if (typeof value === \"object\") {\n value.mode = mode;\n return value as T;\n }\n\n return {\n mode,\n } as T;\n }\n\n /**\n * Finds the mode based for a given library\n * 1. If object we call recursively using object.mode for value\n * 1. If the user hasn't specified anything we use the hard coded defaults\n * 3. If the value is false or it got defaulted to false, we return undefined\n * 4. If the value is true we return trueMode or defaultMode (if trueMode is undefined)\n */\n function getModeAsString(value: InputLibConfig, defaultMode: boolean | string, trueMode?: boolean | string): boolean | string {\n\n if (typeof value === \"object\") {\n // 1. if object\n return getModeAsString(value.mode, defaultMode, trueMode).toString();\n } else if (typeof value === \"undefined\") {\n // 2. if the user does not pass anything\n if (typeof defaultMode === \"boolean\" && !defaultMode) {\n // 3. if gets defaulted to false, the library should be off\n return undefined;\n } else if (typeof defaultMode === \"boolean\" && defaultMode) {\n // if the user passed in 'trueMode', then supposedly they expect\n // a default of 'true' to also be converted to 'trueMode'\n return typeof trueMode === \"undefined\" ? defaultMode : trueMode;\n } else if (typeof defaultMode === \"undefined\") {\n return undefined;\n } else {\n return defaultMode;\n }\n } else if (typeof value === \"boolean\") {\n // 4. if the user passes true, use trueMode or defaultMode\n if (value) {\n // if the user passes true, use trueMode or defaultMode\n return (typeof trueMode === \"undefined\") ? defaultMode : trueMode;\n } else {\n // 3. if the user passes false, the library should be off\n return undefined;\n }\n }\n\n return value;\n }\n\n const appDefaultMode = true;\n const appDefaultTrueMode = \"startOnly\";\n\n const activitiesDefaultMode = Utils.isNode() ? false : \"trackMyTypeAndInitiatedFromMe\";\n const activitiesTrueMode = \"trackMyTypeAndInitiatedFromMe\";\n\n const layoutsDefaultMode = \"slim\";\n const layoutsTrueMode = layoutsDefaultMode;\n\n const exposeAPI = typeof options.exposeAPI === \"boolean\" || typeof options.exposeGlue === \"boolean\";\n\n return {\n layouts: getLibConfig<LayoutsLibConfigObject>(options.layouts, layoutsDefaultMode, layoutsTrueMode),\n activities: getLibConfig<ActivitiesLibConfigObject>(options.activities, activitiesDefaultMode, activitiesTrueMode),\n appManager: getLibConfig<AppManagerLibConfigObject>(options.appManager, appDefaultMode, appDefaultTrueMode),\n windows: getLibConfig<LibConfigObject<boolean>>(options.windows, true, true),\n channels: getLibConfig<LibConfigObject<boolean>>(options.channels, false, true),\n displays: getLibConfig<LibConfigObject<boolean>>(options.displays, true, true),\n exposeAPI: exposeAPI ? exposeAPI : true\n };\n};\n","import { IOConnectDesktop } from \"../../desktop\";\nimport callbackRegistry, { CallbackRegistry } from \"callback-registry\";\nimport { Events } from \"./main\";\n\n\n\nexport class Glue42Notification implements IOConnectDesktop.Notifications.Notification {\n public readonly actions: IOConnectDesktop.Notifications.NotificationAction[];\n public id: string;\n public instanceId: string;\n public panelExpiry: number;\n public toastExpiry: number;\n public badge: string;\n public body: string;\n public data: any;\n public dir: NotificationDirection;\n public icon: string;\n public image: string;\n public lang: string;\n public renotify: boolean;\n public requireInteraction: boolean;\n public silent: boolean;\n public tag: string;\n public timestamp: number;\n public title: string;\n public readonly vibrate: number[];\n\n public onclick: ((ev: IOConnectDesktop.Notifications.ClickEvent) => void);\n public onclose: (() => void);\n public onerror: ((ev: IOConnectDesktop.Notifications.ErrorEvent) => void);\n public onshow: ((ev: IOConnectDesktop.Notifications.ShowEvent) => void);\n public onaction: ((ev: IOConnectDesktop.Notifications.ActionEvent) => void);\n\n private callbacks: CallbackRegistry = callbackRegistry();\n\n public constructor(public options: IOConnectDesktop.Notifications.IOConnectNotificationOptions) {\n this.actions = options.actions;\n this.body = options.body;\n this.badge = options.badge;\n this.data = options.data;\n this.dir = options.dir;\n this.icon = options.icon;\n this.image = options.image;\n this.lang = options.lang;\n this.renotify = options.renotify;\n this.requireInteraction = options.requireInteraction;\n this.silent = options.silent;\n this.tag = options.tag;\n this.timestamp = options.timestamp;\n this.title = options.title;\n }\n\n public close(): void {\n throw new Error(\"Method not implemented.\");\n }\n public addEventListener<K extends \"click\" | \"close\" | \"error\" | \"show\">(type: K, listener: (this: Notification, ev: NotificationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;\n public addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;\n public addEventListener(type: any, listener: any, options?: any) {\n this.callbacks.add(type, listener);\n }\n public removeEventListener<K extends \"click\" | \"close\" | \"error\" | \"show\">(type: K, listener: (this: Notification, ev: NotificationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;\n public removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;\n public removeEventListener(type: any, listener: any, options?: any) {\n // DO NOTHING FOR NOW\n }\n public dispatchEvent(event: Events): boolean {\n this.callbacks.execute(event.type, event);\n return true;\n }\n}\n","import { UnsubscribeFunction } from \"callback-registry\";\nimport { IOConnectDesktop } from \"../../desktop\";\n\nexport class PanelAPI implements IOConnectDesktop.Notifications.NotificationPanelAPI {\n\n constructor(private interop: IOConnectDesktop.Interop.API, private onStreamEvent: <T>(key: string, callback: T) => UnsubscribeFunction) {\n }\n\n public onVisibilityChanged(callback: (isVisible: boolean) => void): UnsubscribeFunction {\n return this.onStreamEvent(\"on-panel-visibility-changed\", callback);\n }\n\n public toggle(): Promise<any> {\n return this.interop.invoke(\"T42.Notifications.Show\");\n }\n\n public show(): Promise<any> {\n return this.interop.invoke(\"T42.Notifications.Show\", { show: true });\n }\n\n public hide(): Promise<any> {\n return this.interop.invoke(\"T42.Notifications.Hide\");\n }\n\n public async isVisible(): Promise<boolean> {\n const interopResult = await this.interop.invoke<{ panelVisible: boolean }>(\"T42.Notifications.Execute\", { command: \"isPanelVisible\" });\n return interopResult.returned.panelVisible;\n }\n\n public toAPI(): IOConnectDesktop.Notifications.NotificationPanelAPI {\n return {\n onVisibilityChanged: this.onVisibilityChanged.bind(this),\n toggle: this.toggle.bind(this),\n show: this.show.bind(this),\n hide: this.hide.bind(this),\n isVisible: this.isVisible.bind(this)\n };\n }\n}\n","import { IOConnectDesktop } from \"../../desktop\";\nimport { Glue42Notification } from \"./notification\";\nimport { GnsNotificationSettings, GnsNotificationActionSettings, GnsNotificationActionPayload, NotificationsConfiguration, StreamMessage, StreamNotification, StreamNotificationDeltas } from \"./types\";\nimport callbackRegistry, { Callback, CallbackRegistry, UnsubscribeFunction } from \"callback-registry\";\nimport generate from \"shortid\";\nimport { PanelAPI } from \"./panel\";\n\nconst STARTING_INDEX = 0;\n\ninterface NotificationEventMapExt extends NotificationEventMap {\n \"action\": Event;\n \"unknown\": Event;\n}\n\ninterface GnsNotificationEventArgs {\n event: keyof NotificationEventMapExt;\n notificationId?: string;\n notificationActionPayload?: GnsNotificationActionPayload;\n error?: Error;\n}\n\nexport type Events = IOConnectDesktop.Notifications.ActionEvent | IOConnectDesktop.Notifications.ErrorEvent | IOConnectDesktop.Notifications.ClickEvent;\n\n\nexport class Notifications {\n private _panel: PanelAPI;\n\n private readonly NotificationsSubscribeStream = \"T42.GNS.Subscribe.Notifications\";\n private readonly NotificationsCounterStream = \"T42.Notifications.Counter\";\n private readonly RaiseNotificationMethodName = \"T42.GNS.Publish.RaiseNotification\";\n private readonly NotificationsExecuteMethod = \"T42.Notifications.Execute\";\n\n private methodsRegistered = false;\n private NOTIFICATIONS_CONFIGURE_METHOD_NAME = \"T42.Notifications.Configure\";\n private readonly methodNameRoot = \"T42.Notifications.Handler-\" + generate();\n private nextId = 0;\n private notifications: { [id: string]: Glue42Notification } = {};\n private registry: CallbackRegistry = callbackRegistry();\n private subscriptionForNotifications: IOConnectDesktop.Interop.Subscription;\n private subscriptionForCounter: IOConnectDesktop.Interop.Subscription;\n private subscribedForNotifications = false;\n private subscribedCounterStream = false;\n private subscriptionsCountForNotifications = 0;\n private subscriptionsCountForCounter = 0;\n\n constructor(private interop: IOConnectDesktop.Interop.API, private logger: IOConnectDesktop.Logger.API) {\n this._panel = new PanelAPI(interop, this.onStreamEventCore.bind(this));\n this.subscribeInternalEvents();\n }\n\n public get maxActions(): number {\n return 2;\n }\n\n public get panel() {\n return this._panel.toAPI();\n }\n\n public async raise(options: IOConnectDesktop.Notifications.IOConnectNotificationOptions): Promise<IOConnectDesktop.Notifications.Notification> {\n this.validate(options);\n\n if (!this.methodsRegistered) {\n const bunchOfPromises = [];\n for (let index = STARTING_INDEX; index < this.maxActions; index++) {\n bunchOfPromises.push(\n this.interop.register(`${this.methodNameRoot}_${index}`, this.handleNotificationEvent.bind(this))\n );\n }\n\n this.methodsRegistered = true;\n await Promise.all(bunchOfPromises);\n }\n\n // transform actions\n const id = String(this.nextId++);\n const type = options.type ?? \"Notification\";\n const notification: GnsNotificationSettings = {\n title: options.title,\n type,\n severity: options.severity ?? \"None\",\n description: options.body,\n glueRoutingDetailMethodName: `${this.methodNameRoot}_${STARTING_INDEX}`,\n actions: [],\n sourceId: id,\n source: options.source,\n publishExtraEvents: true, // such as onerror, onshow and onclose\n clickInterop: options.clickInterop // desktop will invoke the interop method\n };\n\n if (options.actions) {\n this.handleActions(options, id, notification);\n }\n\n this.handleOptions(options, notification);\n\n const g42notification = new Glue42Notification(options);\n this.notifications[id] = g42notification;\n\n try {\n const invocationResult = await this.interop.invoke(this.RaiseNotificationMethodName, { notification });\n g42notification.id = invocationResult.returned?.id;\n } catch (err) {\n // let user code to subscribe for the onerror event\n const errorMessage = err.message;\n setTimeout(() => {\n this.handleNotificationErrorEvent(g42notification, errorMessage);\n }, 1);\n }\n return g42notification;\n }\n\n public async setFilter(filter: IOConnectDesktop.Notifications.NotificationFilter): Promise<IOConnectDesktop.Notifications.NotificationFilter> {\n const result = await this.interop.invoke(\"T42.Notifications.Filter\", filter);\n return result.returned;\n }\n\n public async getFilter(): Promise<IOConnectDesktop.Notifications.NotificationFilter> {\n const result = await this.interop.invoke(\"T42.Notifications.Filter\");\n return result.returned;\n }\n\n public async configure(options: IOConnectDesktop.Notifications.Configuration): Promise<void> {\n if (!options || Array.isArray(options)) {\n throw new Error(\"Invalid options - should be an object.\");\n }\n\n if (Object.values(options).length === 0) {\n throw new Error(\"The argument must be a non-empty object.\");\n }\n\n if (typeof options.enable !== \"undefined\" && typeof options.enable !== \"boolean\") {\n throw new Error(\"Expected type of enabled - boolean.\");\n }\n\n if (typeof options.enableToasts !== \"undefined\" && typeof options.enableToasts !== \"boolean\") {\n throw new Error(\"Expected type of enableToasts - boolean.\");\n }\n\n if (typeof options.toastExpiry !== \"undefined\" && typeof options.toastExpiry !== \"number\") {\n throw new Error(\"Expected type of toastExpiry - number.\");\n }\n\n if (options.sourceFilter && typeof options.sourceFilter !== \"object\") {\n throw new Error(\"Expected type of sourceFilter - object.\");\n }\n\n if (options.sourceFilter?.allowed && !Array.isArray(options.sourceFilter?.allowed)) {\n throw new Error(\"Expected type of sourceFilter.allowed - array.\");\n }\n\n if (options.sourceFilter?.blocked && !Array.isArray(options.sourceFilter?.blocked)) {\n throw new Error(\"Expected type of sourceFilter.blocked - array.\");\n }\n\n const result = await this.interop.invoke(this.NOTIFICATIONS_CONFIGURE_METHOD_NAME, options);\n return result.returned;\n }\n\n public async getConfiguration(): Promise<IOConnectDesktop.Notifications.Configuration> {\n const result = await this.interop.invoke(this.NotificationsExecuteMethod, { command: \"getConfiguration\" });\n return result.returned;\n }\n\n public async list(): Promise<IOConnectDesktop.Notifications.NotificationData[]> {\n const interopResult = await this.interop.invoke<{ notifications: IOConnectDesktop.Notifications.NotificationData[] }>(this.NotificationsExecuteMethod, { command: \"list\" });\n return interopResult.returned.notifications;\n }\n\n public onRaised(callback: (notification: IOConnectDesktop.Notifications.NotificationData) => void): UnsubscribeFunction {\n return this.onStreamEventCore(\"on-notification-raised\", callback);\n }\n\n public onStateChanged(callback: (id: string, state: IOConnectDesktop.Notifications.State) => any): UnsubscribeFunction {\n return this.onStreamEventCore(\"on-state-changed\", callback);\n }\n\n public onClosed(callback: (notification: { id: string }) => void): UnsubscribeFunction {\n return this.onStreamEventCore(\"on-notification-closed\", callback);\n }\n\n public onConfigurationChanged(callback: (config: NotificationsConfiguration) => void): UnsubscribeFunction {\n if (typeof callback !== \"function\") {\n throw new Error(\"Please provide the callback as a function!\");\n }\n this.subscribe();\n const un = this.registry.add(\"on-configuration-changed\", callback);\n return () => {\n un();\n this.closeStreamSubscriptionIfNoNeeded();\n };\n }\n\n public onCounterChanged(callback: (info: { count: number }) => void): UnsubscribeFunction {\n if (typeof callback !== \"function\") {\n throw new Error(\"Please provide the callback as a function!\");\n }\n this.subscribeForCounterStream();\n const un = this.registry.add(\"on-counter-changed\", callback);\n return () => {\n un();\n this.closeStreamCounterSubscriptionIfNoNeeded();\n };\n }\n\n public async clearAll(): Promise<void> {\n await this.interop.invoke(this.NotificationsExecuteMethod, { command: \"clearAll\" });\n }\n\n public async clearOld(): Promise<void> {\n await this.interop.invoke(this.NotificationsExecuteMethod, { command: \"clearAllOld\" });\n }\n\n public async clear(id: string): Promise<void> {\n if (!id) {\n throw new Error(\"The 'id' argument cannot be null or undefined\");\n }\n if (typeof (id) !== \"string\") {\n throw new Error(\"The 'id' argument must be a string\");\n }\n await this.interop.invoke(this.NotificationsExecuteMethod, { command: \"clear\", data: { id } });\n }\n\n public async click(id: string, action?: string): Promise<void> {\n await this.interop.invoke(this.NotificationsExecuteMethod, { command: \"click\", data: { id, action } });\n }\n\n public async setState(id: string, state: \"Active\" | \"Acknowledged\" | \"Stale\"): Promise<void> {\n if (!id) {\n throw new Error(\"The 'id' argument cannot be null or undefined\");\n }\n if (typeof (id) !== \"string\") {\n throw new Error(\"The 'id' argument must be a string\");\n }\n\n if (!state) {\n throw new Error(\"The 'state' argument cannot be null or undefined\");\n }\n if (typeof (state) !== \"string\") {\n throw new Error(\"The 'state' argument must be a string\");\n }\n\n const validStates = [\n \"Active\",\n \"Acknowledged\",\n \"Stale\"\n ];\n\n if (!validStates.includes(state)) {\n throw new Error(`The state argument: ${state} is not valid!`);\n }\n\n await this.interop.invoke(this.NotificationsExecuteMethod, { command: \"updateState\", data: { id, state } });\n }\n\n public toAPI(): IOConnectDesktop.Notifications.API {\n return {\n maxActions: this.maxActions,\n panel: this._panel.toAPI(),\n raise: this.raise.bind(this),\n setFilter: this.setFilter.bind(this),\n getFilter: this.getFilter.bind(this),\n configure: this.configure.bind(this),\n getConfiguration: this.getConfiguration.bind(this),\n list: this.list.bind(this),\n onRaised: this.onRaised.bind(this),\n onStateChanged: this.onStateChanged.bind(this),\n onClosed: this.onClosed.bind(this),\n onConfigurationChanged: this.onConfigurationChanged.bind(this),\n onCounterChanged: this.onCounterChanged.bind(this),\n clearAll: this.clearAll.bind(this),\n clearOld: this.clearOld.bind(this),\n clear: this.clear.bind(this),\n click: this.click.bind(this),\n setState: this.setState.bind(this)\n };\n }\n\n private onStreamEventCore<T extends Callback>(key: string, callback: T) {\n if (typeof callback !== \"function\") {\n throw new Error(\"Please provide the callback as a function!\");\n }\n this.subscribe();\n const un = this.registry.add(key, callback);\n return () => {\n un();\n this.closeStreamSubscriptionIfNoNeeded();\n };\n }\n\n private handleOptions(options: IOConnectDesktop.Notifications.IOConnectNotificationOptions, notification: GnsNotificationSettings) {\n if (options.icon) {\n notification.attributes = notification.attributes || [];\n notification.attributes.push(\n { key: \"icon\", value: { stringValue: options.icon } }\n );\n }\n\n if (options.data) {\n notification.attributes = notification.attributes || [];\n const dataAsString = JSON.stringify(options.data);\n notification.attributes.push(\n { key: \"data\", value: { stringValue: dataAsString } }\n );\n }\n\n if (typeof options.panelExpiry === \"number\") {\n notification.attributes = notification.attributes || [];\n notification.attributes.push(\n { key: \"panelExpiry\", value: { stringValue: options.panelExpiry.toString() } }\n );\n }\n\n if (typeof options.toastExpiry === \"number\") {\n notification.attributes = notification.attributes || [];\n notification.attributes.push(\n { key: \"toastExpiry\", value: { stringValue: options.toastExpiry.toString() } }\n );\n }\n }\n\n private handleActions(options: IOConnectDesktop.Notifications.IOConnectNotificationOptions, id: string, notification: GnsNotificationSettings) {\n const validActions = options.actions.slice(0, this.maxActions);\n\n let index = STARTING_INDEX;\n for (const action of validActions) {\n const args: GnsNotificationActionPayload & { [key: string]: string; } = {\n g42notificationId: id,\n g42action: action.action,\n g42interopMethod: action.interop?.method, // desktop will invoke the interop method\n g42interopTarget: action.interop?.target,\n g42interopArguments: JSON.stringify(action.interop?.arguments)\n };\n // properly convert between args and GNS value\n const parameters = Object.keys(args).map((key) => {\n const value = args[key];\n return {\n name: key,\n value: {\n stringValue: value\n }\n };\n });\n\n const glueAction: GnsNotificationActionSettings = {\n name: `${this.methodNameRoot}_${index}`,\n description: action.title,\n displayName: action.title,\n parameters\n };\n\n notification.actions.push(glueAction);\n index++;\n }\n }\n\n private validate(options: IOConnectDesktop.Notifications.IOConnectNotificationOptions) {\n if (!options) {\n throw new Error(\"invalid options - should be an object\");\n }\n if (typeof options !== \"object\") {\n throw new Error(\"invalid options - should be an object\");\n }\n if (!options.title) {\n throw new Error(\"invalid options - should have a title\");\n }\n if (typeof options.title !== \"string\") {\n throw new Error(\"invalid options - title should be a string\");\n }\n if (options.severity && typeof options.severity !== \"string\") {\n throw new Error(\"invalid options - severity should be a string\")\n }\n if (options.panelExpiry && typeof options.panelExpiry !== \"number\") {\n throw new Error(\"invalid options - panelExpiry should be a number\")\n }\n if (options.toastExpiry && typeof options.toastExpiry !== \"number\") {\n throw new Error(\"invalid options - toastExpiry should be a number\")\n }\n }\n\n private subscribe() {\n this.subscriptionsCountForNotifications++;\n if (!this.subscribedForNotifications) {\n this.subscribedForNotifications = true;\n\n this.logger.info(`Attempting to subscribe to \"${this.NotificationsSubscribeStream}\".`);\n this.interop\n .subscribe(this.NotificationsSubscribeStream, {\n arguments: {\n sendDeltaOnly: true\n }\n })\n .then((sub) => {\n this.subscriptionForNotifications = sub;\n this.logger.info(`Successfully subscribed to \"${this.NotificationsSubscribeStream}\".`);\n sub.onData(({ data }) => {\n this.handleData(data);\n });\n sub.onClosed((...args) => {\n this.subscribedForNotifications = false;\n this.logger.info(\n `Stream subscription Closed - ${JSON.stringify(args)}`\n );\n });\n sub.onFailed((...args) => {\n this.subscribedForNotifications = false;\n this.logger.warn(\n `Stream subscription Failed - ${JSON.stringify(args)}`\n );\n });\n })\n .catch((e) => {\n this.subscribedForNotifications = false;\n this.logger.error(`Unable to subscribe to \"${this.NotificationsSubscribeStream}\"`, e);\n });\n }\n }\n\n private subscribeForCounterStream() {\n this.subscriptionsCountForCounter++;\n if (!this.subscribedCounterStream) {\n this.subscribedCounterStream = true;\n this.logger.info(`Attempting to subscribe to \"${this.NotificationsCounterStream}\".`);\n this.interop\n .subscribe(this.NotificationsCounterStream, {\n arguments: {\n sendDeltaOnly: true\n }\n })\n .then((sub) => {\n this.subscriptionForCounter = sub;\n this.logger.info(`Successfully subscribed to \"${this.NotificationsCounterStream}\".`);\n sub.onData(({ data }) => {\n this.registry.execute(\"on-counter-changed\", { count: data.count });\n });\n sub.onClosed((...args) => {\n this.subscribedCounterStream = false;\n this.logger.info(\n `Stream subscription Closed - ${JSON.stringify(args)}`\n );\n });\n sub.onFailed((...args) => {\n this.subscribedCounterStream = false;\n this.logger.warn(\n `Stream subscription Failed - ${JSON.stringify(args)}`\n );\n });\n })\n .catch((e) => {\n this.subscribedCounterStream = false;\n this.logger.error(`Unable to subscribe to \"${this.NotificationsCounterStream}\"`, e);\n });\n }\n }\n\n private subscribeInternalEvents() {\n this.registry.add(\"on-notification-closed\", (id) => {\n this.handleOnClosed(id);\n });\n this.registry.add(\"on-notification-raised\", (notification) => {\n this.handleOnShow(notification.id);\n });\n }\n\n private handleData(message: StreamMessage) {\n try {\n if (\"items\" in message && Array.isArray(message.items)) {\n this.handleItemsData(message);\n } else if (\"deltas\" in message && Array.isArray(message.deltas)) {\n this.handleDeltas(message);\n }\n if (\"configuration\" in message && typeof message.configuration === \"object\") {\n this.logger.info(`Received configuration ${JSON.stringify(message.configuration)} from the stream`);\n this.registry.execute(\"on-configuration-changed\", message.configuration, message.configuration.allApplications);\n }\n if (\"command\" in message && typeof message.command === \"string\") {\n this.logger.info(`Received command \"${message.command ?? JSON.stringify(message)}\" from the stream`);\n if (message.command === \"showPanel\" || message.command === \"hidePanel\") {\n this.registry.execute(\"on-panel-visibility-changed\", message.command === \"showPanel\");\n }\n }\n } catch (e) {\n this.logger.error(`Failed to parse data from the stream`, e);\n }\n }\n\n private handleItemsData(message: StreamNotification) {\n const items = message.items;\n this.logger.info(\n `Received ${items.length} notifications from the stream`\n );\n const notifications: IOConnectDesktop.Notifications.NotificationData[] = items;\n\n // will handle the notifications in case of snapshot\n if (message.isSnapshot) {\n notifications.forEach((n) => {\n this.registry.execute(\"on-notification-raised\", n);\n });\n } else {\n const notification = notifications[0];\n if (notification.state === \"Closed\") {\n this.registry.execute(\"on-notification-closed\", { id: notification.id });\n } else if (notification.state === \"Active\") {\n this.registry.execute(\"on-notification-raised\", notification);\n }\n }\n }\n\n private handleDeltas(message: StreamNotificationDeltas) {\n const deltas = message.deltas;\n deltas.forEach((info) => {\n const id = info.id;\n const delta = info.delta;\n if (delta.state === \"Closed\") {\n this.registry.execute(\"on-notification-closed\", { id });\n } else {\n this.registry.execute(\"on-state-changed\", { id }, delta.state);\n }\n });\n }\n\n private handleOnClosed(id: string) {\n const { notification, key }: { notification: Glue42Notification; key: string; } = this.getNotification(id);\n if (notification) {\n this.handleEvent(notification, \"close\");\n delete this.notifications[key];\n }\n }\n\n private handleOnShow(id: string) {\n const { notification }: { notification: Glue42Notification; key: string; } = this.getNotification(id);\n if (notification) {\n this.handleEvent(notification, \"show\");\n }\n }\n\n private getNotification(id: string) {\n let notification: Glue42Notification | undefined;\n let key: string;\n for (const k in this.notifications) {\n if (this.notifications[k].id === id) {\n notification = this.notifications[k];\n key = k;\n break;\n }\n }\n return { notification, key };\n }\n\n private handleNotificationEvent(args: Readonly<any>): void {\n const gnsNotificationArgs = this.getGnsNotificationArgs(args);\n if (gnsNotificationArgs.event === \"unknown\") {\n // we cannot handle this event since we do not understand it\n return;\n }\n const notification = this.notifications[gnsNotificationArgs.notificationId];\n if (!notification) {\n // we cannot handle this event since notification is missing\n return;\n }\n this.handleNotificationEventCore(notification, gnsNotificationArgs);\n }\n\n private handleNotificationEventCore(notification: Readonly<Glue42Notification>, args: Readonly<GnsNotificationEventArgs>): void {\n switch (args.event) {\n case \"action\": {\n return this.handleNotificationActionEvent(notification, args.notificationActionPayload);\n }\n case \"click\": {\n return this.handleNotificationClickEvent(notification);\n }\n case \"close\": {\n return this.handleEvent(notification, \"close\");\n }\n case \"error\": {\n return this.handleNotificationErrorEvent(notification, args.error);\n }\n case \"show\": {\n return this.handleEvent(notification, \"show\");\n }\n default: {\n // unexpected event, do nothing\n }\n }\n }\n\n private handleNotificationActionEvent(notification: Readonly<Glue42Notification>, payload: Readonly<GnsNotificationActionPayload>): void {\n // user event\n const event: IOConnectDesktop.Notifications.ActionEvent = {\n type: \"onaction\",\n action: payload.g42action\n };\n\n if (notification.onaction) {\n notification.onaction(event);\n }\n\n // dispatch\n notification.dispatchEvent(event);\n }\n\n private handleNotificationClickEvent(notification: Readonly<Glue42Notification>): void {\n // user event\n const event: IOConnectDesktop.Notifications.ClickEvent = { type: \"onclick\" };\n if (notification.onclick) {\n notification.onclick(event);\n }\n\n // dispatch\n notification.dispatchEvent(event);\n }\n\n private handleEvent(notification: Readonly<Glue42Notification & {\n [k: string]: any;\n\n }>, eventType: keyof NotificationEventMap): void {\n // user event\n const event = { type: eventType };\n const eventName = `on${eventType}`;\n notification[eventName]?.(event);\n\n // dispatch\n notification.dispatchEvent(event as unknown as Events);\n }\n\n private handleNotificationErrorEvent(notification: Readonly<Glue42Notification>, error: Readonly<Error>): void {\n // user event\n const event = { type: \"onerror\", error } as IOConnectDesktop.Notifications.ErrorEvent;\n if (notification.onerror) {\n notification.onerror(event);\n }\n\n // dispatch\n notification.dispatchEvent(event);\n }\n\n private getGnsNotificationArgs(args: Readonly<any>): GnsNotificationEventArgs {\n let result: GnsNotificationEventArgs;\n const event = args.notification?.event;\n if (!event) {\n result = this.getBackwardGnsNotificationArgs(args);\n } else {\n result = {\n event,\n notificationId: args.notification.sourceNotificationId,\n notificationActionPayload: args as GnsNotificationActionPayload\n };\n }\n return result;\n }\n\n private getBackwardGnsNotificationArgs(args: Readonly<any>): GnsNotificationEventArgs {\n let result: GnsNotificationEventArgs;\n if (args.g42notificationId) {\n result = {\n event: \"action\",\n notificationId: args.g42notificationId,\n notificationActionPayload: args as GnsNotificationActionPayload\n };\n } else if (args.notification?.sourceNotificationId) {\n result = {\n event: \"click\",\n notificationId: args.notification.sourceNotificationId,\n notificationActionPayload: args as GnsNotificationActionPayload\n };\n } else {\n result = {\n event: \"unknown\",\n notificationId: undefined,\n notificationActionPayload: args as GnsNotificationActionPayload\n };\n }\n\n return result;\n }\n\n private closeStreamSubscriptionIfNoNeeded(): void {\n this.subscriptionsCountForNotifications--;\n\n if (this.subscriptionForNotifications && this.subscriptionsCountForNotifications === 0) {\n this.subscriptionForNotifications.close();\n this.subscriptionForNotifications = undefined;\n }\n }\n\n private closeStreamCounterSubscriptionIfNoNeeded(): void {\n this.subscriptionsCountForCounter--;\n\n if (this.subscriptionForCounter && this.subscriptionsCountForCounter === 0) {\n this.subscriptionForCounter.close();\n this.subscriptionForCounter = undefined;\n }\n }\n}\n","import CallbackRegistryFactory, { CallbackRegistry, UnsubscribeFunction } from \"callback-registry\";\r\nimport { IOConnectDesktop } from \"../../desktop\";\r\n\r\nconst ThemesConfigurationMethodName = \"T42.Themes.Configuration\";\r\ninterface ThemesConfiguration {\r\n setThemesMethodName: string;\r\n getThemesMethodName: string;\r\n sharedContextName: string;\r\n getThemesConfigurationMethodName: string;\r\n}\r\ninterface GetResult {\r\n all: IOConnectDesktop.Themes.Theme[];\r\n selected: string;\r\n}\r\nexport class ThemesImpl implements IOConnectDesktop.Themes.API {\r\n private registry: CallbackRegistry = CallbackRegistryFactory();\r\n private sharedContextName: string;\r\n private getMethodName: string;\r\n private setMethodName: string;\r\n private isSubscribed = false;\r\n\r\n constructor(private contexts: IOConnectDesktop.Contexts.API, private interop: IOConnectDesktop.Interop.API) {\r\n this.getConfiguration();\r\n }\r\n\r\n public async list(): Promise<IOConnectDesktop.Themes.Theme[]> {\r\n await this.getConfiguration();\r\n if (!this.getMethodName) {\r\n throw new Error(\"not supported\");\r\n }\r\n return (await this.getAll()).returned.all;\r\n }\r\n\r\n public async getCurrent(): Promise<IOConnectDesktop.Themes.Theme> {\r\n await this.getConfiguration();\r\n if (!this.getMethodName) {\r\n throw new Error(\"not supported\");\r\n }\r\n const all = await this.getAll();\r\n return all.returned.all.find((t) => t.name === all.returned.selected);\r\n }\r\n\r\n public async select(theme: string): Promise<void> {\r\n await this.getConfiguration();\r\n if (!this.setMethodName) {\r\n throw new Error(\"not supported\");\r\n }\r\n\r\n await this.interop.invoke(this.setMethodName, { theme });\r\n }\r\n\r\n public onChanged(callback: (theme: IOConnectDesktop.Themes.Theme) => any): UnsubscribeFunction {\r\n this.subscribe();\r\n return this.registry.add(\"changed\", callback);\r\n }\r\n\r\n private async getConfiguration() {\r\n try {\r\n if (this.sharedContextName) {\r\n return;\r\n }\r\n const config = await this.interop.invoke<ThemesConfiguration>(ThemesConfigurationMethodName);\r\n this.sharedContextName = config.returned.sharedContextName;\r\n this.getMethodName = config.returned.getThemesMethodName;\r\n this.setMethodName = config.returned.setThemesMethodName;\r\n } catch (error) {\r\n return;\r\n }\r\n }\r\n\r\n private async getAll() {\r\n await this.getConfiguration();\r\n return await this.interop.invoke<GetResult>(this.getMethodName);\r\n }\r\n\r\n private async subscribe() {\r\n await this.getConfiguration();\r\n if (this.isSubscribed) {\r\n return;\r\n }\r\n this.isSubscribed = true;\r\n this.contexts.subscribe(this.sharedContextName, (data: { all: IOConnectDesktop.Themes.Theme[], selected: string }) => {\r\n if (data && data.all && data.selected) {\r\n this.registry.execute(\"changed\", data.all.find((t) => t.name === data.selected));\r\n }\r\n });\r\n }\r\n}\r\n","\nexport const GLUE42_FDC3_INTENTS_METHOD_PREFIX = \"Tick42.FDC3.Intents.\";\nexport const INTENTS_RESOLVER_INTEROP_PREFIX = \"T42.Intents.Resolver.Control\";\n\nexport const INTENTS_RESOLVER_WIDTH = 400;\nexport const INTENTS_RESOLVER_HEIGHT = 440;\nexport const DEFAULT_RESOLVER_RESPONSE_TIMEOUT = 60000;\n\nexport const INTENT_HANDLER_DEFAULT_PROPS = [\"applicationName\", \"type\"];\nexport const INTENTS_RESOLVER_APP_NAME = \"intentsResolver\";\n\n// JS setTimeout max value - When delay is larger than 2147483647 or less than 1, the delay will be set to 1\nexport const MAX_SET_TIMEOUT_DELAY = 2147483647;\n\nexport const DEFAULT_METHOD_RESPONSE_TIMEOUT_MS = 60000;\n\nexport const DEFAULT_RAISE_TIMEOUT_MS = 90000;\n","export const PromisePlus = <T>(executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void, timeoutMilliseconds: number, timeoutMessage?: string): Promise<T> => {\n\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n\n const message = timeoutMessage || `Promise timeout hit: ${timeoutMilliseconds}`;\n\n reject(message);\n }, timeoutMilliseconds);\n\n const providedPromise = new Promise<T>(executor);\n\n providedPromise\n .then((result) => {\n clearTimeout(timeout);\n resolve(result);\n })\n .catch((error) => {\n clearTimeout(timeout);\n reject(error);\n });\n });\n};\n\nexport const PromiseWrap = <T>(promise: () => Promise<T>, timeoutMilliseconds: number, timeoutMessage?: string): Promise<T> => {\n return new Promise<T>((resolve, reject) => {\n\n let promiseActive = true;\n\n const timeout = setTimeout(() => {\n if (!promiseActive) {\n return;\n }\n promiseActive = false;\n const message = timeoutMessage || `Promise timeout hit: ${timeoutMilliseconds}`;\n\n reject(message);\n }, timeoutMilliseconds);\n\n promise()\n .then((result) => {\n if (!promiseActive) {\n return;\n }\n promiseActive = false;\n clearTimeout(timeout);\n resolve(result);\n })\n .catch((error) => {\n if (!promiseActive) {\n return;\n }\n promiseActive = false;\n clearTimeout(timeout);\n\n reject(error);\n });\n });\n};\n","import shortid from \"shortid\";\r\nimport { IOConnectDesktop } from \"../../desktop\";\r\nimport { AppDefinition, CoreRaiseIntentArgs, GetWindowsInfoResult, GetWindowsInfoResultItem, IntentInfo, IntentsResolverResponse, IntentsResolverResponsePromise, IntentsResolverResponseValidator, IntentsResolverStartContext, ResolverInstance, ShouldResolverOpen } from \"./types\";\r\nimport { INTENTS_RESOLVER_INTEROP_PREFIX, GLUE42_FDC3_INTENTS_METHOD_PREFIX, INTENTS_RESOLVER_HEIGHT, INTENTS_RESOLVER_WIDTH, INTENT_HANDLER_DEFAULT_PROPS, INTENTS_RESOLVER_APP_NAME, DEFAULT_RESOLVER_RESPONSE_TIMEOUT, DEFAULT_RAISE_TIMEOUT_MS, DEFAULT_METHOD_RESPONSE_TIMEOUT_MS, MAX_SET_TIMEOUT_DELAY } from \"./constants\";\r\nimport { PromisePlus, PromiseWrap } from \"./common\";\r\n\r\nexport class Intents implements IOConnectDesktop.Intents.API {\r\n private myIntents = new Set<string>();\r\n\r\n private intentsResolverAppName: string;\r\n private readonly intentsResolverResponsePromises: { [instanceId: string]: IntentsResolverResponsePromise } = {};\r\n\r\n private useIntentsResolverUI = true;\r\n private intentsResolverResponseTimeout: number;\r\n\r\n private unregisterIntentPromises: Promise<void>[] = [];\r\n\r\n constructor(private interop: IOConnectDesktop.Interop.API, private windows: IOConnectDesktop.Windows.API, private logger: IOConnectDesktop.Logger.API, options: IOConnectDesktop.Config, private appManager?: IOConnectDesktop.AppManager.API) {\r\n this.checkIfIntentsResolverIsEnabled(options, appManager);\r\n }\r\n\r\n public async find(intentFilter?: string | IOConnectDesktop.Intents.IntentFilter): Promise<IOConnectDesktop.Intents.Intent[]> {\r\n await Promise.all(this.unregisterIntentPromises);\r\n\r\n let intents = await this.all();\r\n if (typeof intentFilter === \"undefined\") {\r\n return intents;\r\n }\r\n\r\n if (typeof intentFilter === \"string\") {\r\n return intents.filter((intent) => intent.name === intentFilter);\r\n }\r\n\r\n if (typeof intentFilter !== \"object\") {\r\n throw new Error(\"Please provide the intentFilter as a string or an object!\");\r\n }\r\n\r\n if (intentFilter.contextType) {\r\n const ctToLower = intentFilter.contextType.toLowerCase();\r\n intents = intents.filter((intent) => intent.handlers.some((handler) => handler.contextTypes?.some((ct) => ct.toLowerCase() === ctToLower)));\r\n }\r\n\r\n if (intentFilter.resultType) {\r\n const resultTypeToLower = intentFilter.resultType.toLowerCase();\r\n intents = intents.filter((intent) => intent.handlers.some((handler) => handler.resultType?.toLowerCase() === resultTypeToLower));\r\n }\r\n\r\n if (intentFilter.name) {\r\n intents = intents.filter((intent) => intent.name === intentFilter.name);\r\n }\r\n\r\n return intents;\r\n }\r\n\r\n public async raise(intentRequest: string | IOConnectDesktop.Intents.IntentRequest): Promise<IOConnectDesktop.Intents.IntentResult> {\r\n if ((typeof intentRequest !== \"string\" && typeof intentRequest !== \"object\") || (typeof intentRequest === \"object\" && typeof intentRequest.intent !== \"string\")) {\r\n throw new Error(\"Please provide the intent as a string or an object with an intent property!\");\r\n }\r\n\r\n if (typeof intentRequest === \"string\") {\r\n intentRequest = { intent: intentRequest };\r\n }\r\n\r\n this.validateIntentRequest(intentRequest);\r\n\r\n await Promise.all(this.unregisterIntentPromises);\r\n\r\n const timeout = intentRequest.timeout || DEFAULT_RAISE_TIMEOUT_MS;\r\n\r\n const resolverInstance: ResolverInstance = {};\r\n\r\n const coreRaiseIntentFn = this.coreRaiseIntent.bind(this, { request: intentRequest, resolverInstance, timeout });\r\n\r\n if (intentRequest.waitUserResponseIndefinitely) {\r\n return coreRaiseIntentFn();\r\n }\r\n\r\n // start timeout here -> default (waitUserResponseIndefinitely: false)\r\n const resultPromise = PromiseWrap<IOConnectDesktop.Intents.IntentResult>(coreRaiseIntentFn,\r\n timeout, `Timeout of ${timeout}ms hit for intent request ${JSON.stringify(intentRequest)}`\r\n );\r\n\r\n resultPromise.catch(() => this.handleRaiseOnError(resolverInstance.instanceId));\r\n\r\n return resultPromise;\r\n }\r\n\r\n public async all(): Promise<IOConnectDesktop.Intents.Intent[]> {\r\n await Promise.all(this.unregisterIntentPromises);\r\n\r\n // Gathers all intents from:\r\n // 1. Application definitions\r\n // 2. Running instances (application can register dynamic intents by calling `addIntentListener()` that aren't predefined inside of their application definitions)\r\n // It also populates intent handlers (actual entities that can handle the intent).\r\n let apps: AppDefinition[];\r\n try {\r\n const result = await this.interop.invoke<{ applications: AppDefinition[] }>(\"T42.ACS.GetApplications\", { withIntentsInfo: true });\r\n apps = result.returned.applications;\r\n } catch (e) {\r\n this.logger.error(`Failed to get the applications!`, e);\r\n return [];\r\n }\r\n const intents: { [key: string]: IOConnectDesktop.Intents.Intent } = {};\r\n const appsWithIntents = apps.filter((app) => app.intents && app.intents.length > 0);\r\n // Gather app handlers from application definitions.\r\n for (const app of appsWithIntents) {\r\n for (const intentDef of app.intents) {\r\n let intent = intents[intentDef.name];\r\n if (!intent) {\r\n intent = {\r\n name: intentDef.name,\r\n handlers: [],\r\n };\r\n intents[intentDef.name] = intent;\r\n }\r\n\r\n const handler: IOConnectDesktop.Intents.IntentHandler = {\r\n applicationName: app.name,\r\n applicationTitle: app.title || \"\",\r\n applicationDescription: app.caption,\r\n displayName: intentDef.displayName,\r\n contextTypes: intentDef.contexts,\r\n applicationIcon: app.icon,\r\n type: \"app\",\r\n resultType: intentDef.resultType\r\n };\r\n\r\n intent.handlers.push(handler);\r\n }\r\n }\r\n\r\n const servers = this.interop.servers();\r\n const serverWindowIds = servers.map((server) => server.windowId).filter((serverWindowId) => typeof serverWindowId !== \"undefined\");\r\n\r\n const T42WndGetInfo = \"T42.Wnd.GetInfo\";\r\n const isT42WndGetInfoMethodRegistered = this.interop.methods().some((method) => method.name === T42WndGetInfo);\r\n\r\n let windowsInfos: GetWindowsInfoResultItem[];\r\n // For backwards compatibility with previous versions of Glue Desktop, the windows' titles will be attempted to be obtained using the Windows API.\r\n if (isT42WndGetInfoMethodRegistered) {\r\n try {\r\n const result = await this.interop.invoke<GetWindowsInfoResult>(T42WndGetInfo, { ids: serverWindowIds });\r\n windowsInfos = result.returned.windows;\r\n } catch (e) {\r\n // Swallow the error. The windows' titles will be attempted to be obtained using the Windows API.\r\n }\r\n }\r\n\r\n // Discover all running instances that provide intents, and add them to the corresponding intent.\r\n for (const server of servers) {\r\n await Promise.all(server.getMethods()\r\n .filter((method) => method.name.startsWith(GLUE42_FDC3_INTENTS_METHOD_PREFIX))\r\n .map(async (method) => {\r\n const intentName = method.name.replace(GLUE42_FDC3_INTENTS_METHOD_PREFIX, \"\");\r\n let intent = intents[intentName];\r\n if (!intent) {\r\n intent = {\r\n name: intentName,\r\n handlers: [],\r\n };\r\n intents[intentName] = intent;\r\n }\r\n const info = method.flags.intent as Omit<IOConnectDesktop.Intents.AddIntentListenerRequest, \"intent\">;\r\n\r\n const app = apps.find((appWithIntents) => appWithIntents.name === server.application);\r\n let appIntent: IntentInfo | undefined;\r\n if (app && app.intents) {\r\n appIntent = app.intents.find((appDefIntent) => appDefIntent.name === intentName);\r\n }\r\n\r\n const title = await this.windowsIdToTitle(server.windowId, windowsInfos);\r\n const handler: IOConnectDesktop.Intents.IntentHandler = {\r\n instanceId: server.instance,\r\n applicationName: server.application,\r\n applicationIcon: info.icon || app?.icon,\r\n applicationTitle: app?.title || \"\",\r\n applicationDescription: info.description || app?.caption,\r\n displayName: info.displayName || appIntent?.displayName,\r\n contextTypes: info.contextTypes || appIntent?.contexts,\r\n instanceTitle: title,\r\n type: \"instance\",\r\n resultType: appIntent?.resultType || info.resultType\r\n };\r\n intent.handlers.push(handler);\r\n }));\r\n }\r\n\r\n return Object.values(intents);\r\n }\r\n\r\n public addIntentListener(intent: string | IOConnectDesktop.Intents.AddIntentListenerRequest, handler: (context: IOConnectDesktop.Intents.IntentContext) => any): { unsubscribe: () => void } {\r\n if ((typeof intent !== \"string\" && typeof intent !== \"object\") || (typeof intent === \"object\" && typeof intent.intent !== \"string\")) {\r\n throw new Error(\"Please provide the intent as a string or an object with an intent property!\");\r\n }\r\n if (typeof handler !== \"function\") {\r\n throw new Error(\"Please provide the handler as a function!\");\r\n }\r\n\r\n // `addIntentListener()` is sync.\r\n // tslint:disable-next-line:no-console\r\n const intentName = typeof intent === \"string\" ? intent : intent.intent;\r\n const methodName = `${GLUE42_FDC3_INTENTS_METHOD_PREFIX}${intentName}`;\r\n let intentFlag: Omit<IOConnectDesktop.Intents.AddIntentListenerRequest, \"intent\"> = {};\r\n // eslint-disable-next-line prefer-const\r\n let registerPromise: Promise<void>;\r\n\r\n const alreadyRegistered = this.myIntents.has(intentName);\r\n\r\n if (alreadyRegistered) {\r\n throw new Error(`Intent listener for intent ${intentName} already registered!`);\r\n }\r\n\r\n this.myIntents.add(intentName);\r\n\r\n const result = {\r\n unsubscribe: (): void => {\r\n this.myIntents.delete(intentName);\r\n\r\n registerPromise\r\n .then(() => this.interop.unregister(methodName))\r\n .catch((err) => this.logger.trace(`Unregistration of a method with name ${methodName} failed with reason: ${JSON.stringify(err)}`));\r\n }\r\n };\r\n\r\n if (typeof intent === \"object\") {\r\n const { intent: removed, ...rest } = intent;\r\n intentFlag = rest;\r\n }\r\n\r\n registerPromise = this.interop.register({ name: methodName, flags: { intent: intentFlag } }, (args: IOConnectDesktop.Intents.IntentContext) => {\r\n if (this.myIntents.has(intentName)) {\r\n return handler(args);\r\n }\r\n });\r\n\r\n registerPromise.catch((err) => {\r\n this.myIntents.delete(intentName);\r\n\r\n this.logger.warn(`Registration of a method with name ${methodName} failed with reason: ${JSON.stringify(err)}`);\r\n });\r\n\r\n return result;\r\n }\r\n\r\n public async register(intent: string | IOConnectDesktop.Intents.AddIntentListenerRequest, handler: (context: IOConnectDesktop.Intents.IntentContext) => any): Promise<{ unsubscribe: () => void }> {\r\n if ((typeof intent !== \"string\" && typeof intent !== \"object\") || (typeof intent === \"object\" && typeof intent.intent !== \"string\")) {\r\n throw new Error(\"Please provide the intent as a string or an object with an intent property!\");\r\n }\r\n\r\n if (typeof handler !== \"function\") {\r\n throw new Error(\"Please provide the handler as a function!\");\r\n }\r\n\r\n await Promise.all(this.unregisterIntentPromises);\r\n\r\n // tslint:disable-next-line:no-console\r\n const intentName = typeof intent === \"string\" ? intent : intent.intent;\r\n const methodName = this.buildInteropMethodName(intentName);\r\n\r\n let intentFlag: Omit<IOConnectDesktop.Intents.AddIntentListenerRequest, \"intent\"> = {};\r\n\r\n const alreadyRegistered = this.myIntents.has(intentName);\r\n\r\n if (alreadyRegistered) {\r\n throw new Error(`Intent listener for intent ${intentName} already registered!`);\r\n }\r\n\r\n this.myIntents.add(intentName);\r\n\r\n if (typeof intent === \"object\") {\r\n const { intent: removed, ...rest } = intent;\r\n intentFlag = rest;\r\n }\r\n\r\n try {\r\n await this.interop.register({ name: methodName, flags: { intent: intentFlag } }, (args: IOConnectDesktop.Intents.IntentContext) => {\r\n if (this.myIntents.has(intentName)) {\r\n return handler(args);\r\n }\r\n });\r\n } catch (err) {\r\n this.myIntents.delete(intentName);\r\n\r\n throw new Error(`Registration of a method with name ${methodName} failed with reason: ${JSON.stringify(err)}`);\r\n }\r\n\r\n return {\r\n unsubscribe: () => this.unsubscribeIntent(intentName)\r\n };\r\n }\r\n\r\n private async coreRaiseIntent({ request, resolverInstance, timeout }: CoreRaiseIntentArgs): Promise<IOConnectDesktop.Intents.IntentResult> {\r\n const intentDef = await this.get(request.intent);\r\n\r\n if (typeof intentDef === \"undefined\") {\r\n throw new Error(`Intent ${request.intent} not found.`);\r\n }\r\n\r\n const { open, reason } = this.checkIfResolverShouldBeOpened(intentDef, request);\r\n\r\n if (!open) {\r\n this.logger.trace(`Intent Resolver UI won't be used. Reason: ${reason}`);\r\n\r\n // start timeout here -> waitUserResponseIndefinitely: true, but resolver will not be opened\r\n return request.waitUserResponseIndefinitely\r\n ? PromiseWrap<IOConnectDesktop.Intents.IntentResult>(() => this.raiseIntent(request, timeout), timeout, `Timeout of ${timeout}ms hit for raise to resolve`)\r\n : this.raiseIntent(request, timeout);\r\n }\r\n\r\n const resolverHandler = await this.startResolverApp(request, resolverInstance);\r\n\r\n this.logger?.trace(`Raising intent to target handler: ${JSON.stringify(resolverHandler)} with timeout of ${timeout}`);\r\n\r\n if (request.waitUserResponseIndefinitely) {\r\n return PromiseWrap(() => this.raiseIntentToTargetHandler(request, resolverHandler, timeout), timeout, `Timeout of ${timeout}ms hit for raise to resolve`);\r\n }\r\n\r\n const result = await this.raiseIntentToTargetHandler(request, resolverHandler, timeout);\r\n\r\n this.logger?.trace(`Result from raise() method for intent ${JSON.stringify(request.intent)}: ${JSON.stringify(result)}`);\r\n\r\n return result;\r\n }\r\n\r\n private async get(intent: string): Promise<IOConnectDesktop.Intents.Intent> {\r\n return (await this.all()).find((registeredIntent) => registeredIntent.name === intent);\r\n }\r\n\r\n private async raiseIntent(intentRequest: IOConnectDesktop.Intents.IntentRequest, timeout?: number): Promise<IOConnectDesktop.Intents.IntentResult> {\r\n const intentName = intentRequest.intent;\r\n const intentDef = await this.get(intentName);\r\n\r\n if (typeof intentDef === \"undefined\") {\r\n throw new Error(`Intent ${intentName} not found.`);\r\n }\r\n\r\n const firstFoundAppHandler = intentRequest.handlers ? this.findHandlerByFilter(intentRequest.handlers, { type: \"app\" }) : this.findHandlerByFilter(intentDef.handlers, { type: \"app\" });\r\n\r\n const firstFoundInstanceHandler = intentRequest.handlers ? this.findHandlerByFilter(intentRequest.handlers, { type: \"instance\" }) : this.findHandlerByFilter(intentDef.handlers, { type: \"instance\" });\r\n\r\n let handler: IOConnectDesktop.Intents.IntentHandler | undefined;\r\n\r\n // target the first found instance or start a new one if there isn't\r\n if (!intentRequest.target || intentRequest.target === \"reuse\") {\r\n handler = firstFoundInstanceHandler || firstFoundAppHandler;\r\n }\r\n\r\n // start new instance of the first handler in handlers / intentDef.handlers\r\n if (intentRequest.target === \"startNew\") {\r\n handler = firstFoundAppHandler;\r\n }\r\n\r\n // open a new app from the list of intentRequest.handlers (if passed) or intentDef.handlers\r\n if (typeof intentRequest.target === \"object\" && intentRequest.target.app) {\r\n handler = this.findHandlerByFilter(intentDef.handlers, { app: intentRequest.target.app });\r\n }\r\n\r\n // target the instance in the list of intentRequest.handlers (if passed) or intentDef.handlers\r\n if (typeof intentRequest.target === \"object\" && intentRequest.target.instance) {\r\n handler = this.findHandlerByFilter(intentDef.handlers, { instance: intentRequest.target.instance, app: intentRequest.target.app });\r\n }\r\n\r\n if (!handler) {\r\n throw new Error(`Can not raise intent for request ${JSON.stringify(intentRequest)} - can not find intent handler!`);\r\n }\r\n\r\n const result = await this.raiseIntentToTargetHandler(intentRequest, handler, timeout);\r\n\r\n return result;\r\n }\r\n\r\n private async raiseIntentToTargetHandler(intentRequest: IOConnectDesktop.Intents.IntentRequest, handler: IOConnectDesktop.Intents.IntentHandler, timeout?: number): Promise<IOConnectDesktop.Intents.IntentResult> {\r\n this.logger?.trace(`Raising intent to target handler:${JSON.stringify(handler)}`);\r\n\r\n if (!handler.instanceId) {\r\n handler.instanceId = await this.invokeStartApp(handler.applicationName, intentRequest.context, intentRequest.options);\r\n }\r\n\r\n const methodName = `${GLUE42_FDC3_INTENTS_METHOD_PREFIX}${intentRequest.intent}`;\r\n\r\n const invokeOptions = {\r\n methodResponseTimeoutMs: timeout ? timeout + 1000 : DEFAULT_METHOD_RESPONSE_TIMEOUT_MS,\r\n waitTimeoutMs: timeout ? timeout + 1000 : DEFAULT_METHOD_RESPONSE_TIMEOUT_MS\r\n };\r\n\r\n const result = await this.interop.invoke(methodName, intentRequest.context, { instance: handler.instanceId }, invokeOptions);\r\n\r\n this.logger?.trace(`raiseIntent command completed. Returning result: ${JSON.stringify(result)}`);\r\n\r\n return {\r\n request: intentRequest,\r\n handler: { ...handler, type: \"instance\" },\r\n result: result.returned\r\n };\r\n }\r\n\r\n private async startResolverApp(intentRequest: IOConnectDesktop.Intents.IntentRequest, resolverInstance?: ResolverInstance): Promise<IOConnectDesktop.Intents.IntentHandler> {\r\n this.logger?.trace(`Intents Resolver UI with app name ${this.intentsResolverAppName} will be used`);\r\n\r\n const responseMethodName = await this.registerIntentResolverMethod();\r\n\r\n this.logger?.trace(`Registered interop method ${responseMethodName}`);\r\n\r\n const startContext = this.buildStartContext(intentRequest, responseMethodName);\r\n\r\n const startOptions = await this.buildStartOptions();\r\n\r\n this.logger?.trace(`Starting Intents Resolver UI with context: ${JSON.stringify(startContext)} and options: ${JSON.stringify(startOptions)}`);\r\n\r\n const instance = await this.appManager.application(this.intentsResolverAppName).start(startContext, startOptions);\r\n\r\n if (resolverInstance) {\r\n resolverInstance.instanceId = instance.id;\r\n }\r\n\r\n this.logger?.trace(`Intents Resolver instance with id ${instance.id} opened`);\r\n\r\n this.subscribeOnInstanceStopped(instance);\r\n\r\n this.createResponsePromise(intentRequest, instance.id, responseMethodName);\r\n\r\n const handler = await this.handleInstanceResponse(instance.id);\r\n\r\n return handler;\r\n }\r\n\r\n private async windowsIdToTitle(id: string, windowsInfos?: GetWindowsInfoResultItem[]): Promise<string> {\r\n if (typeof windowsInfos !== \"undefined\") {\r\n return windowsInfos.find((windowsInfo) => windowsInfo.id === id)?.title;\r\n }\r\n\r\n // The Windows API could be undefined e.g. when running inside of a node environment.\r\n const window = this.windows?.findById(id);\r\n const title = await window?.getTitle();\r\n return title;\r\n }\r\n\r\n private async handleInstanceResponse(instanceId: string): Promise<IOConnectDesktop.Intents.IntentHandler> {\r\n try {\r\n const { handler, intent } = await this.intentsResolverResponsePromises[instanceId].promise;\r\n\r\n this.logger?.trace(`Intent handler chosen for intent ${intent}: ${JSON.stringify(handler)}`);\r\n\r\n this.stopResolverInstance(instanceId);\r\n\r\n return handler;\r\n\r\n } catch (error) {\r\n this.stopResolverInstance(instanceId);\r\n\r\n throw new Error(error as string);\r\n }\r\n }\r\n\r\n private async registerIntentResolverMethod(): Promise<string> {\r\n const methodName = INTENTS_RESOLVER_INTEROP_PREFIX + shortid();\r\n\r\n await this.interop.register(methodName, this.resolverResponseHandler.bind(this));\r\n\r\n return methodName;\r\n }\r\n\r\n private resolverResponseHandler(args: any, callerId: IOConnectDesktop.Interop.Instance): void {\r\n const { instance } = callerId;\r\n\r\n const isValid = this.validateIntentsResolverResponse(args);\r\n\r\n if (!isValid) {\r\n this.logger.trace(`Intent Resolver sent invalid response. Error: ${isValid.error}`);\r\n\r\n this.intentsResolverResponsePromises[instance].reject(isValid.error);\r\n\r\n this.stopResolverInstance(instance);\r\n }\r\n\r\n const validResponse = isValid.ok;\r\n\r\n this.intentsResolverResponsePromises[instance].resolve(validResponse);\r\n\r\n this.cleanUpIntentResolverPromise(instance);\r\n }\r\n\r\n private buildStartContext(request: IOConnectDesktop.Intents.IntentRequest, methodName: string): IntentsResolverStartContext {\r\n const startContext: IntentsResolverStartContext = {\r\n intent: request,\r\n callerId: this.interop.instance.instance,\r\n methodName\r\n };\r\n\r\n return startContext;\r\n }\r\n\r\n private async buildStartOptions(): Promise<IOConnectDesktop.AppManager.ApplicationStartOptions | undefined> {\r\n const win = this.windows.my();\r\n\r\n if (!win) {\r\n return;\r\n }\r\n\r\n const bounds = await win.getBounds();\r\n\r\n return {\r\n top: (bounds.height - INTENTS_RESOLVER_HEIGHT) / 2 + bounds.top,\r\n left: (bounds.width - INTENTS_RESOLVER_WIDTH) / 2 + bounds.left,\r\n };\r\n }\r\n\r\n private createResponsePromise(intentRequest: IOConnectDesktop.Intents.IntentRequest, instanceId: string, methodName: string): void {\r\n let resolve;\r\n let reject;\r\n\r\n const waitResponseTimeout = intentRequest.waitUserResponseIndefinitely ? MAX_SET_TIMEOUT_DELAY : this.intentsResolverResponseTimeout;\r\n\r\n const promise = PromisePlus<IntentsResolverResponse>((res, rej) => {\r\n resolve = res;\r\n reject = rej;\r\n },\r\n waitResponseTimeout,\r\n `Timeout of ${waitResponseTimeout}ms hit waiting for the user to choose a handler for intent ${intentRequest.intent}`);\r\n\r\n this.intentsResolverResponsePromises[instanceId] = { intent: intentRequest.intent, resolve, reject, promise, methodName };\r\n }\r\n\r\n private async invokeStartApp(application: string, context: any, options?: IOConnectDesktop.AppManager.ApplicationStartOptions) {\r\n const result = await this.interop.invoke<{ Name: string, Id: string }>(\"T42.ACS.StartApplication\", { Name: application, options });\r\n return result.returned.Id;\r\n }\r\n\r\n private subscribeOnInstanceStopped(instance: IOConnectDesktop.AppManager.Instance): void {\r\n const unsub = instance.onStopped((inst: IOConnectDesktop.AppManager.Instance) => {\r\n const intentPromise = this.intentsResolverResponsePromises[inst.id];\r\n\r\n if (!intentPromise) {\r\n return unsub();\r\n }\r\n\r\n intentPromise.reject(`Cannot resolve raise intent ${intentPromise.intent} - User closed ${this.intentsResolverAppName} app without choosing an intent handler`);\r\n\r\n this.cleanUpIntentResolverPromise(inst.id);\r\n\r\n unsub();\r\n });\r\n }\r\n\r\n private async cleanUpIntentResolverPromise(instanceId: string) {\r\n const intentPromise = this.intentsResolverResponsePromises[instanceId];\r\n\r\n if (!intentPromise) {\r\n return;\r\n }\r\n\r\n // typings are wrong and mark unregister as a sync method\r\n const unregisterPromise = this.interop.unregister(intentPromise.methodName) as unknown as Promise<void>;\r\n\r\n unregisterPromise.catch((error) => this.logger.warn(error));\r\n\r\n delete this.intentsResolverResponsePromises[instanceId];\r\n }\r\n\r\n private validateIntentsResolverResponse(responseObj: any): IntentsResolverResponseValidator {\r\n const invalidKey = Object.keys(responseObj).some((key) => key !== \"intent\" && key !== \"handler\");\r\n\r\n if (invalidKey) {\r\n return { isValid: false, error: \"Response is not a valid object. Expected { intent: string, handler: IntentHandler }\" };\r\n }\r\n\r\n if (typeof responseObj.intent !== \"string\") {\r\n return { isValid: false, error: `Response object has invalid 'intent' key. Expected a string, got ${typeof responseObj.intent}` };\r\n }\r\n\r\n if (typeof responseObj.handler !== \"object\") {\r\n return { isValid: false, error: `Response object has invalid 'handler' key. Expected an object, got ${typeof responseObj.handler}` };\r\n }\r\n\r\n const compulsoryKeysExist = INTENT_HANDLER_DEFAULT_PROPS.filter((key) => !(key in responseObj.handler));\r\n\r\n if (compulsoryKeysExist.length) {\r\n return { isValid: false, error: `Handler in Response object does not provide compulsory keys: ${compulsoryKeysExist.join(\", \")}` };\r\n }\r\n\r\n return { isValid: true, ok: { intent: responseObj.intent, handler: { ...responseObj.handler } } };\r\n }\r\n\r\n private handleRaiseOnError(instanceId?: string) {\r\n if (!instanceId) {\r\n return;\r\n }\r\n\r\n this.stopResolverInstance(instanceId);\r\n }\r\n\r\n private stopResolverInstance(instanceId: string): void {\r\n const gdWin = this.windows.findById(instanceId);\r\n\r\n gdWin?.close().catch((err) => this.logger.error(err));\r\n }\r\n\r\n private checkIfIntentsResolverIsEnabled(options: IOConnectDesktop.Config, appManager: IOConnectDesktop.AppManager.API): void {\r\n /* if Glue is initialized with { appManager: false }, fallback to previous implementation and do not use Intents Resolver UI */\r\n if (!appManager) {\r\n this.useIntentsResolverUI = false;\r\n return;\r\n }\r\n\r\n this.useIntentsResolverUI = typeof options.intents?.enableIntentsResolverUI === \"boolean\"\r\n ? options.intents.enableIntentsResolverUI\r\n : true;\r\n\r\n this.intentsResolverAppName = options.intents?.intentsResolverAppName ?? INTENTS_RESOLVER_APP_NAME;\r\n\r\n this.intentsResolverResponseTimeout = options.intents?.methodResponseTimeoutMs ?? DEFAULT_RESOLVER_RESPONSE_TIMEOUT;\r\n }\r\n\r\n private checkIfResolverShouldBeOpened(intent: IOConnectDesktop.Intents.Intent, request: IOConnectDesktop.Intents.IntentRequest): ShouldResolverOpen {\r\n if (!this.useIntentsResolverUI) {\r\n return { open: false, reason: `Intent Resolver is disabled. Raising intent to first found handler` };\r\n }\r\n\r\n const intentsResolverApp = this.appManager.application(this.intentsResolverAppName);\r\n\r\n if (!intentsResolverApp) {\r\n return { open: false, reason: `Intent Resolver Application with name ${this.intentsResolverAppName} not found.` };\r\n }\r\n\r\n const hasMoreThanOneHandler = this.checkIfIntentHasMoreThanOneHandler(intent, request);\r\n\r\n if (!hasMoreThanOneHandler) {\r\n return { open: false, reason: `Raised intent ${intent.name} has only one handler` };\r\n }\r\n\r\n return { open: true };\r\n }\r\n\r\n private checkIfIntentHasMoreThanOneHandler(intent: IOConnectDesktop.Intents.Intent, request: IOConnectDesktop.Intents.IntentRequest): boolean {\r\n // no target => show resolver if request.handlers > 1 || intent.handlers.length > 1\r\n // reuse => show resolver if 2+ instances in request.handlers || show resolver if intent.handlers.length > 1\r\n // startNew => show resolver if 2+ apps in request.handler || intent.handlers as apps > 1\r\n // app => do not show resolver\r\n\r\n if (!request.target) {\r\n return request.handlers\r\n ? request.handlers.length > 1\r\n : intent.handlers.length > 1;\r\n }\r\n\r\n if (request.target === \"reuse\") {\r\n return request.handlers\r\n ? request.handlers.filter((handler) => handler.type === \"instance\" && handler.instanceId).length > 1 || request.handlers.filter((handler) => handler.type === \"app\").length > 1\r\n : intent.handlers.filter((handler) => handler.type === \"instance\" && handler.instanceId).length > 1 || intent.handlers.filter((handler) => handler.type === \"app\").length > 1;\r\n }\r\n\r\n if (request.target === \"startNew\") {\r\n return request.handlers\r\n ? request.handlers.filter((handler) => handler.type === \"app\").length > 1\r\n : intent.handlers.filter((handler) => handler.type === \"app\").length > 1;\r\n }\r\n\r\n if (typeof request.target === \"object\") {\r\n return false;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private buildInteropMethodName(intentName: string): string {\r\n return `${GLUE42_FDC3_INTENTS_METHOD_PREFIX}${intentName}`;\r\n }\r\n\r\n private clearUnregistrationPromise(promiseToRemove: Promise<void>): void {\r\n this.unregisterIntentPromises = this.unregisterIntentPromises.filter((promise) => promise !== promiseToRemove);\r\n }\r\n\r\n private unsubscribeIntent(intentName: string): void {\r\n this.myIntents.delete(intentName);\r\n\r\n const methodName = this.buildInteropMethodName(intentName);\r\n\r\n // typings are wrong and mark unregister as a sync method\r\n const unregisterPromise = this.interop.unregister(methodName) as unknown as Promise<void>;\r\n\r\n this.unregisterIntentPromises.push(unregisterPromise);\r\n\r\n unregisterPromise\r\n .then(() => {\r\n this.clearUnregistrationPromise(unregisterPromise);\r\n })\r\n .catch((err) => {\r\n this.logger.error(`Unregistration of a method with name ${methodName} failed with reason: `, err);\r\n\r\n this.clearUnregistrationPromise(unregisterPromise);\r\n });\r\n }\r\n\r\n private validateIntentRequest(request: IOConnectDesktop.Intents.IntentRequest): void {\r\n this.validateIntentRequestContext(request.context);\r\n\r\n this.validateIntentRequestTarget(request.target);\r\n\r\n this.validateIntentRequestTimeout(request.timeout);\r\n\r\n this.validateWaitUserResponseIndefinitely(request.waitUserResponseIndefinitely);\r\n\r\n if (request.handlers) {\r\n request.handlers.forEach((handler) => this.validateIntentRequestHandler(handler));\r\n }\r\n }\r\n\r\n private validateIntentRequestTarget(target?: \"startNew\" | \"reuse\" | { app?: string; instance?: string }): void {\r\n if (!target) {\r\n return;\r\n }\r\n\r\n if (typeof target !== \"string\" && typeof target !== \"object\") {\r\n throw new Error(`Please provide the intent target as one of the valid values: \"reuse\", \"startNew\", { app: string }, { instance: string } `);\r\n }\r\n }\r\n\r\n private validateIntentRequestContext(context?: any): void {\r\n if (!context) {\r\n return;\r\n }\r\n\r\n if (typeof context !== \"object\") {\r\n throw new Error(`Please provide the intent context as an object`);\r\n }\r\n\r\n if (context.type && typeof context.type !== \"string\") {\r\n throw new Error(`Please provide the intent context as an object with 'type' property as string`);\r\n }\r\n\r\n if (context.data && typeof context.data !== \"object\") {\r\n throw new Error(`Please provide the intent context as an object with 'data' property as object`);\r\n }\r\n }\r\n\r\n private validateIntentRequestHandler(handler: IOConnectDesktop.Intents.IntentHandler): void {\r\n if (!handler.applicationName) {\r\n throw new Error(`Please provide applicationName for handler ${JSON.stringify(handler)}`);\r\n }\r\n\r\n if (!handler.type) {\r\n throw new Error(`Please provide type for handler ${JSON.stringify(handler)}`);\r\n }\r\n\r\n if (handler.type === \"instance\" && !handler.instanceId) {\r\n throw new Error(`Please provide instanceId for handler ${JSON.stringify(handler)}`);\r\n }\r\n }\r\n\r\n private validateIntentRequestTimeout(timeout?: number) {\r\n if (!timeout) {\r\n return;\r\n }\r\n\r\n if (typeof timeout !== \"number\") {\r\n throw new Error(`Please provide the timeout as a number`);\r\n }\r\n\r\n if (timeout <= 0) {\r\n throw new Error(`Please provide the timeout as a positive number`);\r\n }\r\n }\r\n\r\n private validateWaitUserResponseIndefinitely(waitUserResponseIndefinitely?: boolean) {\r\n if (!waitUserResponseIndefinitely) {\r\n return;\r\n }\r\n\r\n if (typeof waitUserResponseIndefinitely !== \"boolean\") {\r\n throw new Error(\"Please provide waitUserResponseIndefinitely as a boolean\");\r\n }\r\n }\r\n\r\n private findHandlerByFilter(handlers: IOConnectDesktop.Intents.IntentHandler[], filter: { app?: string, instance?: string, type?: \"app\" | \"instance\" }) {\r\n if (filter.type) {\r\n return handlers.find((handler) => handler.type === filter.type);\r\n }\r\n\r\n if (filter.instance) {\r\n return handlers.find((handler) => filter.app\r\n ? handler.applicationName === filter.app && handler.instanceId === filter.instance\r\n : handler.instanceId === filter.instance\r\n );\r\n }\r\n\r\n if (filter.app) {\r\n return handlers.find((handler) => handler.applicationName === filter.app);\r\n }\r\n }\r\n}\r\n","import { IOConnectDesktop } from \"../../desktop\";\nimport { default as CallbackRegistryFactory, CallbackRegistry } from \"callback-registry\";\nimport { isFunction, isObject, isString } from \"../activity/helpers/util\";\n\nexport interface AppPreferences<T> {\n app: string;\n data: T;\n lastUpdate: Date;\n}\n\nexport class Prefs {\n\n private registry: CallbackRegistry = CallbackRegistryFactory();\n private interopMethodRegistered = false;\n\n constructor(private appName: string, private interop: IOConnectDesktop.Interop.API) {\n }\n\n public async get<T>(app?: string): Promise<AppPreferences<T> | undefined> {\n const data = (await this.interop.invoke(\"T42.Prefs.Get\", { app: app ?? this.appName }));\n return data.returned;\n }\n\n public async set(data: any, options?: { app: string }): Promise<void> {\n this.verifyDataObject(data);\n await this.interop.invoke(\"T42.Prefs.Set\", { app: options?.app ?? this.appName, data, merge: false });\n }\n\n public async setFor(app: string, data: any): Promise<void> {\n this.verifyApp(app);\n this.verifyDataObject(data);\n return this.set(data, { app });\n }\n\n public async update(data: any, options?: { app: string }) {\n this.verifyDataObject(data);\n await this.interop.invoke(\"T42.Prefs.Set\", { app: options?.app ?? this.appName, data, merge: true });\n }\n\n public async updateFor(app: string, data: any) {\n this.verifyApp(app);\n this.verifyDataObject(data);\n return this.update(data, { app });\n }\n\n public async clear(app?: string) {\n await this.interop.invoke(\"T42.Prefs.Set\", { app: app ?? this.appName, clear: true });\n }\n\n public async clearFor(app: string) {\n this.verifyApp(app);\n await this.interop.invoke(\"T42.Prefs.Set\", { app, clear: true });\n }\n\n public async getAll<T>(): Promise<AppPreferences<T>[]> {\n const data = (await this.interop.invoke(\"T42.Prefs.Get\"));\n return data.returned;\n }\n\n public async clearAll() {\n await this.interop.invoke(\"T42.Prefs.Set\", { clear: true });\n }\n\n public subscribe<T>(callback: (prefs: AppPreferences<T>) => void): () => void {\n this.verifyCallback(callback);\n return this.subscribeFor(this.appName, callback);\n }\n\n public subscribeFor<T>(app: string, callback: (prefs: AppPreferences<T>) => void): () => void {\n this.verifyApp(app);\n this.verifyCallback(callback);\n const unsubscribeFn = this.registry.add(app, callback);\n\n // register the method if needed and then send the subscription request\n this.registerInteropIfNeeded()\n .then(() => {\n this.interop.invoke(\"T42.Prefs.Get\", { app, subscribe: true });\n });\n\n return () => {\n unsubscribeFn();\n };\n }\n\n private async registerInteropIfNeeded() {\n if (this.interopMethodRegistered) {\n return;\n }\n this.interopMethodRegistered = true;\n\n await this.interop.register(\"T42.Prefs.Update\", (args) => {\n this.registry.execute(args.app, args);\n });\n }\n\n private verifyApp(app: string) {\n if (!app) {\n throw new Error(`app should be defined`);\n }\n if (!isString(app)) {\n throw new Error(`app should be a string`);\n }\n }\n private verifyDataObject(data: any) {\n if (!data) {\n throw new Error(`data should be defined`);\n }\n if (!isObject(data)) {\n throw new Error(`data should be an object`);\n }\n }\n\n private verifyCallback(callback: any) {\n if (!isFunction(callback)) {\n throw new Error(`callback should be defined`);\n }\n }\n}\n","import { IOConnectDesktop } from \"../../desktop\";\r\nimport { isObject, isString } from \"../activity/helpers/util\";\r\n\r\nconst enum Commands {\r\n GetCookies = \"get-cookies\",\r\n SetCookie = \"set-cookie\",\r\n RemoveCookie = \"remove-cookie\"\r\n}\r\n\r\nexport class Cookies implements IOConnectDesktop.Cookies.API {\r\n\r\n constructor(private methodName: string, private interop: IOConnectDesktop.Interop.API) {\r\n }\r\n\r\n public async get(filter?: IOConnectDesktop.Cookies.CookiesGetFilter): Promise<IOConnectDesktop.Cookies.Cookie[]> {\r\n const result = await this.invoke<{ cookies: IOConnectDesktop.Cookies.Cookie[] }>(Commands.GetCookies, { filter });\r\n return result.returned.cookies;\r\n }\r\n\r\n public async set(cookie: IOConnectDesktop.Cookies.CookiesSetDetails): Promise<void> {\r\n this.verifyCookieObject(cookie);\r\n await this.invoke<IOConnectDesktop.Cookies.Cookie[]>(Commands.SetCookie, cookie);\r\n }\r\n\r\n public async remove(url: string, name: string): Promise<void> {\r\n if (!isString(url)) {\r\n throw new Error(`url should be a string`);\r\n }\r\n if (!isString(name)) {\r\n throw new Error(`name should be a string`);\r\n }\r\n await this.invoke<IOConnectDesktop.Cookies.Cookie[]>(Commands.RemoveCookie, { url, name });\r\n }\r\n\r\n private invoke<T>(command: Commands, data: any) {\r\n return this.interop.invoke<T>(this.methodName, { command, args: data });\r\n }\r\n\r\n private verifyCookieObject(cookie: IOConnectDesktop.Cookies.CookiesSetDetails) {\r\n if (!cookie) {\r\n throw new Error(`cookie should be defined`);\r\n }\r\n if (!isObject(cookie)) {\r\n throw new Error(`cookie should be an object`);\r\n }\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { IOConnectDesktop } from \"../desktop\";\nimport { InternalConfig } from \"./types\";\nimport Utils from \"./utils\";\n\nexport class EventsDispatcher {\n private glue!: IOConnectDesktop.API;\n private readonly glue42EventName = \"Glue42\";\n\n private readonly events: { [key in string]: { name: string; handle: (glue42Data: any) => void | Promise<void> } } = {\n notifyStarted: { name: \"notifyStarted\", handle: this.handleNotifyStarted.bind(this) },\n requestGlue: { name: \"requestGlue\", handle: this.handleRequestGlue.bind(this) }\n };\n\n constructor(private readonly config: InternalConfig) { }\n\n public start(glue: IOConnectDesktop.API): void {\n\n if (Utils.isNode()) {\n // raising custom events is not supported in Node, because we can't raise global events and we do not at this\n // point expose an EventEmitter instance via the API\n return;\n }\n\n this.glue = glue;\n\n this.wireCustomEventListener();\n\n this.announceStarted();\n }\n\n private wireCustomEventListener(): void {\n window.addEventListener(this.glue42EventName, (event) => {\n const data = (event as CustomEvent).detail;\n\n if (!data || !data.glue42) {\n return;\n }\n\n const glue42Event: string = data.glue42.event;\n\n const foundHandler = this.events[glue42Event];\n\n if (!foundHandler) {\n return;\n }\n\n foundHandler.handle(data.glue42.message);\n\n });\n }\n\n private announceStarted(): void {\n this.send(\"start\");\n }\n\n private handleRequestGlue(): void {\n if (!this.config.exposeAPI) {\n this.send(\"requestGlueResponse\", { error: \"Will not give access to the underlying Glue API, because it was explicitly denied upon initialization.\" });\n return;\n }\n\n this.send(\"requestGlueResponse\", { glue: this.glue });\n }\n\n private handleNotifyStarted(): void {\n this.announceStarted();\n }\n\n private send(eventName: string, message?: any): void {\n const payload = { glue42: { event: eventName, message } };\n\n const event = new CustomEvent(this.glue42EventName, { detail: payload });\n\n window.dispatchEvent(event);\n }\n}\n","import CoreFactory, { IOConnectCore } from \"@interopio/core\";\nimport { ActivityModule } from \"./activity/main\";\nimport AppManagerFactory from \"./app-manager/main\";\nimport WindowsFactory from \"./windows/main\";\nimport LayoutsFactory from \"./layouts/main\";\nimport DisplayManager from \"./displays/displayManager\";\nimport { factory as channels } from \"./channels/main\";\nimport { factory as hotkeys } from \"./hotkeys/main\";\n\nimport { IOConnectDesktop } from \"../desktop\";\nimport { version } from \"../package.json\";\nimport prepareConfig from \"./config\";\nimport { LibConfigObject } from \"./types\";\nimport { ActivityMode } from \"./activity/activityConfig\";\nimport Utils from \"./utils\";\nimport { Notifications } from \"./notifications/main\";\nimport { factory as themes } from \"./themes/main\";\nimport { Intents } from \"./intents/intents\";\nimport { FactoryCallInfo } from \"./factoryCallInfo\";\nimport { Prefs } from \"./prefs/index\";\nimport { factory as cookies } from \"./cookies/main\";\nimport { EventsDispatcher } from \"./eventsDispatcher\";\n\nconst callInfo: FactoryCallInfo = new FactoryCallInfo();\n\nconst factory = async (options: IOConnectDesktop.Config): Promise<IOConnectDesktop.API> => {\n let firstRun = false;\n if (!callInfo.initialized) {\n firstRun = true;\n callInfo.init(options);\n }\n\n // if running in GD, do not allow creating multiple instance of this API in the same page\n const glue42gd: IOConnectDesktop.GDObject = typeof window !== \"undefined\" && window.glue42gd;\n if (glue42gd) {\n if (!firstRun) {\n callInfo.addCall(options);\n return callInfo.promise;\n }\n }\n const g = await factoryCore(options, glue42gd);\n callInfo.resolve(g);\n return g;\n};\n\nconst factoryCore = async (options: IOConnectDesktop.Config, glue42gd: IOConnectDesktop.GDObject): Promise<IOConnectDesktop.API> => {\n const T42GDExecuteMethod = \"T42.GD.Execute\";\n const gdMajorVersion = Utils.getGDMajorVersion();\n // get config object\n // basically selecting some properties (and defaulting them)\n // it's used to extract things like layouts, appManager, activities etc things\n // that API itself doesn't know about\n options = options || {};\n const glueConfig = prepareConfig(options);\n options.gateway = options.gateway || {};\n\n let _appManager: any;\n let _activity: any;\n let _windows: any;\n let _displays: any;\n let _channels: IOConnectDesktop.Channels;\n const _browserEventsDispatcher = new EventsDispatcher(glueConfig);\n\n // dependency graph:\n // windows: agm, appManager (via getter)\n // activities: contexts, agm, logger, windows, appManager (via getter)\n // appManager: agm, windows, logger, activities\n // layouts: agm, appManager, logger\n function createWindows(core: IOConnectCore.API) {\n if (glueConfig.windows) {\n\n const windowsLogger = getLibLogger(\"windows\", core.logger, glueConfig.windows);\n\n _windows = WindowsFactory(\n core.agm,\n windowsLogger,\n () => {\n return _appManager;\n },\n () => {\n return _displays;\n },\n () => {\n return _channels;\n },\n gdMajorVersion);\n debugLog(_windows);\n return _windows;\n }\n }\n\n function createActivities(core: IOConnectCore.API) {\n if (glueConfig.activities) {\n if (ActivityModule.checkIsUsingGW3Implementation && ActivityModule.checkIsUsingGW3Implementation(core.connection)) {\n\n const activityLogger = getLibLogger(\"activity\", core.logger, glueConfig.activities);\n\n _activity = new ActivityModule({\n connection: core.connection,\n contexts: core.contexts,\n agm: core.agm,\n logger: activityLogger,\n logLevel: \"info\",\n disableAutoAnnounce: false,\n disposeRequestHandling: \"exit\",\n announcementInfo: null,\n windows: _windows,\n appManagerGetter: () => {\n return _appManager;\n },\n mode: glueConfig.activities.mode as ActivityMode,\n typesToTrack: glueConfig.activities.typesToTrack,\n activityId: glue42gd?.activityInfo?.activityId,\n gdMajorVersion\n }).api;\n debugLog(_activity);\n return _activity;\n }\n }\n }\n\n function createAppManager(core: IOConnectCore.API) {\n if (!glueConfig.appManager) {\n return;\n }\n\n const logger = getLibLogger(\"appManager\", core.logger, glueConfig.appManager);\n\n // AppManager v3\n _appManager = AppManagerFactory({\n agm: core.agm,\n windows: _windows,\n logger,\n activities: _activity,\n mode: glueConfig.appManager.mode,\n gdMajorVersion\n });\n debugLog(_appManager);\n return _appManager;\n }\n\n function createLayouts(core: IOConnectCore.API) {\n if (!glueConfig.layouts) {\n return;\n }\n\n const logger = getLibLogger(\"layouts\", core.logger, glueConfig.layouts);\n const layoutsConfig = glueConfig.layouts;\n const lay = LayoutsFactory({\n agm: core.agm,\n appManager: _appManager,\n activityGetter: () => _activity,\n logger,\n mode: layoutsConfig.mode,\n autoSaveWindowContext: layoutsConfig.autoSaveWindowContext ?? false,\n gdMajorVersion\n });\n debugLog(lay);\n return lay;\n }\n\n function createChannels(core: IOConnectCore.API) {\n if (!glueConfig.channels) {\n return;\n }\n\n if (!core.contexts) {\n // TODO log - notify the user that he can not use channels without context\n return;\n }\n\n // Logger\n const logger = getLibLogger(\"channels\", core.logger, glueConfig.channels);\n\n _channels = channels(core.contexts, core.agm, () => _windows, logger);\n\n debugLog(_channels);\n return _channels;\n }\n\n function createHotkeys(core: IOConnectCore.API) {\n const hotkeysAPI = hotkeys(core.agm);\n\n debugLog(hotkeysAPI);\n return hotkeysAPI;\n }\n\n function createIntents(core: IOConnectCore.API) {\n const intentsAPI = new Intents(core.agm, _windows, core.logger.subLogger(\"intents\"), options, _appManager);\n\n debugLog(intentsAPI);\n return intentsAPI;\n }\n\n function createNotifications(core: IOConnectCore.API) {\n const notificationsAPI = new Notifications(core.interop, core.logger).toAPI();\n\n debugLog(notificationsAPI);\n return notificationsAPI;\n }\n\n function createDisplaysApi(core: IOConnectCore.API) {\n if (glueConfig.displays) {\n const displaysLogger = getLibLogger(\"displays\", core.logger, glueConfig.displays);\n\n _displays = new DisplayManager(core.agm, displaysLogger);\n debugLog(_displays);\n return _displays;\n }\n }\n\n function createThemes(core: IOConnectCore.API) {\n if (!core.contexts) {\n // TODO log - notify the user that he can not use themes without context\n return;\n }\n const themesAPI = themes(core.contexts, core.interop);\n\n debugLog(themesAPI);\n return themesAPI;\n }\n\n function createPrefs(core: IOConnectCore.API) {\n const appName = options.application ?? glue42gd?.application ?? core.interop.instance.application;\n const prefs = new Prefs(appName, core.interop);\n\n debugLog(prefs);\n return prefs;\n }\n\n function createCookies(core: IOConnectCore.API) {\n const api = cookies(core.interop, T42GDExecuteMethod);\n\n debugLog(api);\n return api;\n }\n\n function getLibLogger(loggerName: string, logger: IOConnectCore.Logger.API, config: LibConfigObject<string | boolean>) {\n const newLogger = logger.subLogger(loggerName);\n\n if (config && config.logger) {\n const loggerConfig = config.logger;\n if (loggerConfig.console) {\n newLogger.consoleLevel(loggerConfig.console);\n }\n if (loggerConfig.publish) {\n newLogger.publishLevel(loggerConfig.publish);\n }\n // not supported in GD3\n // if (loggerConfig.metrics) {\n // newLogger.metricsLevel(loggerConfig.metrics);\n // }\n }\n\n return newLogger;\n }\n\n const ext: IOConnectCore.Extension = {\n // define extra libraries for glue-core to raise\n libs: [\n { name: \"windows\", create: createWindows },\n { name: \"activities\", create: createActivities },\n { name: \"appManager\", create: createAppManager },\n { name: \"layouts\", create: createLayouts },\n { name: \"channels\", create: createChannels },\n { name: \"hotkeys\", create: createHotkeys },\n { name: \"displays\", create: createDisplaysApi },\n { name: \"intents\", create: createIntents },\n { name: \"notifications\", create: createNotifications },\n { name: \"themes\", create: createThemes },\n { name: \"prefs\", create: createPrefs },\n { name: \"cookies\", create: createCookies }\n ],\n\n version,\n\n enrichGlue: (glue: IOConnectCore.API) => {\n // put some data to config\n glue.config.activities = glueConfig.activities;\n glue.config.windows = glueConfig.windows;\n glue.config.appManager = glueConfig.appManager;\n glue.config.layouts = glueConfig.layouts;\n glue.config.channels = glueConfig.channels;\n glue.config.displays = glueConfig.displays;\n },\n };\n\n const currentLog: any[] = [];\n if (typeof window !== \"undefined\") {\n if (!(window as any).glueFactoryLog) {\n (window as any).glueFactoryLog = [];\n }\n (window as any).glueFactoryLog.push(currentLog);\n }\n\n function debugLog(entry: any) {\n currentLog.push(entry);\n }\n\n const glueApi = (await CoreFactory(options, ext)) as IOConnectDesktop.API;\n\n // Decorate the ready glue object with extra functionalities coming from the user-defined libraries.\n if (Array.isArray(options?.libraries) && options.libraries.length) {\n await Promise.all(options.libraries.map((lib) => lib(glueApi, options)));\n }\n\n _browserEventsDispatcher.start(glueApi);\n\n return glueApi;\n};\n\nfactory.coreVersion = (CoreFactory as any).version;\nfactory.version = version;\nfactory.calls = callInfo;\n\nexport default factory;\n","import { IOConnectDesktop } from \"../desktop\";\n\ninterface CallDetails {\n date: Date;\n config: IOConnectDesktop.Config;\n}\n\nexport class FactoryCallInfo {\n\n public promise: Promise<IOConnectDesktop.API>;\n public initialized = false;\n public details: CallDetails[] = [];\n public reject: (reason?: any) => void = () => { /** Do nothing - default impl. - will be replaced */ };\n public resolve: (value: IOConnectDesktop.API | PromiseLike<IOConnectDesktop.API>) => void = () => { /** Do nothing - default impl. - will be replaced */ };\n\n public init(config: IOConnectDesktop.Config) {\n this.initialized = true;\n this.addCall(config);\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n public addCall(config: IOConnectDesktop.Config) {\n this.details.push({ date: new Date(), config });\n }\n\n public done(g: IOConnectDesktop.API) {\n this.resolve(g);\n }\n\n public error(e: Error) {\n this.reject(e);\n }\n}\n","import { IOConnectDesktop } from \"../../desktop\";\nimport { HotkeysImpl } from \"./hotkeys\";\n\nexport function factory(agm: IOConnectDesktop.AGM.API): IOConnectDesktop.Hotkeys.API & { ready: () => Promise<void>; } {\n const hotkeys = new HotkeysImpl(agm);\n\n return {\n register: hotkeys.register.bind(hotkeys),\n unregister: hotkeys.unregister.bind(hotkeys),\n unregisterAll: hotkeys.unregisterAll.bind(hotkeys),\n isRegistered: hotkeys.isRegistered.bind(hotkeys),\n\n ready: () => Promise.resolve()\n };\n}\n","import { IOConnectDesktop } from \"../../desktop\";\r\nimport { ThemesImpl } from \"./themes\";\r\n\r\nexport function factory(contexts: IOConnectDesktop.Contexts.API, interop: IOConnectDesktop.Interop.API): IOConnectDesktop.Themes.API & { ready: () => Promise<void>; } {\r\n const themes = new ThemesImpl(contexts, interop);\r\n\r\n return {\r\n list: themes.list.bind(themes),\r\n getCurrent: themes.getCurrent.bind(themes),\r\n select: themes.select.bind(themes),\r\n onChanged: themes.onChanged.bind(themes),\r\n ready: () => Promise.resolve(),\r\n };\r\n}\r\n","import { IOConnectDesktop } from \"../../desktop\";\r\nimport { Cookies } from \"./index\";\r\n\r\nexport function factory(agm: IOConnectDesktop.AGM.API, methodName: string): IOConnectDesktop.Cookies.API & { ready: () => Promise<void>; } {\r\n const cookies = new Cookies(methodName, agm);\r\n\r\n return {\r\n get: cookies.get.bind(cookies),\r\n remove: cookies.remove.bind(cookies),\r\n set: cookies.set.bind(cookies),\r\n ready: () => Promise.resolve()\r\n };\r\n}\r\n","import CreateGlue from \"./glue\";\n\nlet whatToExpose = CreateGlue;\nlet shouldSetToWindow = true;\nif (typeof window !== \"undefined\") {\n const windowAsAny = window as any;\n // if iodesktop (running in GD3) and autoInjected\n const iodesktop = windowAsAny.iodesktop ?? windowAsAny.glue42gd;\n if (iodesktop && iodesktop.autoInjected) {\n whatToExpose = windowAsAny.IODesktop;\n // no need to set to window, it's already there\n shouldSetToWindow = false;\n }\n\n if (shouldSetToWindow) {\n windowAsAny.Glue = whatToExpose; // to keep backward compatibility\n windowAsAny.IODesktop = whatToExpose;\n }\n\n // remove GlueCore from the window object (injected by Glue-core)\n delete windowAsAny.IOBrowser;\n delete windowAsAny.GlueCore;\n}\n// add default library for ES6 modules\n(whatToExpose as any).default = whatToExpose;\n\nexport default whatToExpose;\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","v","op","pop","push","__spreadArray","to","from","pack","ar","l","slice","concat","MetricTypes","STRING","NUMBER","TIMESTAMP","OBJECT","getMetricTypeByValue","metric","type","getTypeByValue","Date","serializeMetric","serializedMetrics","values","keys","reduce","memo","key","innerType","composite","defineNestedComposite","description","context","name","normalizeMetricName","path","join","getMetricValueByType","now","publishNestedComposite","getTime","Boolean","toString","flatten","arr","flat","toFlatten","isArray","composeMsgForRootStateMetric","system","merged","root","getAggregateState","highestState","sort","a","state","aggregateDesc","msg","forEach","m","idx","aggregateDescription","Helpers","definition","parent","transport","Error","BaseMetric","createMetric","defineProperty","get","_a","repo","enumerable","configurable","update","newValue","updateMetric","NumberMetric","_super","incrementBy","num","increment","decrement","decrementBy","ObjectMetric","mergeValues","_this","k","StringMetric","TimestampMetric","protocol","separator","_transport","_name","_description","_repo","_parent","_path","_buildPath","shadowedSystem","_state","id","_subSystems","_metrics","_getOrCreateMetric","metricObject","expectedType","metricDef","matching","filter","shadowedMetric","existing","catch","me","subSystems","metrics","subSystem","nameSystem","descriptionSystem","match","_system","getState","setState","stateDescription","updateSystem","stringMetric","timestampMetric","objectMetric","numberMetric","aggState","shadowedSubSystem","createSystem","Repository","options","init","addSystemMetrics","clickStream","undefined","rootSystem","useClickStream","navigator","userAgent","document","clickStream_1","documentClickHandler","target","className","getAttribute","timestamp","tagName","toLowerCase","href","title","page","window","location","addEventListener","attachEvent","urlMetric","appNameMetric","startUrl","glue42gd","appName","NullProtocol","PerfTracker","api","initialPublishTimeout","publishInterval","lastCount","scheduleCollection","setTimeout","collect","setInterval","collectMemory","collectEntries","memory","performance","JSON","stringify","totalJSHeapSize","usedJSHeapSize","allEntries","getEntries","jsonfiedEntries","map","toJSON","connection","config","joinPromise","session","replayRepo","replaySystem","ss","createMetricsMsg","Description","Value","send","metricClone","cloneMetric","updateMetricCore","canUpdate","publishMetricsMsg","sendFireAndForget","canUpdateMetric","_b","resolveReadyPromise","domain","onJoined","reconnect","defineRootMetricsMsg","service","instance","shadowedUpdateMetric","stateObj","rootMetric","peer_id","peerId","gw3","disableAutoAppSystem","featureMetric","reportingSystem","def","featureMetricFunc","action","payload","addFAVSupport","perfConfig","pagePerformanceMetrics","enabled","initPerf","commonjsGlobal","globalThis","global","self","getDefaultExportFromCjs","x","__esModule","createRegistry","errorHandling","_userErrorHandler","callbacks","_handleError","exceptionArtifact","errParam","stack","console","error","add","callback","replayArgumentsArr","callbacksForKey","replayArgument","includes","err","allForKey","acc","element","index","execute","argumentsArr","_i","results","clear","clearKey","default","lib$1","InProcTransport","settings","logger","registry","gw","facade","connect","_client","message","messageHandler","client","sendObject","_msg","onMessage","onConnectedChanged","close","open","SharedWorkerTransport","workerFile","worker","SharedWorker","port","onmessage","data","postMessage","Utils","isNode","_isNode","process","PromiseWrapper","resolved","promise","delay","time","timers","timer","timerName","marks","endTime","period","startTime","mark","currentTime","diff","timerObj","stop","WebSocketConstructor","require","WebSocket","WS","startupTimer","_running","_registry","wsRequests","ws","waitForSocketConnection","info","pw","failed","readyState","openSocket","retryInterval","retriesLeft","reconnectInterval","reconnectAttempts","notifyForSocketState","debug","initiateSocket","retries","onerror","reason","seen_1","WeakSet","has","notifyStatusChanged","onclose","onopen","identity","application","wsRequest","status","shortidExports","shortid$1","exports","libExports","lib","seed","alphabet$2","previousSeed","shuffled","randomFromSeed","nextValue","_seed_","ORIGINAL","reset","setCharacters","_alphabet_","unique","split","item","ind","lastIndexOf","getShuffled","characterIndex","sourceArray","targetArray","r","Math","floor","splice","shuffle","randomByte","alphabet_1","characters","lookup","crypto","msCrypto","getRandomValues","size","Uint8Array","bytes","random","alphabet$1","format","alphabet","mask","log","LN2","counter","previousSeconds","generate","number","loopCounter","str","pow","build_1","clusterWorkerId","seconds","isValid","RegExp","replace","test","module","build","isValid$1","seedValue","workerId","newCharacters","shortid","domainSession","successMessages","errorMessages","_latestOptions","isJoined","tryReconnecting","_connectionOn","disconnected","loggedIn","on","handleSuccessMessage","handleErrorMessage","sm","requestsMap","destination","wasReconnect","handleJoined","requestId","request_id","entry","success","getNextRequestId","tag","skipPeerId","successMsg","_tag","errorMsg","warn","leave","onLeft","connected","GW3ProtocolImpl","protocolVersion","datePrefix","datePrefixLen","dateMinLen","datePrefixFirstChar","_isLoggedIn","shouldTryLogin","initialLogin","initialLoginAttempts","sessions","handleDisconnected","ping","processStringMessage","parse","substring","milliseconds","parseInt","isNaN","ex","msgType","createStringMessage","oldToJson","datePrefix_1","processObjectMessage","createObjectMessage","login","authentication","e_1","helloMsg","sendOptions","welcomeMsg","token","err_1","_c","loginConfig","username","password","gatewayToken","getNewGWToken","method","flowName","provider","flowCallback","sessionId","secret","providerContext","globalDomain","subLogger","maxRetries","Buffer","resolvedIdentity","resolved_identity","availableDomains","available_domains","access_token","setLoggedIn","logout","promises","pingTimer","clearTimeout","all","domainName","domainLogger","bind","authToken","res","getGWToken","MessageReplayerImpl","specs","specsNames","messages","subs","subsRefCount","specs_1","spec","name_1","_loop_1","refCount","this_1","sub","processMessage","types","isDone","name_2","indexOf","drain","off","PromisePlus","executor","timeoutMilliseconds","timeoutMessage","timeout","WebPlatformTransport","iAmConnected","parentReady","children","extContentAvailable","extContentConnecting","extContentConnected","parentInExtMode","webNamespace","parentPingTimeout","connectionRequestTimeout","defaultTargetString","connectionAccepted","handle","handleConnectionAccepted","connectionRejected","handleConnectionRejected","connectionRequest","handleConnectionRequest","parentPing","handleParentPing","platformPing","handlePlatformPing","platformReady","handlePlatformReady","clientUnload","handleClientUnload","manualUnload","handleManualUnload","extConnectionResponse","handleExtConnectionResponse","extSetupRequest","handleExtSetupRequest","gatewayDisconnect","handleGatewayDisconnect","gatewayInternalConnect","handleGatewayInternalConnect","glue42ext","setUpMessageListener","setUpUnload","setupPlatformUnloadListener","parentType","manualSetReadyState","publicWindowId","_communicationId","glue42ExtOut","glue42core","clientId","myClientId","ownWindowId","windowId","initiateInternalConnection","event","initiateRemoteConnection","connectionResolve","connectionReject","bridgeInstanceId","getMyWindowId","request","clientType","selfAssignedWindowId","parentWindowId","isParentCheckSuccess","parentCheck","checkMessageTypeValid","messageType","parentPingResolve","parentPingInterval","clearInterval","source","handleAcceptanceOfMyRequest","handleAcceptanceOfGrandChildRequest","isPreferredActivated","processExtContentConnection","applicationName","communicationId","extData","glue42ExtInc","child","find","c","grandChildId","origin","rejectConnectionRequest","extMode","typeToValidate","rejection","requestConnectionPermissionFromExt","waitForContentScript","extConnectionResolve","extConnectionReject","approved","content","findParent","connectionNotPossibleMsg","myInsideParents","myOutsideParents","uniqueParents","getPossibleParentsInWindow","getPossibleParentsOutsideWindow","top","opener","Set","confirmParent","currentWindow","current","targets","AsyncSequelizer","minSequenceInterval","queue","isExecutingQueue","enqueue","executeQueue","operation","actionResult","error_1","shift","intervalBreak","Connection","messageHandlers","ids","_connected","isTrace","_swapTransport","_switchInProgress","_transportSubscriptions","_sequelizer","inproc","sharedWorker","webPlatform","canPublish","unsubConnectionChanged","handleConnectionChanged","unsubOnMessage","handleTransportMessage","_defaultTransport","switchTransport","switchTargetTransport","verifyPromise","isSwitchSuccess","trace","getNewSecondaryTransport","_targetTransport","_targetAuth","getNewSecondaryAuth","_defaultAuth","verifyConnection","onLibReAnnounced","setLibReAnnounced","isObjectBasedTransport","strMessage","isLoggedIn","currentServer","authRequest","newAuth","error_2","transportSwap","prepareDefaultSwap","distributeMessage","handlers","handlerId","handler","loggerError","replaySpecs","replayer","msgObj","unsub","left","ready","transportConfig","url","auth","order","Logger","logFn","subLoggers","customLogFn","loggerFullName","includeTimeAndLevel","existingSub","publishLevel","level","_publishLevel","consoleLevel","_consoleLevel","publishMessage","compareWith","loggerName","interop","Interop","methods","InteropMethodName","invoke","prefix","date","getHours","getMinutes","getSeconds","getMilliseconds","toPrint","GW_MESSAGE_CREATE_CONTEXT","GW_MESSAGE_ACTIVITY_CREATED","GW_MESSAGE_ACTIVITY_DESTROYED","GW_MESSAGE_CONTEXT_CREATED","GW_MESSAGE_CONTEXT_ADDED","GW_MESSAGE_SUBSCRIBE_CONTEXT","GW_MESSAGE_SUBSCRIBED_CONTEXT","GW_MESSAGE_UNSUBSCRIBE_CONTEXT","GW_MESSAGE_DESTROY_CONTEXT","GW_MESSAGE_CONTEXT_DESTROYED","GW_MESSAGE_UPDATE_CONTEXT","GW_MESSAGE_CONTEXT_UPDATED","GW_MESSAGE_JOINED_ACTIVITY","ContextMessageReplaySpec","version","GW3ContextData","contextId","isAnnounced","activityId","updateCallbacks","hasCallbacks","lodash_clonedeepExports","HASH_UNDEFINED","MAX_SAFE_INTEGER","argsTag","boolTag","dateTag","funcTag","genTag","mapTag","numberTag","objectTag","promiseTag","regexpTag","setTag","stringTag","symbolTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reFlags","reIsHostCtor","reIsUint","cloneableTags","freeGlobal","freeSelf","Function","freeExports","nodeType","freeModule","moduleExports","addMapEntry","pair","set","addSetEntry","arrayReduce","array","iteratee","accumulator","initAccum","isHostObject","mapToArray","overArg","func","transform","arg","setToArray","uid","arrayProto","funcProto","objectProto","coreJsData","maskSrcKey","exec","IE_PROTO","funcToString","objectToString","reIsNative","getPrototype","getPrototypeOf","objectCreate","propertyIsEnumerable","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","isBuffer","nativeKeys","DataView","getNative","Map","WeakMap","nativeCreate","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","Hash","entries","ListCache","MapCache","Stack","__data__","arrayLikeKeys","inherited","isObjectLike","isArrayLike","isArrayLikeObject","isArguments","baseTimes","skipIndexes","isIndex","assignValue","object","objValue","eq","assocIndexOf","baseClone","isDeep","isFull","customizer","isObject","isArr","input","initCloneArray","copyArray","getTag","isFunc","buffer","copy","cloneBuffer","isPrototype","proto","initCloneObject","copyObject","getSymbols","copySymbols","baseAssign","cloneFunc","Ctor","cloneArrayBuffer","dataView","byteOffset","byteLength","cloneDataView","typedArray","cloneTypedArray","cloneMap","regexp","lastIndex","cloneRegExp","cloneSet","symbol","initCloneByTag","stacked","props","keysFunc","symbolsFunc","offset","arrayPush","baseGetAllKeys","getAllKeys","arrayEach","subValue","baseIsNative","isFunction","arrayBuffer","getMapData","getValue","hash","string","cache","pairs","LARGE_ARRAY_SIZE","other","ArrayBuffer","ctorString","isLength","baseKeys","cloneDeep","applyContextDelta","delta","deepClone","commands","command","deletePath","setValueToPath","added_1","added","updated_1","updated","removed","mergeObjectsProperties","obj","what","withWhat","right","deepEqual","pathArr","isSubset","superObj","subObj","every","ele","InvokeStatus","GW3Bridge","_contextNameToData","_gw3Subscriptions","_nextCallbackSubscriptionNumber","_creationPromises","_contextNameToId","_contextIdToName","_protocolVersion","_contextsTempCache","_contextsSubscriptionsCache","_connection","_logger","_trackAllContexts","trackAllContexts","_reAnnounceKnownContexts","reAnnounceKnownContexts","_gw3Session","resetState","reInitiateState","subscribeToContextCreatedMessages","subscribeToContextUpdatedMessages","subscribeToContextDestroyedMessages","handleContextCreatedMessage","handleContextUpdatedMessage","handleContextDestroyedMessage","contextsDomainInfo","uri","dispose","contextName","createContext","lifetime","createContextMsg","context_id","contextData","hasReceivedSnapshot","currentContext","calculatedDelta","calculateContextDeltaV2","calculateContextDeltaV1","gwResponse","handleUpdated","updaterId","setPath","setPathSupported","setPaths","pathValues","pathValues_1","pathValues_2","pathValue","subscribe","_d","_r","un","unsubscribe","subscriptionKey","thisCallbackSubscriptionNumber","hadCallbacks","clone","subscription","subKey","joinedActivity","sentExplicitSubscription","sendSubscribe","sendUnsubscribe","destroy","extraData","oldContext","invokeUpdateCallbacks","createdMessageTypes_1","createdMessageType","contextCreatedMsg","activity_id","_systemContextsSubKey","updatedMessageTypes_1","updatedMessageType","contextUpdatedMsg","justSeen","context_snapshot","updater_id","updateCallbackIndex","updateCallback","destroyedMessageTypes_1","destroyedMessageType","destroyedMsg","cacheSoFar","ctxName","_e","lastKnownData","_f","flushQueue","ContextsModule","_bridge","checkName","checkData","checkPath","paths","paths_1","promisify","successCallback","errorCallback","rejectAfter","ms","clearTimeoutIfThere","Client","configuration","callProtocolSubscribe","targetServers","stream","successProxy","errorProxy","methodResponseTimeout","waitTimeoutMs","methodDef","method_response_timeout","wait_for_method_timeout","delayTillNow","currentServers","getServerMethodsByFilterAndTarget","retry_1","streamInfo","servers","methodFilter","filterCopy","getServers","serverMethodMap","server","getMethods","methodsForInstance","getMethodsForInstance","methodAdded","onMethodAdded","methodRemoved","onMethodRemoved","serverAdded","onServerAdded","serverRemoved","onServerRemoved","serverMethodAdded","onServerMethodAdded","serverMethodRemoved","onServerMethodRemoved","argumentObj","additionalOptions","getInvokePromise","methodDefinition","serversMethodMap","errorObj","additionalOptionsCopy","invokePromises","invocationMessages","methodResponseTimeoutMs","tryToAwaitForMethods","supportsStreaming","objectTypes","flags","metadata","called_with","executed_by","returned","serversMethodPair","invId","invokePromise","race","invocationId","getInvocationResultObj","invocationResults","calledWith","all_return_values","invokeMessage","Success","allValues","currentValue","all_errors","allErrors","currError","invResult","interval","filterByTarget","matches","myMatches","serverMethodPair","instanceMatch","localMachine","isLocal","instanceFilter","instanceDefinition","containsProps","methodMatch","repoMethod","prop","isMatch","filterValue","repoMethodValue","filterValueEl","matchingServers","resultMethodsObject","methodKey","identifier","prev","matchingMethods","ServerSubscription","branchKey","closeSingleSubscription","pushDataToSingle","Request","requestContext","accept","acceptRequestOnBranch","acceptOnBranch","branch","rejectRequest","ServerStreaming$1","ServerStreaming","onSubRequest","rc","rm","handleSubRequest","onSubAdded","handleSubAdded","onSubRemoved","handleSubRemoved","streamCallbacks","subscriptionRequestHandler","subscriptionAddedHandler","subscriptionRemovedHandler","ServerBranch","subscriptions","getSubscriptionList","closeAllSubscriptions","pushData","ServerStream","_protocol","_repoMethod","_server","branches","bList","getBranchList","def2","accepts","displayName","returns","unregister","updateRepoMethod","Server","serverRepository","invocations","currentlyUnregistering","streaming","onInvoked","onMethodInvoked","createStream","streamDef","existingStream","streamMethodDefinition","getList","some","serverMethod","protocolState","streamUserObject","repoId","remove","register","wrappedCallbackFunction","resultCallback","resultValue","args","userCallback","registerCore","registerAsync","wrappedCallback","resultCalled_1","methodResult","userCallbackAsync","forStream","methodToBeRemoved","unregisterWithPredicate","removeMethodsOrStreams","filterPredicate","methodsOrStreamsToRemove","methodsToRemove","methodUnregPromises","addAsCurrentlyUnregistering","methodName","theFunction","unregisterInProgress","methodToExecute","invocationArgs","unStrException","_value","methodInvocationResult","InstanceWrapper","API","wrapped","getStreams","refreshWrappedObject","refresh","unwrap","user","pid","machine","environment","region","hideMethodSystemFlags","ClientRepository","methodsCount","myServer","wrapper","unwrappedInstance","addServer","serverId","serverEntry","removeServerById","methodId","removeServerMethod","addServerMethod","createMethodIdentifier","that","gatewayId","display_name","object_types","input_signature","result_signature","getServersByMethod","clientMethodDefinition","extractMethodsFromServers","hideServerMethodSystemFlags","unsubscribeFunc","serversWithMethodsToReplay","returnUnsubWithDelayedReplay","methodsToReplay","unsubCalled","getServerById","methodInfo","allServers","collectionToReplay","clientMethods","ServerRepository","nextId","getById","SUBSCRIPTION_REQUEST","SUBSCRIPTION_ADDED","SUBSCRIPTION_REMOVED","repository","ERR_URI_SUBSCRIPTION_FAILED","nextStreamId","handleAddInterest","handleRemoveInterest","streamingMethod","subscriptionsMap","branchKeyToStreamIdMap","streamId","getStreamId","subscription_id","subscribeMsg","stream_id","sendSubscriptionFailed","br","dropSubscriptionMessage","closeMultipleSubscriptions","subscriptionsToClose","drop","allSubscriptions","onSubscriptionLifetimeEvent","method_id","eventName","handlerFunc","getNextStreamId","caller_id","arguments_kv","subscriptionId","errorMessage","reason_uri","needleBranch","ServerProtocol","clientRepository","handleInvokeMessage","isStreaming","registerMsg","restrictions","invocation_id","callerId","UserSubscription","subscriptionData","params","trackedServers","onData","dataCallback","queued","dataItem","onClosed","closedCallback","onFailed","onConnected","setNewSubscription","newSub","TimedCache","timeoutIds","timeoutId","elementIdx","findIndex","ELEMENT_TTL_MS","flush","elements","STATUS_AWAITING_ACCEPT","STATUS_SUBSCRIBED","ERR_MSG_SUB_FAILED","ON_CLOSE_MSG_CLIENT_INIT","ClientStreaming","subscriptionsList","timedCache","subscriptionIdToLocalKeyMap","nextSubLocalKey","handleErrorSubscribing","errorResponse","subLocalKey","pendingSub","callArgs","callOnClosedHandlers","handleSubscribed","acceptingServer","isFirstResponse","serverInstance","handleEventData","trackedServersFound","isPrivateData","oob","sendingServerId","receivedStreamData","requestArguments","private","onDataHandlers","queuedData","handleSubscriptionCancelled","expectedNewLength","closers","getNextSubscriptionLocalKey","registerSubscription","server_id","drainSubscriptions","drainSubscriptionsCache","subsInfo","localKey","closeSubscription","closingServer","closersCount","closingServerId","ClientProtocol","handlePeerAdded","handlePeerRemoved","handleMethodsAddedMessage","handleMethodsRemovedMessage","handleResultMessage","handleInvocationError","newPeerId","new_peer_id","remoteId","meta","local","Number","serverInfo","removedPeerId","removed_id","methodIdList","gW3ProtocolFactory","libConfig","readyPromise","reconnectionPromises","existingSubscriptions","existingSubscriptions_1","registeredMethods","_loop_2","registeredMethods_1","handleReconnect","protocolPromise","waitForMethod","MessageBus","publish","topic","routingKey","removeEmptyValues","routing_key","target_identity","response","watchOnEvent","keysMatch","cleaned","obj1","obj2","keysObj1","allMatch","IOConnectCoreFactory","userConfig","ext","_interop","_contexts","_bus","_allowTrace","iodesktop","preloadPromise","gdPreloadPromise","glueInitTimer","internalConfig","nodeStartingContext","startingContextString","env","_GD_STARTING_CONTEXT_","getApplication","glue42electron","applicationConfig","instanceId","gwConfig","gateway","gwURL","uniqueAppName","appInstanceId","getConnection","windowAsAny","containerApplication","htmlContainer","containerName","bus","gwToken","getAuth","gdConsoleLevel","defaultLevel","consoleLogLevel","getLogger","contexts","libs","customLogger","prepareConfig","registerLib","inner","initTime","initEndTime","initStartTime","setupMetrics","initTimer","metricsPublishingEnabledFunc","getMetricsPublishingEnabled","setupContexts","hasActivities","activities","setupBus","setupExternalLibs","externalLibs","createCallback","setupExternalLib","authPromise","authConfig","agmConfig","RegisterInstanceMethodName","typedError","registerInstanceIfNeeded","libsReadyPromises","coreVersion","glue","feedback","feedbackInfo","agm","glueVer","glueConfig","browser","timing","initTimes","duration","extOptions","enrichGlue","updatePerfData","deprecatedDecorator","fn","wrong","proper","agmAny","method_added","method_removed","server_added","server_method_aded","server_method_removed","IOConnectCore","ActivityEntity","_id","_update","_updateCore","_beforeDelete","isNumber","isString","isUndefined","isUndefinedOrNull","isNullOrWhiteSpace","isBoolean","ifNotUndefined","doWithIt","ActivityType","ownerWindow","helperWindows","super","_ownerWindow","_helperWindows","hw","covertToWindowDef","initiate","_manager","windowType","WindowType","appByWindowTypeGetter","_appByWindowTypeGetter","windows","getWindows","activity","isIndependent","createWindow","EntityEvent","entitiy","entity","EntityEventContext","eventType","ActivityStatusChangeEventContext","newStatus","oldStatus","EntityEventType","StatusChange","ActivityContextChangedEventContext","ActivityContextChange","Added","Removed","Updated","Closed","ActivityWindowEvent","ActivityWindowJoinedActivity","ActivityWindowLeftActivity","ActivityState","Created","Started","Destroyed","ActivityAGM","_activity","_ensureHasAgm","AGM","util.isUndefinedOrNull","w","methodNames","methodsForWindow","currentWindowMethod","activityServers","util.isString","potentialTargets","util.isArray","firstElem","_isInstance","_isActivityWindow","win","parameters","AttachedActivityDescriptor","manager","ownerActivityId","_ownerActivityId","ownerId","windowIds","frameColor","detach","descriptor","detachActivities","nextTick","cb","nodeify","util.isFunction","resp","Activity","actType","_actType","_status","_context","_ownerId","_agm","getActivityType","owner","addWindow","addWindowToActivity","createStackedWindows","windowTypes","leaveWindowFromActivity","getWindowsByType","setContext","setActivityContext","updateContext","updateActivityContext","onStatusChange","subscribeActivityEvents","ns","os","onWindowEvent","subscribeWindowEvents","onContextChanged","subscribeActivityContextChanged","act","stopActivity","attach","attachActivities","onActivityAttached","subscribeActivitiesAttached","newActId","oldActId","onDetached","subscribeActivitiesDetached","newAct","originalActivity","_updateDescriptors","allStates","_attached","attached","setFrameColor","color","callbacksToWait","underlyingWindow","getFrameColor","LogLevel","Trace","Debug","Info","Warn","GetNamed","Get","GetTypeName","GlueLogger","_glueLogger","Level","_getMessage","ActivityWindow","windowGetter","hcWindowId","_type","_activityId","_instance","_isIndependent","_windowGetter","_hcWindowId","getBounds","getWindowBounds","getWindowType","util.isUndefined","getActivityById","isOwner","setVisible","isVisible","setWindowVisibility","activate","focus","activateWindow","setBounds","bounds","setWindowBounds","closeWindow","onActivityJoined","_subscribeForActivityWindowEvent","onActivityRemoved","ActivityStatus","getMessage","gwMmessageError","gwMessageAddActivityTypes","gwMessageActivityCreated","gwMessageActivityDestroyed","gwMessageActivityInitiated","gwMessageJoinedActivity","gwMessageActivityJoined","gwMessageActivityLeft","gwMessageOwnerChanged","gwMessageAddPeerFactories","gwMessagePeerFactoriesAdded","gwMessagePeerFactoriesRemoved","gwMessagePeerCreated","activityTypeGwMessageEntityToActivityType","nameToWindowType","windowName","owner_type","helper_types","peerFactoryGwMessageEntityToWindowType","peer_type","activityGwMessageToActivity","owner_id","activity_type","activityToActivityStatusChangeEvent","_activityChangeCallbacks","_activityTypeStatusChangeCallbacks","_activityWindowChangeCallbacks","_windowTypeStatusChangeCallbacks","_peerIdAndFactoryIdToPeerType","_peerFactoriesRegisteredByUs","_contextSubscriptions","_activityTypesInitiatedFromMe","_config","_windows","_sessionJoinedPromise","_sessionJoinedPromiseResolve","_activityJoinedPromise","_activityJoinedPromiseResolve","activityInfo","addRefreshHandler","setGWToken","addWillNavigateHandler","bridgeType","forwardActivityTypeMessagesToStatusEventHandlers","handleActivityCreatedMessage","handleActivityDestroyedMessage","forwardActivityMessagesToStatusEventHandlers","forwardActivityCreatedAndJoinedActivityToActivityWindowEventHandlers","forwardPeerFactoryMessagesToStatusEventHandlers","forwardPeerFactoryMessagesToPeerFactoryRequests","handlePeerFactoriesAdded","handlePeerFactoriesRemoved","forwardActivityWindowMessagesToEventHandlers","disposeRequestHandling","my","exit","mode","activity_types","typesToTrack","initReady","onActivityTypeStatusChange","registerActivityType","activityTypeName","toActivityPeerConfig","windowDefinition","activityType","invokeCallbacks","unregisterActivityType","onWindowTypeStatusChange","registerWindowFactory","factory","factories","unregisterWindowFactory","factory_ids","onActivityStatusChange","initiateActivity","initiateMsg","initial_context","isOverrideTypeDefinition","types_override","helpers","wd","sendCreateAndMapResultingMessagesToPromise","initMsg","fullReplace","removedKeys","announceWindow","activityWindowId","registerWindow","independent","shouldSendReady","getAgmInstance","generateWindowGetter","onActivityWindowChange","layout","width","height","cellSize","joinPeer","joinActivity","peer_name","created_id","destroy_peer_id","getAnnouncementInfo","announcementInfo","activityWindowType","activityWindowIndependent","activityWindowName","search","URLSearchParams","searchParams","maybeName","target_id","leaveActivity","getActivityTypes","getWindowTypes","getActivities","getActivityWindows","windowDefinitions","visible","cloneActivity","cloneOptions","into","merge","newActivityInfo","onActivitiesAttached","onActivitiesDetached","onActivityAttachedDescriptorsRefreshed","getAttachedDescriptors","getRandomRequestId","forwardAddedAndRemovedMessagesToEventHandler","addedMessageType","removedMessageType","mapper","getGetEntityEvent","isAdded","forwardMessageToEventHandler","getEntityEvent","ent","h","initiatedMessageType","initiatedMessageFilter","createdMessageFilter","cancelledMessageType","cancelledMessageFilter","createdMessageToPromiseResolution","listenForRecreates","reqId","resolveCreatedPromise","rejectCreatedPromise","createdPromise","initiatedSubscription","createdSubscription","cancelledSubscription","errorSubscription","initiatedMessageAck","dropSubscriptions","dropSubscription","msg4","recreated","msg1","msg2","msg3","toReturn","peerFactoryIdAndOwnerIdToWindowType","factoryId","peerType","subscribeToContext","unsubscribeContext","activityCreatedMessage","participants","createdMessage","peer_factory","gateway_token","joinedMessage","joinedId","joined_id","joinedType","joined_type","joinedName","joined_name","left_id","list","ActivityMy","_myAttached","_myDetached","_myAttachedTo","_myDetachedFrom","_myActivityFrameColorChanged","_myActivityJoinedCallbacks","_myActivityRemovedCallbacks","_myContextUpdateCallbacks","_m","am","_subscribeMyContextChanged","_subscribeMyWindowEvent","_subscribeActivitiesAttached","_subscribeActivitiesDetached","onWindowFrameColorChanged","_subscribeWindowFrameColorChanged","_w","announcedWindows","myWin","onActivityLeft","onActivityDetached","onAttachedToActivity","onDetachedFromActivity","onFrameColorChanged","myActivity","_notifyMyContextChanged","_notifyMyWindowEvent","callbackStore","_notifyAttached","_notifyDetached","_notifyAttachedTo","_notifyDetachedFrom","detached","oldAct","ReadyMarker","signalsToWait","_signals","_callbacks","setCallback","isSet","isError","_error","signal","getError","EntityObservableCollection","processNew","_items","_listeners","_processNew","addOne","items","internalEntity","_updateInternalCollections","_notifyListeners","getByName","getOrWait","entityAddedHandler","listener","entityAsAny","isActivityDestroy","isWindowClose","oldEntity","ActivityManager","usingHc","_announcedWindows","bridge","autoAnnounce","_attachedCallbacks","_detachedCallbacks","_frameColorChangesCallbacks","_windowHandlers","_activityTypes","_grabEntity","_windowTypes","_activities","_dataReadyMarker","_descriptorsMarker","_readyMarker","dataErr","errCatch","refreshDescriptors","_handleActivitiesAttached","_handleActivitiesDetached","_handleActivityDescriptorsRefreshed","_handleWindowFrameColorChanged","_subscribeForData","aw","_getInitialData","ownerWindowType","helperWindowTypes","ownerDefinition","helperDefinitions","relativeTo","relativeDirection","windowStyleAttributes","actId","subscribeActivityTypeEvents","at","factoryMethod","util.isObject","getName","predicate","util.some","windowEventHandler","unsubscribeWindowEvents","subscribeWindowTypeEvents","wt","wrappingHandler","found","windowTypeOrConfiguration","relativeToWindow","invalidKeys","filteredWindowTypeOrConfiguration","wid","relativeWindowTypes","stackedWindow","tasks","removedKey","descriptors","stateWrapped","u","subscribeActivityFrameColorChanged","ac","descriptorAsObjectFromAPI","oldActivityId","newActivityId","ActivityManagementAPI","_my","activityTypes","_getActivityTypesWrapper","_getWindowTypesWrapper","registerFactory","unregisterFactory","announce","instances","onAttached","onActivityFrameColorChanged","ActivityAPI","_mgr","aware","inActivity","getAvailableFrameColors","ActivityModule","checkIsUsingGW3Implementation","_api","logLevel","_isUsingHCImplementation","gdMajorVersion","_isUsingGW3Implementation","activityManager","disableAutoAnnounce","My","_readyPromise","isUsingHCImplementation","isUsingGW3Implementation","GetFunctionalEntitlementMethodName","CanIMethodName","OnEventMethodName","GetApplicationsMethodName","objectValues","objectClone","validate","throwErrors","ApplicationImpl","_appManager","_configuration","CallbackRegistryFactory","onInstanceStarted","onInstanceStopped","onAppRemoved","app","onAppChanged","onAppAvailable","_props","IsReady","onAppUnavailable","Title","Version","autoStart","AutoStart","isShell","IsShell","caption","Caption","hidden","IsHidden","container","ApplicationName","ActivityWindowType","windowSettings","Arguments","allowMultiple","AllowMultiple","available","icon","Icon","iconURL","IconUrl","sortOrder","SortOrder","userProperties","UserProperties","keywords","Keywords","isActivity","Type","Mode","styleAttributes","WindowStyleAttributes","searchFor","modeIndex","startModeIndex","stopModeIndex","style","substr","getConfiguration","AgmNames.GetApplicationsMethodName","v2","apps","applications","updateFromProps","Name","start","async","startTimeout","waitForAGMInstance","awaitInterop","waitForAGMReady","waitForApplicationInstance","waitFunc","onInstanceAgmServerReady","acsResult","Context","Options","waitForInterop","Id","handleInstanceStarted","ActivityId","IsActivityOwner","AgmServers","onAvailable","onUnavailable","onChanged","onRemoved","InstanceImpl","_appName","startFailed","_unsubscribeInstanceStopped","_unsubscribeInstanceAgmServerReady","activityInstance","isActivityOwner","_isActivityOwner","activityInstances","activityOwnerInstance","inst","_startUpContext","_title","isActivityInstance","_isActivityInstance","_inActivity","isSingleWindowApp","_agmInstance","interopInstance","onInteropReady","onAgmReady","onStopped","getWindow","onWindowAdded","updateAgmInstanceFromProps","agmInstances","idToResolve","handleInstanceStopped","getContext","AppManagerImpl","_gdMajorVersion","_apps","_instances","getConfigurations","getMyInstance","getMyApplication","handleSnapshotAppsAdded","newApps","currentApps","handleAppRemoved","handleAppAdded","handleSnapshotInstanceStarted","newInstances","currentInstances","_getAppId","_updateAppFromProps","handleAppUpdated","handleAppReady","_getAppOrThrow","_getInstanceId","_getInstanceAppName","_updateInstanceFromProps","_getInstanceOrThrow","_matchInstance","handleInstanceAgmServerReady","handleInstanceStartFailed","handleInstanceUpdated","onInstanceStartFailed","onInstanceUpdated","onAppAdded","_getInstanceByIdAndName","EntitlementsImpl","_isMethodRegistered","handleBranchModified","handleBranchesModified","getRegion","_agmInvoke","Region","getBranches","Branches","getCurrentBranch","Branch","setRegion","ResultMessage","setCurrentBranch","currentUser","getFunctionalEntitlement","funct","AgmNames.GetFunctionalEntitlementMethodName","Entitlement","getFunctionalEntitlementBranch","canI","AgmNames.CanIMethodName","Result","canIBranch","onBranchesChanged","onBranchChanged","onShuttingDown","registerMethod","restart","transformFunction","prevent","InMemoryStoreCommandMethodName","InMemoryStore","import","createAppDef","details","AppManagerFactory","START_ONLY","SKIP_ICONS","appManager","entitlements","skipIcon","snapshot","skipIcons","initiated","resolveFunc","rejectFunc","resultPromise","AgmNames.OnEventMethodName","streamData","events","onApplicationAddedEventArgs","isSnapshot","onApplicationStartedEventArgs","hasMyAppInSnapShot","hasMyInstanceInSnapShot","subscriptionFactory","myInstance","myApplication","inMemory","randomByteBrowser","dest","encode_1","decode_1","encode","len","decode","require$$0","T42JumpListAction","jumpListManager","_groupActionCallbacks","_registered","_executor","registerCallbackMethod","setEnabled","updateJumpList","createCategory","actions","validateActions","category","toUpdateActions","removeCategory","manageActionCallback","createActions","categoryTitle","removeActions","getActions","catgoryTitle","currentCategory","getJumpListSettings","categories","actionCallback","getActionCallback","callbackId","singleInstanceTitle","multiInstanceTitle","getJumpList","updateAction","groupCallbacksKey","categoryActionCallbacks","accCal","delete","caller","callbackAction","cal","windowStore","waitForTimeoutInMilliseconds","_pendingWindows","_pendingWindowsStates","CallbackFactory","getIfReady","remote","urlChanged","setReadyState","targetWindowState","markReadyToShow","setUrlChangedState","setCompositionChangedState","windowAvailableOnURLChanged","waitFor","onReadyWindow","onAdded","getGDMajorVersion","glueDesktop","ver","callbackifyPromise","fail","getMonitor","displays","workingAreaWidth","workingAreaHeight","monitor","totalOverlap","calculateTotalOverlap","getDisplayCenterOfScreen","currentDisplay","primaryDisplay","physicalWidth","scaleFactor","physicalHeight","physicalDisplayLeft","workArea","physicalDisplayTop","physicalDisplayWidth","physicalDisplayHeight","physicalHOffset","max","physicalVOffset","centeredPhysicalLeft","centeredPhysicalTop","r1","r2","r1x","r1y","r1xMax","r1yMax","r2x","r2y","r2xMax","r2yMax","min","JumpListActions","_categoryTitle","JumpListCategories","getCategories","cat","JumpList","_categories","isEnabled","windowFactory","appManagerGetter","displayAPIGetter","channelsAPIGetter","getChannels","channels","_mode","_bounds","_url","_frameColor","_focus","_neighbours","neighbours","_groupId","groupId","_isGroupHeaderVisible","isGroupHeaderVisible","_isTabHeaderVisible","isTabHeaderVisible","_isTabSelected","isTabSelected","_settings","_applicationName","_group","_isVisible","_isSticky","isSticky","_isCollapsed","isCollapsed","_windowState","_tabGroupId","tabGroupId","_tabIndex","tabIndex","_frameId","frameId","_isLocked","isLocked","_frameButtons","frameButtons","_zoomFactor","zoomFactor","_placementSettings","placementSettings","_jumpList","moveResize","utils","resultWindow","toBeVisible","onGroupChanged","onEventCore","replayArguments","getNeighboursByDirection","direction","winId","getApplicationName","_APPLICATION_NAME","_t42","getWindowInfo","hostInstance","agmInstance","b1","b2","minHeight","maxHeight","minWidth","maxWidth","isFocused","opened","group","topNeighbours","leftNeighbours","rightNeighbours","bottomNeighbours","screen","monitors","jumpList","maximize","restore","minimize","maximizeRestore","collapse","expand","toggleCollapse","setTitle","newTitle","setStyle","styleAsAny","util.isNumber","setOnTop","onTop","resetButtons","buttons","getButtons","setSizeConstraints","constraints","getSizeConstraints","navigate","newUrl","optionsOrCallback","util.isNullOrWhiteSpace","addFrameButton","buttonInfo","buttonId","imageBase64","removeFrameButton","show","hide","center","display","validateCenterArguments","cbOrOptions","snap","autoAlign","showLoader","loader","hideLoader","lock","unlock","getIcon","setIcon","base64Image","setTabTooltip","tooltip","getTabTooltip","attachTab","tab","opt","errMsg","sourceWindow","attachOptions","selected","detachTab","argsForSend","hideTabHeader","setTabHeaderVisible","toBeTabHeaderVisible","showPopup","createFlydown","setModalState","isModal","setZoomFactor","zoomIn","zoomOut","showDevTools","capture","captureOptions","flash","suppliedOptions","flashOptions","shouldFlash","flashTab","setSticky","print","printOptions","printToPDF","printToPDFOptions","place","ungroup","ungroupOptions","unGroupChanged","newGroup","oldGroup","ignoreCache","goBack","goForward","download","opts","configure","configureWindow","getWindowConfiguration","getChannel","getWindowsWithChannels","channel","startDrag","option","showDialog","dialogOptions","timerDuration","showTimer","onClose","onUrlChanged","onTitleChanged","onFrameButtonAdded","onFrameButtonRemoved","onFrameButtonClicked","onCollapsed","onExpanded","onMinimized","onMaximized","onNormal","onVisibilityChanged","onContextUpdated","onLockingChanged","onBoundsChanged","onFocusChanged","onStickyChanged","onWindowAttached","onWindowDetached","onTabSelectionChanged","onTabHeaderVisibilityChanged","onClosing","onRefreshing","onZoomFactorChanged","onPlacementSettingsChanged","onNeighboursChanged","onNavigating","tabs","allWindows","w1","w2","MIN_SAFE_INTEGER","getAllTabs","getURL","getTitle","getDisplay","getByWindowId","resizeTo","moveTo","getParentWindow","myParentId","parentInstanceId","joinChannel","leaveChannel","Events","handleUpdate","handleWindowClose","handleWindowChangeState","finished","handleTitleChanged","finally","handleVisibilityChanged","handleUrlChanged","handleWindowSettingsChanged","handleContextUpdated","handleFrameIsLockedChanged","handleBoundsChanged","handleFocusChanged","handleFrameButtonAdded","frameButton","buttonObj","btn","handleFrameButtonRemoved","frameButtonId","button","handleFrameButtonClicked","handleFrameColorChanged","handleFrameAttached","handleFrameSelectionChanged","newWindow","prevWindow","selectedWindow","previousWindow","handleCompositionChanged","neighbors","handleGroupHeaderVisibilityChanged","handleTabHeaderVisibilityChanged","handleGroupChanged","handleAttached","newTabGroupId","newFrameId","tabHeaderVisible","winsToBeNotified","handleWindowAttached","handleDetached","handleWindowDetached","handleZoomFactorChanged","handleIsStickyChanged","handlePlacementSettingsChanged","displayAPI","getWindowsByTabGroupId","isEmpty","GroupMethodName","WndMethodName","_finished","unsubCallbacks","agmTarget","startsWith","handleEvent","finishedResolve","closed","urlLoadOptions","stylePromises","wait","tabTooltip","tabToolTip","toolTip","tabTitle","allowClose","allowCollapse","allowLockUnlock","allowMaximize","allowMinimize","buttonsConfig","versionNum","rej","resolveImmediately","areBoundsEqual","unsubscribeBoundsChanged","resolveTimeout","targetWindow","targetWindowId","snappingEdge","sourceWindowId","eventKeys","contextWithoutUndefinedValues","swapUndefinedToNull","dataURL","toShow","optionsCopy","targetLocation","reformatedOptions","popupBounds","targetId","popupId","horizontalOffset","verticalOffset","fullOptions","reformatFlydownOptions","zoneIds","zones","z","flydownSize","cancel","clearFlydownArea","handleFlydownBoundsRequested","callbackData","zoneId","flydownId","flydownWindowBounds","flydownWindowId","responses","defaultResponse","handleOnEventRequested","prevented","preventArgs","pArgs","captureGroup","groupWindowIds","filePath","enableDownloadBar","silent","fullPath","fileSize","executeCore","executeGroup","gdWindow","addCloseHandler","nonWindowHandlers","assignGeneralIfUnassigned","zone","valueFromOptions","flydownBounds","flydownActiveArea","activeArea","areaIds","executeWithoutToken","uns","executed","executeWithToken","requested","areHeightsEqual","areWidthsEqual","areLeftsEqual","areTopsEqual","GDEnvironment","wndId","_waitTimeout","_windowId","_appManagerGetter","_displayAPIGetter","_channelsAPIGetter","respondToEvent","streamResolve","streamReject","withConfig","updateWindow","copyOptions","windowState","tabAttached","tabDetached","onEvent","onCompositionChanged","onGroupHeaderVisibilityChanged","onGroupVisibilityChanged","onGroupStateChanged","onWindowGotFocus","onWindowLostFocus","windowInfo","readyResolve","extendedStreamEvent","getExtendedStreamEvent","existingWindow","mapToWindowConstructorOptions","windowInfoCreatedEvent","windowObjectAndEvents","theWindow","theWindowEvents","windowInfoBoundsChangedEvent","windowInfoUrlChangedEvent","windowInfoTitleChanged","windowInfoIsStickyChangedChanged","windowInfoCompositionChanged","groupHeaderVisible","windowInfoFocusChanged","focusChanged","oldTabGroupId","newWindowId","prevWindowId","windowObjAndEvents","isActiveTab","jumpListOptions","streamEvent","charAt","toUpperCase","groupFactory","callbackRegistry","_windowsId","_isHibernatedFlag","groupObject","_mapToWindowObjects","winObjects","windowObject","_mapToWindowObject","mappedWindows","isHeaderVisible","isHibernated","showHeader","hideHeader","onHeaderVisibilityChanged","onWindowRemoved","groupAPI","groupInternal","removeWindow","handleGroupVisibilityChanged","visibile","handleGroupHibernateChanged","isHibernatedFlag","groupsFactory","_groups","heardForWindowsCounter","findGroupByWindow","groupObj","onGroupAdded","createdGroupWrapper","createOrGet","groupWrapper","deleteIfEmpty","findGroupWrapperByWindow","currentGroup","fromGroup","toGroup","moveWindow","groupEvents","groupsAPI","waitForGroup","onGroupRemoved","hibernate","resume","onHibernated","onResumed","groupsEvents","onWindowMoved","WindowsFactory","channelsGetter","groups","isReady","GD","envDetector","myWindow","windowAdded","windowRemoved","optionsAsAny","windowsForListing","findById","onTabAttached","unsubFunc","unsubscribed","onTabDetached","store","layouts","removeWhere","condition","removeAll","where","first","ContextProvider","activitiesGetter","registerRequestMethods","onSaveRequested","activityIsOwner","usersCbs","requestResult","autoSaveWindowContext","windowContext","activityContext","transformACSLayout","something","convertedValue","LayoutImpl","components","LayoutsCommandMethod","LayoutsAPIImpl","isRegisterMethodForLayoutModified","activityGetter","setDefaultGlobal","invokeMethodCore","clearDefaultGlobal","getDefaultGlobal","isSlimMode","gotSnapshot","save","verifyNotSlimMode","layoutObject","ignoreInstances","invokeMethodAndTrack","activityIdToJoin","closeRunningInstance","closeRunningInstances","closeMe","restoreOptions","activityToJoin","ignoreActivityWindowTypes","reuseExistingWindows","reuseWindows","excludeFromClosing","layoutType","getObjectValues","Layouts","rename","newName","oldName","updateMetadata","getCurrentLayout","onRestored","onRenamed","onLayoutModified","registerMethodForLayoutModified","updateAppContextInCurrent","updateDefaultContext","getAll","forceRefresh","skipStreamEvent","agmResult","streamEventReceived","handleResult","isCommandMethodPresent","ACSStream","StreamName","resolveReady","rejectReady","resolveGotSnapshot","rejectGotSnapshot","noRetry","checkForLayoutEventMethod","IsSnapshot","addLayouts","OnLayoutAdded","removeLayouts","OnLayoutRemoved","changeLayouts","OnLayoutChanged","renameLayouts","OnLayoutRenamed","restoredLayout","OnLayoutRestored","Token","layoutsData","createAndNotifyLayout","layoutData","existingLayout","compareLayouts","removedLayouts","removedLayout","changedLayouts","changedLayout","renamedLayouts","renamedLayout","layout1","layout2","restoredLayouts","LayoutsFactory","acsStream","DisplayManager","callGD","DisplayCommand","GetAll","decorateDisplay","getPrimary","isPrimary","Capture","captureAll","CaptureAll","getMousePosition","GetMousePosition","original","decoratedDisplay","workAreaAsAny","GetByWindowId","onDisplayChanged","T42_ANNOUNCE_METHOD_NAME","switchChannel","swId","newChannel","addOrRemoveChannel","CONTEXT_PREFIX","LATEST_FDC3_TYPE","SharedContextSubscriber","subscribeFor","isChannel","createContextName","___","channelContextName","getContextData","latest_fdc3_type","updateChannel","updateData","fdc3Type","getFDC3Type","channelName","fdc3PropsArr","ChannelsImpl","shared","subsKey","changedKey","isInitialJoin","pendingReplays","initialChannel","joinNoSelectorSwitch","lastUpdate","channelNames","getMy","joinCore","leaveCore","leaveNoSelectorSwitch","changed","getWindowsOnChannel","er","changeSelector","doesChannelExist","channelExistsPromise","intervalId","sharedContexts","setupInteropPromise","interopLib","setupInterop","CommandMethod","HotkeysImpl","firstHotkey","hotkeys","hotkey","hkToLower","formatHotkey","registerInvokeAGMMethod","unregisterAll","isRegistered","getLibConfig","defaultMode","trueMode","getModeAsString","activitiesDefaultMode","layoutsDefaultMode","layoutsTrueMode","exposeAPI","exposeGlue","Glue42Notification","badge","dir","image","lang","renotify","requireInteraction","removeEventListener","dispatchEvent","PanelAPI","onStreamEvent","toggle","panelVisible","toAPI","Notifications","NotificationsSubscribeStream","NotificationsCounterStream","RaiseNotificationMethodName","NotificationsExecuteMethod","methodsRegistered","NOTIFICATIONS_CONFIGURE_METHOD_NAME","methodNameRoot","notifications","subscribedForNotifications","subscribedCounterStream","subscriptionsCountForNotifications","subscriptionsCountForCounter","_panel","onStreamEventCore","subscribeInternalEvents","maxActions","panel","raise","bunchOfPromises","handleNotificationEvent","notification","severity","glueRoutingDetailMethodName","sourceId","publishExtraEvents","clickInterop","handleActions","handleOptions","g42notification","invocationResult","handleNotificationErrorEvent","setFilter","getFilter","enable","enableToasts","toastExpiry","sourceFilter","allowed","blocked","onRaised","onStateChanged","onConfigurationChanged","closeStreamSubscriptionIfNoNeeded","onCounterChanged","subscribeForCounterStream","closeStreamCounterSubscriptionIfNoNeeded","clearAll","clearOld","click","attributes","stringValue","dataAsString","panelExpiry","validActions","g42notificationId","g42action","g42interopMethod","g42interopTarget","g42interopArguments","glueAction","sendDeltaOnly","subscriptionForNotifications","handleData","subscriptionForCounter","count","handleOnClosed","handleOnShow","handleItemsData","deltas","handleDeltas","allApplications","getNotification","gnsNotificationArgs","getGnsNotificationArgs","notificationId","handleNotificationEventCore","handleNotificationActionEvent","notificationActionPayload","handleNotificationClickEvent","onaction","onclick","sourceNotificationId","getBackwardGnsNotificationArgs","ThemesImpl","isSubscribed","getMethodName","getCurrent","select","theme","setMethodName","sharedContextName","getThemesMethodName","setThemesMethodName","GLUE42_FDC3_INTENTS_METHOD_PREFIX","INTENT_HANDLER_DEFAULT_PROPS","PromiseWrap","promiseActive","Intents","myIntents","intentsResolverResponsePromises","useIntentsResolverUI","unregisterIntentPromises","checkIfIntentsResolverIsEnabled","intentFilter","intents","intent","contextType","ctToLower","contextTypes","ct","resultType","resultTypeToLower","intentRequest","validateIntentRequest","resolverInstance","coreRaiseIntentFn","coreRaiseIntent","waitUserResponseIndefinitely","handleRaiseOnError","withIntentsInfo","appsWithIntents","intentDef","applicationTitle","applicationDescription","applicationIcon","serverWindowIds","serverWindowId","T42WndGetInfo","windowsInfos","intentName","appWithIntents","appIntent","appDefIntent","windowsIdToTitle","instanceTitle","addIntentListener","registerPromise","intentFlag","rest","buildInteropMethodName","unsubscribeIntent","checkIfResolverShouldBeOpened","raiseIntent","resolverHandler","startResolverApp","raiseIntentToTargetHandler","registeredIntent","firstFoundAppHandler","findHandlerByFilter","firstFoundInstanceHandler","invokeStartApp","invokeOptions","intentsResolverAppName","responseMethodName","registerIntentResolverMethod","startContext","buildStartContext","startOptions","buildStartOptions","subscribeOnInstanceStopped","createResponsePromise","handleInstanceResponse","windowsInfo","stopResolverInstance","resolverResponseHandler","validateIntentsResolverResponse","validResponse","ok","cleanUpIntentResolverPromise","waitResponseTimeout","intentsResolverResponseTimeout","intentPromise","responseObj","compulsoryKeysExist","gdWin","enableIntentsResolverUI","checkIfIntentHasMoreThanOneHandler","clearUnregistrationPromise","promiseToRemove","unregisterPromise","validateIntentRequestContext","validateIntentRequestTarget","validateIntentRequestTimeout","validateWaitUserResponseIndefinitely","validateIntentRequestHandler","Prefs","interopMethodRegistered","verifyDataObject","setFor","verifyApp","updateFor","clearFor","verifyCallback","unsubscribeFn","registerInteropIfNeeded","Cookies","cookies","cookie","verifyCookieObject","EventsDispatcher","glue42EventName","notifyStarted","handleNotifyStarted","requestGlue","handleRequestGlue","wireCustomEventListener","announceStarted","detail","glue42","glue42Event","foundHandler","CustomEvent","callInfo","initialized","addCall","firstRun","factoryCore","_displays","_channels","_browserEventsDispatcher","getLibLogger","newLogger","loggerConfig","core","windowsLogger","debugLog","activityLogger","layoutsConfig","lay","hotkeysAPI","displaysLogger","intentsAPI","notificationsAPI","themesAPI","themes","prefs","currentLog","glueFactoryLog","glueApi","CoreFactory","libraries","calls","whatToExpose","CreateGlue","shouldSetToWindow","autoInjected","IODesktop","Glue","IOBrowser","GlueCore"],"mappings":"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"}