@truly-you/trulyyou-web-sdk 0.1.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.
- package/dist/index.d.ts +2 -0
- package/dist/index.esm.js +9 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.js +9 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/sdk/TrulyYouSDK.d.ts +77 -0
- package/dist/types.d.ts +36 -0
- package/package.json +43 -0
- package/rollup.config.js +58 -0
- package/src/index.ts +3 -0
- package/src/sdk/TrulyYouSDK.ts +1805 -0
- package/src/types.ts +40 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../node_modules/pusher-js/dist/web/pusher.js","../src/sdk/TrulyYouSDK.ts"],"sourcesContent":["/*!\n * Pusher JavaScript Library v8.4.0\n * https://pusher.com/\n *\n * Copyright 2020, Pusher\n * Released under the MIT licence.\n */\n\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Pusher\"] = factory();\n\telse\n\t\troot[\"Pusher\"] = factory();\n})(window, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 2);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Package base64 implements Base64 encoding and decoding.\n */\n// Invalid character used in decoding to indicate\n// that the character to decode is out of range of\n// alphabet and cannot be decoded.\nvar INVALID_BYTE = 256;\n/**\n * Implements standard Base64 encoding.\n *\n * Operates in constant time.\n */\nvar Coder = /** @class */ (function () {\n // TODO(dchest): methods to encode chunk-by-chunk.\n function Coder(_paddingCharacter) {\n if (_paddingCharacter === void 0) { _paddingCharacter = \"=\"; }\n this._paddingCharacter = _paddingCharacter;\n }\n Coder.prototype.encodedLength = function (length) {\n if (!this._paddingCharacter) {\n return (length * 8 + 5) / 6 | 0;\n }\n return (length + 2) / 3 * 4 | 0;\n };\n Coder.prototype.encode = function (data) {\n var out = \"\";\n var i = 0;\n for (; i < data.length - 2; i += 3) {\n var c = (data[i] << 16) | (data[i + 1] << 8) | (data[i + 2]);\n out += this._encodeByte((c >>> 3 * 6) & 63);\n out += this._encodeByte((c >>> 2 * 6) & 63);\n out += this._encodeByte((c >>> 1 * 6) & 63);\n out += this._encodeByte((c >>> 0 * 6) & 63);\n }\n var left = data.length - i;\n if (left > 0) {\n var c = (data[i] << 16) | (left === 2 ? data[i + 1] << 8 : 0);\n out += this._encodeByte((c >>> 3 * 6) & 63);\n out += this._encodeByte((c >>> 2 * 6) & 63);\n if (left === 2) {\n out += this._encodeByte((c >>> 1 * 6) & 63);\n }\n else {\n out += this._paddingCharacter || \"\";\n }\n out += this._paddingCharacter || \"\";\n }\n return out;\n };\n Coder.prototype.maxDecodedLength = function (length) {\n if (!this._paddingCharacter) {\n return (length * 6 + 7) / 8 | 0;\n }\n return length / 4 * 3 | 0;\n };\n Coder.prototype.decodedLength = function (s) {\n return this.maxDecodedLength(s.length - this._getPaddingLength(s));\n };\n Coder.prototype.decode = function (s) {\n if (s.length === 0) {\n return new Uint8Array(0);\n }\n var paddingLength = this._getPaddingLength(s);\n var length = s.length - paddingLength;\n var out = new Uint8Array(this.maxDecodedLength(length));\n var op = 0;\n var i = 0;\n var haveBad = 0;\n var v0 = 0, v1 = 0, v2 = 0, v3 = 0;\n for (; i < length - 4; i += 4) {\n v0 = this._decodeChar(s.charCodeAt(i + 0));\n v1 = this._decodeChar(s.charCodeAt(i + 1));\n v2 = this._decodeChar(s.charCodeAt(i + 2));\n v3 = this._decodeChar(s.charCodeAt(i + 3));\n out[op++] = (v0 << 2) | (v1 >>> 4);\n out[op++] = (v1 << 4) | (v2 >>> 2);\n out[op++] = (v2 << 6) | v3;\n haveBad |= v0 & INVALID_BYTE;\n haveBad |= v1 & INVALID_BYTE;\n haveBad |= v2 & INVALID_BYTE;\n haveBad |= v3 & INVALID_BYTE;\n }\n if (i < length - 1) {\n v0 = this._decodeChar(s.charCodeAt(i));\n v1 = this._decodeChar(s.charCodeAt(i + 1));\n out[op++] = (v0 << 2) | (v1 >>> 4);\n haveBad |= v0 & INVALID_BYTE;\n haveBad |= v1 & INVALID_BYTE;\n }\n if (i < length - 2) {\n v2 = this._decodeChar(s.charCodeAt(i + 2));\n out[op++] = (v1 << 4) | (v2 >>> 2);\n haveBad |= v2 & INVALID_BYTE;\n }\n if (i < length - 3) {\n v3 = this._decodeChar(s.charCodeAt(i + 3));\n out[op++] = (v2 << 6) | v3;\n haveBad |= v3 & INVALID_BYTE;\n }\n if (haveBad !== 0) {\n throw new Error(\"Base64Coder: incorrect characters for decoding\");\n }\n return out;\n };\n // Standard encoding have the following encoded/decoded ranges,\n // which we need to convert between.\n //\n // ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 + /\n // Index: 0 - 25 26 - 51 52 - 61 62 63\n // ASCII: 65 - 90 97 - 122 48 - 57 43 47\n //\n // Encode 6 bits in b into a new character.\n Coder.prototype._encodeByte = function (b) {\n // Encoding uses constant time operations as follows:\n //\n // 1. Define comparison of A with B using (A - B) >>> 8:\n // if A > B, then result is positive integer\n // if A <= B, then result is 0\n //\n // 2. Define selection of C or 0 using bitwise AND: X & C:\n // if X == 0, then result is 0\n // if X != 0, then result is C\n //\n // 3. Start with the smallest comparison (b >= 0), which is always\n // true, so set the result to the starting ASCII value (65).\n //\n // 4. Continue comparing b to higher ASCII values, and selecting\n // zero if comparison isn't true, otherwise selecting a value\n // to add to result, which:\n //\n // a) undoes the previous addition\n // b) provides new value to add\n //\n var result = b;\n // b >= 0\n result += 65;\n // b > 25\n result += ((25 - b) >>> 8) & ((0 - 65) - 26 + 97);\n // b > 51\n result += ((51 - b) >>> 8) & ((26 - 97) - 52 + 48);\n // b > 61\n result += ((61 - b) >>> 8) & ((52 - 48) - 62 + 43);\n // b > 62\n result += ((62 - b) >>> 8) & ((62 - 43) - 63 + 47);\n return String.fromCharCode(result);\n };\n // Decode a character code into a byte.\n // Must return 256 if character is out of alphabet range.\n Coder.prototype._decodeChar = function (c) {\n // Decoding works similar to encoding: using the same comparison\n // function, but now it works on ranges: result is always incremented\n // by value, but this value becomes zero if the range is not\n // satisfied.\n //\n // Decoding starts with invalid value, 256, which is then\n // subtracted when the range is satisfied. If none of the ranges\n // apply, the function returns 256, which is then checked by\n // the caller to throw error.\n var result = INVALID_BYTE; // start with invalid character\n // c == 43 (c > 42 and c < 44)\n result += (((42 - c) & (c - 44)) >>> 8) & (-INVALID_BYTE + c - 43 + 62);\n // c == 47 (c > 46 and c < 48)\n result += (((46 - c) & (c - 48)) >>> 8) & (-INVALID_BYTE + c - 47 + 63);\n // c > 47 and c < 58\n result += (((47 - c) & (c - 58)) >>> 8) & (-INVALID_BYTE + c - 48 + 52);\n // c > 64 and c < 91\n result += (((64 - c) & (c - 91)) >>> 8) & (-INVALID_BYTE + c - 65 + 0);\n // c > 96 and c < 123\n result += (((96 - c) & (c - 123)) >>> 8) & (-INVALID_BYTE + c - 97 + 26);\n return result;\n };\n Coder.prototype._getPaddingLength = function (s) {\n var paddingLength = 0;\n if (this._paddingCharacter) {\n for (var i = s.length - 1; i >= 0; i--) {\n if (s[i] !== this._paddingCharacter) {\n break;\n }\n paddingLength++;\n }\n if (s.length < 4 || paddingLength > 2) {\n throw new Error(\"Base64Coder: incorrect padding\");\n }\n }\n return paddingLength;\n };\n return Coder;\n}());\nexports.Coder = Coder;\nvar stdCoder = new Coder();\nfunction encode(data) {\n return stdCoder.encode(data);\n}\nexports.encode = encode;\nfunction decode(s) {\n return stdCoder.decode(s);\n}\nexports.decode = decode;\n/**\n * Implements URL-safe Base64 encoding.\n * (Same as Base64, but '+' is replaced with '-', and '/' with '_').\n *\n * Operates in constant time.\n */\nvar URLSafeCoder = /** @class */ (function (_super) {\n __extends(URLSafeCoder, _super);\n function URLSafeCoder() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n // URL-safe encoding have the following encoded/decoded ranges:\n //\n // ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 - _\n // Index: 0 - 25 26 - 51 52 - 61 62 63\n // ASCII: 65 - 90 97 - 122 48 - 57 45 95\n //\n URLSafeCoder.prototype._encodeByte = function (b) {\n var result = b;\n // b >= 0\n result += 65;\n // b > 25\n result += ((25 - b) >>> 8) & ((0 - 65) - 26 + 97);\n // b > 51\n result += ((51 - b) >>> 8) & ((26 - 97) - 52 + 48);\n // b > 61\n result += ((61 - b) >>> 8) & ((52 - 48) - 62 + 45);\n // b > 62\n result += ((62 - b) >>> 8) & ((62 - 45) - 63 + 95);\n return String.fromCharCode(result);\n };\n URLSafeCoder.prototype._decodeChar = function (c) {\n var result = INVALID_BYTE;\n // c == 45 (c > 44 and c < 46)\n result += (((44 - c) & (c - 46)) >>> 8) & (-INVALID_BYTE + c - 45 + 62);\n // c == 95 (c > 94 and c < 96)\n result += (((94 - c) & (c - 96)) >>> 8) & (-INVALID_BYTE + c - 95 + 63);\n // c > 47 and c < 58\n result += (((47 - c) & (c - 58)) >>> 8) & (-INVALID_BYTE + c - 48 + 52);\n // c > 64 and c < 91\n result += (((64 - c) & (c - 91)) >>> 8) & (-INVALID_BYTE + c - 65 + 0);\n // c > 96 and c < 123\n result += (((96 - c) & (c - 123)) >>> 8) & (-INVALID_BYTE + c - 97 + 26);\n return result;\n };\n return URLSafeCoder;\n}(Coder));\nexports.URLSafeCoder = URLSafeCoder;\nvar urlSafeCoder = new URLSafeCoder();\nfunction encodeURLSafe(data) {\n return urlSafeCoder.encode(data);\n}\nexports.encodeURLSafe = encodeURLSafe;\nfunction decodeURLSafe(s) {\n return urlSafeCoder.decode(s);\n}\nexports.decodeURLSafe = decodeURLSafe;\nexports.encodedLength = function (length) {\n return stdCoder.encodedLength(length);\n};\nexports.maxDecodedLength = function (length) {\n return stdCoder.maxDecodedLength(length);\n};\nexports.decodedLength = function (s) {\n return stdCoder.decodedLength(s);\n};\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Package utf8 implements UTF-8 encoding and decoding.\n */\nvar INVALID_UTF16 = \"utf8: invalid string\";\nvar INVALID_UTF8 = \"utf8: invalid source encoding\";\n/**\n * Encodes the given string into UTF-8 byte array.\n * Throws if the source string has invalid UTF-16 encoding.\n */\nfunction encode(s) {\n // Calculate result length and allocate output array.\n // encodedLength() also validates string and throws errors,\n // so we don't need repeat validation here.\n var arr = new Uint8Array(encodedLength(s));\n var pos = 0;\n for (var i = 0; i < s.length; i++) {\n var c = s.charCodeAt(i);\n if (c < 0x80) {\n arr[pos++] = c;\n }\n else if (c < 0x800) {\n arr[pos++] = 0xc0 | c >> 6;\n arr[pos++] = 0x80 | c & 0x3f;\n }\n else if (c < 0xd800) {\n arr[pos++] = 0xe0 | c >> 12;\n arr[pos++] = 0x80 | (c >> 6) & 0x3f;\n arr[pos++] = 0x80 | c & 0x3f;\n }\n else {\n i++; // get one more character\n c = (c & 0x3ff) << 10;\n c |= s.charCodeAt(i) & 0x3ff;\n c += 0x10000;\n arr[pos++] = 0xf0 | c >> 18;\n arr[pos++] = 0x80 | (c >> 12) & 0x3f;\n arr[pos++] = 0x80 | (c >> 6) & 0x3f;\n arr[pos++] = 0x80 | c & 0x3f;\n }\n }\n return arr;\n}\nexports.encode = encode;\n/**\n * Returns the number of bytes required to encode the given string into UTF-8.\n * Throws if the source string has invalid UTF-16 encoding.\n */\nfunction encodedLength(s) {\n var result = 0;\n for (var i = 0; i < s.length; i++) {\n var c = s.charCodeAt(i);\n if (c < 0x80) {\n result += 1;\n }\n else if (c < 0x800) {\n result += 2;\n }\n else if (c < 0xd800) {\n result += 3;\n }\n else if (c <= 0xdfff) {\n if (i >= s.length - 1) {\n throw new Error(INVALID_UTF16);\n }\n i++; // \"eat\" next character\n result += 4;\n }\n else {\n throw new Error(INVALID_UTF16);\n }\n }\n return result;\n}\nexports.encodedLength = encodedLength;\n/**\n * Decodes the given byte array from UTF-8 into a string.\n * Throws if encoding is invalid.\n */\nfunction decode(arr) {\n var chars = [];\n for (var i = 0; i < arr.length; i++) {\n var b = arr[i];\n if (b & 0x80) {\n var min = void 0;\n if (b < 0xe0) {\n // Need 1 more byte.\n if (i >= arr.length) {\n throw new Error(INVALID_UTF8);\n }\n var n1 = arr[++i];\n if ((n1 & 0xc0) !== 0x80) {\n throw new Error(INVALID_UTF8);\n }\n b = (b & 0x1f) << 6 | (n1 & 0x3f);\n min = 0x80;\n }\n else if (b < 0xf0) {\n // Need 2 more bytes.\n if (i >= arr.length - 1) {\n throw new Error(INVALID_UTF8);\n }\n var n1 = arr[++i];\n var n2 = arr[++i];\n if ((n1 & 0xc0) !== 0x80 || (n2 & 0xc0) !== 0x80) {\n throw new Error(INVALID_UTF8);\n }\n b = (b & 0x0f) << 12 | (n1 & 0x3f) << 6 | (n2 & 0x3f);\n min = 0x800;\n }\n else if (b < 0xf8) {\n // Need 3 more bytes.\n if (i >= arr.length - 2) {\n throw new Error(INVALID_UTF8);\n }\n var n1 = arr[++i];\n var n2 = arr[++i];\n var n3 = arr[++i];\n if ((n1 & 0xc0) !== 0x80 || (n2 & 0xc0) !== 0x80 || (n3 & 0xc0) !== 0x80) {\n throw new Error(INVALID_UTF8);\n }\n b = (b & 0x0f) << 18 | (n1 & 0x3f) << 12 | (n2 & 0x3f) << 6 | (n3 & 0x3f);\n min = 0x10000;\n }\n else {\n throw new Error(INVALID_UTF8);\n }\n if (b < min || (b >= 0xd800 && b <= 0xdfff)) {\n throw new Error(INVALID_UTF8);\n }\n if (b >= 0x10000) {\n // Surrogate pair.\n if (b > 0x10ffff) {\n throw new Error(INVALID_UTF8);\n }\n b -= 0x10000;\n chars.push(String.fromCharCode(0xd800 | (b >> 10)));\n b = 0xdc00 | (b & 0x3ff);\n }\n }\n chars.push(String.fromCharCode(b));\n }\n return chars.join(\"\");\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// required so we don't have to do require('pusher').default etc.\nmodule.exports = __webpack_require__(3).default;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/script_receiver_factory.ts\nclass ScriptReceiverFactory {\n constructor(prefix, name) {\n this.lastId = 0;\n this.prefix = prefix;\n this.name = name;\n }\n create(callback) {\n this.lastId++;\n var number = this.lastId;\n var id = this.prefix + number;\n var name = this.name + '[' + number + ']';\n var called = false;\n var callbackWrapper = function () {\n if (!called) {\n callback.apply(null, arguments);\n called = true;\n }\n };\n this[number] = callbackWrapper;\n return { number: number, id: id, name: name, callback: callbackWrapper };\n }\n remove(receiver) {\n delete this[receiver.number];\n }\n}\nvar ScriptReceivers = new ScriptReceiverFactory('_pusher_script_', 'Pusher.ScriptReceivers');\n\n// CONCATENATED MODULE: ./src/core/defaults.ts\nvar Defaults = {\n VERSION: \"8.4.0\",\n PROTOCOL: 7,\n wsPort: 80,\n wssPort: 443,\n wsPath: '',\n httpHost: 'sockjs.pusher.com',\n httpPort: 80,\n httpsPort: 443,\n httpPath: '/pusher',\n stats_host: 'stats.pusher.com',\n authEndpoint: '/pusher/auth',\n authTransport: 'ajax',\n activityTimeout: 120000,\n pongTimeout: 30000,\n unavailableTimeout: 10000,\n userAuthentication: {\n endpoint: '/pusher/user-auth',\n transport: 'ajax',\n },\n channelAuthorization: {\n endpoint: '/pusher/auth',\n transport: 'ajax',\n },\n cdn_http: \"http://js.pusher.com\",\n cdn_https: \"https://js.pusher.com\",\n dependency_suffix: \"\",\n};\n/* harmony default export */ var defaults = (Defaults);\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/dependency_loader.ts\n\n\nclass dependency_loader_DependencyLoader {\n constructor(options) {\n this.options = options;\n this.receivers = options.receivers || ScriptReceivers;\n this.loading = {};\n }\n load(name, options, callback) {\n var self = this;\n if (self.loading[name] && self.loading[name].length > 0) {\n self.loading[name].push(callback);\n }\n else {\n self.loading[name] = [callback];\n var request = runtime.createScriptRequest(self.getPath(name, options));\n var receiver = self.receivers.create(function (error) {\n self.receivers.remove(receiver);\n if (self.loading[name]) {\n var callbacks = self.loading[name];\n delete self.loading[name];\n var successCallback = function (wasSuccessful) {\n if (!wasSuccessful) {\n request.cleanup();\n }\n };\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](error, successCallback);\n }\n }\n });\n request.send(receiver);\n }\n }\n getRoot(options) {\n var cdn;\n var protocol = runtime.getDocument().location.protocol;\n if ((options && options.useTLS) || protocol === 'https:') {\n cdn = this.options.cdn_https;\n }\n else {\n cdn = this.options.cdn_http;\n }\n return cdn.replace(/\\/*$/, '') + '/' + this.options.version;\n }\n getPath(name, options) {\n return this.getRoot(options) + '/' + name + this.options.suffix + '.js';\n }\n}\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/dependencies.ts\n\n\n\nvar DependenciesReceivers = new ScriptReceiverFactory('_pusher_dependencies', 'Pusher.DependenciesReceivers');\nvar Dependencies = new dependency_loader_DependencyLoader({\n cdn_http: defaults.cdn_http,\n cdn_https: defaults.cdn_https,\n version: defaults.VERSION,\n suffix: defaults.dependency_suffix,\n receivers: DependenciesReceivers,\n});\n\n// CONCATENATED MODULE: ./src/core/utils/url_store.ts\nconst urlStore = {\n baseUrl: 'https://pusher.com',\n urls: {\n authenticationEndpoint: {\n path: '/docs/channels/server_api/authenticating_users',\n },\n authorizationEndpoint: {\n path: '/docs/channels/server_api/authorizing-users/',\n },\n javascriptQuickStart: {\n path: '/docs/javascript_quick_start',\n },\n triggeringClientEvents: {\n path: '/docs/client_api_guide/client_events#trigger-events',\n },\n encryptedChannelSupport: {\n fullUrl: 'https://github.com/pusher/pusher-js/tree/cc491015371a4bde5743d1c87a0fbac0feb53195#encrypted-channel-support',\n },\n },\n};\nconst buildLogSuffix = function (key) {\n const urlPrefix = 'See:';\n const urlObj = urlStore.urls[key];\n if (!urlObj)\n return '';\n let url;\n if (urlObj.fullUrl) {\n url = urlObj.fullUrl;\n }\n else if (urlObj.path) {\n url = urlStore.baseUrl + urlObj.path;\n }\n if (!url)\n return '';\n return `${urlPrefix} ${url}`;\n};\n/* harmony default export */ var url_store = ({ buildLogSuffix });\n\n// CONCATENATED MODULE: ./src/core/auth/options.ts\nvar AuthRequestType;\n(function (AuthRequestType) {\n AuthRequestType[\"UserAuthentication\"] = \"user-authentication\";\n AuthRequestType[\"ChannelAuthorization\"] = \"channel-authorization\";\n})(AuthRequestType || (AuthRequestType = {}));\n\n// CONCATENATED MODULE: ./src/core/errors.ts\nclass BadEventName extends Error {\n constructor(msg) {\n super(msg);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nclass BadChannelName extends Error {\n constructor(msg) {\n super(msg);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nclass RequestTimedOut extends Error {\n constructor(msg) {\n super(msg);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nclass TransportPriorityTooLow extends Error {\n constructor(msg) {\n super(msg);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nclass TransportClosed extends Error {\n constructor(msg) {\n super(msg);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nclass UnsupportedFeature extends Error {\n constructor(msg) {\n super(msg);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nclass UnsupportedTransport extends Error {\n constructor(msg) {\n super(msg);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nclass UnsupportedStrategy extends Error {\n constructor(msg) {\n super(msg);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nclass HTTPAuthError extends Error {\n constructor(status, msg) {\n super(msg);\n this.status = status;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n// CONCATENATED MODULE: ./src/runtimes/isomorphic/auth/xhr_auth.ts\n\n\n\n\nconst ajax = function (context, query, authOptions, authRequestType, callback) {\n const xhr = runtime.createXHR();\n xhr.open('POST', authOptions.endpoint, true);\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n for (var headerName in authOptions.headers) {\n xhr.setRequestHeader(headerName, authOptions.headers[headerName]);\n }\n if (authOptions.headersProvider != null) {\n let dynamicHeaders = authOptions.headersProvider();\n for (var headerName in dynamicHeaders) {\n xhr.setRequestHeader(headerName, dynamicHeaders[headerName]);\n }\n }\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n let data;\n let parsed = false;\n try {\n data = JSON.parse(xhr.responseText);\n parsed = true;\n }\n catch (e) {\n callback(new HTTPAuthError(200, `JSON returned from ${authRequestType.toString()} endpoint was invalid, yet status code was 200. Data was: ${xhr.responseText}`), null);\n }\n if (parsed) {\n callback(null, data);\n }\n }\n else {\n let suffix = '';\n switch (authRequestType) {\n case AuthRequestType.UserAuthentication:\n suffix = url_store.buildLogSuffix('authenticationEndpoint');\n break;\n case AuthRequestType.ChannelAuthorization:\n suffix = `Clients must be authorized to join private or presence channels. ${url_store.buildLogSuffix('authorizationEndpoint')}`;\n break;\n }\n callback(new HTTPAuthError(xhr.status, `Unable to retrieve auth string from ${authRequestType.toString()} endpoint - ` +\n `received status: ${xhr.status} from ${authOptions.endpoint}. ${suffix}`), null);\n }\n }\n };\n xhr.send(query);\n return xhr;\n};\n/* harmony default export */ var xhr_auth = (ajax);\n\n// CONCATENATED MODULE: ./src/core/base64.ts\nfunction encode(s) {\n return btoa(utob(s));\n}\nvar fromCharCode = String.fromCharCode;\nvar b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nvar b64tab = {};\nfor (var base64_i = 0, l = b64chars.length; base64_i < l; base64_i++) {\n b64tab[b64chars.charAt(base64_i)] = base64_i;\n}\nvar cb_utob = function (c) {\n var cc = c.charCodeAt(0);\n return cc < 0x80\n ? c\n : cc < 0x800\n ? fromCharCode(0xc0 | (cc >>> 6)) + fromCharCode(0x80 | (cc & 0x3f))\n : fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) +\n fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) +\n fromCharCode(0x80 | (cc & 0x3f));\n};\nvar utob = function (u) {\n return u.replace(/[^\\x00-\\x7F]/g, cb_utob);\n};\nvar cb_encode = function (ccc) {\n var padlen = [0, 2, 1][ccc.length % 3];\n var ord = (ccc.charCodeAt(0) << 16) |\n ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) |\n (ccc.length > 2 ? ccc.charCodeAt(2) : 0);\n var chars = [\n b64chars.charAt(ord >>> 18),\n b64chars.charAt((ord >>> 12) & 63),\n padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),\n padlen >= 1 ? '=' : b64chars.charAt(ord & 63),\n ];\n return chars.join('');\n};\nvar btoa = window.btoa ||\n function (b) {\n return b.replace(/[\\s\\S]{1,3}/g, cb_encode);\n };\n\n// CONCATENATED MODULE: ./src/core/utils/timers/abstract_timer.ts\nclass Timer {\n constructor(set, clear, delay, callback) {\n this.clear = clear;\n this.timer = set(() => {\n if (this.timer) {\n this.timer = callback(this.timer);\n }\n }, delay);\n }\n isRunning() {\n return this.timer !== null;\n }\n ensureAborted() {\n if (this.timer) {\n this.clear(this.timer);\n this.timer = null;\n }\n }\n}\n/* harmony default export */ var abstract_timer = (Timer);\n\n// CONCATENATED MODULE: ./src/core/utils/timers/index.ts\n\nfunction timers_clearTimeout(timer) {\n window.clearTimeout(timer);\n}\nfunction timers_clearInterval(timer) {\n window.clearInterval(timer);\n}\nclass timers_OneOffTimer extends abstract_timer {\n constructor(delay, callback) {\n super(setTimeout, timers_clearTimeout, delay, function (timer) {\n callback();\n return null;\n });\n }\n}\nclass timers_PeriodicTimer extends abstract_timer {\n constructor(delay, callback) {\n super(setInterval, timers_clearInterval, delay, function (timer) {\n callback();\n return timer;\n });\n }\n}\n\n// CONCATENATED MODULE: ./src/core/util.ts\n\nvar Util = {\n now() {\n if (Date.now) {\n return Date.now();\n }\n else {\n return new Date().valueOf();\n }\n },\n defer(callback) {\n return new timers_OneOffTimer(0, callback);\n },\n method(name, ...args) {\n var boundArguments = Array.prototype.slice.call(arguments, 1);\n return function (object) {\n return object[name].apply(object, boundArguments.concat(arguments));\n };\n },\n};\n/* harmony default export */ var util = (Util);\n\n// CONCATENATED MODULE: ./src/core/utils/collections.ts\n\n\nfunction extend(target, ...sources) {\n for (var i = 0; i < sources.length; i++) {\n var extensions = sources[i];\n for (var property in extensions) {\n if (extensions[property] &&\n extensions[property].constructor &&\n extensions[property].constructor === Object) {\n target[property] = extend(target[property] || {}, extensions[property]);\n }\n else {\n target[property] = extensions[property];\n }\n }\n }\n return target;\n}\nfunction stringify() {\n var m = ['Pusher'];\n for (var i = 0; i < arguments.length; i++) {\n if (typeof arguments[i] === 'string') {\n m.push(arguments[i]);\n }\n else {\n m.push(safeJSONStringify(arguments[i]));\n }\n }\n return m.join(' : ');\n}\nfunction arrayIndexOf(array, item) {\n var nativeIndexOf = Array.prototype.indexOf;\n if (array === null) {\n return -1;\n }\n if (nativeIndexOf && array.indexOf === nativeIndexOf) {\n return array.indexOf(item);\n }\n for (var i = 0, l = array.length; i < l; i++) {\n if (array[i] === item) {\n return i;\n }\n }\n return -1;\n}\nfunction objectApply(object, f) {\n for (var key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n f(object[key], key, object);\n }\n }\n}\nfunction keys(object) {\n var keys = [];\n objectApply(object, function (_, key) {\n keys.push(key);\n });\n return keys;\n}\nfunction values(object) {\n var values = [];\n objectApply(object, function (value) {\n values.push(value);\n });\n return values;\n}\nfunction apply(array, f, context) {\n for (var i = 0; i < array.length; i++) {\n f.call(context || window, array[i], i, array);\n }\n}\nfunction map(array, f) {\n var result = [];\n for (var i = 0; i < array.length; i++) {\n result.push(f(array[i], i, array, result));\n }\n return result;\n}\nfunction mapObject(object, f) {\n var result = {};\n objectApply(object, function (value, key) {\n result[key] = f(value);\n });\n return result;\n}\nfunction filter(array, test) {\n test =\n test ||\n function (value) {\n return !!value;\n };\n var result = [];\n for (var i = 0; i < array.length; i++) {\n if (test(array[i], i, array, result)) {\n result.push(array[i]);\n }\n }\n return result;\n}\nfunction filterObject(object, test) {\n var result = {};\n objectApply(object, function (value, key) {\n if ((test && test(value, key, object, result)) || Boolean(value)) {\n result[key] = value;\n }\n });\n return result;\n}\nfunction flatten(object) {\n var result = [];\n objectApply(object, function (value, key) {\n result.push([key, value]);\n });\n return result;\n}\nfunction any(array, test) {\n for (var i = 0; i < array.length; i++) {\n if (test(array[i], i, array)) {\n return true;\n }\n }\n return false;\n}\nfunction collections_all(array, test) {\n for (var i = 0; i < array.length; i++) {\n if (!test(array[i], i, array)) {\n return false;\n }\n }\n return true;\n}\nfunction encodeParamsObject(data) {\n return mapObject(data, function (value) {\n if (typeof value === 'object') {\n value = safeJSONStringify(value);\n }\n return encodeURIComponent(encode(value.toString()));\n });\n}\nfunction buildQueryString(data) {\n var params = filterObject(data, function (value) {\n return value !== undefined;\n });\n var query = map(flatten(encodeParamsObject(params)), util.method('join', '=')).join('&');\n return query;\n}\nfunction decycleObject(object) {\n var objects = [], paths = [];\n return (function derez(value, path) {\n var i, name, nu;\n switch (typeof value) {\n case 'object':\n if (!value) {\n return null;\n }\n for (i = 0; i < objects.length; i += 1) {\n if (objects[i] === value) {\n return { $ref: paths[i] };\n }\n }\n objects.push(value);\n paths.push(path);\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n nu = [];\n for (i = 0; i < value.length; i += 1) {\n nu[i] = derez(value[i], path + '[' + i + ']');\n }\n }\n else {\n nu = {};\n for (name in value) {\n if (Object.prototype.hasOwnProperty.call(value, name)) {\n nu[name] = derez(value[name], path + '[' + JSON.stringify(name) + ']');\n }\n }\n }\n return nu;\n case 'number':\n case 'string':\n case 'boolean':\n return value;\n }\n })(object, '$');\n}\nfunction safeJSONStringify(source) {\n try {\n return JSON.stringify(source);\n }\n catch (e) {\n return JSON.stringify(decycleObject(source));\n }\n}\n\n// CONCATENATED MODULE: ./src/core/logger.ts\n\n\nclass logger_Logger {\n constructor() {\n this.globalLog = (message) => {\n if (window.console && window.console.log) {\n window.console.log(message);\n }\n };\n }\n debug(...args) {\n this.log(this.globalLog, args);\n }\n warn(...args) {\n this.log(this.globalLogWarn, args);\n }\n error(...args) {\n this.log(this.globalLogError, args);\n }\n globalLogWarn(message) {\n if (window.console && window.console.warn) {\n window.console.warn(message);\n }\n else {\n this.globalLog(message);\n }\n }\n globalLogError(message) {\n if (window.console && window.console.error) {\n window.console.error(message);\n }\n else {\n this.globalLogWarn(message);\n }\n }\n log(defaultLoggingFunction, ...args) {\n var message = stringify.apply(this, arguments);\n if (core_pusher.log) {\n core_pusher.log(message);\n }\n else if (core_pusher.logToConsole) {\n const log = defaultLoggingFunction.bind(this);\n log(message);\n }\n }\n}\n/* harmony default export */ var logger = (new logger_Logger());\n\n// CONCATENATED MODULE: ./src/runtimes/web/auth/jsonp_auth.ts\n\nvar jsonp = function (context, query, authOptions, authRequestType, callback) {\n if (authOptions.headers !== undefined ||\n authOptions.headersProvider != null) {\n logger.warn(`To send headers with the ${authRequestType.toString()} request, you must use AJAX, rather than JSONP.`);\n }\n var callbackName = context.nextAuthCallbackID.toString();\n context.nextAuthCallbackID++;\n var document = context.getDocument();\n var script = document.createElement('script');\n context.auth_callbacks[callbackName] = function (data) {\n callback(null, data);\n };\n var callback_name = \"Pusher.auth_callbacks['\" + callbackName + \"']\";\n script.src =\n authOptions.endpoint +\n '?callback=' +\n encodeURIComponent(callback_name) +\n '&' +\n query;\n var head = document.getElementsByTagName('head')[0] || document.documentElement;\n head.insertBefore(script, head.firstChild);\n};\n/* harmony default export */ var jsonp_auth = (jsonp);\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/script_request.ts\nclass ScriptRequest {\n constructor(src) {\n this.src = src;\n }\n send(receiver) {\n var self = this;\n var errorString = 'Error loading ' + self.src;\n self.script = document.createElement('script');\n self.script.id = receiver.id;\n self.script.src = self.src;\n self.script.type = 'text/javascript';\n self.script.charset = 'UTF-8';\n if (self.script.addEventListener) {\n self.script.onerror = function () {\n receiver.callback(errorString);\n };\n self.script.onload = function () {\n receiver.callback(null);\n };\n }\n else {\n self.script.onreadystatechange = function () {\n if (self.script.readyState === 'loaded' ||\n self.script.readyState === 'complete') {\n receiver.callback(null);\n }\n };\n }\n if (self.script.async === undefined &&\n document.attachEvent &&\n /opera/i.test(navigator.userAgent)) {\n self.errorScript = document.createElement('script');\n self.errorScript.id = receiver.id + '_error';\n self.errorScript.text = receiver.name + \"('\" + errorString + \"');\";\n self.script.async = self.errorScript.async = false;\n }\n else {\n self.script.async = true;\n }\n var head = document.getElementsByTagName('head')[0];\n head.insertBefore(self.script, head.firstChild);\n if (self.errorScript) {\n head.insertBefore(self.errorScript, self.script.nextSibling);\n }\n }\n cleanup() {\n if (this.script) {\n this.script.onload = this.script.onerror = null;\n this.script.onreadystatechange = null;\n }\n if (this.script && this.script.parentNode) {\n this.script.parentNode.removeChild(this.script);\n }\n if (this.errorScript && this.errorScript.parentNode) {\n this.errorScript.parentNode.removeChild(this.errorScript);\n }\n this.script = null;\n this.errorScript = null;\n }\n}\n\n// CONCATENATED MODULE: ./src/runtimes/web/dom/jsonp_request.ts\n\n\nclass jsonp_request_JSONPRequest {\n constructor(url, data) {\n this.url = url;\n this.data = data;\n }\n send(receiver) {\n if (this.request) {\n return;\n }\n var query = buildQueryString(this.data);\n var url = this.url + '/' + receiver.number + '?' + query;\n this.request = runtime.createScriptRequest(url);\n this.request.send(receiver);\n }\n cleanup() {\n if (this.request) {\n this.request.cleanup();\n }\n }\n}\n\n// CONCATENATED MODULE: ./src/runtimes/web/timeline/jsonp_timeline.ts\n\n\nvar getAgent = function (sender, useTLS) {\n return function (data, callback) {\n var scheme = 'http' + (useTLS ? 's' : '') + '://';\n var url = scheme + (sender.host || sender.options.host) + sender.options.path;\n var request = runtime.createJSONPRequest(url, data);\n var receiver = runtime.ScriptReceivers.create(function (error, result) {\n ScriptReceivers.remove(receiver);\n request.cleanup();\n if (result && result.host) {\n sender.host = result.host;\n }\n if (callback) {\n callback(error, result);\n }\n });\n request.send(receiver);\n };\n};\nvar jsonp_timeline_jsonp = {\n name: 'jsonp',\n getAgent,\n};\n/* harmony default export */ var jsonp_timeline = (jsonp_timeline_jsonp);\n\n// CONCATENATED MODULE: ./src/core/transports/url_schemes.ts\n\nfunction getGenericURL(baseScheme, params, path) {\n var scheme = baseScheme + (params.useTLS ? 's' : '');\n var host = params.useTLS ? params.hostTLS : params.hostNonTLS;\n return scheme + '://' + host + path;\n}\nfunction getGenericPath(key, queryString) {\n var path = '/app/' + key;\n var query = '?protocol=' +\n defaults.PROTOCOL +\n '&client=js' +\n '&version=' +\n defaults.VERSION +\n (queryString ? '&' + queryString : '');\n return path + query;\n}\nvar ws = {\n getInitial: function (key, params) {\n var path = (params.httpPath || '') + getGenericPath(key, 'flash=false');\n return getGenericURL('ws', params, path);\n },\n};\nvar http = {\n getInitial: function (key, params) {\n var path = (params.httpPath || '/pusher') + getGenericPath(key);\n return getGenericURL('http', params, path);\n },\n};\nvar sockjs = {\n getInitial: function (key, params) {\n return getGenericURL('http', params, params.httpPath || '/pusher');\n },\n getPath: function (key, params) {\n return getGenericPath(key);\n },\n};\n\n// CONCATENATED MODULE: ./src/core/events/callback_registry.ts\n\nclass callback_registry_CallbackRegistry {\n constructor() {\n this._callbacks = {};\n }\n get(name) {\n return this._callbacks[prefix(name)];\n }\n add(name, callback, context) {\n var prefixedEventName = prefix(name);\n this._callbacks[prefixedEventName] =\n this._callbacks[prefixedEventName] || [];\n this._callbacks[prefixedEventName].push({\n fn: callback,\n context: context,\n });\n }\n remove(name, callback, context) {\n if (!name && !callback && !context) {\n this._callbacks = {};\n return;\n }\n var names = name ? [prefix(name)] : keys(this._callbacks);\n if (callback || context) {\n this.removeCallback(names, callback, context);\n }\n else {\n this.removeAllCallbacks(names);\n }\n }\n removeCallback(names, callback, context) {\n apply(names, function (name) {\n this._callbacks[name] = filter(this._callbacks[name] || [], function (binding) {\n return ((callback && callback !== binding.fn) ||\n (context && context !== binding.context));\n });\n if (this._callbacks[name].length === 0) {\n delete this._callbacks[name];\n }\n }, this);\n }\n removeAllCallbacks(names) {\n apply(names, function (name) {\n delete this._callbacks[name];\n }, this);\n }\n}\nfunction prefix(name) {\n return '_' + name;\n}\n\n// CONCATENATED MODULE: ./src/core/events/dispatcher.ts\n\n\nclass dispatcher_Dispatcher {\n constructor(failThrough) {\n this.callbacks = new callback_registry_CallbackRegistry();\n this.global_callbacks = [];\n this.failThrough = failThrough;\n }\n bind(eventName, callback, context) {\n this.callbacks.add(eventName, callback, context);\n return this;\n }\n bind_global(callback) {\n this.global_callbacks.push(callback);\n return this;\n }\n unbind(eventName, callback, context) {\n this.callbacks.remove(eventName, callback, context);\n return this;\n }\n unbind_global(callback) {\n if (!callback) {\n this.global_callbacks = [];\n return this;\n }\n this.global_callbacks = filter(this.global_callbacks || [], (c) => c !== callback);\n return this;\n }\n unbind_all() {\n this.unbind();\n this.unbind_global();\n return this;\n }\n emit(eventName, data, metadata) {\n for (var i = 0; i < this.global_callbacks.length; i++) {\n this.global_callbacks[i](eventName, data);\n }\n var callbacks = this.callbacks.get(eventName);\n var args = [];\n if (metadata) {\n args.push(data, metadata);\n }\n else if (data) {\n args.push(data);\n }\n if (callbacks && callbacks.length > 0) {\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i].fn.apply(callbacks[i].context || window, args);\n }\n }\n else if (this.failThrough) {\n this.failThrough(eventName, data);\n }\n return this;\n }\n}\n\n// CONCATENATED MODULE: ./src/core/transports/transport_connection.ts\n\n\n\n\n\nclass transport_connection_TransportConnection extends dispatcher_Dispatcher {\n constructor(hooks, name, priority, key, options) {\n super();\n this.initialize = runtime.transportConnectionInitializer;\n this.hooks = hooks;\n this.name = name;\n this.priority = priority;\n this.key = key;\n this.options = options;\n this.state = 'new';\n this.timeline = options.timeline;\n this.activityTimeout = options.activityTimeout;\n this.id = this.timeline.generateUniqueID();\n }\n handlesActivityChecks() {\n return Boolean(this.hooks.handlesActivityChecks);\n }\n supportsPing() {\n return Boolean(this.hooks.supportsPing);\n }\n connect() {\n if (this.socket || this.state !== 'initialized') {\n return false;\n }\n var url = this.hooks.urls.getInitial(this.key, this.options);\n try {\n this.socket = this.hooks.getSocket(url, this.options);\n }\n catch (e) {\n util.defer(() => {\n this.onError(e);\n this.changeState('closed');\n });\n return false;\n }\n this.bindListeners();\n logger.debug('Connecting', { transport: this.name, url });\n this.changeState('connecting');\n return true;\n }\n close() {\n if (this.socket) {\n this.socket.close();\n return true;\n }\n else {\n return false;\n }\n }\n send(data) {\n if (this.state === 'open') {\n util.defer(() => {\n if (this.socket) {\n this.socket.send(data);\n }\n });\n return true;\n }\n else {\n return false;\n }\n }\n ping() {\n if (this.state === 'open' && this.supportsPing()) {\n this.socket.ping();\n }\n }\n onOpen() {\n if (this.hooks.beforeOpen) {\n this.hooks.beforeOpen(this.socket, this.hooks.urls.getPath(this.key, this.options));\n }\n this.changeState('open');\n this.socket.onopen = undefined;\n }\n onError(error) {\n this.emit('error', { type: 'WebSocketError', error: error });\n this.timeline.error(this.buildTimelineMessage({ error: error.toString() }));\n }\n onClose(closeEvent) {\n if (closeEvent) {\n this.changeState('closed', {\n code: closeEvent.code,\n reason: closeEvent.reason,\n wasClean: closeEvent.wasClean,\n });\n }\n else {\n this.changeState('closed');\n }\n this.unbindListeners();\n this.socket = undefined;\n }\n onMessage(message) {\n this.emit('message', message);\n }\n onActivity() {\n this.emit('activity');\n }\n bindListeners() {\n this.socket.onopen = () => {\n this.onOpen();\n };\n this.socket.onerror = (error) => {\n this.onError(error);\n };\n this.socket.onclose = (closeEvent) => {\n this.onClose(closeEvent);\n };\n this.socket.onmessage = (message) => {\n this.onMessage(message);\n };\n if (this.supportsPing()) {\n this.socket.onactivity = () => {\n this.onActivity();\n };\n }\n }\n unbindListeners() {\n if (this.socket) {\n this.socket.onopen = undefined;\n this.socket.onerror = undefined;\n this.socket.onclose = undefined;\n this.socket.onmessage = undefined;\n if (this.supportsPing()) {\n this.socket.onactivity = undefined;\n }\n }\n }\n changeState(state, params) {\n this.state = state;\n this.timeline.info(this.buildTimelineMessage({\n state: state,\n params: params,\n }));\n this.emit(state, params);\n }\n buildTimelineMessage(message) {\n return extend({ cid: this.id }, message);\n }\n}\n\n// CONCATENATED MODULE: ./src/core/transports/transport.ts\n\nclass transport_Transport {\n constructor(hooks) {\n this.hooks = hooks;\n }\n isSupported(environment) {\n return this.hooks.isSupported(environment);\n }\n createConnection(name, priority, key, options) {\n return new transport_connection_TransportConnection(this.hooks, name, priority, key, options);\n }\n}\n\n// CONCATENATED MODULE: ./src/runtimes/isomorphic/transports/transports.ts\n\n\n\n\nvar WSTransport = new transport_Transport({\n urls: ws,\n handlesActivityChecks: false,\n supportsPing: false,\n isInitialized: function () {\n return Boolean(runtime.getWebSocketAPI());\n },\n isSupported: function () {\n return Boolean(runtime.getWebSocketAPI());\n },\n getSocket: function (url) {\n return runtime.createWebSocket(url);\n },\n});\nvar httpConfiguration = {\n urls: http,\n handlesActivityChecks: false,\n supportsPing: true,\n isInitialized: function () {\n return true;\n },\n};\nvar streamingConfiguration = extend({\n getSocket: function (url) {\n return runtime.HTTPFactory.createStreamingSocket(url);\n },\n}, httpConfiguration);\nvar pollingConfiguration = extend({\n getSocket: function (url) {\n return runtime.HTTPFactory.createPollingSocket(url);\n },\n}, httpConfiguration);\nvar xhrConfiguration = {\n isSupported: function () {\n return runtime.isXHRSupported();\n },\n};\nvar XHRStreamingTransport = new transport_Transport((extend({}, streamingConfiguration, xhrConfiguration)));\nvar XHRPollingTransport = new transport_Transport((extend({}, pollingConfiguration, xhrConfiguration)));\nvar Transports = {\n ws: WSTransport,\n xhr_streaming: XHRStreamingTransport,\n xhr_polling: XHRPollingTransport,\n};\n/* harmony default export */ var transports = (Transports);\n\n// CONCATENATED MODULE: ./src/runtimes/web/transports/transports.ts\n\n\n\n\n\n\nvar SockJSTransport = new transport_Transport({\n file: 'sockjs',\n urls: sockjs,\n handlesActivityChecks: true,\n supportsPing: false,\n isSupported: function () {\n return true;\n },\n isInitialized: function () {\n return window.SockJS !== undefined;\n },\n getSocket: function (url, options) {\n return new window.SockJS(url, null, {\n js_path: Dependencies.getPath('sockjs', {\n useTLS: options.useTLS,\n }),\n ignore_null_origin: options.ignoreNullOrigin,\n });\n },\n beforeOpen: function (socket, path) {\n socket.send(JSON.stringify({\n path: path,\n }));\n },\n});\nvar xdrConfiguration = {\n isSupported: function (environment) {\n var yes = runtime.isXDRSupported(environment.useTLS);\n return yes;\n },\n};\nvar XDRStreamingTransport = new transport_Transport((extend({}, streamingConfiguration, xdrConfiguration)));\nvar XDRPollingTransport = new transport_Transport((extend({}, pollingConfiguration, xdrConfiguration)));\ntransports.xdr_streaming = XDRStreamingTransport;\ntransports.xdr_polling = XDRPollingTransport;\ntransports.sockjs = SockJSTransport;\n/* harmony default export */ var transports_transports = (transports);\n\n// CONCATENATED MODULE: ./src/runtimes/web/net_info.ts\n\nclass net_info_NetInfo extends dispatcher_Dispatcher {\n constructor() {\n super();\n var self = this;\n if (window.addEventListener !== undefined) {\n window.addEventListener('online', function () {\n self.emit('online');\n }, false);\n window.addEventListener('offline', function () {\n self.emit('offline');\n }, false);\n }\n }\n isOnline() {\n if (window.navigator.onLine === undefined) {\n return true;\n }\n else {\n return window.navigator.onLine;\n }\n }\n}\nvar net_info_Network = new net_info_NetInfo();\n\n// CONCATENATED MODULE: ./src/core/transports/assistant_to_the_transport_manager.ts\n\n\nclass assistant_to_the_transport_manager_AssistantToTheTransportManager {\n constructor(manager, transport, options) {\n this.manager = manager;\n this.transport = transport;\n this.minPingDelay = options.minPingDelay;\n this.maxPingDelay = options.maxPingDelay;\n this.pingDelay = undefined;\n }\n createConnection(name, priority, key, options) {\n options = extend({}, options, {\n activityTimeout: this.pingDelay,\n });\n var connection = this.transport.createConnection(name, priority, key, options);\n var openTimestamp = null;\n var onOpen = function () {\n connection.unbind('open', onOpen);\n connection.bind('closed', onClosed);\n openTimestamp = util.now();\n };\n var onClosed = (closeEvent) => {\n connection.unbind('closed', onClosed);\n if (closeEvent.code === 1002 || closeEvent.code === 1003) {\n this.manager.reportDeath();\n }\n else if (!closeEvent.wasClean && openTimestamp) {\n var lifespan = util.now() - openTimestamp;\n if (lifespan < 2 * this.maxPingDelay) {\n this.manager.reportDeath();\n this.pingDelay = Math.max(lifespan / 2, this.minPingDelay);\n }\n }\n };\n connection.bind('open', onOpen);\n return connection;\n }\n isSupported(environment) {\n return this.manager.isAlive() && this.transport.isSupported(environment);\n }\n}\n\n// CONCATENATED MODULE: ./src/core/connection/protocol/protocol.ts\nconst Protocol = {\n decodeMessage: function (messageEvent) {\n try {\n var messageData = JSON.parse(messageEvent.data);\n var pusherEventData = messageData.data;\n if (typeof pusherEventData === 'string') {\n try {\n pusherEventData = JSON.parse(messageData.data);\n }\n catch (e) { }\n }\n var pusherEvent = {\n event: messageData.event,\n channel: messageData.channel,\n data: pusherEventData,\n };\n if (messageData.user_id) {\n pusherEvent.user_id = messageData.user_id;\n }\n return pusherEvent;\n }\n catch (e) {\n throw { type: 'MessageParseError', error: e, data: messageEvent.data };\n }\n },\n encodeMessage: function (event) {\n return JSON.stringify(event);\n },\n processHandshake: function (messageEvent) {\n var message = Protocol.decodeMessage(messageEvent);\n if (message.event === 'pusher:connection_established') {\n if (!message.data.activity_timeout) {\n throw 'No activity timeout specified in handshake';\n }\n return {\n action: 'connected',\n id: message.data.socket_id,\n activityTimeout: message.data.activity_timeout * 1000,\n };\n }\n else if (message.event === 'pusher:error') {\n return {\n action: this.getCloseAction(message.data),\n error: this.getCloseError(message.data),\n };\n }\n else {\n throw 'Invalid handshake';\n }\n },\n getCloseAction: function (closeEvent) {\n if (closeEvent.code < 4000) {\n if (closeEvent.code >= 1002 && closeEvent.code <= 1004) {\n return 'backoff';\n }\n else {\n return null;\n }\n }\n else if (closeEvent.code === 4000) {\n return 'tls_only';\n }\n else if (closeEvent.code < 4100) {\n return 'refused';\n }\n else if (closeEvent.code < 4200) {\n return 'backoff';\n }\n else if (closeEvent.code < 4300) {\n return 'retry';\n }\n else {\n return 'refused';\n }\n },\n getCloseError: function (closeEvent) {\n if (closeEvent.code !== 1000 && closeEvent.code !== 1001) {\n return {\n type: 'PusherError',\n data: {\n code: closeEvent.code,\n message: closeEvent.reason || closeEvent.message,\n },\n };\n }\n else {\n return null;\n }\n },\n};\n/* harmony default export */ var protocol_protocol = (Protocol);\n\n// CONCATENATED MODULE: ./src/core/connection/connection.ts\n\n\n\n\nclass connection_Connection extends dispatcher_Dispatcher {\n constructor(id, transport) {\n super();\n this.id = id;\n this.transport = transport;\n this.activityTimeout = transport.activityTimeout;\n this.bindListeners();\n }\n handlesActivityChecks() {\n return this.transport.handlesActivityChecks();\n }\n send(data) {\n return this.transport.send(data);\n }\n send_event(name, data, channel) {\n var event = { event: name, data: data };\n if (channel) {\n event.channel = channel;\n }\n logger.debug('Event sent', event);\n return this.send(protocol_protocol.encodeMessage(event));\n }\n ping() {\n if (this.transport.supportsPing()) {\n this.transport.ping();\n }\n else {\n this.send_event('pusher:ping', {});\n }\n }\n close() {\n this.transport.close();\n }\n bindListeners() {\n var listeners = {\n message: (messageEvent) => {\n var pusherEvent;\n try {\n pusherEvent = protocol_protocol.decodeMessage(messageEvent);\n }\n catch (e) {\n this.emit('error', {\n type: 'MessageParseError',\n error: e,\n data: messageEvent.data,\n });\n }\n if (pusherEvent !== undefined) {\n logger.debug('Event recd', pusherEvent);\n switch (pusherEvent.event) {\n case 'pusher:error':\n this.emit('error', {\n type: 'PusherError',\n data: pusherEvent.data,\n });\n break;\n case 'pusher:ping':\n this.emit('ping');\n break;\n case 'pusher:pong':\n this.emit('pong');\n break;\n }\n this.emit('message', pusherEvent);\n }\n },\n activity: () => {\n this.emit('activity');\n },\n error: (error) => {\n this.emit('error', error);\n },\n closed: (closeEvent) => {\n unbindListeners();\n if (closeEvent && closeEvent.code) {\n this.handleCloseEvent(closeEvent);\n }\n this.transport = null;\n this.emit('closed');\n },\n };\n var unbindListeners = () => {\n objectApply(listeners, (listener, event) => {\n this.transport.unbind(event, listener);\n });\n };\n objectApply(listeners, (listener, event) => {\n this.transport.bind(event, listener);\n });\n }\n handleCloseEvent(closeEvent) {\n var action = protocol_protocol.getCloseAction(closeEvent);\n var error = protocol_protocol.getCloseError(closeEvent);\n if (error) {\n this.emit('error', error);\n }\n if (action) {\n this.emit(action, { action: action, error: error });\n }\n }\n}\n\n// CONCATENATED MODULE: ./src/core/connection/handshake/index.ts\n\n\n\nclass handshake_Handshake {\n constructor(transport, callback) {\n this.transport = transport;\n this.callback = callback;\n this.bindListeners();\n }\n close() {\n this.unbindListeners();\n this.transport.close();\n }\n bindListeners() {\n this.onMessage = (m) => {\n this.unbindListeners();\n var result;\n try {\n result = protocol_protocol.processHandshake(m);\n }\n catch (e) {\n this.finish('error', { error: e });\n this.transport.close();\n return;\n }\n if (result.action === 'connected') {\n this.finish('connected', {\n connection: new connection_Connection(result.id, this.transport),\n activityTimeout: result.activityTimeout,\n });\n }\n else {\n this.finish(result.action, { error: result.error });\n this.transport.close();\n }\n };\n this.onClosed = (closeEvent) => {\n this.unbindListeners();\n var action = protocol_protocol.getCloseAction(closeEvent) || 'backoff';\n var error = protocol_protocol.getCloseError(closeEvent);\n this.finish(action, { error: error });\n };\n this.transport.bind('message', this.onMessage);\n this.transport.bind('closed', this.onClosed);\n }\n unbindListeners() {\n this.transport.unbind('message', this.onMessage);\n this.transport.unbind('closed', this.onClosed);\n }\n finish(action, params) {\n this.callback(extend({ transport: this.transport, action: action }, params));\n }\n}\n\n// CONCATENATED MODULE: ./src/core/timeline/timeline_sender.ts\n\nclass timeline_sender_TimelineSender {\n constructor(timeline, options) {\n this.timeline = timeline;\n this.options = options || {};\n }\n send(useTLS, callback) {\n if (this.timeline.isEmpty()) {\n return;\n }\n this.timeline.send(runtime.TimelineTransport.getAgent(this, useTLS), callback);\n }\n}\n\n// CONCATENATED MODULE: ./src/core/channels/channel.ts\n\n\n\n\n\nclass channel_Channel extends dispatcher_Dispatcher {\n constructor(name, pusher) {\n super(function (event, data) {\n logger.debug('No callbacks on ' + name + ' for ' + event);\n });\n this.name = name;\n this.pusher = pusher;\n this.subscribed = false;\n this.subscriptionPending = false;\n this.subscriptionCancelled = false;\n }\n authorize(socketId, callback) {\n return callback(null, { auth: '' });\n }\n trigger(event, data) {\n if (event.indexOf('client-') !== 0) {\n throw new BadEventName(\"Event '\" + event + \"' does not start with 'client-'\");\n }\n if (!this.subscribed) {\n var suffix = url_store.buildLogSuffix('triggeringClientEvents');\n logger.warn(`Client event triggered before channel 'subscription_succeeded' event . ${suffix}`);\n }\n return this.pusher.send_event(event, data, this.name);\n }\n disconnect() {\n this.subscribed = false;\n this.subscriptionPending = false;\n }\n handleEvent(event) {\n var eventName = event.event;\n var data = event.data;\n if (eventName === 'pusher_internal:subscription_succeeded') {\n this.handleSubscriptionSucceededEvent(event);\n }\n else if (eventName === 'pusher_internal:subscription_count') {\n this.handleSubscriptionCountEvent(event);\n }\n else if (eventName.indexOf('pusher_internal:') !== 0) {\n var metadata = {};\n this.emit(eventName, data, metadata);\n }\n }\n handleSubscriptionSucceededEvent(event) {\n this.subscriptionPending = false;\n this.subscribed = true;\n if (this.subscriptionCancelled) {\n this.pusher.unsubscribe(this.name);\n }\n else {\n this.emit('pusher:subscription_succeeded', event.data);\n }\n }\n handleSubscriptionCountEvent(event) {\n if (event.data.subscription_count) {\n this.subscriptionCount = event.data.subscription_count;\n }\n this.emit('pusher:subscription_count', event.data);\n }\n subscribe() {\n if (this.subscribed) {\n return;\n }\n this.subscriptionPending = true;\n this.subscriptionCancelled = false;\n this.authorize(this.pusher.connection.socket_id, (error, data) => {\n if (error) {\n this.subscriptionPending = false;\n logger.error(error.toString());\n this.emit('pusher:subscription_error', Object.assign({}, {\n type: 'AuthError',\n error: error.message,\n }, error instanceof HTTPAuthError ? { status: error.status } : {}));\n }\n else {\n this.pusher.send_event('pusher:subscribe', {\n auth: data.auth,\n channel_data: data.channel_data,\n channel: this.name,\n });\n }\n });\n }\n unsubscribe() {\n this.subscribed = false;\n this.pusher.send_event('pusher:unsubscribe', {\n channel: this.name,\n });\n }\n cancelSubscription() {\n this.subscriptionCancelled = true;\n }\n reinstateSubscription() {\n this.subscriptionCancelled = false;\n }\n}\n\n// CONCATENATED MODULE: ./src/core/channels/private_channel.ts\n\nclass private_channel_PrivateChannel extends channel_Channel {\n authorize(socketId, callback) {\n return this.pusher.config.channelAuthorizer({\n channelName: this.name,\n socketId: socketId,\n }, callback);\n }\n}\n\n// CONCATENATED MODULE: ./src/core/channels/members.ts\n\nclass members_Members {\n constructor() {\n this.reset();\n }\n get(id) {\n if (Object.prototype.hasOwnProperty.call(this.members, id)) {\n return {\n id: id,\n info: this.members[id],\n };\n }\n else {\n return null;\n }\n }\n each(callback) {\n objectApply(this.members, (member, id) => {\n callback(this.get(id));\n });\n }\n setMyID(id) {\n this.myID = id;\n }\n onSubscription(subscriptionData) {\n this.members = subscriptionData.presence.hash;\n this.count = subscriptionData.presence.count;\n this.me = this.get(this.myID);\n }\n addMember(memberData) {\n if (this.get(memberData.user_id) === null) {\n this.count++;\n }\n this.members[memberData.user_id] = memberData.user_info;\n return this.get(memberData.user_id);\n }\n removeMember(memberData) {\n var member = this.get(memberData.user_id);\n if (member) {\n delete this.members[memberData.user_id];\n this.count--;\n }\n return member;\n }\n reset() {\n this.members = {};\n this.count = 0;\n this.myID = null;\n this.me = null;\n }\n}\n\n// CONCATENATED MODULE: ./src/core/channels/presence_channel.ts\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\nclass presence_channel_PresenceChannel extends private_channel_PrivateChannel {\n constructor(name, pusher) {\n super(name, pusher);\n this.members = new members_Members();\n }\n authorize(socketId, callback) {\n super.authorize(socketId, (error, authData) => __awaiter(this, void 0, void 0, function* () {\n if (!error) {\n authData = authData;\n if (authData.channel_data != null) {\n var channelData = JSON.parse(authData.channel_data);\n this.members.setMyID(channelData.user_id);\n }\n else {\n yield this.pusher.user.signinDonePromise;\n if (this.pusher.user.user_data != null) {\n this.members.setMyID(this.pusher.user.user_data.id);\n }\n else {\n let suffix = url_store.buildLogSuffix('authorizationEndpoint');\n logger.error(`Invalid auth response for channel '${this.name}', ` +\n `expected 'channel_data' field. ${suffix}, ` +\n `or the user should be signed in.`);\n callback('Invalid auth response');\n return;\n }\n }\n }\n callback(error, authData);\n }));\n }\n handleEvent(event) {\n var eventName = event.event;\n if (eventName.indexOf('pusher_internal:') === 0) {\n this.handleInternalEvent(event);\n }\n else {\n var data = event.data;\n var metadata = {};\n if (event.user_id) {\n metadata.user_id = event.user_id;\n }\n this.emit(eventName, data, metadata);\n }\n }\n handleInternalEvent(event) {\n var eventName = event.event;\n var data = event.data;\n switch (eventName) {\n case 'pusher_internal:subscription_succeeded':\n this.handleSubscriptionSucceededEvent(event);\n break;\n case 'pusher_internal:subscription_count':\n this.handleSubscriptionCountEvent(event);\n break;\n case 'pusher_internal:member_added':\n var addedMember = this.members.addMember(data);\n this.emit('pusher:member_added', addedMember);\n break;\n case 'pusher_internal:member_removed':\n var removedMember = this.members.removeMember(data);\n if (removedMember) {\n this.emit('pusher:member_removed', removedMember);\n }\n break;\n }\n }\n handleSubscriptionSucceededEvent(event) {\n this.subscriptionPending = false;\n this.subscribed = true;\n if (this.subscriptionCancelled) {\n this.pusher.unsubscribe(this.name);\n }\n else {\n this.members.onSubscription(event.data);\n this.emit('pusher:subscription_succeeded', this.members);\n }\n }\n disconnect() {\n this.members.reset();\n super.disconnect();\n }\n}\n\n// EXTERNAL MODULE: ./node_modules/@stablelib/utf8/lib/utf8.js\nvar utf8 = __webpack_require__(1);\n\n// EXTERNAL MODULE: ./node_modules/@stablelib/base64/lib/base64.js\nvar base64 = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./src/core/channels/encrypted_channel.ts\n\n\n\n\n\nclass encrypted_channel_EncryptedChannel extends private_channel_PrivateChannel {\n constructor(name, pusher, nacl) {\n super(name, pusher);\n this.key = null;\n this.nacl = nacl;\n }\n authorize(socketId, callback) {\n super.authorize(socketId, (error, authData) => {\n if (error) {\n callback(error, authData);\n return;\n }\n let sharedSecret = authData['shared_secret'];\n if (!sharedSecret) {\n callback(new Error(`No shared_secret key in auth payload for encrypted channel: ${this.name}`), null);\n return;\n }\n this.key = Object(base64[\"decode\"])(sharedSecret);\n delete authData['shared_secret'];\n callback(null, authData);\n });\n }\n trigger(event, data) {\n throw new UnsupportedFeature('Client events are not currently supported for encrypted channels');\n }\n handleEvent(event) {\n var eventName = event.event;\n var data = event.data;\n if (eventName.indexOf('pusher_internal:') === 0 ||\n eventName.indexOf('pusher:') === 0) {\n super.handleEvent(event);\n return;\n }\n this.handleEncryptedEvent(eventName, data);\n }\n handleEncryptedEvent(event, data) {\n if (!this.key) {\n logger.debug('Received encrypted event before key has been retrieved from the authEndpoint');\n return;\n }\n if (!data.ciphertext || !data.nonce) {\n logger.error('Unexpected format for encrypted event, expected object with `ciphertext` and `nonce` fields, got: ' +\n data);\n return;\n }\n let cipherText = Object(base64[\"decode\"])(data.ciphertext);\n if (cipherText.length < this.nacl.secretbox.overheadLength) {\n logger.error(`Expected encrypted event ciphertext length to be ${this.nacl.secretbox.overheadLength}, got: ${cipherText.length}`);\n return;\n }\n let nonce = Object(base64[\"decode\"])(data.nonce);\n if (nonce.length < this.nacl.secretbox.nonceLength) {\n logger.error(`Expected encrypted event nonce length to be ${this.nacl.secretbox.nonceLength}, got: ${nonce.length}`);\n return;\n }\n let bytes = this.nacl.secretbox.open(cipherText, nonce, this.key);\n if (bytes === null) {\n logger.debug('Failed to decrypt an event, probably because it was encrypted with a different key. Fetching a new key from the authEndpoint...');\n this.authorize(this.pusher.connection.socket_id, (error, authData) => {\n if (error) {\n logger.error(`Failed to make a request to the authEndpoint: ${authData}. Unable to fetch new key, so dropping encrypted event`);\n return;\n }\n bytes = this.nacl.secretbox.open(cipherText, nonce, this.key);\n if (bytes === null) {\n logger.error(`Failed to decrypt event with new key. Dropping encrypted event`);\n return;\n }\n this.emit(event, this.getDataToEmit(bytes));\n return;\n });\n return;\n }\n this.emit(event, this.getDataToEmit(bytes));\n }\n getDataToEmit(bytes) {\n let raw = Object(utf8[\"decode\"])(bytes);\n try {\n return JSON.parse(raw);\n }\n catch (_a) {\n return raw;\n }\n }\n}\n\n// CONCATENATED MODULE: ./src/core/connection/connection_manager.ts\n\n\n\n\n\nclass connection_manager_ConnectionManager extends dispatcher_Dispatcher {\n constructor(key, options) {\n super();\n this.state = 'initialized';\n this.connection = null;\n this.key = key;\n this.options = options;\n this.timeline = this.options.timeline;\n this.usingTLS = this.options.useTLS;\n this.errorCallbacks = this.buildErrorCallbacks();\n this.connectionCallbacks = this.buildConnectionCallbacks(this.errorCallbacks);\n this.handshakeCallbacks = this.buildHandshakeCallbacks(this.errorCallbacks);\n var Network = runtime.getNetwork();\n Network.bind('online', () => {\n this.timeline.info({ netinfo: 'online' });\n if (this.state === 'connecting' || this.state === 'unavailable') {\n this.retryIn(0);\n }\n });\n Network.bind('offline', () => {\n this.timeline.info({ netinfo: 'offline' });\n if (this.connection) {\n this.sendActivityCheck();\n }\n });\n this.updateStrategy();\n }\n connect() {\n if (this.connection || this.runner) {\n return;\n }\n if (!this.strategy.isSupported()) {\n this.updateState('failed');\n return;\n }\n this.updateState('connecting');\n this.startConnecting();\n this.setUnavailableTimer();\n }\n send(data) {\n if (this.connection) {\n return this.connection.send(data);\n }\n else {\n return false;\n }\n }\n send_event(name, data, channel) {\n if (this.connection) {\n return this.connection.send_event(name, data, channel);\n }\n else {\n return false;\n }\n }\n disconnect() {\n this.disconnectInternally();\n this.updateState('disconnected');\n }\n isUsingTLS() {\n return this.usingTLS;\n }\n startConnecting() {\n var callback = (error, handshake) => {\n if (error) {\n this.runner = this.strategy.connect(0, callback);\n }\n else {\n if (handshake.action === 'error') {\n this.emit('error', {\n type: 'HandshakeError',\n error: handshake.error,\n });\n this.timeline.error({ handshakeError: handshake.error });\n }\n else {\n this.abortConnecting();\n this.handshakeCallbacks[handshake.action](handshake);\n }\n }\n };\n this.runner = this.strategy.connect(0, callback);\n }\n abortConnecting() {\n if (this.runner) {\n this.runner.abort();\n this.runner = null;\n }\n }\n disconnectInternally() {\n this.abortConnecting();\n this.clearRetryTimer();\n this.clearUnavailableTimer();\n if (this.connection) {\n var connection = this.abandonConnection();\n connection.close();\n }\n }\n updateStrategy() {\n this.strategy = this.options.getStrategy({\n key: this.key,\n timeline: this.timeline,\n useTLS: this.usingTLS,\n });\n }\n retryIn(delay) {\n this.timeline.info({ action: 'retry', delay: delay });\n if (delay > 0) {\n this.emit('connecting_in', Math.round(delay / 1000));\n }\n this.retryTimer = new timers_OneOffTimer(delay || 0, () => {\n this.disconnectInternally();\n this.connect();\n });\n }\n clearRetryTimer() {\n if (this.retryTimer) {\n this.retryTimer.ensureAborted();\n this.retryTimer = null;\n }\n }\n setUnavailableTimer() {\n this.unavailableTimer = new timers_OneOffTimer(this.options.unavailableTimeout, () => {\n this.updateState('unavailable');\n });\n }\n clearUnavailableTimer() {\n if (this.unavailableTimer) {\n this.unavailableTimer.ensureAborted();\n }\n }\n sendActivityCheck() {\n this.stopActivityCheck();\n this.connection.ping();\n this.activityTimer = new timers_OneOffTimer(this.options.pongTimeout, () => {\n this.timeline.error({ pong_timed_out: this.options.pongTimeout });\n this.retryIn(0);\n });\n }\n resetActivityCheck() {\n this.stopActivityCheck();\n if (this.connection && !this.connection.handlesActivityChecks()) {\n this.activityTimer = new timers_OneOffTimer(this.activityTimeout, () => {\n this.sendActivityCheck();\n });\n }\n }\n stopActivityCheck() {\n if (this.activityTimer) {\n this.activityTimer.ensureAborted();\n }\n }\n buildConnectionCallbacks(errorCallbacks) {\n return extend({}, errorCallbacks, {\n message: (message) => {\n this.resetActivityCheck();\n this.emit('message', message);\n },\n ping: () => {\n this.send_event('pusher:pong', {});\n },\n activity: () => {\n this.resetActivityCheck();\n },\n error: (error) => {\n this.emit('error', error);\n },\n closed: () => {\n this.abandonConnection();\n if (this.shouldRetry()) {\n this.retryIn(1000);\n }\n },\n });\n }\n buildHandshakeCallbacks(errorCallbacks) {\n return extend({}, errorCallbacks, {\n connected: (handshake) => {\n this.activityTimeout = Math.min(this.options.activityTimeout, handshake.activityTimeout, handshake.connection.activityTimeout || Infinity);\n this.clearUnavailableTimer();\n this.setConnection(handshake.connection);\n this.socket_id = this.connection.id;\n this.updateState('connected', { socket_id: this.socket_id });\n },\n });\n }\n buildErrorCallbacks() {\n let withErrorEmitted = (callback) => {\n return (result) => {\n if (result.error) {\n this.emit('error', { type: 'WebSocketError', error: result.error });\n }\n callback(result);\n };\n };\n return {\n tls_only: withErrorEmitted(() => {\n this.usingTLS = true;\n this.updateStrategy();\n this.retryIn(0);\n }),\n refused: withErrorEmitted(() => {\n this.disconnect();\n }),\n backoff: withErrorEmitted(() => {\n this.retryIn(1000);\n }),\n retry: withErrorEmitted(() => {\n this.retryIn(0);\n }),\n };\n }\n setConnection(connection) {\n this.connection = connection;\n for (var event in this.connectionCallbacks) {\n this.connection.bind(event, this.connectionCallbacks[event]);\n }\n this.resetActivityCheck();\n }\n abandonConnection() {\n if (!this.connection) {\n return;\n }\n this.stopActivityCheck();\n for (var event in this.connectionCallbacks) {\n this.connection.unbind(event, this.connectionCallbacks[event]);\n }\n var connection = this.connection;\n this.connection = null;\n return connection;\n }\n updateState(newState, data) {\n var previousState = this.state;\n this.state = newState;\n if (previousState !== newState) {\n var newStateDescription = newState;\n if (newStateDescription === 'connected') {\n newStateDescription += ' with new socket ID ' + data.socket_id;\n }\n logger.debug('State changed', previousState + ' -> ' + newStateDescription);\n this.timeline.info({ state: newState, params: data });\n this.emit('state_change', { previous: previousState, current: newState });\n this.emit(newState, data);\n }\n }\n shouldRetry() {\n return this.state === 'connecting' || this.state === 'connected';\n }\n}\n\n// CONCATENATED MODULE: ./src/core/channels/channels.ts\n\n\n\n\nclass channels_Channels {\n constructor() {\n this.channels = {};\n }\n add(name, pusher) {\n if (!this.channels[name]) {\n this.channels[name] = createChannel(name, pusher);\n }\n return this.channels[name];\n }\n all() {\n return values(this.channels);\n }\n find(name) {\n return this.channels[name];\n }\n remove(name) {\n var channel = this.channels[name];\n delete this.channels[name];\n return channel;\n }\n disconnect() {\n objectApply(this.channels, function (channel) {\n channel.disconnect();\n });\n }\n}\nfunction createChannel(name, pusher) {\n if (name.indexOf('private-encrypted-') === 0) {\n if (pusher.config.nacl) {\n return factory.createEncryptedChannel(name, pusher, pusher.config.nacl);\n }\n let errMsg = 'Tried to subscribe to a private-encrypted- channel but no nacl implementation available';\n let suffix = url_store.buildLogSuffix('encryptedChannelSupport');\n throw new UnsupportedFeature(`${errMsg}. ${suffix}`);\n }\n else if (name.indexOf('private-') === 0) {\n return factory.createPrivateChannel(name, pusher);\n }\n else if (name.indexOf('presence-') === 0) {\n return factory.createPresenceChannel(name, pusher);\n }\n else if (name.indexOf('#') === 0) {\n throw new BadChannelName('Cannot create a channel with name \"' + name + '\".');\n }\n else {\n return factory.createChannel(name, pusher);\n }\n}\n\n// CONCATENATED MODULE: ./src/core/utils/factory.ts\n\n\n\n\n\n\n\n\n\nvar Factory = {\n createChannels() {\n return new channels_Channels();\n },\n createConnectionManager(key, options) {\n return new connection_manager_ConnectionManager(key, options);\n },\n createChannel(name, pusher) {\n return new channel_Channel(name, pusher);\n },\n createPrivateChannel(name, pusher) {\n return new private_channel_PrivateChannel(name, pusher);\n },\n createPresenceChannel(name, pusher) {\n return new presence_channel_PresenceChannel(name, pusher);\n },\n createEncryptedChannel(name, pusher, nacl) {\n return new encrypted_channel_EncryptedChannel(name, pusher, nacl);\n },\n createTimelineSender(timeline, options) {\n return new timeline_sender_TimelineSender(timeline, options);\n },\n createHandshake(transport, callback) {\n return new handshake_Handshake(transport, callback);\n },\n createAssistantToTheTransportManager(manager, transport, options) {\n return new assistant_to_the_transport_manager_AssistantToTheTransportManager(manager, transport, options);\n },\n};\n/* harmony default export */ var factory = (Factory);\n\n// CONCATENATED MODULE: ./src/core/transports/transport_manager.ts\n\nclass transport_manager_TransportManager {\n constructor(options) {\n this.options = options || {};\n this.livesLeft = this.options.lives || Infinity;\n }\n getAssistant(transport) {\n return factory.createAssistantToTheTransportManager(this, transport, {\n minPingDelay: this.options.minPingDelay,\n maxPingDelay: this.options.maxPingDelay,\n });\n }\n isAlive() {\n return this.livesLeft > 0;\n }\n reportDeath() {\n this.livesLeft -= 1;\n }\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/sequential_strategy.ts\n\n\n\nclass sequential_strategy_SequentialStrategy {\n constructor(strategies, options) {\n this.strategies = strategies;\n this.loop = Boolean(options.loop);\n this.failFast = Boolean(options.failFast);\n this.timeout = options.timeout;\n this.timeoutLimit = options.timeoutLimit;\n }\n isSupported() {\n return any(this.strategies, util.method('isSupported'));\n }\n connect(minPriority, callback) {\n var strategies = this.strategies;\n var current = 0;\n var timeout = this.timeout;\n var runner = null;\n var tryNextStrategy = (error, handshake) => {\n if (handshake) {\n callback(null, handshake);\n }\n else {\n current = current + 1;\n if (this.loop) {\n current = current % strategies.length;\n }\n if (current < strategies.length) {\n if (timeout) {\n timeout = timeout * 2;\n if (this.timeoutLimit) {\n timeout = Math.min(timeout, this.timeoutLimit);\n }\n }\n runner = this.tryStrategy(strategies[current], minPriority, { timeout, failFast: this.failFast }, tryNextStrategy);\n }\n else {\n callback(true);\n }\n }\n };\n runner = this.tryStrategy(strategies[current], minPriority, { timeout: timeout, failFast: this.failFast }, tryNextStrategy);\n return {\n abort: function () {\n runner.abort();\n },\n forceMinPriority: function (p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n },\n };\n }\n tryStrategy(strategy, minPriority, options, callback) {\n var timer = null;\n var runner = null;\n if (options.timeout > 0) {\n timer = new timers_OneOffTimer(options.timeout, function () {\n runner.abort();\n callback(true);\n });\n }\n runner = strategy.connect(minPriority, function (error, handshake) {\n if (error && timer && timer.isRunning() && !options.failFast) {\n return;\n }\n if (timer) {\n timer.ensureAborted();\n }\n callback(error, handshake);\n });\n return {\n abort: function () {\n if (timer) {\n timer.ensureAborted();\n }\n runner.abort();\n },\n forceMinPriority: function (p) {\n runner.forceMinPriority(p);\n },\n };\n }\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/best_connected_ever_strategy.ts\n\n\nclass best_connected_ever_strategy_BestConnectedEverStrategy {\n constructor(strategies) {\n this.strategies = strategies;\n }\n isSupported() {\n return any(this.strategies, util.method('isSupported'));\n }\n connect(minPriority, callback) {\n return connect(this.strategies, minPriority, function (i, runners) {\n return function (error, handshake) {\n runners[i].error = error;\n if (error) {\n if (allRunnersFailed(runners)) {\n callback(true);\n }\n return;\n }\n apply(runners, function (runner) {\n runner.forceMinPriority(handshake.transport.priority);\n });\n callback(null, handshake);\n };\n });\n }\n}\nfunction connect(strategies, minPriority, callbackBuilder) {\n var runners = map(strategies, function (strategy, i, _, rs) {\n return strategy.connect(minPriority, callbackBuilder(i, rs));\n });\n return {\n abort: function () {\n apply(runners, abortRunner);\n },\n forceMinPriority: function (p) {\n apply(runners, function (runner) {\n runner.forceMinPriority(p);\n });\n },\n };\n}\nfunction allRunnersFailed(runners) {\n return collections_all(runners, function (runner) {\n return Boolean(runner.error);\n });\n}\nfunction abortRunner(runner) {\n if (!runner.error && !runner.aborted) {\n runner.abort();\n runner.aborted = true;\n }\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/websocket_prioritized_cached_strategy.ts\n\n\n\n\nclass websocket_prioritized_cached_strategy_WebSocketPrioritizedCachedStrategy {\n constructor(strategy, transports, options) {\n this.strategy = strategy;\n this.transports = transports;\n this.ttl = options.ttl || 1800 * 1000;\n this.usingTLS = options.useTLS;\n this.timeline = options.timeline;\n }\n isSupported() {\n return this.strategy.isSupported();\n }\n connect(minPriority, callback) {\n var usingTLS = this.usingTLS;\n var info = fetchTransportCache(usingTLS);\n var cacheSkipCount = info && info.cacheSkipCount ? info.cacheSkipCount : 0;\n var strategies = [this.strategy];\n if (info && info.timestamp + this.ttl >= util.now()) {\n var transport = this.transports[info.transport];\n if (transport) {\n if (['ws', 'wss'].includes(info.transport) || cacheSkipCount > 3) {\n this.timeline.info({\n cached: true,\n transport: info.transport,\n latency: info.latency,\n });\n strategies.push(new sequential_strategy_SequentialStrategy([transport], {\n timeout: info.latency * 2 + 1000,\n failFast: true,\n }));\n }\n else {\n cacheSkipCount++;\n }\n }\n }\n var startTimestamp = util.now();\n var runner = strategies\n .pop()\n .connect(minPriority, function cb(error, handshake) {\n if (error) {\n flushTransportCache(usingTLS);\n if (strategies.length > 0) {\n startTimestamp = util.now();\n runner = strategies.pop().connect(minPriority, cb);\n }\n else {\n callback(error);\n }\n }\n else {\n storeTransportCache(usingTLS, handshake.transport.name, util.now() - startTimestamp, cacheSkipCount);\n callback(null, handshake);\n }\n });\n return {\n abort: function () {\n runner.abort();\n },\n forceMinPriority: function (p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n },\n };\n }\n}\nfunction getTransportCacheKey(usingTLS) {\n return 'pusherTransport' + (usingTLS ? 'TLS' : 'NonTLS');\n}\nfunction fetchTransportCache(usingTLS) {\n var storage = runtime.getLocalStorage();\n if (storage) {\n try {\n var serializedCache = storage[getTransportCacheKey(usingTLS)];\n if (serializedCache) {\n return JSON.parse(serializedCache);\n }\n }\n catch (e) {\n flushTransportCache(usingTLS);\n }\n }\n return null;\n}\nfunction storeTransportCache(usingTLS, transport, latency, cacheSkipCount) {\n var storage = runtime.getLocalStorage();\n if (storage) {\n try {\n storage[getTransportCacheKey(usingTLS)] = safeJSONStringify({\n timestamp: util.now(),\n transport: transport,\n latency: latency,\n cacheSkipCount: cacheSkipCount,\n });\n }\n catch (e) {\n }\n }\n}\nfunction flushTransportCache(usingTLS) {\n var storage = runtime.getLocalStorage();\n if (storage) {\n try {\n delete storage[getTransportCacheKey(usingTLS)];\n }\n catch (e) {\n }\n }\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/delayed_strategy.ts\n\nclass delayed_strategy_DelayedStrategy {\n constructor(strategy, { delay: number }) {\n this.strategy = strategy;\n this.options = { delay: number };\n }\n isSupported() {\n return this.strategy.isSupported();\n }\n connect(minPriority, callback) {\n var strategy = this.strategy;\n var runner;\n var timer = new timers_OneOffTimer(this.options.delay, function () {\n runner = strategy.connect(minPriority, callback);\n });\n return {\n abort: function () {\n timer.ensureAborted();\n if (runner) {\n runner.abort();\n }\n },\n forceMinPriority: function (p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n },\n };\n }\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/if_strategy.ts\nclass IfStrategy {\n constructor(test, trueBranch, falseBranch) {\n this.test = test;\n this.trueBranch = trueBranch;\n this.falseBranch = falseBranch;\n }\n isSupported() {\n var branch = this.test() ? this.trueBranch : this.falseBranch;\n return branch.isSupported();\n }\n connect(minPriority, callback) {\n var branch = this.test() ? this.trueBranch : this.falseBranch;\n return branch.connect(minPriority, callback);\n }\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/first_connected_strategy.ts\nclass FirstConnectedStrategy {\n constructor(strategy) {\n this.strategy = strategy;\n }\n isSupported() {\n return this.strategy.isSupported();\n }\n connect(minPriority, callback) {\n var runner = this.strategy.connect(minPriority, function (error, handshake) {\n if (handshake) {\n runner.abort();\n }\n callback(error, handshake);\n });\n return runner;\n }\n}\n\n// CONCATENATED MODULE: ./src/runtimes/web/default_strategy.ts\n\n\n\n\n\n\n\nfunction testSupportsStrategy(strategy) {\n return function () {\n return strategy.isSupported();\n };\n}\nvar getDefaultStrategy = function (config, baseOptions, defineTransport) {\n var definedTransports = {};\n function defineTransportStrategy(name, type, priority, options, manager) {\n var transport = defineTransport(config, name, type, priority, options, manager);\n definedTransports[name] = transport;\n return transport;\n }\n var ws_options = Object.assign({}, baseOptions, {\n hostNonTLS: config.wsHost + ':' + config.wsPort,\n hostTLS: config.wsHost + ':' + config.wssPort,\n httpPath: config.wsPath,\n });\n var wss_options = Object.assign({}, ws_options, {\n useTLS: true,\n });\n var sockjs_options = Object.assign({}, baseOptions, {\n hostNonTLS: config.httpHost + ':' + config.httpPort,\n hostTLS: config.httpHost + ':' + config.httpsPort,\n httpPath: config.httpPath,\n });\n var timeouts = {\n loop: true,\n timeout: 15000,\n timeoutLimit: 60000,\n };\n var ws_manager = new transport_manager_TransportManager({\n minPingDelay: 10000,\n maxPingDelay: config.activityTimeout,\n });\n var streaming_manager = new transport_manager_TransportManager({\n lives: 2,\n minPingDelay: 10000,\n maxPingDelay: config.activityTimeout,\n });\n var ws_transport = defineTransportStrategy('ws', 'ws', 3, ws_options, ws_manager);\n var wss_transport = defineTransportStrategy('wss', 'ws', 3, wss_options, ws_manager);\n var sockjs_transport = defineTransportStrategy('sockjs', 'sockjs', 1, sockjs_options);\n var xhr_streaming_transport = defineTransportStrategy('xhr_streaming', 'xhr_streaming', 1, sockjs_options, streaming_manager);\n var xdr_streaming_transport = defineTransportStrategy('xdr_streaming', 'xdr_streaming', 1, sockjs_options, streaming_manager);\n var xhr_polling_transport = defineTransportStrategy('xhr_polling', 'xhr_polling', 1, sockjs_options);\n var xdr_polling_transport = defineTransportStrategy('xdr_polling', 'xdr_polling', 1, sockjs_options);\n var ws_loop = new sequential_strategy_SequentialStrategy([ws_transport], timeouts);\n var wss_loop = new sequential_strategy_SequentialStrategy([wss_transport], timeouts);\n var sockjs_loop = new sequential_strategy_SequentialStrategy([sockjs_transport], timeouts);\n var streaming_loop = new sequential_strategy_SequentialStrategy([\n new IfStrategy(testSupportsStrategy(xhr_streaming_transport), xhr_streaming_transport, xdr_streaming_transport),\n ], timeouts);\n var polling_loop = new sequential_strategy_SequentialStrategy([\n new IfStrategy(testSupportsStrategy(xhr_polling_transport), xhr_polling_transport, xdr_polling_transport),\n ], timeouts);\n var http_loop = new sequential_strategy_SequentialStrategy([\n new IfStrategy(testSupportsStrategy(streaming_loop), new best_connected_ever_strategy_BestConnectedEverStrategy([\n streaming_loop,\n new delayed_strategy_DelayedStrategy(polling_loop, { delay: 4000 }),\n ]), polling_loop),\n ], timeouts);\n var http_fallback_loop = new IfStrategy(testSupportsStrategy(http_loop), http_loop, sockjs_loop);\n var wsStrategy;\n if (baseOptions.useTLS) {\n wsStrategy = new best_connected_ever_strategy_BestConnectedEverStrategy([\n ws_loop,\n new delayed_strategy_DelayedStrategy(http_fallback_loop, { delay: 2000 }),\n ]);\n }\n else {\n wsStrategy = new best_connected_ever_strategy_BestConnectedEverStrategy([\n ws_loop,\n new delayed_strategy_DelayedStrategy(wss_loop, { delay: 2000 }),\n new delayed_strategy_DelayedStrategy(http_fallback_loop, { delay: 5000 }),\n ]);\n }\n return new websocket_prioritized_cached_strategy_WebSocketPrioritizedCachedStrategy(new FirstConnectedStrategy(new IfStrategy(testSupportsStrategy(ws_transport), wsStrategy, http_fallback_loop)), definedTransports, {\n ttl: 1800000,\n timeline: baseOptions.timeline,\n useTLS: baseOptions.useTLS,\n });\n};\n/* harmony default export */ var default_strategy = (getDefaultStrategy);\n\n// CONCATENATED MODULE: ./src/runtimes/web/transports/transport_connection_initializer.ts\n\n/* harmony default export */ var transport_connection_initializer = (function () {\n var self = this;\n self.timeline.info(self.buildTimelineMessage({\n transport: self.name + (self.options.useTLS ? 's' : ''),\n }));\n if (self.hooks.isInitialized()) {\n self.changeState('initialized');\n }\n else if (self.hooks.file) {\n self.changeState('initializing');\n Dependencies.load(self.hooks.file, { useTLS: self.options.useTLS }, function (error, callback) {\n if (self.hooks.isInitialized()) {\n self.changeState('initialized');\n callback(true);\n }\n else {\n if (error) {\n self.onError(error);\n }\n self.onClose();\n callback(false);\n }\n });\n }\n else {\n self.onClose();\n }\n});\n\n// CONCATENATED MODULE: ./src/runtimes/web/http/http_xdomain_request.ts\n\nvar http_xdomain_request_hooks = {\n getRequest: function (socket) {\n var xdr = new window.XDomainRequest();\n xdr.ontimeout = function () {\n socket.emit('error', new RequestTimedOut());\n socket.close();\n };\n xdr.onerror = function (e) {\n socket.emit('error', e);\n socket.close();\n };\n xdr.onprogress = function () {\n if (xdr.responseText && xdr.responseText.length > 0) {\n socket.onChunk(200, xdr.responseText);\n }\n };\n xdr.onload = function () {\n if (xdr.responseText && xdr.responseText.length > 0) {\n socket.onChunk(200, xdr.responseText);\n }\n socket.emit('finished', 200);\n socket.close();\n };\n return xdr;\n },\n abortRequest: function (xdr) {\n xdr.ontimeout = xdr.onerror = xdr.onprogress = xdr.onload = null;\n xdr.abort();\n },\n};\n/* harmony default export */ var http_xdomain_request = (http_xdomain_request_hooks);\n\n// CONCATENATED MODULE: ./src/core/http/http_request.ts\n\n\nconst MAX_BUFFER_LENGTH = 256 * 1024;\nclass http_request_HTTPRequest extends dispatcher_Dispatcher {\n constructor(hooks, method, url) {\n super();\n this.hooks = hooks;\n this.method = method;\n this.url = url;\n }\n start(payload) {\n this.position = 0;\n this.xhr = this.hooks.getRequest(this);\n this.unloader = () => {\n this.close();\n };\n runtime.addUnloadListener(this.unloader);\n this.xhr.open(this.method, this.url, true);\n if (this.xhr.setRequestHeader) {\n this.xhr.setRequestHeader('Content-Type', 'application/json');\n }\n this.xhr.send(payload);\n }\n close() {\n if (this.unloader) {\n runtime.removeUnloadListener(this.unloader);\n this.unloader = null;\n }\n if (this.xhr) {\n this.hooks.abortRequest(this.xhr);\n this.xhr = null;\n }\n }\n onChunk(status, data) {\n while (true) {\n var chunk = this.advanceBuffer(data);\n if (chunk) {\n this.emit('chunk', { status: status, data: chunk });\n }\n else {\n break;\n }\n }\n if (this.isBufferTooLong(data)) {\n this.emit('buffer_too_long');\n }\n }\n advanceBuffer(buffer) {\n var unreadData = buffer.slice(this.position);\n var endOfLinePosition = unreadData.indexOf('\\n');\n if (endOfLinePosition !== -1) {\n this.position += endOfLinePosition + 1;\n return unreadData.slice(0, endOfLinePosition);\n }\n else {\n return null;\n }\n }\n isBufferTooLong(buffer) {\n return this.position === buffer.length && buffer.length > MAX_BUFFER_LENGTH;\n }\n}\n\n// CONCATENATED MODULE: ./src/core/http/state.ts\nvar State;\n(function (State) {\n State[State[\"CONNECTING\"] = 0] = \"CONNECTING\";\n State[State[\"OPEN\"] = 1] = \"OPEN\";\n State[State[\"CLOSED\"] = 3] = \"CLOSED\";\n})(State || (State = {}));\n/* harmony default export */ var state = (State);\n\n// CONCATENATED MODULE: ./src/core/http/http_socket.ts\n\n\n\nvar autoIncrement = 1;\nclass http_socket_HTTPSocket {\n constructor(hooks, url) {\n this.hooks = hooks;\n this.session = randomNumber(1000) + '/' + randomString(8);\n this.location = getLocation(url);\n this.readyState = state.CONNECTING;\n this.openStream();\n }\n send(payload) {\n return this.sendRaw(JSON.stringify([payload]));\n }\n ping() {\n this.hooks.sendHeartbeat(this);\n }\n close(code, reason) {\n this.onClose(code, reason, true);\n }\n sendRaw(payload) {\n if (this.readyState === state.OPEN) {\n try {\n runtime.createSocketRequest('POST', getUniqueURL(getSendURL(this.location, this.session))).start(payload);\n return true;\n }\n catch (e) {\n return false;\n }\n }\n else {\n return false;\n }\n }\n reconnect() {\n this.closeStream();\n this.openStream();\n }\n onClose(code, reason, wasClean) {\n this.closeStream();\n this.readyState = state.CLOSED;\n if (this.onclose) {\n this.onclose({\n code: code,\n reason: reason,\n wasClean: wasClean,\n });\n }\n }\n onChunk(chunk) {\n if (chunk.status !== 200) {\n return;\n }\n if (this.readyState === state.OPEN) {\n this.onActivity();\n }\n var payload;\n var type = chunk.data.slice(0, 1);\n switch (type) {\n case 'o':\n payload = JSON.parse(chunk.data.slice(1) || '{}');\n this.onOpen(payload);\n break;\n case 'a':\n payload = JSON.parse(chunk.data.slice(1) || '[]');\n for (var i = 0; i < payload.length; i++) {\n this.onEvent(payload[i]);\n }\n break;\n case 'm':\n payload = JSON.parse(chunk.data.slice(1) || 'null');\n this.onEvent(payload);\n break;\n case 'h':\n this.hooks.onHeartbeat(this);\n break;\n case 'c':\n payload = JSON.parse(chunk.data.slice(1) || '[]');\n this.onClose(payload[0], payload[1], true);\n break;\n }\n }\n onOpen(options) {\n if (this.readyState === state.CONNECTING) {\n if (options && options.hostname) {\n this.location.base = replaceHost(this.location.base, options.hostname);\n }\n this.readyState = state.OPEN;\n if (this.onopen) {\n this.onopen();\n }\n }\n else {\n this.onClose(1006, 'Server lost session', true);\n }\n }\n onEvent(event) {\n if (this.readyState === state.OPEN && this.onmessage) {\n this.onmessage({ data: event });\n }\n }\n onActivity() {\n if (this.onactivity) {\n this.onactivity();\n }\n }\n onError(error) {\n if (this.onerror) {\n this.onerror(error);\n }\n }\n openStream() {\n this.stream = runtime.createSocketRequest('POST', getUniqueURL(this.hooks.getReceiveURL(this.location, this.session)));\n this.stream.bind('chunk', (chunk) => {\n this.onChunk(chunk);\n });\n this.stream.bind('finished', (status) => {\n this.hooks.onFinished(this, status);\n });\n this.stream.bind('buffer_too_long', () => {\n this.reconnect();\n });\n try {\n this.stream.start();\n }\n catch (error) {\n util.defer(() => {\n this.onError(error);\n this.onClose(1006, 'Could not start streaming', false);\n });\n }\n }\n closeStream() {\n if (this.stream) {\n this.stream.unbind_all();\n this.stream.close();\n this.stream = null;\n }\n }\n}\nfunction getLocation(url) {\n var parts = /([^\\?]*)\\/*(\\??.*)/.exec(url);\n return {\n base: parts[1],\n queryString: parts[2],\n };\n}\nfunction getSendURL(url, session) {\n return url.base + '/' + session + '/xhr_send';\n}\nfunction getUniqueURL(url) {\n var separator = url.indexOf('?') === -1 ? '?' : '&';\n return url + separator + 't=' + +new Date() + '&n=' + autoIncrement++;\n}\nfunction replaceHost(url, hostname) {\n var urlParts = /(https?:\\/\\/)([^\\/:]+)((\\/|:)?.*)/.exec(url);\n return urlParts[1] + hostname + urlParts[3];\n}\nfunction randomNumber(max) {\n return runtime.randomInt(max);\n}\nfunction randomString(length) {\n var result = [];\n for (var i = 0; i < length; i++) {\n result.push(randomNumber(32).toString(32));\n }\n return result.join('');\n}\n/* harmony default export */ var http_socket = (http_socket_HTTPSocket);\n\n// CONCATENATED MODULE: ./src/core/http/http_streaming_socket.ts\nvar http_streaming_socket_hooks = {\n getReceiveURL: function (url, session) {\n return url.base + '/' + session + '/xhr_streaming' + url.queryString;\n },\n onHeartbeat: function (socket) {\n socket.sendRaw('[]');\n },\n sendHeartbeat: function (socket) {\n socket.sendRaw('[]');\n },\n onFinished: function (socket, status) {\n socket.onClose(1006, 'Connection interrupted (' + status + ')', false);\n },\n};\n/* harmony default export */ var http_streaming_socket = (http_streaming_socket_hooks);\n\n// CONCATENATED MODULE: ./src/core/http/http_polling_socket.ts\nvar http_polling_socket_hooks = {\n getReceiveURL: function (url, session) {\n return url.base + '/' + session + '/xhr' + url.queryString;\n },\n onHeartbeat: function () {\n },\n sendHeartbeat: function (socket) {\n socket.sendRaw('[]');\n },\n onFinished: function (socket, status) {\n if (status === 200) {\n socket.reconnect();\n }\n else {\n socket.onClose(1006, 'Connection interrupted (' + status + ')', false);\n }\n },\n};\n/* harmony default export */ var http_polling_socket = (http_polling_socket_hooks);\n\n// CONCATENATED MODULE: ./src/runtimes/isomorphic/http/http_xhr_request.ts\n\nvar http_xhr_request_hooks = {\n getRequest: function (socket) {\n var Constructor = runtime.getXHRAPI();\n var xhr = new Constructor();\n xhr.onreadystatechange = xhr.onprogress = function () {\n switch (xhr.readyState) {\n case 3:\n if (xhr.responseText && xhr.responseText.length > 0) {\n socket.onChunk(xhr.status, xhr.responseText);\n }\n break;\n case 4:\n if (xhr.responseText && xhr.responseText.length > 0) {\n socket.onChunk(xhr.status, xhr.responseText);\n }\n socket.emit('finished', xhr.status);\n socket.close();\n break;\n }\n };\n return xhr;\n },\n abortRequest: function (xhr) {\n xhr.onreadystatechange = null;\n xhr.abort();\n },\n};\n/* harmony default export */ var http_xhr_request = (http_xhr_request_hooks);\n\n// CONCATENATED MODULE: ./src/runtimes/isomorphic/http/http.ts\n\n\n\n\n\nvar HTTP = {\n createStreamingSocket(url) {\n return this.createSocket(http_streaming_socket, url);\n },\n createPollingSocket(url) {\n return this.createSocket(http_polling_socket, url);\n },\n createSocket(hooks, url) {\n return new http_socket(hooks, url);\n },\n createXHR(method, url) {\n return this.createRequest(http_xhr_request, method, url);\n },\n createRequest(hooks, method, url) {\n return new http_request_HTTPRequest(hooks, method, url);\n },\n};\n/* harmony default export */ var http_http = (HTTP);\n\n// CONCATENATED MODULE: ./src/runtimes/web/http/http.ts\n\n\nhttp_http.createXDR = function (method, url) {\n return this.createRequest(http_xdomain_request, method, url);\n};\n/* harmony default export */ var web_http_http = (http_http);\n\n// CONCATENATED MODULE: ./src/runtimes/web/runtime.ts\n\n\n\n\n\n\n\n\n\n\n\n\nvar Runtime = {\n nextAuthCallbackID: 1,\n auth_callbacks: {},\n ScriptReceivers: ScriptReceivers,\n DependenciesReceivers: DependenciesReceivers,\n getDefaultStrategy: default_strategy,\n Transports: transports_transports,\n transportConnectionInitializer: transport_connection_initializer,\n HTTPFactory: web_http_http,\n TimelineTransport: jsonp_timeline,\n getXHRAPI() {\n return window.XMLHttpRequest;\n },\n getWebSocketAPI() {\n return window.WebSocket || window.MozWebSocket;\n },\n setup(PusherClass) {\n window.Pusher = PusherClass;\n var initializeOnDocumentBody = () => {\n this.onDocumentBody(PusherClass.ready);\n };\n if (!window.JSON) {\n Dependencies.load('json2', {}, initializeOnDocumentBody);\n }\n else {\n initializeOnDocumentBody();\n }\n },\n getDocument() {\n return document;\n },\n getProtocol() {\n return this.getDocument().location.protocol;\n },\n getAuthorizers() {\n return { ajax: xhr_auth, jsonp: jsonp_auth };\n },\n onDocumentBody(callback) {\n if (document.body) {\n callback();\n }\n else {\n setTimeout(() => {\n this.onDocumentBody(callback);\n }, 0);\n }\n },\n createJSONPRequest(url, data) {\n return new jsonp_request_JSONPRequest(url, data);\n },\n createScriptRequest(src) {\n return new ScriptRequest(src);\n },\n getLocalStorage() {\n try {\n return window.localStorage;\n }\n catch (e) {\n return undefined;\n }\n },\n createXHR() {\n if (this.getXHRAPI()) {\n return this.createXMLHttpRequest();\n }\n else {\n return this.createMicrosoftXHR();\n }\n },\n createXMLHttpRequest() {\n var Constructor = this.getXHRAPI();\n return new Constructor();\n },\n createMicrosoftXHR() {\n return new ActiveXObject('Microsoft.XMLHTTP');\n },\n getNetwork() {\n return net_info_Network;\n },\n createWebSocket(url) {\n var Constructor = this.getWebSocketAPI();\n return new Constructor(url);\n },\n createSocketRequest(method, url) {\n if (this.isXHRSupported()) {\n return this.HTTPFactory.createXHR(method, url);\n }\n else if (this.isXDRSupported(url.indexOf('https:') === 0)) {\n return this.HTTPFactory.createXDR(method, url);\n }\n else {\n throw 'Cross-origin HTTP requests are not supported';\n }\n },\n isXHRSupported() {\n var Constructor = this.getXHRAPI();\n return (Boolean(Constructor) && new Constructor().withCredentials !== undefined);\n },\n isXDRSupported(useTLS) {\n var protocol = useTLS ? 'https:' : 'http:';\n var documentProtocol = this.getProtocol();\n return (Boolean(window['XDomainRequest']) && documentProtocol === protocol);\n },\n addUnloadListener(listener) {\n if (window.addEventListener !== undefined) {\n window.addEventListener('unload', listener, false);\n }\n else if (window.attachEvent !== undefined) {\n window.attachEvent('onunload', listener);\n }\n },\n removeUnloadListener(listener) {\n if (window.addEventListener !== undefined) {\n window.removeEventListener('unload', listener, false);\n }\n else if (window.detachEvent !== undefined) {\n window.detachEvent('onunload', listener);\n }\n },\n randomInt(max) {\n const random = function () {\n const crypto = window.crypto || window['msCrypto'];\n const random = crypto.getRandomValues(new Uint32Array(1))[0];\n return random / Math.pow(2, 32);\n };\n return Math.floor(random() * max);\n },\n};\n/* harmony default export */ var runtime = (Runtime);\n\n// CONCATENATED MODULE: ./src/core/timeline/level.ts\nvar TimelineLevel;\n(function (TimelineLevel) {\n TimelineLevel[TimelineLevel[\"ERROR\"] = 3] = \"ERROR\";\n TimelineLevel[TimelineLevel[\"INFO\"] = 6] = \"INFO\";\n TimelineLevel[TimelineLevel[\"DEBUG\"] = 7] = \"DEBUG\";\n})(TimelineLevel || (TimelineLevel = {}));\n/* harmony default export */ var timeline_level = (TimelineLevel);\n\n// CONCATENATED MODULE: ./src/core/timeline/timeline.ts\n\n\n\nclass timeline_Timeline {\n constructor(key, session, options) {\n this.key = key;\n this.session = session;\n this.events = [];\n this.options = options || {};\n this.sent = 0;\n this.uniqueID = 0;\n }\n log(level, event) {\n if (level <= this.options.level) {\n this.events.push(extend({}, event, { timestamp: util.now() }));\n if (this.options.limit && this.events.length > this.options.limit) {\n this.events.shift();\n }\n }\n }\n error(event) {\n this.log(timeline_level.ERROR, event);\n }\n info(event) {\n this.log(timeline_level.INFO, event);\n }\n debug(event) {\n this.log(timeline_level.DEBUG, event);\n }\n isEmpty() {\n return this.events.length === 0;\n }\n send(sendfn, callback) {\n var data = extend({\n session: this.session,\n bundle: this.sent + 1,\n key: this.key,\n lib: 'js',\n version: this.options.version,\n cluster: this.options.cluster,\n features: this.options.features,\n timeline: this.events,\n }, this.options.params);\n this.events = [];\n sendfn(data, (error, result) => {\n if (!error) {\n this.sent++;\n }\n if (callback) {\n callback(error, result);\n }\n });\n return true;\n }\n generateUniqueID() {\n this.uniqueID++;\n return this.uniqueID;\n }\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/transport_strategy.ts\n\n\n\n\nclass transport_strategy_TransportStrategy {\n constructor(name, priority, transport, options) {\n this.name = name;\n this.priority = priority;\n this.transport = transport;\n this.options = options || {};\n }\n isSupported() {\n return this.transport.isSupported({\n useTLS: this.options.useTLS,\n });\n }\n connect(minPriority, callback) {\n if (!this.isSupported()) {\n return failAttempt(new UnsupportedStrategy(), callback);\n }\n else if (this.priority < minPriority) {\n return failAttempt(new TransportPriorityTooLow(), callback);\n }\n var connected = false;\n var transport = this.transport.createConnection(this.name, this.priority, this.options.key, this.options);\n var handshake = null;\n var onInitialized = function () {\n transport.unbind('initialized', onInitialized);\n transport.connect();\n };\n var onOpen = function () {\n handshake = factory.createHandshake(transport, function (result) {\n connected = true;\n unbindListeners();\n callback(null, result);\n });\n };\n var onError = function (error) {\n unbindListeners();\n callback(error);\n };\n var onClosed = function () {\n unbindListeners();\n var serializedTransport;\n serializedTransport = safeJSONStringify(transport);\n callback(new TransportClosed(serializedTransport));\n };\n var unbindListeners = function () {\n transport.unbind('initialized', onInitialized);\n transport.unbind('open', onOpen);\n transport.unbind('error', onError);\n transport.unbind('closed', onClosed);\n };\n transport.bind('initialized', onInitialized);\n transport.bind('open', onOpen);\n transport.bind('error', onError);\n transport.bind('closed', onClosed);\n transport.initialize();\n return {\n abort: () => {\n if (connected) {\n return;\n }\n unbindListeners();\n if (handshake) {\n handshake.close();\n }\n else {\n transport.close();\n }\n },\n forceMinPriority: (p) => {\n if (connected) {\n return;\n }\n if (this.priority < p) {\n if (handshake) {\n handshake.close();\n }\n else {\n transport.close();\n }\n }\n },\n };\n }\n}\nfunction failAttempt(error, callback) {\n util.defer(function () {\n callback(error);\n });\n return {\n abort: function () { },\n forceMinPriority: function () { },\n };\n}\n\n// CONCATENATED MODULE: ./src/core/strategies/strategy_builder.ts\n\n\n\n\n\nconst { Transports: strategy_builder_Transports } = runtime;\nvar strategy_builder_defineTransport = function (config, name, type, priority, options, manager) {\n var transportClass = strategy_builder_Transports[type];\n if (!transportClass) {\n throw new UnsupportedTransport(type);\n }\n var enabled = (!config.enabledTransports ||\n arrayIndexOf(config.enabledTransports, name) !== -1) &&\n (!config.disabledTransports ||\n arrayIndexOf(config.disabledTransports, name) === -1);\n var transport;\n if (enabled) {\n options = Object.assign({ ignoreNullOrigin: config.ignoreNullOrigin }, options);\n transport = new transport_strategy_TransportStrategy(name, priority, manager ? manager.getAssistant(transportClass) : transportClass, options);\n }\n else {\n transport = strategy_builder_UnsupportedStrategy;\n }\n return transport;\n};\nvar strategy_builder_UnsupportedStrategy = {\n isSupported: function () {\n return false;\n },\n connect: function (_, callback) {\n var deferred = util.defer(function () {\n callback(new UnsupportedStrategy());\n });\n return {\n abort: function () {\n deferred.ensureAborted();\n },\n forceMinPriority: function () { },\n };\n },\n};\n\n// CONCATENATED MODULE: ./src/core/options.ts\n\nfunction validateOptions(options) {\n if (options == null) {\n throw 'You must pass an options object';\n }\n if (options.cluster == null) {\n throw 'Options object must provide a cluster';\n }\n if ('disableStats' in options) {\n logger.warn('The disableStats option is deprecated in favor of enableStats');\n }\n}\n\n// CONCATENATED MODULE: ./src/core/auth/user_authenticator.ts\n\n\nconst composeChannelQuery = (params, authOptions) => {\n var query = 'socket_id=' + encodeURIComponent(params.socketId);\n for (var key in authOptions.params) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(authOptions.params[key]);\n }\n if (authOptions.paramsProvider != null) {\n let dynamicParams = authOptions.paramsProvider();\n for (var key in dynamicParams) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(dynamicParams[key]);\n }\n }\n return query;\n};\nconst UserAuthenticator = (authOptions) => {\n if (typeof runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n throw `'${authOptions.transport}' is not a recognized auth transport`;\n }\n return (params, callback) => {\n const query = composeChannelQuery(params, authOptions);\n runtime.getAuthorizers()[authOptions.transport](runtime, query, authOptions, AuthRequestType.UserAuthentication, callback);\n };\n};\n/* harmony default export */ var user_authenticator = (UserAuthenticator);\n\n// CONCATENATED MODULE: ./src/core/auth/channel_authorizer.ts\n\n\nconst channel_authorizer_composeChannelQuery = (params, authOptions) => {\n var query = 'socket_id=' + encodeURIComponent(params.socketId);\n query += '&channel_name=' + encodeURIComponent(params.channelName);\n for (var key in authOptions.params) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(authOptions.params[key]);\n }\n if (authOptions.paramsProvider != null) {\n let dynamicParams = authOptions.paramsProvider();\n for (var key in dynamicParams) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(dynamicParams[key]);\n }\n }\n return query;\n};\nconst ChannelAuthorizer = (authOptions) => {\n if (typeof runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n throw `'${authOptions.transport}' is not a recognized auth transport`;\n }\n return (params, callback) => {\n const query = channel_authorizer_composeChannelQuery(params, authOptions);\n runtime.getAuthorizers()[authOptions.transport](runtime, query, authOptions, AuthRequestType.ChannelAuthorization, callback);\n };\n};\n/* harmony default export */ var channel_authorizer = (ChannelAuthorizer);\n\n// CONCATENATED MODULE: ./src/core/auth/deprecated_channel_authorizer.ts\nconst ChannelAuthorizerProxy = (pusher, authOptions, channelAuthorizerGenerator) => {\n const deprecatedAuthorizerOptions = {\n authTransport: authOptions.transport,\n authEndpoint: authOptions.endpoint,\n auth: {\n params: authOptions.params,\n headers: authOptions.headers,\n },\n };\n return (params, callback) => {\n const channel = pusher.channel(params.channelName);\n const channelAuthorizer = channelAuthorizerGenerator(channel, deprecatedAuthorizerOptions);\n channelAuthorizer.authorize(params.socketId, callback);\n };\n};\n\n// CONCATENATED MODULE: ./src/core/config.ts\n\n\n\n\n\nfunction getConfig(opts, pusher) {\n let config = {\n activityTimeout: opts.activityTimeout || defaults.activityTimeout,\n cluster: opts.cluster,\n httpPath: opts.httpPath || defaults.httpPath,\n httpPort: opts.httpPort || defaults.httpPort,\n httpsPort: opts.httpsPort || defaults.httpsPort,\n pongTimeout: opts.pongTimeout || defaults.pongTimeout,\n statsHost: opts.statsHost || defaults.stats_host,\n unavailableTimeout: opts.unavailableTimeout || defaults.unavailableTimeout,\n wsPath: opts.wsPath || defaults.wsPath,\n wsPort: opts.wsPort || defaults.wsPort,\n wssPort: opts.wssPort || defaults.wssPort,\n enableStats: getEnableStatsConfig(opts),\n httpHost: getHttpHost(opts),\n useTLS: shouldUseTLS(opts),\n wsHost: getWebsocketHost(opts),\n userAuthenticator: buildUserAuthenticator(opts),\n channelAuthorizer: buildChannelAuthorizer(opts, pusher),\n };\n if ('disabledTransports' in opts)\n config.disabledTransports = opts.disabledTransports;\n if ('enabledTransports' in opts)\n config.enabledTransports = opts.enabledTransports;\n if ('ignoreNullOrigin' in opts)\n config.ignoreNullOrigin = opts.ignoreNullOrigin;\n if ('timelineParams' in opts)\n config.timelineParams = opts.timelineParams;\n if ('nacl' in opts) {\n config.nacl = opts.nacl;\n }\n return config;\n}\nfunction getHttpHost(opts) {\n if (opts.httpHost) {\n return opts.httpHost;\n }\n if (opts.cluster) {\n return `sockjs-${opts.cluster}.pusher.com`;\n }\n return defaults.httpHost;\n}\nfunction getWebsocketHost(opts) {\n if (opts.wsHost) {\n return opts.wsHost;\n }\n return getWebsocketHostFromCluster(opts.cluster);\n}\nfunction getWebsocketHostFromCluster(cluster) {\n return `ws-${cluster}.pusher.com`;\n}\nfunction shouldUseTLS(opts) {\n if (runtime.getProtocol() === 'https:') {\n return true;\n }\n else if (opts.forceTLS === false) {\n return false;\n }\n return true;\n}\nfunction getEnableStatsConfig(opts) {\n if ('enableStats' in opts) {\n return opts.enableStats;\n }\n if ('disableStats' in opts) {\n return !opts.disableStats;\n }\n return false;\n}\nfunction buildUserAuthenticator(opts) {\n const userAuthentication = Object.assign(Object.assign({}, defaults.userAuthentication), opts.userAuthentication);\n if ('customHandler' in userAuthentication &&\n userAuthentication['customHandler'] != null) {\n return userAuthentication['customHandler'];\n }\n return user_authenticator(userAuthentication);\n}\nfunction buildChannelAuth(opts, pusher) {\n let channelAuthorization;\n if ('channelAuthorization' in opts) {\n channelAuthorization = Object.assign(Object.assign({}, defaults.channelAuthorization), opts.channelAuthorization);\n }\n else {\n channelAuthorization = {\n transport: opts.authTransport || defaults.authTransport,\n endpoint: opts.authEndpoint || defaults.authEndpoint,\n };\n if ('auth' in opts) {\n if ('params' in opts.auth)\n channelAuthorization.params = opts.auth.params;\n if ('headers' in opts.auth)\n channelAuthorization.headers = opts.auth.headers;\n }\n if ('authorizer' in opts)\n channelAuthorization.customHandler = ChannelAuthorizerProxy(pusher, channelAuthorization, opts.authorizer);\n }\n return channelAuthorization;\n}\nfunction buildChannelAuthorizer(opts, pusher) {\n const channelAuthorization = buildChannelAuth(opts, pusher);\n if ('customHandler' in channelAuthorization &&\n channelAuthorization['customHandler'] != null) {\n return channelAuthorization['customHandler'];\n }\n return channel_authorizer(channelAuthorization);\n}\n\n// CONCATENATED MODULE: ./src/core/watchlist.ts\n\n\nclass watchlist_WatchlistFacade extends dispatcher_Dispatcher {\n constructor(pusher) {\n super(function (eventName, data) {\n logger.debug(`No callbacks on watchlist events for ${eventName}`);\n });\n this.pusher = pusher;\n this.bindWatchlistInternalEvent();\n }\n handleEvent(pusherEvent) {\n pusherEvent.data.events.forEach((watchlistEvent) => {\n this.emit(watchlistEvent.name, watchlistEvent);\n });\n }\n bindWatchlistInternalEvent() {\n this.pusher.connection.bind('message', (pusherEvent) => {\n var eventName = pusherEvent.event;\n if (eventName === 'pusher_internal:watchlist_events') {\n this.handleEvent(pusherEvent);\n }\n });\n }\n}\n\n// CONCATENATED MODULE: ./src/core/utils/flat_promise.ts\nfunction flatPromise() {\n let resolve, reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n/* harmony default export */ var flat_promise = (flatPromise);\n\n// CONCATENATED MODULE: ./src/core/user.ts\n\n\n\n\n\nclass user_UserFacade extends dispatcher_Dispatcher {\n constructor(pusher) {\n super(function (eventName, data) {\n logger.debug('No callbacks on user for ' + eventName);\n });\n this.signin_requested = false;\n this.user_data = null;\n this.serverToUserChannel = null;\n this.signinDonePromise = null;\n this._signinDoneResolve = null;\n this._onAuthorize = (err, authData) => {\n if (err) {\n logger.warn(`Error during signin: ${err}`);\n this._cleanup();\n return;\n }\n this.pusher.send_event('pusher:signin', {\n auth: authData.auth,\n user_data: authData.user_data,\n });\n };\n this.pusher = pusher;\n this.pusher.connection.bind('state_change', ({ previous, current }) => {\n if (previous !== 'connected' && current === 'connected') {\n this._signin();\n }\n if (previous === 'connected' && current !== 'connected') {\n this._cleanup();\n this._newSigninPromiseIfNeeded();\n }\n });\n this.watchlist = new watchlist_WatchlistFacade(pusher);\n this.pusher.connection.bind('message', (event) => {\n var eventName = event.event;\n if (eventName === 'pusher:signin_success') {\n this._onSigninSuccess(event.data);\n }\n if (this.serverToUserChannel &&\n this.serverToUserChannel.name === event.channel) {\n this.serverToUserChannel.handleEvent(event);\n }\n });\n }\n signin() {\n if (this.signin_requested) {\n return;\n }\n this.signin_requested = true;\n this._signin();\n }\n _signin() {\n if (!this.signin_requested) {\n return;\n }\n this._newSigninPromiseIfNeeded();\n if (this.pusher.connection.state !== 'connected') {\n return;\n }\n this.pusher.config.userAuthenticator({\n socketId: this.pusher.connection.socket_id,\n }, this._onAuthorize);\n }\n _onSigninSuccess(data) {\n try {\n this.user_data = JSON.parse(data.user_data);\n }\n catch (e) {\n logger.error(`Failed parsing user data after signin: ${data.user_data}`);\n this._cleanup();\n return;\n }\n if (typeof this.user_data.id !== 'string' || this.user_data.id === '') {\n logger.error(`user_data doesn't contain an id. user_data: ${this.user_data}`);\n this._cleanup();\n return;\n }\n this._signinDoneResolve();\n this._subscribeChannels();\n }\n _subscribeChannels() {\n const ensure_subscribed = (channel) => {\n if (channel.subscriptionPending && channel.subscriptionCancelled) {\n channel.reinstateSubscription();\n }\n else if (!channel.subscriptionPending &&\n this.pusher.connection.state === 'connected') {\n channel.subscribe();\n }\n };\n this.serverToUserChannel = new channel_Channel(`#server-to-user-${this.user_data.id}`, this.pusher);\n this.serverToUserChannel.bind_global((eventName, data) => {\n if (eventName.indexOf('pusher_internal:') === 0 ||\n eventName.indexOf('pusher:') === 0) {\n return;\n }\n this.emit(eventName, data);\n });\n ensure_subscribed(this.serverToUserChannel);\n }\n _cleanup() {\n this.user_data = null;\n if (this.serverToUserChannel) {\n this.serverToUserChannel.unbind_all();\n this.serverToUserChannel.disconnect();\n this.serverToUserChannel = null;\n }\n if (this.signin_requested) {\n this._signinDoneResolve();\n }\n }\n _newSigninPromiseIfNeeded() {\n if (!this.signin_requested) {\n return;\n }\n if (this.signinDonePromise && !this.signinDonePromise.done) {\n return;\n }\n const { promise, resolve, reject: _ } = flat_promise();\n promise.done = false;\n const setDone = () => {\n promise.done = true;\n };\n promise.then(setDone).catch(setDone);\n this.signinDonePromise = promise;\n this._signinDoneResolve = resolve;\n }\n}\n\n// CONCATENATED MODULE: ./src/core/pusher.ts\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass pusher_Pusher {\n static ready() {\n pusher_Pusher.isReady = true;\n for (var i = 0, l = pusher_Pusher.instances.length; i < l; i++) {\n pusher_Pusher.instances[i].connect();\n }\n }\n static getClientFeatures() {\n return keys(filterObject({ ws: runtime.Transports.ws }, function (t) {\n return t.isSupported({});\n }));\n }\n constructor(app_key, options) {\n checkAppKey(app_key);\n validateOptions(options);\n this.key = app_key;\n this.config = getConfig(options, this);\n this.channels = factory.createChannels();\n this.global_emitter = new dispatcher_Dispatcher();\n this.sessionID = runtime.randomInt(1000000000);\n this.timeline = new timeline_Timeline(this.key, this.sessionID, {\n cluster: this.config.cluster,\n features: pusher_Pusher.getClientFeatures(),\n params: this.config.timelineParams || {},\n limit: 50,\n level: timeline_level.INFO,\n version: defaults.VERSION,\n });\n if (this.config.enableStats) {\n this.timelineSender = factory.createTimelineSender(this.timeline, {\n host: this.config.statsHost,\n path: '/timeline/v2/' + runtime.TimelineTransport.name,\n });\n }\n var getStrategy = (options) => {\n return runtime.getDefaultStrategy(this.config, options, strategy_builder_defineTransport);\n };\n this.connection = factory.createConnectionManager(this.key, {\n getStrategy: getStrategy,\n timeline: this.timeline,\n activityTimeout: this.config.activityTimeout,\n pongTimeout: this.config.pongTimeout,\n unavailableTimeout: this.config.unavailableTimeout,\n useTLS: Boolean(this.config.useTLS),\n });\n this.connection.bind('connected', () => {\n this.subscribeAll();\n if (this.timelineSender) {\n this.timelineSender.send(this.connection.isUsingTLS());\n }\n });\n this.connection.bind('message', (event) => {\n var eventName = event.event;\n var internal = eventName.indexOf('pusher_internal:') === 0;\n if (event.channel) {\n var channel = this.channel(event.channel);\n if (channel) {\n channel.handleEvent(event);\n }\n }\n if (!internal) {\n this.global_emitter.emit(event.event, event.data);\n }\n });\n this.connection.bind('connecting', () => {\n this.channels.disconnect();\n });\n this.connection.bind('disconnected', () => {\n this.channels.disconnect();\n });\n this.connection.bind('error', (err) => {\n logger.warn(err);\n });\n pusher_Pusher.instances.push(this);\n this.timeline.info({ instances: pusher_Pusher.instances.length });\n this.user = new user_UserFacade(this);\n if (pusher_Pusher.isReady) {\n this.connect();\n }\n }\n channel(name) {\n return this.channels.find(name);\n }\n allChannels() {\n return this.channels.all();\n }\n connect() {\n this.connection.connect();\n if (this.timelineSender) {\n if (!this.timelineSenderTimer) {\n var usingTLS = this.connection.isUsingTLS();\n var timelineSender = this.timelineSender;\n this.timelineSenderTimer = new timers_PeriodicTimer(60000, function () {\n timelineSender.send(usingTLS);\n });\n }\n }\n }\n disconnect() {\n this.connection.disconnect();\n if (this.timelineSenderTimer) {\n this.timelineSenderTimer.ensureAborted();\n this.timelineSenderTimer = null;\n }\n }\n bind(event_name, callback, context) {\n this.global_emitter.bind(event_name, callback, context);\n return this;\n }\n unbind(event_name, callback, context) {\n this.global_emitter.unbind(event_name, callback, context);\n return this;\n }\n bind_global(callback) {\n this.global_emitter.bind_global(callback);\n return this;\n }\n unbind_global(callback) {\n this.global_emitter.unbind_global(callback);\n return this;\n }\n unbind_all(callback) {\n this.global_emitter.unbind_all();\n return this;\n }\n subscribeAll() {\n var channelName;\n for (channelName in this.channels.channels) {\n if (this.channels.channels.hasOwnProperty(channelName)) {\n this.subscribe(channelName);\n }\n }\n }\n subscribe(channel_name) {\n var channel = this.channels.add(channel_name, this);\n if (channel.subscriptionPending && channel.subscriptionCancelled) {\n channel.reinstateSubscription();\n }\n else if (!channel.subscriptionPending &&\n this.connection.state === 'connected') {\n channel.subscribe();\n }\n return channel;\n }\n unsubscribe(channel_name) {\n var channel = this.channels.find(channel_name);\n if (channel && channel.subscriptionPending) {\n channel.cancelSubscription();\n }\n else {\n channel = this.channels.remove(channel_name);\n if (channel && channel.subscribed) {\n channel.unsubscribe();\n }\n }\n }\n send_event(event_name, data, channel) {\n return this.connection.send_event(event_name, data, channel);\n }\n shouldUseTLS() {\n return this.config.useTLS;\n }\n signin() {\n this.user.signin();\n }\n}\npusher_Pusher.instances = [];\npusher_Pusher.isReady = false;\npusher_Pusher.logToConsole = false;\npusher_Pusher.Runtime = runtime;\npusher_Pusher.ScriptReceivers = runtime.ScriptReceivers;\npusher_Pusher.DependenciesReceivers = runtime.DependenciesReceivers;\npusher_Pusher.auth_callbacks = runtime.auth_callbacks;\n/* harmony default export */ var core_pusher = __webpack_exports__[\"default\"] = (pusher_Pusher);\nfunction checkAppKey(key) {\n if (key === null || key === undefined) {\n throw 'You must pass your app key when you instantiate Pusher.';\n }\n}\nruntime.setup(pusher_Pusher);\n\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=pusher.js.map","import { TrulyYouSDKConfig, FetchOptions, SigningResult, FetchResult } from '../types'\nimport Pusher from 'pusher-js'\n\nexport class TrulyYouSDK {\n private config: TrulyYouSDKConfig\n private frontendUrl: string\n private apiUrl: string\n private authAppId: string | undefined\n private invisible: boolean\n private targetElement: string | HTMLElement | undefined\n private brandingCache: { primary?: string; background?: string; secondary?: string; textColor?: string; icon?: string; name?: string } | null = null\n private realtimeUrl: string\n private mockMobileDevice: boolean\n\n constructor(config: TrulyYouSDKConfig) {\n this.config = config\n this.frontendUrl = config.frontendUrl || this.getDefaultFrontendUrl()\n this.apiUrl = config.apiUrl || this.getDefaultApiUrl()\n this.authAppId = config.authAppId\n this.invisible = config.invisible || false\n this.targetElement = config.targetElement\n this.mockMobileDevice = config.mockMobileDevice || false\n \n // Determine realtime WebSocket URL\n if (config.realtimeUrl) {\n this.realtimeUrl = config.realtimeUrl\n console.log('[SDK]: Using provided realtimeUrl:', this.realtimeUrl)\n } else {\n // Infer from frontendUrl - replace http/https with ws/wss\n const url = new URL(this.frontendUrl)\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n this.realtimeUrl = `${wsProtocol}//${url.host}`\n console.log('[SDK]: No realtimeUrl provided, inferring from frontendUrl:', this.realtimeUrl)\n }\n \n // Fetch branding on instantiation if authAppId is provided\n if (this.authAppId) {\n this.fetchBranding().catch(err => {\n console.warn('[SDK]: Failed to fetch branding:', err)\n })\n }\n }\n\n\n /**\n * Fetch app branding from SDK backend\n */\n private async fetchBranding(): Promise<void> {\n if (!this.authAppId) return\n \n try {\n // Call SDK backend API directly\n const response = await fetch(`${this.apiUrl}/api/apps/${this.authAppId}`, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' }\n })\n if (response.ok) {\n const data = await response.json()\n // Handle both formats: { app: {...} } or direct app object\n const app = data.app || data\n if (app?.colors || app?.icon || app?.name) {\n this.brandingCache = {\n primary: app.colors?.primary,\n background: app.colors?.background,\n secondary: app.colors?.secondary,\n textColor: app.colors?.textColor,\n icon: app.icon,\n name: app.name\n }\n console.log('[SDK]: Branding fetched and cached:', this.brandingCache)\n }\n }\n } catch (error) {\n console.warn('[SDK]: Error fetching branding:', error)\n }\n }\n\n /**\n * Generate QR code with app icon overlaid in center\n */\n private async generateQRCodeWithIcon(qrData: string, imgElement: HTMLImageElement): Promise<void> {\n return new Promise((resolve, reject) => {\n // Step 1: Generate base QR code\n const qrCodeUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodeURIComponent(qrData)}`\n const qrImg = new Image()\n qrImg.crossOrigin = 'anonymous'\n \n qrImg.onload = () => {\n // Step 2: Create canvas and draw QR code\n const canvas = document.createElement('canvas')\n canvas.width = 300\n canvas.height = 300\n const ctx = canvas.getContext('2d')\n \n if (!ctx) {\n reject(new Error('Failed to get canvas context'))\n return\n }\n \n // Draw QR code\n ctx.drawImage(qrImg, 0, 0, 300, 300)\n \n // Step 3: Overlay app icon if available\n if (this.brandingCache?.icon) {\n // Try to load icon via proxy first (avoids CORS issues)\n // If proxy fails, try direct load, then fallback to QR without icon\n const tryLoadIcon = async (iconUrl: string, useProxy: boolean) => {\n try {\n let imageUrl = iconUrl\n \n if (useProxy) {\n // Fetch via proxy to avoid CORS\n const proxyUrl = `${this.apiUrl}/api/proxy-icon?url=${encodeURIComponent(iconUrl)}`\n const response = await fetch(proxyUrl)\n if (!response.ok) {\n throw new Error('Proxy fetch failed')\n }\n const blob = await response.blob()\n imageUrl = URL.createObjectURL(blob)\n }\n \n const iconImg = new Image()\n iconImg.crossOrigin = useProxy ? null : 'anonymous'\n \n await new Promise<void>((resolveIcon, rejectIcon) => {\n iconImg.onload = () => resolveIcon()\n iconImg.onerror = () => rejectIcon(new Error('Image load failed'))\n iconImg.src = imageUrl\n })\n \n // Calculate icon size (20% of QR code size)\n const iconSize = 60\n const iconX = (300 - iconSize) / 2\n const iconY = (300 - iconSize) / 2\n \n // Draw white background circle for icon\n ctx.fillStyle = '#ffffff'\n ctx.beginPath()\n ctx.arc(150, 150, iconSize / 2 + 4, 0, 2 * Math.PI)\n ctx.fill()\n \n // Draw icon\n ctx.drawImage(iconImg, iconX, iconY, iconSize, iconSize)\n \n // Clean up object URL if we created one\n if (useProxy && imageUrl.startsWith('blob:')) {\n URL.revokeObjectURL(imageUrl)\n }\n \n // Convert canvas to data URL and set as image source\n imgElement.src = canvas.toDataURL('image/png')\n resolve()\n } catch (error) {\n throw error\n }\n }\n \n // Try proxy first, then direct, then fallback\n const iconUrl = this.brandingCache.icon\n tryLoadIcon(iconUrl, true).catch(() => {\n // If proxy fails, try direct load\n tryLoadIcon(iconUrl, false).catch(() => {\n // If both fail, just use QR code without icon\n imgElement.src = canvas.toDataURL('image/png')\n resolve()\n })\n })\n } else {\n // No icon, just use QR code\n imgElement.src = canvas.toDataURL('image/png')\n resolve()\n }\n }\n \n qrImg.onerror = () => {\n reject(new Error('Failed to load QR code'))\n }\n \n qrImg.src = qrCodeUrl\n })\n }\n\n private getDefaultFrontendUrl(): string {\n if (typeof window !== 'undefined') {\n const hostname = window.location.hostname\n if (hostname === 'localhost' || hostname === '127.0.0.1') {\n return 'http://localhost:3002'\n }\n }\n return 'https://sdks.verification.local'\n }\n\n private getDefaultApiUrl(): string {\n if (typeof window !== 'undefined') {\n const hostname = window.location.hostname\n if (hostname === 'localhost' || hostname === '127.0.0.1') {\n return 'http://localhost:3003'\n }\n }\n return 'https://api.verification.local'\n }\n\n /**\n * Detect if running on iOS device\n */\n private isIOSDevice(): boolean {\n if (typeof window === 'undefined') return false\n return /iPad|iPhone|iPod/.test(navigator.userAgent) || \n (navigator.platform === 'MacIntel' && (navigator as any).maxTouchPoints > 1)\n }\n\n /**\n * Detect if running on Safari browser\n */\n private isSafariBrowser(): boolean {\n if (typeof window === 'undefined') return false\n return /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)\n }\n\n /**\n * Detect if running on desktop device (not just viewport-based)\n * Returns false if mockMobileDevice is enabled (treats as mobile)\n */\n private isDesktopDevice(): boolean {\n // If mock mobile device is enabled, always return false (treat as mobile)\n if (this.mockMobileDevice === true) {\n console.log('[SDK]: Mock mobile device mode enabled - treating device as mobile (no handoff)')\n return false\n }\n \n if (typeof window === 'undefined') return false\n \n const userAgent = navigator.userAgent || navigator.vendor || (window as any).opera\n const isMobileUA = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini|mobile/i.test(userAgent.toLowerCase())\n \n // Additional checks for actual mobile devices\n const hasTouchScreen = 'ontouchstart' in window || navigator.maxTouchPoints > 0\n const isMobileOrientation = window.screen && 'orientation' in window.screen\n \n // Desktop if: not mobile UA pattern OR (mobile UA but no real touch/orientation support)\n const isDesktop = !isMobileUA || (isMobileUA && !hasTouchScreen && !isMobileOrientation)\n \n return isDesktop\n }\n\n /**\n * Resolve target element from string selector or HTMLElement\n */\n private resolveTargetElement(): HTMLElement | null {\n if (!this.targetElement) return null\n \n if (typeof this.targetElement === 'string') {\n return document.querySelector(this.targetElement)\n }\n \n return this.targetElement\n }\n\n /**\n * Probe iframe to check if key exists in iframe's localStorage\n * Also checks backend to verify key exists and is active\n */\n private async probeIframeForKey(): Promise<string | null> {\n return new Promise((resolve) => {\n try {\n const origin = window.location.origin\n const iframe = document.createElement('iframe')\n iframe.style.cssText = `position: fixed; top: -9999px; left: -9999px; width: 1px; height: 1px; border: none; opacity: 0; pointer-events: none;`\n \n // Create a probe endpoint URL - we'll use /sign endpoint with a probe flag\n const probeUrl = new URL(`${this.frontendUrl}/sign`)\n probeUrl.searchParams.set('probe', 'true')\n probeUrl.searchParams.set('origin', origin)\n iframe.src = probeUrl.toString()\n\n let timeout: NodeJS.Timeout | undefined\n let backendCheckPromise: Promise<boolean> | null = null\n\n const cleanup = () => {\n window.removeEventListener('message', handleMessage)\n if (iframe.parentNode) {\n iframe.parentNode.removeChild(iframe)\n }\n if (timeout) {\n clearTimeout(timeout)\n }\n }\n\n const handleMessage = async (event: MessageEvent) => {\n try {\n const frontendOrigin = new URL(this.frontendUrl).origin\n if (event.origin !== frontendOrigin) return\n \n } catch (e) {\n if (!event.origin.includes(window.location.hostname)) return\n }\n\n const data = event.data as any\n if (data?.type === 'KEY_CHECK_RESULT') {\n cleanup()\n if (data.hasKey && data.keyId) {\n // Key found in localStorage - verify it's active in backend\n if (!backendCheckPromise) {\n backendCheckPromise = this.checkKeyStatus(data.keyId)\n }\n \n const isActive = await backendCheckPromise\n if (isActive) {\n resolve(data.keyId)\n } else {\n console.log('[SDK]: Key found in localStorage but not active in backend, ignoring')\n resolve(null)\n }\n } else {\n resolve(null)\n }\n } else if (data?.type === 'KEY_CHECK_FAILED') {\n cleanup()\n resolve(null)\n }\n }\n\n window.addEventListener('message', handleMessage)\n document.body.appendChild(iframe)\n\n // Short timeout to keep UX snappy\n timeout = setTimeout(() => {\n cleanup()\n resolve(null)\n }, 1500)\n } catch {\n resolve(null)\n }\n })\n }\n\n /**\n * Lightweight API call to check if key exists and is active in backend\n * Calls SDK frontend which proxies to SDK backend\n */\n private async checkKeyStatus(keyId: string): Promise<boolean> {\n try {\n const response = await fetch(`${this.frontendUrl}/api/key/check/${encodeURIComponent(keyId)}`, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' }\n })\n \n if (!response.ok) {\n console.log('[SDK]: Key status check failed:', response.status)\n return false\n }\n \n const result = await response.json() as any\n const isActive = result.success && result.exists && result.active === true\n \n if (!isActive) {\n console.log('[SDK]: Key found but not active:', {\n exists: result.exists,\n active: result.active,\n status: result.status\n })\n }\n \n return isActive\n } catch (error) {\n console.error('[SDK]: Error checking key status:', error)\n // If backend check fails, treat as invalid (fail closed for security)\n // This ensures we don't use keys if we can't verify their status\n return false\n }\n }\n\n /**\n * Open enrollment popup and wait for completion\n */\n private async enrollWithPopup(): Promise<string> {\n if (!this.authAppId) {\n throw new Error('authAppId is required for enrollment. Please configure authAppId in SDK config.')\n }\n\n // Generate session first\n const sessionResponse = await fetch(`${this.frontendUrl}/api/sessions/generate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ authAppId: this.authAppId })\n })\n\n if (!sessionResponse.ok) {\n const errorData = await sessionResponse.json()\n throw new Error(errorData.error || 'Failed to generate enrollment session')\n }\n\n const sessionData = await sessionResponse.json()\n const sessionId = sessionData.data.sessionId\n\n // authAppId is guaranteed to exist here due to check above\n const appId = this.authAppId!\n\n return new Promise((resolve, reject) => {\n const origin = window.location.origin\n \n // Build enrollment URL with branding colors from cache if available\n const enrollUrlParams = new URLSearchParams({\n authAppId: appId,\n sessionId: sessionId,\n returnTo: 'popup',\n origin: origin\n })\n \n // Add branding colors to URL params if cached\n if (this.brandingCache?.primary) {\n enrollUrlParams.set('primaryColor', this.brandingCache.primary)\n }\n if (this.brandingCache?.background) {\n enrollUrlParams.set('backgroundColor', this.brandingCache.background)\n }\n if (this.brandingCache?.secondary) {\n enrollUrlParams.set('secondaryColor', this.brandingCache.secondary)\n }\n if (this.brandingCache?.textColor) {\n enrollUrlParams.set('textColor', this.brandingCache.textColor)\n }\n \n const enrollUrl = `${this.frontendUrl}/enroll?${enrollUrlParams.toString()}`\n\n console.log('[SDK]: Opening enrollment popup:', enrollUrl)\n\n const popup = window.open(\n enrollUrl,\n 'trulyyou-enroll',\n 'width=600,height=700,scrollbars=yes,resizable=yes'\n )\n\n if (!popup) {\n reject(new Error('Failed to open enrollment popup. Please allow popups for this site.'))\n return\n }\n\n let timeout: NodeJS.Timeout\n let checkPopupClosed: NodeJS.Timeout\n let successReceived = false\n\n // Set up postMessage listener\n const handleMessage = (event: MessageEvent) => {\n console.log('[SDK]: Enrollment popup message received:', event.origin, event.data)\n\n // Verify origin matches frontend URL\n try {\n const frontendOrigin = new URL(this.frontendUrl).origin\n if (event.origin !== frontendOrigin) {\n console.log('[SDK]: Origin mismatch, ignoring message')\n return\n }\n } catch (e) {\n // If frontendUrl is relative or invalid, check if it matches current origin\n if (!event.origin.includes(window.location.hostname)) {\n console.log('[SDK]: Origin mismatch, ignoring message')\n return\n }\n }\n\n if (event.data && event.data.type === 'ENROLLMENT_SUCCESS') {\n successReceived = true\n \n // Clear timeouts\n if (timeout) clearTimeout(timeout)\n if (checkPopupClosed) clearInterval(checkPopupClosed)\n\n // Remove listener\n window.removeEventListener('message', handleMessage)\n\n // Get keyId from message first (avoids race condition with localStorage)\n // Fallback to localStorage if not in message\n const keyIdFromMessage = event.data.keyId\n const trulyYouKeyId = keyIdFromMessage || localStorage.getItem('trulyYouKeyId')\n \n if (trulyYouKeyId) {\n console.log('[SDK]: Enrollment successful, keyId obtained:', trulyYouKeyId, keyIdFromMessage ? '(from message)' : '(from localStorage)')\n // Also ensure it's in localStorage for future use\n if (keyIdFromMessage && !localStorage.getItem('trulyYouKeyId')) {\n localStorage.setItem('trulyYouKeyId', keyIdFromMessage)\n }\n resolve(trulyYouKeyId)\n } else {\n // Final fallback: wait a bit and check localStorage again (race condition mitigation)\n setTimeout(() => {\n const delayedKeyId = localStorage.getItem('trulyYouKeyId')\n if (delayedKeyId) {\n console.log('[SDK]: Enrollment successful, keyId obtained (delayed):', delayedKeyId)\n resolve(delayedKeyId)\n } else {\n reject(new Error('Enrollment completed but no keyId found in message or localStorage'))\n }\n }, 500)\n }\n } else if (event.data && event.data.type === 'ENROLLMENT_ERROR') {\n successReceived = true\n if (timeout) clearTimeout(timeout)\n if (checkPopupClosed) clearInterval(checkPopupClosed)\n window.removeEventListener('message', handleMessage)\n reject(new Error(event.data.error || 'Enrollment failed'))\n }\n }\n\n window.addEventListener('message', handleMessage)\n\n // Timeout after 10 minutes\n timeout = setTimeout(() => {\n if (!successReceived) {\n window.removeEventListener('message', handleMessage)\n if (checkPopupClosed) clearInterval(checkPopupClosed)\n reject(new Error('Enrollment timeout'))\n }\n }, 10 * 60 * 1000)\n\n // Check if popup was closed manually\n checkPopupClosed = setInterval(() => {\n if (popup.closed && !successReceived) {\n clearInterval(checkPopupClosed)\n clearTimeout(timeout)\n window.removeEventListener('message', handleMessage)\n reject(new Error('Enrollment popup was closed'))\n }\n }, 500)\n })\n }\n\n /**\n * Sign with iframe (mobile device)\n */\n private async signWithIframe(apiCallStructure: {\n body: any\n uri: string\n method: string\n headers?: any\n }): Promise<SigningResult> {\n return new Promise((resolve, reject) => {\n try {\n const signId = `sign_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n const targetElement = this.resolveTargetElement()\n \n // Create signing loading overlay if we have a target element\n const createSigningLoadingOverlay = () => {\n if (!targetElement) return null\n \n const overlay = document.createElement('div')\n overlay.id = `signing-overlay-${signId}`\n overlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(255, 255, 255, 0.9);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n border-radius: 8px;\n `\n \n const spinner = document.createElement('div')\n spinner.style.cssText = `\n width: 48px;\n height: 48px;\n border: 4px solid ${this.config.spinnerBgColor || '#e5e7eb'};\n border-top-color: ${this.config.spinnerColor || '#2563eb'};\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin-bottom: 16px;\n `\n \n const text = document.createElement('div')\n text.textContent = 'Authenticating...'\n text.style.cssText = `\n color: ${this.config.spinnerTextColor || '#6b7280'};\n font-size: 14px;\n font-weight: 500;\n `\n \n // Add CSS animation\n const style = document.createElement('style')\n style.textContent = `\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n `\n document.head.appendChild(style)\n \n overlay.appendChild(spinner)\n overlay.appendChild(text)\n \n return overlay\n }\n\n // Create iframe for signing\n const iframe = document.createElement('iframe')\n iframe.name = `trulyyou-sign-frame-${signId}`\n iframe.scrolling = 'no'\n iframe.setAttribute('scrolling', 'no')\n // Allow WebAuthn in iframe (required for cross-origin iframes)\n iframe.setAttribute('allow', 'publickey-credentials-get *; publickey-credentials-create *')\n \n // Encode payload\n const sortObjectByKeys = (obj: any): any => {\n if (obj === null || typeof obj !== 'object' || obj instanceof Array) {\n return obj\n }\n const sorted: any = {}\n Object.keys(obj).sort().forEach(key => {\n sorted[key] = sortObjectByKeys(obj[key])\n })\n return sorted\n }\n\n const createPayloadBase64 = (data: any, uri: string, method: string, queryParams: any) => {\n const dataToProcess = data === undefined || data === null ? {} : data\n const queryParamsToProcess = queryParams === undefined || queryParams === null ? {} : queryParams\n \n const sortedData = sortObjectByKeys(dataToProcess)\n const sortedQueryParams = sortObjectByKeys(queryParamsToProcess)\n \n const encodedBody = btoa(JSON.stringify(sortedData))\n const encodedQueryParams = btoa(JSON.stringify(sortedQueryParams))\n \n const payloadData = {\n method: method,\n uriId: uri,\n requestBody: encodedBody,\n queryParams: encodedQueryParams,\n }\n \n return {\n fullbase64: btoa(JSON.stringify(payloadData)),\n sortedData: sortedData,\n sortedQueryParams: sortedQueryParams,\n encodedBody: encodedBody,\n encodedQueryParams: encodedQueryParams,\n }\n }\n\n const base64EncodedResponse = createPayloadBase64(\n apiCallStructure.body || {},\n apiCallStructure.uri,\n apiCallStructure.method,\n {}\n )\n const encodedPayload = base64EncodedResponse.fullbase64\n \n // Prepare attestation data for iframe\n const attestationDataForIframe = {\n payload: encodedPayload,\n apiCallStructure: apiCallStructure\n }\n \n const encodedData = btoa(JSON.stringify(attestationDataForIframe))\n \n // Create form for POST submission to /sign/submit API route\n const form = document.createElement('form')\n form.method = 'POST'\n form.action = `${this.frontendUrl}/sign/submit`\n form.target = iframe.name\n form.style.display = 'none'\n \n // Add form data as hidden inputs\n const attestationDataInput = document.createElement('input')\n attestationDataInput.type = 'hidden'\n attestationDataInput.name = 'attestationData'\n attestationDataInput.value = encodedData\n form.appendChild(attestationDataInput)\n \n const signIdInput = document.createElement('input')\n signIdInput.type = 'hidden'\n signIdInput.name = 'signId'\n signIdInput.value = signId\n form.appendChild(signIdInput)\n \n const modeInput = document.createElement('input')\n modeInput.type = 'hidden'\n modeInput.name = 'mode'\n modeInput.value = 'embedded'\n form.appendChild(modeInput)\n \n // Determine if iframe will be visible (for mobile: not invisible, or iOS/Safari always visible)\n const isIframeVisible = !this.invisible || this.isIOSDevice() || this.isSafariBrowser()\n \n // Add branding colors and visibility flag to form data\n const brandingInput = document.createElement('input')\n brandingInput.type = 'hidden'\n brandingInput.name = 'branding'\n brandingInput.value = JSON.stringify({\n primary: this.brandingCache?.primary || this.config.spinnerColor || '#2563eb',\n background: this.brandingCache?.background || '#ffffff',\n secondary: this.brandingCache?.secondary || '#2563eb',\n textColor: this.brandingCache?.textColor || this.config.spinnerTextColor || '#6b7280',\n spinnerColor: this.config.spinnerColor || this.brandingCache?.primary || '#2563eb',\n spinnerBgColor: this.config.spinnerBgColor || '#e5e7eb',\n spinnerTextColor: this.config.spinnerTextColor || this.brandingCache?.textColor || '#6b7280',\n visible: isIframeVisible\n })\n form.appendChild(brandingInput)\n \n // Mobile device logic (mock mobile OR actual mobile - both treated the same)\n const isMobile = this.mockMobileDevice || !this.isDesktopDevice()\n \n if (isMobile) {\n // Mobile: NEVER full screen\n // iOS/Safari: ALWAYS use target element if provided (WebAuthn requires visible iframe)\n if (this.isIOSDevice() || this.isSafariBrowser()) {\n if (targetElement) {\n // iOS/Safari: Use target element (required for WebAuthn)\n const targetStyle = window.getComputedStyle(targetElement)\n if (targetStyle.position === 'static') {\n targetElement.style.position = 'relative'\n }\n const originalHeight = targetElement.style.height || targetStyle.height\n if (!originalHeight || originalHeight === 'auto') {\n const computedHeight = targetElement.offsetHeight\n if (computedHeight > 0) {\n targetElement.style.height = `${computedHeight}px`\n }\n }\n iframe.style.cssText = `position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none; z-index: 9999;`\n targetElement.appendChild(iframe)\n // No overlay needed - sign page is hidden when embedded\n } else {\n // iOS/Safari with no target element: must use invisible (can't use full screen on mobile)\n console.warn('[SDK]: Mobile iOS/Safari with no target element - using invisible iframe (WebAuthn may fail)')\n iframe.style.cssText = `position: fixed; top: -9999px; left: -9999px; width: 1px; height: 1px; border: none; opacity: 0; pointer-events: none;`\n }\n } else {\n // Mobile non-iOS/Safari: invisible if invisible=true, target element if invisible=false\n if (this.invisible) {\n iframe.style.cssText = `position: fixed; top: -9999px; left: -9999px; width: 1px; height: 1px; border: none; opacity: 0; pointer-events: none;`\n } else if (targetElement) {\n // Visible iframe in target element\n const targetStyle = window.getComputedStyle(targetElement)\n if (targetStyle.position === 'static') {\n targetElement.style.position = 'relative'\n }\n const originalHeight = targetElement.style.height || targetStyle.height\n if (!originalHeight || originalHeight === 'auto') {\n const computedHeight = targetElement.offsetHeight\n if (computedHeight > 0) {\n targetElement.style.height = `${computedHeight}px`\n }\n }\n iframe.style.cssText = `position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none; z-index: 9999;`\n targetElement.appendChild(iframe)\n // No overlay - sign page is hidden when embedded\n } else {\n // No target element - use invisible (can't use full screen on mobile)\n console.warn('[SDK]: Mobile device with invisible=true but no target element - using invisible iframe')\n iframe.style.cssText = `position: fixed; top: -9999px; left: -9999px; width: 1px; height: 1px; border: none; opacity: 0; pointer-events: none;`\n }\n }\n } else {\n // Desktop device: can use full screen (only when opened directly on Device B after handoff)\n // But when called from SDK, prefer target element or invisible\n if (this.invisible) {\n iframe.style.cssText = `position: fixed; top: -9999px; left: -9999px; width: 1px; height: 1px; border: none; opacity: 0; pointer-events: none;`\n } else if (targetElement) {\n // Visible iframe in target element\n const targetStyle = window.getComputedStyle(targetElement)\n if (targetStyle.position === 'static') {\n targetElement.style.position = 'relative'\n }\n const originalHeight = targetElement.style.height || targetStyle.height\n if (!originalHeight || originalHeight === 'auto') {\n const computedHeight = targetElement.offsetHeight\n if (computedHeight > 0) {\n targetElement.style.height = `${computedHeight}px`\n }\n }\n iframe.style.cssText = `position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none; z-index: 9999;`\n targetElement.appendChild(iframe)\n const overlay = createSigningLoadingOverlay()\n if (overlay) {\n targetElement.appendChild(overlay)\n }\n } else {\n // Desktop: full screen overlay (only when no target element - Device B after handoff)\n iframe.style.cssText = `position: fixed; top: 0; left: 0; width: 100%; height: 100%; border: none; z-index: 9999; background: white;`\n }\n }\n \n // Append form to body\n document.body.appendChild(form)\n \n // Append iframe - only to body if not already appended to target element above\n // Check if iframe has a parent (was already appended to target element)\n if (!iframe.parentNode) {\n document.body.appendChild(iframe)\n }\n \n let timeout: NodeJS.Timeout | undefined\n let overlayElement: HTMLElement | null = null\n \n const cleanup = () => {\n window.removeEventListener('message', handleMessage)\n if (form.parentNode) {\n form.parentNode.removeChild(form)\n }\n if (iframe.parentNode) {\n iframe.parentNode.removeChild(iframe)\n }\n if (overlayElement && overlayElement.parentNode) {\n overlayElement.parentNode.removeChild(overlayElement)\n }\n if (timeout) {\n clearTimeout(timeout)\n }\n // Remove height constraint from target element\n if (targetElement && !this.invisible) {\n targetElement.style.height = ''\n }\n }\n \n const handleMessage = (event: MessageEvent) => {\n try {\n const frontendOrigin = new URL(this.frontendUrl).origin\n if (event.origin !== frontendOrigin) return\n } catch (e) {\n if (!event.origin.includes(window.location.hostname)) return\n }\n \n const data = event.data as any\n // Handle both SIGNING_COMPLETE and SIGNATURE_COMPLETE (sign page sends SIGNATURE_COMPLETE)\n if ((data?.type === 'SIGNING_COMPLETE' || data?.type === 'SIGNATURE_COMPLETE') && data?.signId === signId) {\n console.log('[SDK]: Signature complete message received:', { type: data.type, hasSignature: !!data.signature || !!data.signatureBase64 })\n cleanup()\n if (data.error) {\n reject(new Error(data.error))\n } else {\n // Sign page sends signatureBase64, but we expect signature - use either field\n const signature = data.signature || data.signatureBase64\n if (!signature) {\n reject(new Error('No signature in response'))\n return\n }\n resolve({\n signature: signature,\n keyId: data.keyId || ''\n })\n }\n } else if (data?.type === 'SIGNING_ERROR' && data?.signId === signId) {\n cleanup()\n reject(new Error(data.error || 'Signing failed'))\n }\n }\n \n window.addEventListener('message', handleMessage)\n \n // Submit form to iframe\n form.submit()\n \n // Remove form after submission\n setTimeout(() => {\n if (form.parentNode) {\n form.parentNode.removeChild(form)\n }\n }, 100)\n \n // Store overlay reference for cleanup\n if (targetElement && !this.invisible) {\n overlayElement = targetElement.querySelector(`#signing-overlay-${signId}`) as HTMLElement\n }\n \n // Timeout after 5 minutes\n timeout = setTimeout(() => {\n cleanup()\n reject(new Error('Signing timeout'))\n }, 5 * 60 * 1000)\n \n } catch (error: any) {\n reject(error)\n }\n })\n }\n\n /**\n * Sign with WebSocket handoff (desktop device)\n */\n private async signWithWebSocketHandoff(apiCallStructure: {\n body: any\n uri: string\n method: string\n headers?: any\n }, signatureId: string): Promise<SigningResult> {\n return new Promise((resolve, reject) => {\n try {\n console.log('[SDK]: Desktop device detected, using WebSocket handoff with signatureId:', signatureId)\n \n // Get primary color and app name from branding cache (already fetched on SDK instantiation)\n const primaryColor = this.brandingCache?.primary || '#2563eb'\n const authAppName = this.brandingCache?.name || 'TrulyYou'\n \n // Encode signatureId, primaryColor, and authAppName as base64 JSON for URL parameter\n const encodedData = {\n signatureId: signatureId,\n primaryColor: primaryColor,\n authAppName: authAppName\n }\n const encodedThing = btoa(JSON.stringify(encodedData))\n \n // Build sign URL with encoded parameter (no query params)\n const signUrl = `${this.frontendUrl}/sign/${encodedThing}`\n \n // Encode payload\n const sortObjectByKeys = (obj: any): any => {\n if (obj === null || typeof obj !== 'object' || obj instanceof Array) {\n return obj\n }\n const sorted: any = {}\n Object.keys(obj).sort().forEach(key => {\n sorted[key] = sortObjectByKeys(obj[key])\n })\n return sorted\n }\n\n const createPayloadBase64 = (data: any, uri: string, method: string, queryParams: any) => {\n const dataToProcess = data === undefined || data === null ? {} : data\n const queryParamsToProcess = queryParams === undefined || queryParams === null ? {} : queryParams\n \n const sortedData = sortObjectByKeys(dataToProcess)\n const sortedQueryParams = sortObjectByKeys(queryParamsToProcess)\n \n const encodedBody = btoa(JSON.stringify(sortedData))\n const encodedQueryParams = btoa(JSON.stringify(sortedQueryParams))\n \n const payloadData = {\n method: method,\n uriId: uri,\n requestBody: encodedBody,\n queryParams: encodedQueryParams,\n }\n \n return {\n fullbase64: btoa(JSON.stringify(payloadData)),\n sortedData: sortedData,\n sortedQueryParams: sortedQueryParams,\n encodedBody: encodedBody,\n encodedQueryParams: encodedQueryParams,\n }\n }\n\n const base64EncodedResponse = createPayloadBase64(\n apiCallStructure.body || {},\n apiCallStructure.uri,\n apiCallStructure.method,\n {}\n )\n const encodedPayload = base64EncodedResponse.fullbase64\n\n // Prepare attestation data for sending\n const attestationData = {\n payload: encodedPayload,\n apiCallStructure: apiCallStructure\n }\n\n // Parse realtimeUrl to extract host/port for Pusher\n let pusherHost: string | undefined\n let pusherPort: number | undefined\n let forceTLS = false\n let encrypted = true\n \n try {\n const realtimeUrlObj = new URL(this.realtimeUrl.startsWith('ws://') || this.realtimeUrl.startsWith('wss://') \n ? this.realtimeUrl \n : this.realtimeUrl.replace(/^http:/, 'ws:').replace(/^https:/, 'wss:'))\n \n pusherHost = realtimeUrlObj.hostname\n pusherPort = realtimeUrlObj.port ? parseInt(realtimeUrlObj.port, 10) : (realtimeUrlObj.protocol === 'wss:' ? 443 : 80)\n forceTLS = realtimeUrlObj.protocol === 'wss:'\n encrypted = realtimeUrlObj.protocol === 'wss:'\n } catch (e) {\n console.warn('[SDK]: Error parsing realtimeUrl, using defaults:', e)\n pusherHost = '127.0.0.1'\n pusherPort = 6001\n }\n \n // Get Pusher app key from config or use default\n const pusherAppKey = this.config.pusherAppKey || 'app-key'\n \n // Merge custom Pusher config with parsed values\n // When using custom wsHost/wsPort, we need to set cluster to empty string to disable default cluster behavior\n const pusherOptions: any = {\n wsHost: this.config.pusherConfig?.wsHost || pusherHost,\n wsPort: this.config.pusherConfig?.wsPort || pusherPort,\n cluster: this.config.pusherConfig?.cluster || '', // Required when using custom wsHost/wsPort\n forceTLS: this.config.pusherConfig?.forceTLS ?? forceTLS,\n encrypted: this.config.pusherConfig?.encrypted ?? encrypted,\n disableStats: this.config.pusherConfig?.disableStats ?? true,\n enabledTransports: this.config.pusherConfig?.enabledTransports || ['ws', 'wss'],\n }\n \n console.log('[SDK]: Initializing Pusher with config:', pusherOptions)\n const pusher = new Pusher(pusherAppKey, pusherOptions)\n \n // Use signatureId as the channel name (Soketi doesn't need 'public-' prefix)\n const channel = pusher.subscribe(signatureId)\n console.log('[SDK]: Attempting to subscribe to Pusher channel:', signatureId)\n \n // Log when channel subscription succeeds and bind events\n channel.bind('pusher:subscription_succeeded', () => {\n console.log('[SDK]: ✅ Successfully subscribed to channel:', signatureId)\n \n // Bind countdown events after subscription succeeds (backend uses client-* prefix)\n channel.bind('countdown_update', (data: any) => {\n console.log('[SDK]: 📊 Received countdown_update event:', data)\n })\n channel.bind('client-countdown_update', (data: any) => {\n console.log('[SDK]: 📊 Received client-countdown_update event:', data)\n })\n \n channel.bind('countdown_expired', () => {\n console.log('[SDK]: ⏰ Received countdown_expired event')\n })\n channel.bind('client-countdown_expired', () => {\n console.log('[SDK]: ⏰ Received client-countdown_expired event')\n })\n })\n \n // Store handlers in a variable that will be set later\n let handleCountdownUpdate: ((data: any) => void) | null = null\n let handleCountdownExpired: (() => void) | null = null\n \n // Bind events early - handlers will be assigned after QR setup\n const earlyCountdownHandler = (data: any) => {\n console.log('[SDK]: 📊 Received countdown_update event (early bind):', data)\n if (handleCountdownUpdate) {\n handleCountdownUpdate(data)\n } else {\n console.warn('[SDK]: Countdown handler not ready yet, storing event')\n // Store event to process once handler is ready\n setTimeout(() => {\n if (handleCountdownUpdate) {\n handleCountdownUpdate(data)\n }\n }, 100)\n }\n }\n channel.bind('countdown_update', earlyCountdownHandler)\n channel.bind('client-countdown_update', earlyCountdownHandler) // Backend sends as client event\n \n const earlyExpiredHandler = () => {\n console.log('[SDK]: ⏰ Received countdown_expired event (early bind)')\n if (handleCountdownExpired) {\n handleCountdownExpired()\n }\n }\n channel.bind('countdown_expired', earlyExpiredHandler)\n channel.bind('client-countdown_expired', earlyExpiredHandler) // Backend sends as client event\n \n // Log connection errors\n pusher.connection.bind('error', (err: any) => {\n console.error('[SDK]: ❌ Pusher connection error:', err)\n })\n \n // Log state changes\n pusher.connection.bind('state_change', (states: any) => {\n console.log('[SDK]: 🔄 Pusher state change:', states.previous, '->', states.current)\n })\n \n let counterpartyConnected = false\n let timeout: NodeJS.Timeout\n\n // Wait for Pusher connection\n pusher.connection.bind('connected', () => {\n console.log('[SDK]: Pusher connected, waiting for counterparty...')\n \n // Notify server that desktop device connected (if QR is shown inline, already sent above)\n if (!targetElement || !qrContainer) {\n channel.trigger('client-device_connected', { type: 'device_connected', deviceType: 'desktop' })\n }\n \n // Timeout after 5 minutes\n timeout = setTimeout(() => {\n cleanup()\n pusher.disconnect()\n reject(new Error('WebSocket handoff timeout - no counterparty connected'))\n }, 5 * 60 * 1000)\n })\n\n // Listen for mobile device connection (client event from sign page)\n // Device B now fetches payload from API, so we just mark as connected\n channel.bind('client-device_connected', (data: any) => {\n // Only react to mobile device connections (ignore our own desktop connection)\n if (data.type === 'device_connected' && data.deviceType === 'mobile' && !counterpartyConnected) {\n counterpartyConnected = true\n console.log('[SDK]: Mobile device connected (payload will be fetched from API)')\n // No longer sending payload via socket - Device B fetches from API\n }\n })\n\n // Listen for signature result (client event from mobile)\n channel.bind('client-signature_result', (data: any) => {\n console.log('[SDK]: Signature result event received, raw data:', data)\n console.log('[SDK]: Data keys:', Object.keys(data || {}))\n console.log('[SDK]: counterpartyConnected:', counterpartyConnected)\n \n // Extract signature from data - handle both direct and wrapped formats\n const signature = data?.signature || data?.data?.signature\n const error = data?.error || data?.data?.error\n const keyId = data?.keyId || data?.data?.keyId\n \n console.log('[SDK]: Extracted values - signature:', !!signature, 'error:', error, 'keyId:', keyId)\n console.log('[SDK]: Full socket data received:', JSON.stringify(data, null, 2))\n \n // Prevent multiple processing\n if (!counterpartyConnected) {\n console.warn('[SDK]: Received signature result but counterparty not marked as connected yet. Waiting...')\n // Don't return - might be a timing issue, try to process anyway\n }\n \n clearTimeout(timeout)\n \n if (error) {\n console.error('[SDK]: Signature error:', error)\n cleanup()\n pusher.disconnect()\n reject(new Error(error))\n return\n } \n \n if (signature) {\n console.log('[SDK]: Signature received successfully, resolving promise...')\n // Use keyId from Device B (not localStorage) - Device B sent this via socket\n const deviceBKeyId = keyId || ''\n if (!deviceBKeyId) {\n console.warn('[SDK]: ⚠️ WARNING - No keyId received from Device B via socket! Data:', data)\n }\n console.log('[SDK]: ✅ Using keyId from Device B:', deviceBKeyId, '(extracted from socket)')\n const result: SigningResult = {\n signature: signature,\n keyId: deviceBKeyId,\n signatureId: signatureId\n }\n console.log('[SDK]: Resolving with SigningResult:', { \n signatureLength: result.signature?.length, \n keyId: result.keyId, \n signatureId: result.signatureId,\n keyIdSource: deviceBKeyId ? 'Device B (socket)' : 'MISSING - will fallback to localStorage'\n })\n \n cleanup()\n pusher.disconnect()\n resolve(result)\n return\n }\n \n console.error('[SDK]: Invalid signature result data - no signature or error:', JSON.stringify(data))\n cleanup()\n pusher.disconnect()\n reject(new Error('Invalid signature result received'))\n })\n\n pusher.connection.bind('error', (error: any) => {\n console.error('[SDK]: Pusher connection error:', error)\n clearTimeout(timeout)\n pusher.disconnect()\n reject(new Error('Pusher connection error'))\n })\n\n pusher.connection.bind('disconnected', () => {\n console.log('[SDK]: Pusher disconnected')\n clearTimeout(timeout)\n })\n\n // Store signatureId and signUrl for enrollment page to use\n // This will be handled by opening enrollment page with signatureId\n // For now, we'll need to modify the enrollment flow to handle this\n \n // Actually, we need to open enrollment page instead of sign page\n // The enrollment page will show QR code and handle WebSocket\n // Let's modify the approach - we'll emit an event that the app can listen to\n \n // Store attestation data in sessionStorage for sign page to access\n sessionStorage.setItem(`signHandoff_${signatureId}`, JSON.stringify(attestationData))\n \n // Show QR code inline in target element (Device A - desktop)\n // Device B will scan QR code and open the sign page URL\n const targetElement = this.resolveTargetElement()\n let qrContainer: HTMLElement | null = null\n let checkWindowClosed: NodeJS.Timeout | null = null\n \n if (targetElement) {\n // Create QR code container\n qrContainer = document.createElement('div')\n qrContainer.id = `qr-handoff-${signatureId}`\n qrContainer.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100%;\n height: 100%;\n max-width: 100%;\n max-height: 100%;\n overflow: hidden;\n background-color: rgba(255, 255, 255, 0.98);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 10001;\n padding: 0;\n box-sizing: border-box;\n `\n \n // Create QR code wrapper with countdown SVG overlay\n const qrWrapper = document.createElement('div')\n qrWrapper.style.cssText = `\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n max-width: 100%;\n max-height: 100%;\n `\n \n // Create loading spinner (shown while QR loads)\n const spinnerContainer = document.createElement('div')\n spinnerContainer.style.cssText = `\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 48px;\n height: 48px;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n `\n \n const spinner = document.createElement('div')\n spinner.style.cssText = `\n width: 48px;\n height: 48px;\n border: 4px solid ${this.brandingCache?.primary ? `${this.brandingCache.primary}20` : '#e5e7eb'};\n border-top-color: ${this.brandingCache?.primary || '#2563eb'};\n border-radius: 50%;\n animation: spin 1s linear infinite;\n `\n \n // Add spin animation\n const style = document.createElement('style')\n style.textContent = `\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n `\n document.head.appendChild(style)\n \n spinnerContainer.appendChild(spinner)\n \n // Create QR code with app icon overlay in center\n const qrImage = document.createElement('img')\n qrImage.alt = 'QR Code for mobile signing (click to copy URL)'\n qrImage.style.cssText = `\n width: 100%;\n height: 100%;\n max-width: 100%;\n max-height: 100%;\n aspect-ratio: 1;\n object-fit: contain;\n cursor: pointer;\n transition: opacity 0.2s;\n position: relative;\n z-index: 2;\n display: none;\n opacity: 0;\n `\n qrImage.title = 'Click to copy URL to clipboard'\n \n // Show spinner initially, hide when QR loads\n qrImage.addEventListener('load', () => {\n console.log('[SDK]: QR image loaded')\n spinnerContainer.style.display = 'none'\n qrImage.style.display = 'block'\n qrImage.style.opacity = '1'\n // Recalculate SVG position after QR is loaded and visible\n setTimeout(() => {\n if (setupCountdownRect) {\n setupCountdownRect()\n }\n }, 50)\n })\n \n qrImage.addEventListener('error', () => {\n console.error('[SDK]: QR image failed to load')\n spinnerContainer.style.display = 'none'\n // Still try to show QR even if load failed\n qrImage.style.display = 'block'\n qrImage.style.opacity = '0.5'\n })\n \n // Create countdown SVG overlay (positioned absolutely over QR image, matching exact size)\n const countdownSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n countdownSvg.id = `countdown-svg-${signatureId}`\n \n // Wait for QR image to load and get actual rendered dimensions, then size SVG to match exactly\n const setupCountdownRect = () => {\n // Get actual rendered size and position of QR image (after object-fit: contain is applied)\n const qrRect = qrImage.getBoundingClientRect()\n const qrWrapperRect = qrWrapper.getBoundingClientRect()\n \n // QR image with object-fit: contain and aspect-ratio: 1 will be square\n // and fit inside the wrapper. Get its actual rendered size.\n const actualQRSize = Math.min(qrRect.width, qrRect.height)\n \n // Make SVG slightly bigger than QR to create border space (5% larger on each side = 10% total)\n const borderPadding = actualQRSize * 0.05 // 5% padding on each side\n const svgSize = actualQRSize + (borderPadding * 2) // Total SVG size with border space\n \n // Calculate position relative to wrapper (not viewport)\n // Use getBoundingClientRect for accurate positioning (accounts for transforms and object-fit)\n // For centered QR with flexbox, calculate offset from QR center to wrapper center\n const qrCenterX = qrRect.left + qrRect.width / 2 - qrWrapperRect.left\n const qrCenterY = qrRect.top + qrRect.height / 2 - qrWrapperRect.top\n \n // SVG should be centered over QR but slightly bigger - position from top-left\n const offsetX = qrCenterX - svgSize / 2\n const offsetY = qrCenterY - svgSize / 2\n \n // Use getBoundingClientRect values as they account for transforms and positioning\n console.log('[SDK]: QR positioning - centered offset:', offsetX, offsetY, 'QR size:', actualQRSize, 'SVG size:', svgSize)\n \n // Position and size SVG to be slightly bigger than QR (with border space)\n countdownSvg.style.cssText = `\n position: absolute;\n top: ${offsetY}px;\n left: ${offsetX}px;\n width: ${svgSize}px;\n height: ${svgSize}px;\n pointer-events: none;\n z-index: 2;\n transform: rotate(0deg);\n transform-origin: center center;\n `\n countdownSvg.setAttribute('viewBox', `0 0 ${svgSize} ${svgSize}`)\n countdownSvg.setAttribute('preserveAspectRatio', 'xMidYMid meet')\n \n // Rounded rectangle parameters - use percentages relative to viewBox\n // The SVG is bigger than QR to create border space, but rect should fit within SVG bounds\n const rectWidth = svgSize\n const rectHeight = svgSize\n const cornerRadius = svgSize * 0.04 // 4% of size for rounded corners (scales with QR)\n const strokeWidth = svgSize * 0.06 // 6% of size for stroke (3x thicker - scales with QR)\n \n // Clear existing rects if any\n while (countdownSvg.firstChild) {\n countdownSvg.removeChild(countdownSvg.firstChild)\n }\n \n // Position rect so stroke sits OUTSIDE the QR image\n // QR is centered in SVG, so it goes from borderPadding to svgSize - borderPadding\n // We want the stroke to sit outside this, so:\n // - Rect inner edge should be at borderPadding (QR edge)\n // - Stroke is centered on path, so x = borderPadding - strokeWidth/2 (so stroke extends outside)\n // - Rect width should be actualQRSize + strokeWidth (to account for stroke extending outside)\n const rectX = borderPadding - strokeWidth / 2\n const rectY = borderPadding - strokeWidth / 2\n const rectW = actualQRSize + strokeWidth\n const rectH = actualQRSize + strokeWidth\n \n // Background rounded rectangle outline - positioned OUTSIDE QR bounds\n const bgRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n bgRect.setAttribute('x', rectX.toString())\n bgRect.setAttribute('y', rectY.toString())\n bgRect.setAttribute('width', rectW.toString())\n bgRect.setAttribute('height', rectH.toString())\n bgRect.setAttribute('rx', cornerRadius.toString())\n bgRect.setAttribute('ry', cornerRadius.toString())\n bgRect.setAttribute('fill', 'none')\n bgRect.setAttribute('stroke', '#e5e7eb')\n bgRect.setAttribute('stroke-width', strokeWidth.toString())\n countdownSvg.appendChild(bgRect)\n \n // Progress rounded rectangle outline (animated) - same positioning, OUTSIDE QR bounds\n const progressRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n progressRect.id = `countdown-progress-${signatureId}`\n progressRect.setAttribute('x', rectX.toString())\n progressRect.setAttribute('y', rectY.toString())\n progressRect.setAttribute('width', rectW.toString())\n progressRect.setAttribute('height', rectH.toString())\n progressRect.setAttribute('rx', cornerRadius.toString())\n progressRect.setAttribute('ry', cornerRadius.toString())\n progressRect.setAttribute('fill', 'none')\n progressRect.setAttribute('stroke', this.brandingCache?.primary || '#2563eb')\n progressRect.setAttribute('stroke-width', strokeWidth.toString())\n progressRect.setAttribute('stroke-linecap', 'round')\n progressRect.setAttribute('stroke-linejoin', 'round')\n // Recalculate perimeter with new dimensions (rect is outside QR bounds)\n const actualInnerWidth = rectW\n const actualInnerHeight = rectH\n const actualInnerRx = cornerRadius\n const actualStraightEdges = 2 * (actualInnerWidth + actualInnerHeight - 2 * actualInnerRx)\n const actualCornerArcs = 2 * Math.PI * actualInnerRx\n const actualPerimeter = actualStraightEdges + actualCornerArcs\n progressRect.setAttribute('stroke-dasharray', actualPerimeter.toString())\n progressRect.setAttribute('stroke-dashoffset', actualPerimeter.toString())\n progressRect.style.transition = 'stroke-dashoffset 0.3s linear, stroke 0.3s linear'\n countdownSvg.appendChild(progressRect)\n \n // Return actual perimeter for use in countdown updates\n return { perimeter: actualPerimeter }\n }\n \n // Setup when image loads or immediately if already loaded\n if (qrImage.complete && qrImage.naturalWidth > 0) {\n setupCountdownRect()\n } else {\n qrImage.addEventListener('load', () => {\n setupCountdownRect()\n })\n // Fallback setup with default values\n setupCountdownRect()\n }\n \n // Countdown state\n let countdownState = { remaining: 30, total: 30 }\n \n // Listen for countdown updates (bound both early and in subscription_succeeded)\n // Assign handler to the stored variable so early binds can access it\n handleCountdownUpdate = (data: any) => {\n console.log('[SDK]: 🎯 Processing countdown_update:', data)\n if (data && (data.type === 'countdown_update' || data.timeRemaining !== undefined)) {\n countdownState = { \n remaining: data.timeRemaining ?? countdownState.remaining, \n total: data.totalTime ?? countdownState.total \n }\n console.log(`[SDK]: 📊 Updating countdown rectangle: ${countdownState.remaining}/${countdownState.total}`)\n \n // Calculate perimeter using actual SVG size from viewBox\n const viewBoxAttr = countdownSvg.getAttribute('viewBox')\n const svgSize = viewBoxAttr ? parseFloat(viewBoxAttr.split(' ')[2]) || 100 : 100\n const cornerRadius = svgSize * 0.04\n const strokeWidth = svgSize * 0.06 // 3x thicker\n // Calculate border padding (5% of QR size, but we need to reverse-calculate from SVG size)\n // SVG = QR + 2*borderPadding, so borderPadding = (SVG - QR) / 2\n // We approximate QR as ~91% of SVG (since SVG = QR * 1.1, so QR ≈ SVG / 1.1)\n const estimatedQRSize = svgSize / 1.1\n const borderPadding = (svgSize - estimatedQRSize) / 2\n // Rectangle is positioned OUTSIDE QR (at borderPadding - strokeWidth/2)\n const rectW = estimatedQRSize + strokeWidth\n const rectH = estimatedQRSize + strokeWidth\n const actualInnerWidth = rectW\n const actualInnerHeight = rectH\n const actualInnerRx = cornerRadius\n const straightEdges = 2 * (actualInnerWidth + actualInnerHeight - 2 * actualInnerRx)\n const cornerArcs = 2 * Math.PI * actualInnerRx\n const currentPerimeter = straightEdges + cornerArcs\n \n const percentage = countdownState.remaining / countdownState.total\n const strokeDashoffset = currentPerimeter * (1 - percentage)\n \n // Update the progress rect if it exists\n const progressRectElement = document.getElementById(`countdown-progress-${signatureId}`) as SVGElement | null\n if (progressRectElement && progressRectElement instanceof SVGRectElement) {\n progressRectElement.setAttribute('stroke-dashoffset', strokeDashoffset.toString())\n console.log(`[SDK]: 📊 Set stroke-dashoffset to: ${strokeDashoffset} (percentage: ${percentage}, perimeter: ${currentPerimeter})`)\n \n // Change color when low\n if (countdownState.remaining <= 5) {\n progressRectElement.setAttribute('stroke', '#ef4444')\n } else if (countdownState.remaining <= 10) {\n progressRectElement.setAttribute('stroke', '#f59e0b')\n } else {\n progressRectElement.setAttribute('stroke', this.brandingCache?.primary || '#2563eb')\n }\n }\n } else {\n console.warn('[SDK]: Invalid countdown_update data:', data)\n }\n }\n \n handleCountdownExpired = () => {\n console.log('[SDK]: ⏰ Countdown expired - cleaning up and resetting state')\n \n // Clean up Pusher connection first\n if (pusher && pusher.connection.state === 'connected') {\n pusher.disconnect()\n }\n \n // Remove QR container and all its children completely\n if (qrContainer) {\n // Remove all child elements\n while (qrContainer.firstChild) {\n qrContainer.removeChild(qrContainer.firstChild)\n }\n // Remove container from DOM\n if (qrContainer.parentNode) {\n qrContainer.parentNode.removeChild(qrContainer)\n }\n qrContainer = null\n }\n \n // Reset countdown SVG reference\n const countdownSvgElement = document.getElementById(`countdown-svg-${signatureId}`)\n if (countdownSvgElement && countdownSvgElement.parentNode) {\n countdownSvgElement.parentNode.removeChild(countdownSvgElement)\n }\n \n // Clean up any other references\n cleanup()\n \n // Silently reject - don't show alert, just reset state\n reject(new Error('Countdown expired'))\n }\n \n channel.bind('countdown_update', handleCountdownUpdate)\n channel.bind('client-countdown_update', handleCountdownUpdate) // Backend sends as client event\n channel.bind('countdown_expired', handleCountdownExpired)\n channel.bind('client-countdown_expired', handleCountdownExpired) // Backend sends as client event\n \n qrWrapper.appendChild(spinnerContainer)\n qrWrapper.appendChild(qrImage)\n qrWrapper.appendChild(countdownSvg)\n \n // Add click handler to copy URL to clipboard\n qrImage.addEventListener('click', async () => {\n try {\n await navigator.clipboard.writeText(signUrl)\n console.log('[SDK]: URL copied to clipboard:', signUrl)\n \n // Visual feedback - temporarily change opacity\n const originalOpacity = qrImage.style.opacity || '1'\n qrImage.style.opacity = '0.7'\n setTimeout(() => {\n qrImage.style.opacity = originalOpacity\n }, 200)\n } catch (err) {\n console.error('[SDK]: Failed to copy URL to clipboard:', err)\n // Fallback for older browsers\n const textArea = document.createElement('textarea')\n textArea.value = signUrl\n textArea.style.position = 'fixed'\n textArea.style.opacity = '0'\n document.body.appendChild(textArea)\n textArea.select()\n try {\n document.execCommand('copy')\n console.log('[SDK]: URL copied to clipboard (fallback method)')\n } catch (fallbackErr) {\n console.error('[SDK]: Fallback copy failed:', fallbackErr)\n }\n document.body.removeChild(textArea)\n }\n })\n \n // Generate QR code with icon overlay\n this.generateQRCodeWithIcon(signUrl, qrImage).catch((err: any) => {\n console.warn('[SDK]: Error generating QR code with icon, using fallback:', err)\n // Fallback to simple QR code without icon\n const qrCodeUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodeURIComponent(signUrl)}`\n qrImage.src = qrCodeUrl\n })\n \n qrContainer.appendChild(qrWrapper)\n \n // Make target element position relative if needed and add overflow constraints\n const targetStyle = window.getComputedStyle(targetElement)\n if (targetStyle.position === 'static') {\n targetElement.style.position = 'relative'\n }\n // Ensure target element contains the overlay\n if (targetStyle.overflow === 'visible') {\n targetElement.style.overflow = 'hidden'\n }\n \n targetElement.appendChild(qrContainer)\n } else {\n // No target element - fallback to opening in new window\n console.warn('[SDK]: No target element available, opening sign page in new window')\n const signWindow = window.open(signUrl, '_blank', 'width=600,height=700')\n \n if (!signWindow) {\n pusher.disconnect()\n reject(new Error('Failed to open sign page. Please allow popups for this site.'))\n return\n }\n\n // Monitor sign window for closure\n checkWindowClosed = setInterval(() => {\n if (signWindow.closed) {\n if (checkWindowClosed) clearInterval(checkWindowClosed)\n clearTimeout(timeout)\n pusher.disconnect()\n reject(new Error('Sign window was closed'))\n }\n }, 500)\n }\n\n // Store pusher reference for cleanup\n let pusherInstance: Pusher | null = pusher\n \n // Cleanup on completion\n const cleanup = () => {\n if (qrContainer && qrContainer.parentNode) {\n qrContainer.parentNode.removeChild(qrContainer)\n }\n if (checkWindowClosed) {\n clearInterval(checkWindowClosed)\n }\n clearTimeout(timeout)\n if (pusherInstance) {\n pusherInstance.disconnect()\n pusherInstance = null\n }\n sessionStorage.removeItem(`signHandoff_${signatureId}`)\n }\n\n } catch (error: any) {\n reject(error)\n }\n })\n }\n\n /**\n * Sign a payload with WebAuthn without a server-generated challenge\n * Encodes the payload directly as the challenge\n * Uses iframe to extract key from iframe's localStorage, not host\n */\n async signPayload(apiCallStructure: {\n body: any\n uri: string\n method: string\n headers?: any\n }, signatureId?: string): Promise<SigningResult> {\n try {\n // Step 1: Check if desktop device first - desktop uses WebSocket handoff (no key probe needed)\n if (this.isDesktopDevice()) {\n console.log('[SDK]: Desktop device detected, using WebSocket handoff (skipping key probe)')\n if (!signatureId) {\n throw new Error('signatureId is required for desktop handoff')\n }\n return await this.signWithWebSocketHandoff(apiCallStructure, signatureId)\n }\n \n // Step 2: Mobile device - probe iframe to check if key exists in iframe's localStorage and is active in backend\n console.log('[SDK]: Mobile device detected, probing iframe for existing key...')\n let keyId = await this.probeIframeForKey()\n \n if (!keyId) {\n // Step 3: No valid active key found (missing, invalid, revoked, or expired) - open enrollment popup\n console.log('[SDK]: No valid active key found (missing, invalid, revoked, or expired), opening enrollment popup...')\n await this.enrollWithPopup()\n \n // Step 4: After enrollment, probe again to verify new key is active\n keyId = await this.probeIframeForKey()\n \n if (!keyId) {\n throw new Error('Enrollment completed but no valid active key found')\n }\n }\n \n console.log('[SDK]: Valid active key found, signing with keyId:', keyId)\n \n // Step 5: Sign using iframe (key is extracted from iframe's localStorage)\n console.log('[SDK]: Using iframe signing for mobile device')\n return await this.signWithIframe(apiCallStructure)\n\n } catch (error: any) {\n console.error('[SDK]: Signing error:', error)\n throw error\n }\n }\n\n /**\n * Fetch with automatic payload signing\n */\n async fetchWithSignature(\n url: string,\n options: FetchOptions = {}\n ): Promise<FetchResult> {\n // Declare signatureId at function scope so it's accessible in catch block\n let signatureId: string | undefined = undefined\n try {\n console.log('[SDK]: fetchWithSignature called for:', url)\n\n // Parse URL to get path and base URL\n const urlObj = new URL(url)\n const uriPath = urlObj.pathname + urlObj.search\n const baseUrl = `${urlObj.protocol}//${urlObj.host}`\n\n // Prepare API call structure\n const apiCallStructure = {\n body: options.body ? JSON.parse(options.body as string) : {},\n uri: uriPath,\n method: (options.method || 'GET').toUpperCase(),\n headers: options.headers || {}\n }\n\n console.log('[SDK]: API call structure:', apiCallStructure)\n\n // Check if domain + signature template match (if authAppId is configured)\n if (this.authAppId) {\n try {\n // Generate signatureId first (for desktop handoff, we need it before signing)\n // Generate a long, unique signatureId\n signatureId = `sig_${Date.now()}_${Math.random().toString(36).substring(2, 15)}${Math.random().toString(36).substring(2, 15)}${Math.random().toString(36).substring(2, 15)}${Math.random().toString(36).substring(2, 15)}`\n \n // Get keyId and userId from localStorage\n const keyId = localStorage.getItem('trulyYouKeyId')\n const userIdStr = localStorage.getItem('trulyYouUserId')\n let userId: string | undefined\n if (userIdStr) {\n try {\n userId = userIdStr\n } catch (e) {\n console.warn('[SDK]: Failed to parse userId from localStorage:', e)\n }\n }\n\n // Check if this will be a handoff flow (desktop device)\n const isHandoff = this.isDesktopDevice()\n\n // Create signature document BEFORE signing (this also validates domain and template and starts countdown for handoff)\n const createResponse = await fetch(`${this.apiUrl}/api/signatures/create`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n appId: this.authAppId,\n baseUrl,\n endpoint: uriPath,\n method: apiCallStructure.method,\n keyId: keyId || '',\n userId: userId,\n apiCallStructure,\n signatureId,\n isHandoff // Flag to indicate handoff flow\n })\n })\n\n if (createResponse.ok) {\n const createData = await createResponse.json()\n if (createData.success && createData.data?.signatureId) {\n console.log('[SDK]: Signature document created with signatureId:', createData.data.signatureId)\n } else {\n throw new Error('Failed to create signature document: ' + (createData.error || 'No signatureId returned'))\n }\n } else {\n const errorData = await createResponse.json().catch(() => ({}))\n throw new Error('Failed to create signature: ' + (errorData.error || 'Creation request failed'))\n }\n\n // Now sign the payload (pass signatureId for desktop handoff)\n const signingResult = await this.signPayload(apiCallStructure, signatureId)\n\n // Make the actual API call with signature and signatureId in header\n // Use keyId from signingResult (Device B's keyId for handoff, or localStorage keyId for mobile)\n console.log('[SDK]: 🔍 KeyId debug - signingResult.keyId:', signingResult.keyId, 'localStorage keyId:', keyId, 'keyId type:', typeof signingResult.keyId, 'empty?:', signingResult.keyId === '')\n const keyIdForAuth = signingResult.keyId || keyId || ''\n console.log('[SDK]: ✅ Final keyId for auth header:', keyIdForAuth, '(from', signingResult.keyId && signingResult.keyId !== '' ? 'Device B' : 'localStorage fallback', ')')\n const authHeaderValue = btoa(JSON.stringify({ signature: signingResult.signature, keyId: keyIdForAuth, signatureId }))\n\n const response = await fetch(url, {\n ...options,\n headers: {\n ...options.headers,\n 'x-truly-auth': authHeaderValue\n }\n })\n\n console.log('[SDK]: Request complete, status:', response.status)\n\n return {\n response,\n signature: signingResult.signature,\n signatureId\n }\n } catch (error: any) {\n console.error('[SDK]: Signature creation error:', error)\n // Silently fail for countdown expiry - don't throw error\n if (error.message && error.message.includes('Countdown expired')) {\n // Return empty result to indicate silent failure\n return { response: null as any, signature: '', signatureId: signatureId || '' }\n }\n throw new Error('Signature creation failed: ' + (error.message || 'Unknown error'))\n }\n } else {\n throw new Error('authAppId is required for signature validation. Please configure authAppId in SDK initialization.')\n }\n\n } catch (error: any) {\n console.error('[SDK]: fetchWithSignature error:', error)\n // Silently fail for countdown expiry - just reset state\n if (error.message && error.message.includes('Countdown expired')) {\n // Don't throw error, just silently reset - return empty result\n // signatureId is in scope from fetchWithSignature function\n const expiredSignatureId = signatureId || ''\n return { response: null as any, signature: '', signatureId: expiredSignatureId }\n }\n throw error\n }\n }\n}\n\n"],"names":["factory","window","modules","installedModules","__webpack_require__","moduleId","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","extendStatics","__extends","this","b","setPrototypeOf","__proto__","Array","__","constructor","INVALID_BYTE","Coder","_paddingCharacter","encodedLength","length","encode","data","out","_encodeByte","left","maxDecodedLength","decodedLength","_getPaddingLength","decode","Uint8Array","paddingLength","op","haveBad","v0","v1","v2","v3","_decodeChar","charCodeAt","Error","result","String","fromCharCode","stdCoder","URLSafeCoder","_super","apply","arguments","urlSafeCoder","encodeURLSafe","decodeURLSafe","INVALID_UTF16","INVALID_UTF8","arr","pos","chars","min","n1","n2","n3","push","join","default","__webpack_exports__","ScriptReceiverFactory","prefix","lastId","callback","number","id","called","callbackWrapper","remove","receiver","ScriptReceivers","defaults","VERSION","PROTOCOL","wsPort","wssPort","wsPath","httpHost","httpPort","httpsPort","httpPath","stats_host","authEndpoint","authTransport","activityTimeout","pongTimeout","unavailableTimeout","userAuthentication","endpoint","transport","channelAuthorization","cdn_http","cdn_https","dependency_suffix","DependenciesReceivers","Dependencies","options","receivers","loading","load","self","request","runtime","createScriptRequest","getPath","error","callbacks","successCallback","wasSuccessful","cleanup","send","getRoot","protocol","getDocument","location","useTLS","replace","version","suffix","urlStore","baseUrl","urls","authenticationEndpoint","path","authorizationEndpoint","javascriptQuickStart","triggeringClientEvents","encryptedChannelSupport","fullUrl","AuthRequestType","url_store","urlObj","url","BadEventName","msg","super","BadChannelName","RequestTimedOut","TransportPriorityTooLow","TransportClosed","UnsupportedFeature","UnsupportedTransport","UnsupportedStrategy","HTTPAuthError","status","xhr_auth","context","query","authOptions","authRequestType","xhr","createXHR","headerName","open","setRequestHeader","headers","headersProvider","dynamicHeaders","onreadystatechange","readyState","parsed","JSON","parse","responseText","e","toString","UserAuthentication","ChannelAuthorization","b64chars","cb_utob","cc","utob","u","cb_encode","ccc","padlen","ord","charAt","btoa","abstract_timer","set","clear","delay","timer","isRunning","ensureAborted","timers_clearTimeout","clearTimeout","timers_clearInterval","clearInterval","timers_OneOffTimer","setTimeout","timers_PeriodicTimer","setInterval","Util","now","Date","valueOf","defer","method","args","boundArguments","slice","concat","util","extend","target","sources","extensions","stringify","safeJSONStringify","arrayIndexOf","array","item","nativeIndexOf","indexOf","objectApply","f","keys","_","map","filter","test","filterObject","Boolean","any","encodeParamsObject","encodeURIComponent","buildQueryString","params","undefined","source","objects","paths","derez","nu","$ref","logger","globalLog","message","console","log","debug","warn","globalLogWarn","globalLogError","defaultLoggingFunction","core_pusher","logToConsole","jsonp_auth","callbackName","nextAuthCallbackID","document","script","createElement","auth_callbacks","callback_name","src","head","getElementsByTagName","documentElement","insertBefore","firstChild","ScriptRequest","errorString","type","charset","addEventListener","onerror","onload","async","attachEvent","navigator","userAgent","errorScript","text","nextSibling","parentNode","removeChild","jsonp_request_JSONPRequest","jsonp_timeline","getAgent","sender","host","createJSONPRequest","getGenericURL","baseScheme","hostTLS","hostNonTLS","getGenericPath","queryString","ws","getInitial","http","sockjs","callback_registry_CallbackRegistry","_callbacks","add","prefixedEventName","fn","names","removeCallback","removeAllCallbacks","binding","dispatcher_Dispatcher","failThrough","global_callbacks","eventName","bind_global","unbind","unbind_global","unbind_all","emit","metadata","transport_connection_TransportConnection","hooks","priority","initialize","transportConnectionInitializer","state","timeline","generateUniqueID","handlesActivityChecks","supportsPing","connect","socket","getSocket","onError","changeState","bindListeners","close","ping","onOpen","beforeOpen","onopen","buildTimelineMessage","onClose","closeEvent","code","reason","wasClean","unbindListeners","onMessage","onActivity","onclose","onmessage","onactivity","info","cid","transport_Transport","isSupported","environment","createConnection","WSTransport","isInitialized","getWebSocketAPI","createWebSocket","httpConfiguration","streamingConfiguration","HTTPFactory","createStreamingSocket","pollingConfiguration","createPollingSocket","xhrConfiguration","isXHRSupported","transports","xhr_streaming","xhr_polling","SockJSTransport","file","SockJS","js_path","ignore_null_origin","ignoreNullOrigin","xdrConfiguration","isXDRSupported","XDRStreamingTransport","XDRPollingTransport","xdr_streaming","xdr_polling","transports_transports","net_info_Network","isOnline","onLine","assistant_to_the_transport_manager_AssistantToTheTransportManager","manager","minPingDelay","maxPingDelay","pingDelay","connection","openTimestamp","onClosed","reportDeath","lifespan","Math","max","isAlive","Protocol","decodeMessage","messageEvent","messageData","pusherEventData","pusherEvent","event","channel","user_id","encodeMessage","processHandshake","activity_timeout","action","socket_id","getCloseAction","getCloseError","protocol_protocol","connection_Connection","send_event","listeners","activity","closed","handleCloseEvent","listener","handshake_Handshake","finish","timeline_sender_TimelineSender","isEmpty","TimelineTransport","channel_Channel","pusher","subscribed","subscriptionPending","subscriptionCancelled","authorize","socketId","auth","trigger","disconnect","handleEvent","handleSubscriptionSucceededEvent","handleSubscriptionCountEvent","unsubscribe","subscription_count","subscriptionCount","subscribe","assign","channel_data","cancelSubscription","reinstateSubscription","private_channel_PrivateChannel","config","channelAuthorizer","channelName","members_Members","reset","members","each","member","setMyID","myID","onSubscription","subscriptionData","presence","hash","count","me","addMember","memberData","user_info","removeMember","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","done","then","presence_channel_PresenceChannel","authData","channelData","user","signinDonePromise","user_data","handleInternalEvent","addedMember","removedMember","utf8","base64","encrypted_channel_EncryptedChannel","nacl","sharedSecret","handleEncryptedEvent","ciphertext","nonce","cipherText","secretbox","overheadLength","nonceLength","bytes","getDataToEmit","raw","_a","connection_manager_ConnectionManager","usingTLS","errorCallbacks","buildErrorCallbacks","connectionCallbacks","buildConnectionCallbacks","handshakeCallbacks","buildHandshakeCallbacks","Network","getNetwork","netinfo","retryIn","sendActivityCheck","updateStrategy","runner","strategy","updateState","startConnecting","setUnavailableTimer","disconnectInternally","isUsingTLS","handshake","handshakeError","abortConnecting","abort","clearRetryTimer","clearUnavailableTimer","abandonConnection","getStrategy","round","retryTimer","unavailableTimer","stopActivityCheck","activityTimer","pong_timed_out","resetActivityCheck","shouldRetry","connected","Infinity","setConnection","withErrorEmitted","tls_only","refused","backoff","retry","newState","previousState","newStateDescription","previous","current","channels_Channels","channels","createEncryptedChannel","errMsg","createPrivateChannel","createPresenceChannel","createChannel","all","values","find","Factory","createChannels","createConnectionManager","createTimelineSender","createHandshake","createAssistantToTheTransportManager","transport_manager_TransportManager","livesLeft","lives","getAssistant","sequential_strategy_SequentialStrategy","strategies","loop","failFast","timeout","timeoutLimit","minPriority","tryNextStrategy","tryStrategy","forceMinPriority","best_connected_ever_strategy_BestConnectedEverStrategy","callbackBuilder","runners","rs","abortRunner","collections_all","allRunnersFailed","aborted","websocket_prioritized_cached_strategy_WebSocketPrioritizedCachedStrategy","ttl","storage","getLocalStorage","serializedCache","getTransportCacheKey","flushTransportCache","fetchTransportCache","cacheSkipCount","timestamp","includes","cached","latency","startTimestamp","pop","cb","storeTransportCache","delayed_strategy_DelayedStrategy","IfStrategy","trueBranch","falseBranch","FirstConnectedStrategy","testSupportsStrategy","State","default_strategy","baseOptions","defineTransport","definedTransports","defineTransportStrategy","wsStrategy","ws_options","wsHost","wss_options","sockjs_options","timeouts","ws_manager","streaming_manager","ws_transport","wss_transport","sockjs_transport","xhr_streaming_transport","xdr_streaming_transport","xhr_polling_transport","xdr_polling_transport","ws_loop","wss_loop","sockjs_loop","streaming_loop","polling_loop","http_loop","http_fallback_loop","http_xdomain_request","getRequest","xdr","XDomainRequest","ontimeout","onprogress","onChunk","abortRequest","http_request_HTTPRequest","start","payload","position","unloader","addUnloadListener","removeUnloadListener","chunk","advanceBuffer","isBufferTooLong","buffer","unreadData","endOfLinePosition","autoIncrement","getUniqueURL","separator","randomNumber","randomInt","TimelineLevel","http_socket","session","randomString","parts","exec","base","getLocation","CONNECTING","openStream","sendRaw","sendHeartbeat","OPEN","createSocketRequest","reconnect","closeStream","CLOSED","onEvent","onHeartbeat","hostname","urlParts","stream","getReceiveURL","onFinished","http_streaming_socket","http_polling_socket","http_xhr_request","getXHRAPI","http_http","createSocket","createRequest","getDefaultStrategy","Transports","XMLHttpRequest","WebSocket","MozWebSocket","setup","PusherClass","Pusher","initializeOnDocumentBody","onDocumentBody","ready","getProtocol","getAuthorizers","ajax","jsonp","body","localStorage","createXMLHttpRequest","createMicrosoftXHR","ActiveXObject","createXDR","Constructor","withCredentials","documentProtocol","removeEventListener","detachEvent","floor","crypto","getRandomValues","Uint32Array","pow","timeline_level","timeline_Timeline","events","sent","uniqueID","level","limit","shift","ERROR","INFO","DEBUG","sendfn","bundle","lib","cluster","features","transport_strategy_TransportStrategy","failAttempt","onInitialized","serializedTransport","strategy_builder_Transports","strategy_builder_defineTransport","transportClass","enabledTransports","disabledTransports","strategy_builder_UnsupportedStrategy","deferred","user_authenticator","paramsProvider","dynamicParams","composeChannelQuery","channel_authorizer","channel_authorizer_composeChannelQuery","getHttpHost","opts","getWebsocketHost","shouldUseTLS","forceTLS","getEnableStatsConfig","enableStats","disableStats","buildUserAuthenticator","buildChannelAuthorizer","customHandler","channelAuthorizerGenerator","deprecatedAuthorizerOptions","ChannelAuthorizerProxy","authorizer","buildChannelAuth","watchlist_WatchlistFacade","bindWatchlistInternalEvent","forEach","watchlistEvent","flat_promise","promise","res","rej","user_UserFacade","signin_requested","serverToUserChannel","_signinDoneResolve","_onAuthorize","err","_cleanup","_signin","_newSigninPromiseIfNeeded","watchlist","_onSigninSuccess","signin","userAuthenticator","_subscribeChannels","ensure_subscribed","setDone","catch","pusher_Pusher","isReady","instances","getClientFeatures","app_key","checkAppKey","validateOptions","statsHost","timelineParams","getConfig","global_emitter","sessionID","timelineSender","subscribeAll","internal","allChannels","timelineSenderTimer","event_name","channel_name","Runtime","TrulyYouSDK","brandingCache","frontendUrl","getDefaultFrontendUrl","apiUrl","getDefaultApiUrl","authAppId","invisible","targetElement","mockMobileDevice","realtimeUrl","URL","wsProtocol","fetchBranding","response","fetch","ok","json","app","colors","icon","primary","background","secondary","textColor","generateQRCodeWithIcon","qrData","imgElement","qrCodeUrl","qrImg","Image","crossOrigin","canvas","width","height","ctx","getContext","drawImage","tryLoadIcon","iconUrl","useProxy","imageUrl","proxyUrl","blob","createObjectURL","iconImg","resolveIcon","rejectIcon","iconSize","iconX","iconY","fillStyle","beginPath","arc","PI","fill","startsWith","revokeObjectURL","toDataURL","isIOSDevice","platform","maxTouchPoints","isSafariBrowser","isDesktopDevice","vendor","opera","isMobileUA","toLowerCase","hasTouchScreen","isMobileOrientation","screen","resolveTargetElement","querySelector","probeIframeForKey","origin","iframe","style","cssText","probeUrl","searchParams","backendCheckPromise","handleMessage","frontendOrigin","hasKey","keyId","checkKeyStatus","appendChild","isActive","success","exists","active","enrollWithPopup","sessionResponse","errorData","sessionId","appId","enrollUrlParams","URLSearchParams","returnTo","enrollUrl","popup","checkPopupClosed","successReceived","keyIdFromMessage","trulyYouKeyId","getItem","setItem","delayedKeyId","signWithIframe","apiCallStructure","signId","random","substring","createSigningLoadingOverlay","overlay","spinner","spinnerBgColor","spinnerColor","textContent","spinnerTextColor","scrolling","setAttribute","sortObjectByKeys","obj","sorted","sort","base64EncodedResponse","uri","queryParams","queryParamsToProcess","sortedData","sortedQueryParams","encodedBody","encodedQueryParams","payloadData","uriId","requestBody","fullbase64","createPayloadBase64","attestationDataForIframe","encodedData","form","display","attestationDataInput","signIdInput","modeInput","isIframeVisible","brandingInput","visible","targetStyle","getComputedStyle","originalHeight","computedHeight","offsetHeight","overlayElement","hasSignature","signature","signatureBase64","submit","signWithWebSocketHandoff","signatureId","primaryColor","authAppName","encodedThing","signUrl","attestationData","pusherHost","pusherPort","encrypted","realtimeUrlObj","port","parseInt","pusherAppKey","pusherOptions","pusherConfig","handleCountdownUpdate","handleCountdownExpired","earlyCountdownHandler","earlyExpiredHandler","states","counterpartyConnected","qrContainer","deviceType","deviceBKeyId","signatureLength","keyIdSource","sessionStorage","checkWindowClosed","qrWrapper","spinnerContainer","qrImage","alt","title","opacity","setupCountdownRect","countdownSvg","createElementNS","qrRect","getBoundingClientRect","qrWrapperRect","actualQRSize","borderPadding","svgSize","offsetX","offsetY","top","cornerRadius","strokeWidth","rectX","rectY","rectW","rectH","bgRect","progressRect","actualInnerRx","actualPerimeter","transition","perimeter","complete","naturalWidth","countdownState","remaining","total","timeRemaining","totalTime","viewBoxAttr","getAttribute","parseFloat","split","estimatedQRSize","currentPerimeter","percentage","strokeDashoffset","progressRectElement","getElementById","SVGRectElement","countdownSvgElement","clipboard","writeText","originalOpacity","textArea","select","execCommand","fallbackErr","overflow","signWindow","pusherInstance","removeItem","signPayload","fetchWithSignature","uriPath","pathname","search","toUpperCase","userIdStr","userId","isHandoff","createResponse","createData","signingResult","keyIdForAuth","authHeaderValue"],"mappings":"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","x_google_ignoreList":[0]}
|