@dstny/scp-authenticator 1.0.3 → 1.0.5

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.js CHANGED
@@ -831,6 +831,7 @@ var InvalidClientError_default = InvalidClientError;
831
831
  // src/Authenticator.ts
832
832
  var INTERNAL_CREDENTIALS = "INTERNAL_CREDENTIALS";
833
833
  var MAX_TIMEOUT_VALUE = 2147483646;
834
+ var REFRESH_BUFFER_MILLISECONDS = 12e4;
834
835
  function getLockManager() {
835
836
  if (typeof navigator === "object") {
836
837
  const n = navigator;
@@ -1160,7 +1161,10 @@ var Authenticator = class extends Emittery {
1160
1161
  throw new Error("Unable to start refresh token runner without credentials");
1161
1162
  }
1162
1163
  const refreshIn = new Date(this.credentials.expires_at).getTime() - (/* @__PURE__ */ new Date()).getTime();
1163
- const refreshTimeout = this.refreshSeparationMilliseconds + Math.max(1e4, refreshIn - 1e4);
1164
+ const refreshTimeout = Math.max(
1165
+ 1e4,
1166
+ refreshIn - REFRESH_BUFFER_MILLISECONDS - this.refreshSeparationMilliseconds
1167
+ );
1164
1168
  this.logger?.info(
1165
1169
  `Setting timer to refresh token in ${Math.round(refreshTimeout / 1e3)} seconds at ${new Date((/* @__PURE__ */ new Date()).getTime() + refreshTimeout).toTimeString()}`
1166
1170
  );
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../../node_modules/.pnpm/emittery@1.1.0/node_modules/emittery/maps.js","../../../node_modules/.pnpm/emittery@1.1.0/node_modules/emittery/index.js","../../credentials/src/utils.ts","../../credentials/src/Credentials.ts","../src/utils/jwt.ts","../src/events.ts","../src/types.ts","../src/utils/separation.ts","../src/errors/TokenNetworkError.ts","../src/errors/RefreshTokenError.ts","../src/errors/AuthorizationError.ts","../src/errors/InvalidClientError.ts","../src/Authenticator.ts","../src/api/AbstractAuthenticationApi.ts","../src/api/OAuthApi.ts","../src/api/SmgAuthApi.ts"],"sourcesContent":["import Authenticator from './Authenticator'\n\nexport * from './types'\nexport * from './events'\nexport * from './errors/AuthorizationError'\nexport * from './errors/InvalidClientError'\nexport * from './errors/RefreshTokenError'\nexport * from './errors/TokenNetworkError'\n\nexport * from './api/AbstractAuthenticationApi'\nexport * from './api/OAuthApi'\nexport * from './api/SmgAuthApi'\n\nexport default Authenticator\n","export const anyMap = new WeakMap();\nexport const eventsMap = new WeakMap();\nexport const producersMap = new WeakMap();\n","import {anyMap, producersMap, eventsMap} from './maps.js';\n\nconst anyProducer = Symbol('anyProducer');\nconst resolvedPromise = Promise.resolve();\n\n// Define symbols for \"meta\" events.\nconst listenerAdded = Symbol('listenerAdded');\nconst listenerRemoved = Symbol('listenerRemoved');\n\nlet canEmitMetaEvents = false;\nlet isGlobalDebugEnabled = false;\n\nconst isEventKeyType = key => typeof key === 'string' || typeof key === 'symbol' || typeof key === 'number';\n\nfunction assertEventName(eventName) {\n\tif (!isEventKeyType(eventName)) {\n\t\tthrow new TypeError('`eventName` must be a string, symbol, or number');\n\t}\n}\n\nfunction assertListener(listener) {\n\tif (typeof listener !== 'function') {\n\t\tthrow new TypeError('listener must be a function');\n\t}\n}\n\nfunction getListeners(instance, eventName) {\n\tconst events = eventsMap.get(instance);\n\tif (!events.has(eventName)) {\n\t\treturn;\n\t}\n\n\treturn events.get(eventName);\n}\n\nfunction getEventProducers(instance, eventName) {\n\tconst key = isEventKeyType(eventName) ? eventName : anyProducer;\n\tconst producers = producersMap.get(instance);\n\tif (!producers.has(key)) {\n\t\treturn;\n\t}\n\n\treturn producers.get(key);\n}\n\nfunction enqueueProducers(instance, eventName, eventData) {\n\tconst producers = producersMap.get(instance);\n\tif (producers.has(eventName)) {\n\t\tfor (const producer of producers.get(eventName)) {\n\t\t\tproducer.enqueue(eventData);\n\t\t}\n\t}\n\n\tif (producers.has(anyProducer)) {\n\t\tconst item = Promise.all([eventName, eventData]);\n\t\tfor (const producer of producers.get(anyProducer)) {\n\t\t\tproducer.enqueue(item);\n\t\t}\n\t}\n}\n\nfunction iterator(instance, eventNames) {\n\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\n\tlet isFinished = false;\n\tlet flush = () => {};\n\tlet queue = [];\n\n\tconst producer = {\n\t\tenqueue(item) {\n\t\t\tqueue.push(item);\n\t\t\tflush();\n\t\t},\n\t\tfinish() {\n\t\t\tisFinished = true;\n\t\t\tflush();\n\t\t},\n\t};\n\n\tfor (const eventName of eventNames) {\n\t\tlet set = getEventProducers(instance, eventName);\n\t\tif (!set) {\n\t\t\tset = new Set();\n\t\t\tconst producers = producersMap.get(instance);\n\t\t\tproducers.set(eventName, set);\n\t\t}\n\n\t\tset.add(producer);\n\t}\n\n\treturn {\n\t\tasync next() {\n\t\t\tif (!queue) {\n\t\t\t\treturn {done: true};\n\t\t\t}\n\n\t\t\tif (queue.length === 0) {\n\t\t\t\tif (isFinished) {\n\t\t\t\t\tqueue = undefined;\n\t\t\t\t\treturn this.next();\n\t\t\t\t}\n\n\t\t\t\tawait new Promise(resolve => {\n\t\t\t\t\tflush = resolve;\n\t\t\t\t});\n\n\t\t\t\treturn this.next();\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdone: false,\n\t\t\t\tvalue: await queue.shift(),\n\t\t\t};\n\t\t},\n\n\t\tasync return(value) {\n\t\t\tqueue = undefined;\n\n\t\t\tfor (const eventName of eventNames) {\n\t\t\t\tconst set = getEventProducers(instance, eventName);\n\t\t\t\tif (set) {\n\t\t\t\t\tset.delete(producer);\n\t\t\t\t\tif (set.size === 0) {\n\t\t\t\t\t\tconst producers = producersMap.get(instance);\n\t\t\t\t\t\tproducers.delete(eventName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tflush();\n\n\t\t\treturn arguments.length > 0\n\t\t\t\t? {done: true, value: await value}\n\t\t\t\t: {done: true};\n\t\t},\n\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn this;\n\t\t},\n\t};\n}\n\nfunction defaultMethodNamesOrAssert(methodNames) {\n\tif (methodNames === undefined) {\n\t\treturn allEmitteryMethods;\n\t}\n\n\tif (!Array.isArray(methodNames)) {\n\t\tthrow new TypeError('`methodNames` must be an array of strings');\n\t}\n\n\tfor (const methodName of methodNames) {\n\t\tif (!allEmitteryMethods.includes(methodName)) {\n\t\t\tif (typeof methodName !== 'string') {\n\t\t\t\tthrow new TypeError('`methodNames` element must be a string');\n\t\t\t}\n\n\t\t\tthrow new Error(`${methodName} is not Emittery method`);\n\t\t}\n\t}\n\n\treturn methodNames;\n}\n\nconst isMetaEvent = eventName => eventName === listenerAdded || eventName === listenerRemoved;\n\nfunction emitMetaEvent(emitter, eventName, eventData) {\n\tif (!isMetaEvent(eventName)) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tcanEmitMetaEvents = true;\n\t\temitter.emit(eventName, eventData);\n\t} finally {\n\t\tcanEmitMetaEvents = false;\n\t}\n}\n\nexport default class Emittery {\n\tstatic mixin(emitteryPropertyName, methodNames) {\n\t\tmethodNames = defaultMethodNamesOrAssert(methodNames);\n\t\treturn target => {\n\t\t\tif (typeof target !== 'function') {\n\t\t\t\tthrow new TypeError('`target` must be function');\n\t\t\t}\n\n\t\t\tfor (const methodName of methodNames) {\n\t\t\t\tif (target.prototype[methodName] !== undefined) {\n\t\t\t\t\tthrow new Error(`The property \\`${methodName}\\` already exists on \\`target\\``);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction getEmitteryProperty() {\n\t\t\t\tObject.defineProperty(this, emitteryPropertyName, {\n\t\t\t\t\tenumerable: false,\n\t\t\t\t\tvalue: new Emittery(),\n\t\t\t\t});\n\t\t\t\treturn this[emitteryPropertyName];\n\t\t\t}\n\n\t\t\tObject.defineProperty(target.prototype, emitteryPropertyName, {\n\t\t\t\tenumerable: false,\n\t\t\t\tget: getEmitteryProperty,\n\t\t\t});\n\n\t\t\tconst emitteryMethodCaller = methodName => function (...args) {\n\t\t\t\treturn this[emitteryPropertyName][methodName](...args);\n\t\t\t};\n\n\t\t\tfor (const methodName of methodNames) {\n\t\t\t\tObject.defineProperty(target.prototype, methodName, {\n\t\t\t\t\tenumerable: false,\n\t\t\t\t\tvalue: emitteryMethodCaller(methodName),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn target;\n\t\t};\n\t}\n\n\tstatic get isDebugEnabled() {\n\t\t// In a browser environment, `globalThis.process` can potentially reference a DOM Element with a `#process` ID,\n\t\t// so instead of just type checking `globalThis.process`, we need to make sure that `globalThis.process.env` exists.\n\t\t// eslint-disable-next-line n/prefer-global/process\n\t\tif (typeof globalThis.process?.env !== 'object') {\n\t\t\treturn isGlobalDebugEnabled;\n\t\t}\n\n\t\t// eslint-disable-next-line n/prefer-global/process\n\t\tconst {env} = globalThis.process ?? {env: {}};\n\t\treturn env.DEBUG === 'emittery' || env.DEBUG === '*' || isGlobalDebugEnabled;\n\t}\n\n\tstatic set isDebugEnabled(newValue) {\n\t\tisGlobalDebugEnabled = newValue;\n\t}\n\n\tconstructor(options = {}) {\n\t\tanyMap.set(this, new Set());\n\t\teventsMap.set(this, new Map());\n\t\tproducersMap.set(this, new Map());\n\n\t\tproducersMap.get(this).set(anyProducer, new Set());\n\n\t\tthis.debug = options.debug ?? {};\n\n\t\tif (this.debug.enabled === undefined) {\n\t\t\tthis.debug.enabled = false;\n\t\t}\n\n\t\tif (!this.debug.logger) {\n\t\t\tthis.debug.logger = (type, debugName, eventName, eventData) => {\n\t\t\t\ttry {\n\t\t\t\t\t// TODO: Use https://github.com/sindresorhus/safe-stringify when the package is more mature. Just copy-paste the code.\n\t\t\t\t\teventData = JSON.stringify(eventData);\n\t\t\t\t} catch {\n\t\t\t\t\teventData = `Object with the following keys failed to stringify: ${Object.keys(eventData).join(',')}`;\n\t\t\t\t}\n\n\t\t\t\tif (typeof eventName === 'symbol' || typeof eventName === 'number') {\n\t\t\t\t\teventName = eventName.toString();\n\t\t\t\t}\n\n\t\t\t\tconst currentTime = new Date();\n\t\t\t\tconst logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`;\n\t\t\t\tconsole.log(`[${logTime}][emittery:${type}][${debugName}] Event Name: ${eventName}\\n\\tdata: ${eventData}`);\n\t\t\t};\n\t\t}\n\t}\n\n\tlogIfDebugEnabled(type, eventName, eventData) {\n\t\tif (Emittery.isDebugEnabled || this.debug.enabled) {\n\t\t\tthis.debug.logger(type, this.debug.name, eventName, eventData);\n\t\t}\n\t}\n\n\ton(eventNames, listener, {signal} = {}) {\n\t\tassertListener(listener);\n\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tfor (const eventName of eventNames) {\n\t\t\tassertEventName(eventName);\n\t\t\tlet set = getListeners(this, eventName);\n\t\t\tif (!set) {\n\t\t\t\tset = new Set();\n\t\t\t\tconst events = eventsMap.get(this);\n\t\t\t\tevents.set(eventName, set);\n\t\t\t}\n\n\t\t\tset.add(listener);\n\n\t\t\tthis.logIfDebugEnabled('subscribe', eventName, undefined);\n\n\t\t\tif (!isMetaEvent(eventName)) {\n\t\t\t\temitMetaEvent(this, listenerAdded, {eventName, listener});\n\t\t\t}\n\t\t}\n\n\t\tconst off = () => {\n\t\t\tthis.off(eventNames, listener);\n\t\t\tsignal?.removeEventListener('abort', off);\n\t\t};\n\n\t\tsignal?.addEventListener('abort', off, {once: true});\n\n\t\tif (signal?.aborted) {\n\t\t\toff();\n\t\t}\n\n\t\treturn off;\n\t}\n\n\toff(eventNames, listener) {\n\t\tassertListener(listener);\n\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tfor (const eventName of eventNames) {\n\t\t\tassertEventName(eventName);\n\t\t\tconst set = getListeners(this, eventName);\n\t\t\tif (set) {\n\t\t\t\tset.delete(listener);\n\t\t\t\tif (set.size === 0) {\n\t\t\t\t\tconst events = eventsMap.get(this);\n\t\t\t\t\tevents.delete(eventName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.logIfDebugEnabled('unsubscribe', eventName, undefined);\n\n\t\t\tif (!isMetaEvent(eventName)) {\n\t\t\t\temitMetaEvent(this, listenerRemoved, {eventName, listener});\n\t\t\t}\n\t\t}\n\t}\n\n\tonce(eventNames) {\n\t\tlet off_;\n\n\t\tconst promise = new Promise(resolve => {\n\t\t\toff_ = this.on(eventNames, data => {\n\t\t\t\toff_();\n\t\t\t\tresolve(data);\n\t\t\t});\n\t\t});\n\n\t\tpromise.off = off_;\n\t\treturn promise;\n\t}\n\n\tevents(eventNames) {\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tfor (const eventName of eventNames) {\n\t\t\tassertEventName(eventName);\n\t\t}\n\n\t\treturn iterator(this, eventNames);\n\t}\n\n\tasync emit(eventName, eventData) {\n\t\tassertEventName(eventName);\n\n\t\tif (isMetaEvent(eventName) && !canEmitMetaEvents) {\n\t\t\tthrow new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`');\n\t\t}\n\n\t\tthis.logIfDebugEnabled('emit', eventName, eventData);\n\n\t\tenqueueProducers(this, eventName, eventData);\n\n\t\tconst listeners = getListeners(this, eventName) ?? new Set();\n\t\tconst anyListeners = anyMap.get(this);\n\t\tconst staticListeners = [...listeners];\n\t\tconst staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];\n\n\t\tawait resolvedPromise;\n\t\tawait Promise.all([\n\t\t\t...staticListeners.map(async listener => {\n\t\t\t\tif (listeners.has(listener)) {\n\t\t\t\t\treturn listener(eventData);\n\t\t\t\t}\n\t\t\t}),\n\t\t\t...staticAnyListeners.map(async listener => {\n\t\t\t\tif (anyListeners.has(listener)) {\n\t\t\t\t\treturn listener(eventName, eventData);\n\t\t\t\t}\n\t\t\t}),\n\t\t]);\n\t}\n\n\tasync emitSerial(eventName, eventData) {\n\t\tassertEventName(eventName);\n\n\t\tif (isMetaEvent(eventName) && !canEmitMetaEvents) {\n\t\t\tthrow new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`');\n\t\t}\n\n\t\tthis.logIfDebugEnabled('emitSerial', eventName, eventData);\n\n\t\tconst listeners = getListeners(this, eventName) ?? new Set();\n\t\tconst anyListeners = anyMap.get(this);\n\t\tconst staticListeners = [...listeners];\n\t\tconst staticAnyListeners = [...anyListeners];\n\n\t\tawait resolvedPromise;\n\t\t/* eslint-disable no-await-in-loop */\n\t\tfor (const listener of staticListeners) {\n\t\t\tif (listeners.has(listener)) {\n\t\t\t\tawait listener(eventData);\n\t\t\t}\n\t\t}\n\n\t\tfor (const listener of staticAnyListeners) {\n\t\t\tif (anyListeners.has(listener)) {\n\t\t\t\tawait listener(eventName, eventData);\n\t\t\t}\n\t\t}\n\t\t/* eslint-enable no-await-in-loop */\n\t}\n\n\tonAny(listener, {signal} = {}) {\n\t\tassertListener(listener);\n\n\t\tthis.logIfDebugEnabled('subscribeAny', undefined, undefined);\n\n\t\tanyMap.get(this).add(listener);\n\t\temitMetaEvent(this, listenerAdded, {listener});\n\n\t\tconst offAny = () => {\n\t\t\tthis.offAny(listener);\n\t\t\tsignal?.removeEventListener('abort', offAny);\n\t\t};\n\n\t\tsignal?.addEventListener('abort', offAny, {once: true});\n\n\t\tif (signal?.aborted) {\n\t\t\toffAny();\n\t\t}\n\n\t\treturn offAny;\n\t}\n\n\tanyEvent() {\n\t\treturn iterator(this);\n\t}\n\n\toffAny(listener) {\n\t\tassertListener(listener);\n\n\t\tthis.logIfDebugEnabled('unsubscribeAny', undefined, undefined);\n\n\t\temitMetaEvent(this, listenerRemoved, {listener});\n\t\tanyMap.get(this).delete(listener);\n\t}\n\n\tclearListeners(eventNames) {\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\n\t\tfor (const eventName of eventNames) {\n\t\t\tthis.logIfDebugEnabled('clear', eventName, undefined);\n\n\t\t\tif (isEventKeyType(eventName)) {\n\t\t\t\tconst set = getListeners(this, eventName);\n\t\t\t\tif (set) {\n\t\t\t\t\tset.clear();\n\t\t\t\t}\n\n\t\t\t\tconst producers = getEventProducers(this, eventName);\n\t\t\t\tif (producers) {\n\t\t\t\t\tfor (const producer of producers) {\n\t\t\t\t\t\tproducer.finish();\n\t\t\t\t\t}\n\n\t\t\t\t\tproducers.clear();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tanyMap.get(this).clear();\n\n\t\t\t\tfor (const [eventName, listeners] of eventsMap.get(this).entries()) {\n\t\t\t\t\tlisteners.clear();\n\t\t\t\t\teventsMap.get(this).delete(eventName);\n\t\t\t\t}\n\n\t\t\t\tfor (const [eventName, producers] of producersMap.get(this).entries()) {\n\t\t\t\t\tfor (const producer of producers) {\n\t\t\t\t\t\tproducer.finish();\n\t\t\t\t\t}\n\n\t\t\t\t\tproducers.clear();\n\t\t\t\t\tproducersMap.get(this).delete(eventName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlistenerCount(eventNames) {\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tlet count = 0;\n\n\t\tfor (const eventName of eventNames) {\n\t\t\tif (isEventKeyType(eventName)) {\n\t\t\t\tcount += anyMap.get(this).size\n\t\t\t\t\t+ (getListeners(this, eventName)?.size ?? 0)\n\t\t\t\t\t+ (getEventProducers(this, eventName)?.size ?? 0)\n\t\t\t\t\t+ (getEventProducers(this)?.size ?? 0);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (eventName !== undefined) {\n\t\t\t\tassertEventName(eventName);\n\t\t\t}\n\n\t\t\tcount += anyMap.get(this).size;\n\n\t\t\tfor (const value of eventsMap.get(this).values()) {\n\t\t\t\tcount += value.size;\n\t\t\t}\n\n\t\t\tfor (const value of producersMap.get(this).values()) {\n\t\t\t\tcount += value.size;\n\t\t\t}\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tbindMethods(target, methodNames) {\n\t\tif (typeof target !== 'object' || target === null) {\n\t\t\tthrow new TypeError('`target` must be an object');\n\t\t}\n\n\t\tmethodNames = defaultMethodNamesOrAssert(methodNames);\n\n\t\tfor (const methodName of methodNames) {\n\t\t\tif (target[methodName] !== undefined) {\n\t\t\t\tthrow new Error(`The property \\`${methodName}\\` already exists on \\`target\\``);\n\t\t\t}\n\n\t\t\tObject.defineProperty(target, methodName, {\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: this[methodName].bind(this),\n\t\t\t});\n\t\t}\n\t}\n}\n\nconst allEmitteryMethods = Object.getOwnPropertyNames(Emittery.prototype).filter(v => v !== 'constructor');\n\nObject.defineProperty(Emittery, 'listenerAdded', {\n\tvalue: listenerAdded,\n\twritable: false,\n\tenumerable: true,\n\tconfigurable: false,\n});\nObject.defineProperty(Emittery, 'listenerRemoved', {\n\tvalue: listenerRemoved,\n\twritable: false,\n\tenumerable: true,\n\tconfigurable: false,\n});\n","// declare const Buffer\n\nfunction byteToPercent(b: string) {\n return `%${`00${b.charCodeAt(0).toString(16)}`.slice(-2)}`\n}\n\nexport function base64decode(str: string): string | undefined {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n let output: string = ''\n\n str = String(str).replace(/={1,10}$/, '')\n\n if (str.length % 4 === 1) {\n throw new Error(\"'atob' failed: The string to be decoded is not correctly encoded.\")\n }\n\n for (\n // initialize result and counters\n let bc: number = 0, bs: any, buffer: any, idx: number = 0;\n // tslint:disable-next-line:no-conditional-assignment\n (buffer = str.charAt(idx++));\n // tslint:disable-next-line:no-bitwise\n ~buffer &&\n // tslint:disable-next-line:no-conditional-assignment\n ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4)\n ? // tslint:disable-next-line:no-bitwise\n (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer)\n }\n return output\n}\n\nexport async function sha1(str: string) {\n if (typeof crypto === 'object') {\n const hash = await crypto.subtle.digest('SHA-1', new TextEncoder().encode(str))\n return Array.from(new Uint8Array(hash))\n .map((v) => v.toString(16).padStart(2, '0'))\n .join('')\n } else {\n return binb2hex(core_sha1(str2binb(str), str.length * chrsz))\n }\n}\n\nconst hexcase = 0 /* hex output format. 0 - lowercase; 1 - uppercase */\nconst b64pad = '' /* base-64 pad character. \"=\" for strict RFC compliance */\nconst chrsz = 8 /* bits per input character. 8 - ASCII; 16 - Unicode */\n\n/*\n * Calculate the SHA-1 of an array of big-endian words, and a bit length\n */\nfunction core_sha1(x: Array<number>, len: number) {\n /* append padding */\n x[len >> 5] |= 0x80 << (24 - (len % 32))\n x[(((len + 64) >> 9) << 4) + 15] = len\n\n var w = Array(80)\n var a = 1732584193\n var b = -271733879\n var c = -1732584194\n var d = 271733878\n var e = -1009589776\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a\n var oldb = b\n var oldc = c\n var oldd = d\n var olde = e\n\n for (var j = 0; j < 80; j++) {\n if (j < 16) w[j] = x[i + j]\n else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1)\n var t = safe_add(\n safe_add(rol(a, 5), sha1_ft(j, b, c, d)),\n safe_add(safe_add(e, w[j]), sha1_kt(j))\n )\n e = d\n d = c\n c = rol(b, 30)\n b = a\n a = t\n }\n\n a = safe_add(a, olda)\n b = safe_add(b, oldb)\n c = safe_add(c, oldc)\n d = safe_add(d, oldd)\n e = safe_add(e, olde)\n }\n return Array(a, b, c, d, e)\n}\n\n/*\n * Perform the appropriate triplet combination function for the current\n * iteration\n */\nfunction sha1_ft(t: number, b: number, c: number, d: number) {\n if (t < 20) return (b & c) | (~b & d)\n if (t < 40) return b ^ c ^ d\n if (t < 60) return (b & c) | (b & d) | (c & d)\n return b ^ c ^ d\n}\n\n/*\n * Determine the appropriate additive constant for the current iteration\n */\nfunction sha1_kt(t: number) {\n return t < 20 ? 1518500249 : t < 40 ? 1859775393 : t < 60 ? -1894007588 : -899497514\n}\n\n/*\n * Calculate the HMAC-SHA1 of a key and some data\n */\nfunction core_hmac_sha1(key: string, data: string) {\n let bkey = str2binb(key)\n if (bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz)\n\n let ipad = Array(16),\n opad = Array(16)\n for (let i = 0; i < 16; i++) {\n ipad[i] = bkey[i] ^ 0x36363636\n opad[i] = bkey[i] ^ 0x5c5c5c5c\n }\n\n let hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz)\n return core_sha1(opad.concat(hash), 512 + 160)\n}\n\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\nfunction safe_add(x: number, y: number) {\n const lsw = (x & 0xffff) + (y & 0xffff)\n const msw = (x >> 16) + (y >> 16) + (lsw >> 16)\n return (msw << 16) | (lsw & 0xffff)\n}\n\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\nfunction rol(num: number, cnt: number) {\n return (num << cnt) | (num >>> (32 - cnt))\n}\n\n/*\n * Convert an 8-bit or 16-bit string to an array of big-endian words\n * In 8-bit function, characters >255 have their hi-byte silently ignored.\n */\nfunction str2binb(str: string): Array<number> {\n const bin: Array<number> = []\n const mask = (1 << chrsz) - 1\n for (let i = 0; i < str.length * chrsz; i += chrsz)\n bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - (i % 32))\n return bin\n}\n\n/*\n * Convert an array of big-endian words to a string\n */\nfunction binb2str(bin: Array<number>): string {\n let str = ''\n let mask = (1 << chrsz) - 1\n for (let i = 0; i < bin.length * 32; i += chrsz)\n str += String.fromCharCode((bin[i >> 5] >>> (32 - chrsz - (i % 32))) & mask)\n return str\n}\n\n/*\n * Convert an array of big-endian words to a hex string.\n */\nfunction binb2hex(binarray: Array<number>) {\n let hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef'\n let str = ''\n for (let i = 0; i < binarray.length * 4; i++) {\n str +=\n hex_tab.charAt((binarray[i >> 2] >> ((3 - (i % 4)) * 8 + 4)) & 0xf) +\n hex_tab.charAt((binarray[i >> 2] >> ((3 - (i % 4)) * 8)) & 0xf)\n }\n return str\n}\n\n/*\n * Convert an array of big-endian words to a base-64 string\n */\nfunction binb2b64(binarray: Array<number>) {\n let tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n let str = ''\n for (let i = 0; i < binarray.length * 4; i += 3) {\n let triplet =\n (((binarray[i >> 2] >> (8 * (3 - (i % 4)))) & 0xff) << 16) |\n (((binarray[(i + 1) >> 2] >> (8 * (3 - ((i + 1) % 4)))) & 0xff) << 8) |\n ((binarray[(i + 2) >> 2] >> (8 * (3 - ((i + 2) % 4)))) & 0xff)\n for (let j = 0; j < 4; j++) {\n if (i * 8 + j * 6 > binarray.length * 32) str += b64pad\n else str += tab.charAt((triplet >> (6 * (3 - j))) & 0x3f)\n }\n }\n return str\n}\n","import { base64decode, sha1 } from './utils'\nimport { SecureStorageHandler } from '@dstny/scp-storage'\n\nexport const STORE_CREDENTILAS_KEY = 'sdk-auth-credential'\n\ntype CredentialsCallback = (callback: Credentials) => void\ntype JSONCredentials = {\n access_token: string\n refresh_token: string\n expires_in: number\n expires_at: Date\n token_type: 'Bearer' | string\n}\n\nexport default class Credentials {\n static async fromStorage(storage: SecureStorageHandler): Promise<Credentials> {\n const str: string | null = await storage.getItem(STORE_CREDENTILAS_KEY)\n if (str == null || str == undefined) {\n throw new Error('No credentials found in storage.')\n }\n return Credentials.fromJSON(str)\n }\n\n static async toStorage(storage: SecureStorageHandler, credentials: Credentials): Promise<void> {\n await storage.setItem(STORE_CREDENTILAS_KEY, JSON.stringify(credentials))\n }\n\n static async clearFromStorage(storage: SecureStorageHandler): Promise<void> {\n await storage.deleteItem(STORE_CREDENTILAS_KEY)\n }\n\n static fromJSON(str: string): Credentials {\n const { access_token, refresh_token, expires_in } = JSON.parse(str)\n return new Credentials(access_token, refresh_token, expires_in)\n }\n\n static onStorageUpdate(storage: SecureStorageHandler, callback: CredentialsCallback): () => void {\n return storage.on(STORE_CREDENTILAS_KEY, (credentials: string | null) => {\n if (typeof credentials === 'string') {\n callback(Credentials.fromJSON(credentials))\n }\n })\n }\n\n static equals(a?: Credentials, b?: Credentials) {\n if (!a && !b) {\n return true\n }\n if ((a && !b) || (b && !a)) {\n return false\n }\n return (\n a?.access_token === b?.access_token &&\n a?._refresh_token === b?.refresh_token &&\n a?.expires_in === b?.expires_in\n )\n }\n\n /**\n * Used to access resources.\n */\n private _access_token: string\n /**\n * Used to obtain a new access token.\n */\n private _refresh_token: string\n /**\n * Number of seconds until the access token expires.\n * This value is calculated at the moment the access token is generated.\n */\n private _expires_in: number\n\n constructor(access_token: string, refresh_token: string, expires_in: number) {\n this._access_token = access_token\n this._refresh_token = refresh_token\n this._expires_in = expires_in\n }\n\n /**\n * Lists the claims present in the access token.\n */\n get claims() {\n const fallback = {}\n if (typeof this._access_token != 'string') {\n return fallback\n }\n const [, b64payload] = this._access_token.split('.')\n const payload = base64decode(b64payload)\n if (!payload) {\n return fallback\n }\n try {\n return JSON.parse(payload)\n } catch (err) {\n return {}\n }\n }\n\n get access_token(): string {\n return this._access_token\n }\n\n get refresh_token(): string {\n return this._refresh_token\n }\n\n get expires_in(): number {\n return this._expires_in\n }\n\n get token_type(): string {\n return 'Bearer'\n }\n\n get expires_at(): Date {\n if (typeof this.claims?.exp === 'number') {\n return new Date(this.claims?.exp * 1000)\n }\n const expiryDate = new Date()\n expiryDate.setSeconds(expiryDate.getSeconds() + this._expires_in)\n return expiryDate\n }\n\n isExpired(): boolean {\n return this.expires_at && new Date().getTime() > new Date(this.expires_at).getTime()\n }\n\n async getUepId(): Promise<string> {\n const { sub, uep_id: rawUepId } = this.claims \n if (!sub) {\n throw new Error(\"Missing 'sub' claim.\")\n }\n\n if (rawUepId) {\n return rawUepId\n }\n \n return await sha1(sub)\n }\n\n toJSON(): JSONCredentials {\n return {\n access_token: this._access_token,\n refresh_token: this._refresh_token,\n expires_in: this._expires_in,\n expires_at: this.expires_at,\n token_type: this.token_type,\n }\n }\n}\n","export interface JwtPayload {\n [key: string]: any\n iss?: string | undefined\n sub?: string | undefined\n aud?: string | string[] | undefined\n exp?: number | undefined\n nbf?: number | undefined\n iat?: number | undefined\n jti?: string | undefined\n}\n\nexport function decodeToken(token: string): JwtPayload {\n if (!token) {\n throw new Error('No token provided')\n }\n const parts = token.split('.')\n\n if (parts.length !== 3) {\n throw new Error('JWT must have 3 parts')\n }\n\n const decoded = urlBase64Decode(parts[1])\n if (!decoded) {\n throw new Error('Cannot decode the token')\n }\n\n return JSON.parse(decoded)\n}\n\nfunction urlBase64Decode(str: string): string {\n let output = str.replace(/-/g, '+').replace(/_/g, '/')\n switch (output.length % 4) {\n case 0: {\n break\n }\n case 2: {\n output += '=='\n break\n }\n case 3: {\n output += '='\n break\n }\n default: {\n // TODO\n throw new Error('Illegal base64url string!')\n }\n }\n return b64DecodeUnicode(output)\n}\n\nfunction b64DecodeUnicode(str: any): any {\n return decodeURIComponent(\n Array.prototype.map\n .call(b64decode(str), (c: any) => {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)\n })\n .join('')\n )\n}\n\nexport function b64decode(str: string): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n let output: string = ''\n\n str = String(str).replace(/={1,10}$/, '')\n\n if (str.length % 4 === 1) {\n throw new Error(\"'atob' failed: The string to be decoded is not correctly encoded.\")\n }\n\n for (\n // initialize result and counters\n let bc: number = 0, bs: any, buffer: any, idx: number = 0;\n // tslint:disable-next-line:no-conditional-assignment\n (buffer = str.charAt(idx++));\n // tslint:disable-next-line:no-bitwise\n ~buffer &&\n // tslint:disable-next-line:no-conditional-assignment\n ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4)\n ? // tslint:disable-next-line:no-bitwise\n (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer)\n }\n return output\n}\nexport function b64encode(input: string, encode = true) {\n let output = ''\n let chr1, chr2, chr3, enc1, enc2, enc3, enc4\n let i = 0\n const _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n if (encode) {\n input = _utf8_encode(input)\n }\n\n while (i < input.length) {\n chr1 = input.charCodeAt(i++)\n chr2 = input.charCodeAt(i++)\n chr3 = input.charCodeAt(i++)\n\n enc1 = chr1 >> 2\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4)\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6)\n enc4 = chr3 & 63\n\n if (isNaN(chr2)) {\n enc3 = enc4 = 64\n } else if (isNaN(chr3)) {\n enc4 = 64\n }\n\n output =\n output +\n _keyStr.charAt(enc1) +\n _keyStr.charAt(enc2) +\n _keyStr.charAt(enc3) +\n _keyStr.charAt(enc4)\n }\n return output\n}\n\nexport function _utf8_encode(string: string) {\n string = string.replace(/\\r\\n/g, '\\n')\n let utftext = ''\n\n for (let n = 0; n < string.length; n++) {\n const c = string.charCodeAt(n)\n\n if (c < 128) {\n utftext += String.fromCharCode(c)\n } else if (c > 127 && c < 2048) {\n utftext += String.fromCharCode((c >> 6) | 192)\n utftext += String.fromCharCode((c & 63) | 128)\n } else {\n utftext += String.fromCharCode((c >> 12) | 224)\n utftext += String.fromCharCode(((c >> 6) & 63) | 128)\n utftext += String.fromCharCode((c & 63) | 128)\n }\n }\n return utftext\n}\n","export enum AuthenticatorEvents {\n CREDENTIALS = 'CREDENTIALS',\n ACCESS_TOKEN = 'ACCESS_TOKEN',\n JWT_PAYLOAD = 'JWT_PAYLOAD',\n STATE_CHANGE = 'STATE_CHANGE',\n ERROR = 'ERROR',\n}\n","import { Credentials } from '@dstny/scp-credentials'\n\nexport const STORE_CREDENTIALS_KEY = 'sdk-auth-credential'\nexport const STORE_REFRESH_SEPARATION_SECONDS = 'sdk-separation-seconds'\n\nexport type AuthenticatorState = boolean\n\nexport type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\nexport interface Logger {\n log(...arg: any[]): void\n error(...arg: any[]): void\n warn(...arg: any[]): void\n info(...arg: any[]): void\n debug(...arg: any[]): void\n trace(...arg: any[]): void\n\n setLevel(level: LogLevel, persist?: boolean): void\n resetLevel(): void\n}\n\nexport interface AuthenticatorOptions {\n /**\n * The authenticator library will try to use these credentials\n * when the setup method is invoked.\n *\n * This might be useful if you already have credentials available\n * and want to avoid doing the authentication procedure.\n */\n credentials?: Credentials\n /**\n * The authenticator library will use this logger instance for its\n * log statements.\n */\n logger?: Logger\n}\n\ndeclare global {\n interface Navigator {\n locks: LockManager\n }\n}\n","import { SecureStorageHandler } from '@dstny/scp-storage'\nimport { STORE_REFRESH_SEPARATION_SECONDS } from '../types'\n\nexport const getRefreshSeparationMilliseconds = async (\n storage: SecureStorageHandler\n): Promise<number> => {\n const next = parseInt((await storage.getItem(STORE_REFRESH_SEPARATION_SECONDS)) || '0') || 0\n await storage.setItem(STORE_REFRESH_SEPARATION_SECONDS, '' + ((next + 5) % 60))\n return next * 1000\n}\n\n\n","class TokenNetworkError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Network unavailable to refresh the network', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'NetworkError'\n }\n}\n\nexport default TokenNetworkError\n","/**\n * This kind of exceptions are using for reporting error cases for refresh token action such as update, request and ect.\n */\nclass RefreshTokenError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Your token or session is expired.', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'RefreshTokenError'\n }\n}\n\nexport default RefreshTokenError\n","/**\n * Use it for authorization specific errors\n * Depends on reason of exception use proper type\n */\nclass AuthorizationError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Authorization failed', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'AuthorizationError'\n }\n}\n\nexport default AuthorizationError\n","/**\n * This kind of is launched when the configured client is invalid\n */\nclass InvalidClientError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Your client is invalid.', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'InvalidClientError'\n }\n}\n\nexport default InvalidClientError\n","import Emittery from 'emittery'\n\nimport { Credentials } from '@dstny/scp-credentials'\nimport { SecureStorageHandler } from '@dstny/scp-storage'\nimport { AbstractAuthenticationApi } from './api/AbstractAuthenticationApi'\nimport { decodeToken, JwtPayload } from './utils/jwt'\nimport { AuthenticatorEvents } from './events'\nimport { AuthenticatorOptions, AuthenticatorState, Logger, STORE_CREDENTIALS_KEY } from './types'\nimport { getRefreshSeparationMilliseconds } from './utils/separation'\nimport TokenNetworkError from './errors/TokenNetworkError'\nimport RefreshTokenError from './errors/RefreshTokenError'\nimport AuthorizationError from './errors/AuthorizationError'\nimport InvalidClientError from './errors/InvalidClientError'\n\nconst INTERNAL_CREDENTIALS = 'INTERNAL_CREDENTIALS'\nconst MAX_TIMEOUT_VALUE = 2147483646\n\ndeclare global {\n interface Navigator {\n locks: LockManager\n }\n}\n\nfunction getLockManager(): LockManager | undefined {\n if (typeof navigator === 'object') {\n const n = navigator as Navigator\n return n.locks\n }\n}\n\nclass Authenticator extends Emittery {\n private readonly api: AbstractAuthenticationApi\n private readonly secureStorage: SecureStorageHandler\n private readonly logger?: Logger\n private readonly initialCredentials?: Credentials\n\n private _state?: boolean = false\n private _credentials?: Credentials\n private _jwtPayload?: JwtPayload\n\n private isSetup: boolean = false\n private refreshTokenRunnerTimer?: any\n private refreshSeparationMilliseconds: number = 0\n private refreshTokenPromise?: Promise<Credentials>\n private removeCredentialStorageUpdates?: () => void\n private unsubscribeListenerAdded?: () => void\n private unsubscribeUpdateState?: () => void\n private timers: Map<ReturnType<typeof setTimeout>, (error: any) => void> = new Map()\n\n /**\n * In some cases we don't want to trigger the logout automatically\n * on refresh failure.\n *\n * When defined, this method will be invoked after the refresh failure\n * allowing you to define the behavior in that case.\n *\n * Example: You might not want sign out the user immediately\n * when your application is handling calls and you have ongoing calls.\n *\n * @returns {Promise<void>}\n */\n public delegateSignOutOnRefreshFailure?: () => Promise<void>\n\n public get jwtPayload(): JwtPayload | undefined {\n return this._jwtPayload\n }\n\n public get credentials(): Credentials | undefined {\n return this._credentials\n }\n\n public get state(): AuthenticatorState {\n return this._state ?? false\n }\n\n /**\n *\n * @param api\n * @param secureStorage\n * @param options\n */\n constructor(\n api: AbstractAuthenticationApi,\n secureStorage: SecureStorageHandler,\n options?: AuthenticatorOptions\n ) {\n super()\n this.api = api\n this.secureStorage = secureStorage\n this.logger = options?.logger\n this.initialCredentials = options?.credentials\n }\n\n /**\n * Starts the authenticator.\n *\n * @returns Returns either the initialCredentials or credentials stored in local storage.\n * It is usual that authenticator.signInWithCredentials is invoked with the credentials\n * returned by this method.\n */\n async setup(): Promise<Credentials | undefined> {\n let credentials\n\n if (this.initialCredentials) {\n credentials = this.initialCredentials\n } else {\n const localStorageCredentials = await this.secureStorage.getItem(STORE_CREDENTIALS_KEY)\n if (typeof localStorageCredentials === 'string') {\n credentials = Credentials.fromJSON(localStorageCredentials)\n }\n }\n\n // When loading a second instance of ConnectMe on the same browser,\n // the second instance cannot use the refresh token at the same time\n // as the first instance. In that case they will try to use the same\n // refresh_token and the instance that comes last will be returned an error.\n\n // Two mechanisms are put in place to mitigate this:\n // - The first instance to obtain the refresh token will save it to the SecureStorageHandler.\n // Other instances will be notified of the new token. When an instance recevices\n // credentials from another instance they will reset their _setupRefreshTokenRunner,\n // effectively becoming slave from the first instance.\n // - An instance separation delay is added, which separates the refresh of each instance\n // by 5 seconds. Up to 12 instance supported. 60 secs / 5 seconds delay\n this.removeCredentialStorageUpdates = Credentials.onStorageUpdate(\n this.secureStorage,\n (credentials: Credentials) => {\n this._signInWithCredentials(credentials, true)\n }\n )\n // _refreshSeparationMilliseconds is used in _setupRefreshTokenRunner\n this.refreshSeparationMilliseconds = await getRefreshSeparationMilliseconds(this.secureStorage)\n\n // Emit current credentials/access_token/jwt if they are defined when someone registers a listener\n this.unsubscribeListenerAdded = this.on(Emittery.listenerAdded, ({ listener, eventName }) => {\n if (eventName === AuthenticatorEvents.CREDENTIALS && this._credentials) {\n listener(this._credentials)\n } else if (eventName === AuthenticatorEvents.ACCESS_TOKEN && this._credentials) {\n listener(this._credentials.access_token)\n } else if (eventName === AuthenticatorEvents.JWT_PAYLOAD && this._jwtPayload) {\n listener(this._jwtPayload)\n } else if (eventName === AuthenticatorEvents.STATE_CHANGE) {\n listener(this._state)\n }\n })\n\n // Update jwt payload and state, and re-broadcast credentials update\n this.unsubscribeUpdateState = this.on(\n INTERNAL_CREDENTIALS,\n async ({ credentials, isFromOtherInstance }) => {\n if (Credentials.equals(this._credentials, credentials)) {\n return\n }\n this._credentials = credentials\n this.emit(AuthenticatorEvents.CREDENTIALS, credentials)\n if (credentials) {\n this.emit(AuthenticatorEvents.ACCESS_TOKEN, credentials.access_token)\n this._jwtPayload = decodeToken(credentials.access_token)\n this.emit(AuthenticatorEvents.JWT_PAYLOAD, this._jwtPayload)\n this._state = true\n this.emit(AuthenticatorEvents.STATE_CHANGE, this._state)\n if (isFromOtherInstance === false) {\n this.storeCredentials(credentials)\n }\n } else {\n this.emit(AuthenticatorEvents.ACCESS_TOKEN, undefined)\n this._jwtPayload = undefined\n this.emit(AuthenticatorEvents.JWT_PAYLOAD, undefined)\n this._state = false\n this.emit(AuthenticatorEvents.STATE_CHANGE, this._state)\n // Credentials are not removed from the store here as the user\n // might only be stopping the authenticator, not necessarily signin out.\n }\n }\n )\n\n this.isSetup = true\n\n return credentials\n }\n\n /**\n * Destroys the authenticator.\n * This method is called when the user signs-out.\n *\n * @returns {Promise}\n */\n async destroy(): Promise<void> {\n this.refreshTokenRunnerTimer && clearTimeout(this.refreshTokenRunnerTimer)\n\n await this.emit(INTERNAL_CREDENTIALS, { credentials: undefined, isFromOtherInstance: false })\n\n if (this.unsubscribeListenerAdded) {\n this.unsubscribeListenerAdded()\n }\n if (this.unsubscribeUpdateState) {\n this.unsubscribeUpdateState()\n }\n\n this.isSetup = false\n\n for (const [timer, reject] of this.timers.entries()) {\n clearTimeout(timer)\n reject(new Error('Authenticator is being destroyed. Wait functions are rejected.'))\n }\n this.timers.clear()\n }\n\n /**\n * Waits for the given number of milliseconds before resolving the promise.\n *\n * @param waitMilliseconds\n * @returns {Promise<void>}\n */\n private wait(waitMilliseconds: number): Promise<void> {\n try {\n this.assertIsSetup()\n } catch (err) {\n return Promise.reject(err)\n }\n return new Promise((resolve, reject) => {\n const fn = () => {\n this.timers.delete(timer)\n resolve()\n }\n const timer = setTimeout(fn, waitMilliseconds)\n this.timers.set(timer, reject)\n })\n }\n\n /**\n * Generates the login uri for OAuth authentication.\n * Supports escaux-oauth and SMG providers.\n *\n * @param {string} redirectUri - The redirect uri.\n *\n * The URL that the OAuth needs to redirect the browser to once\n * the user has authorized the request.\n *\n * @returns {Promise<string>} The authorization URI.\n *\n * The browser should be redirected to this URI.\n */\n async getLoginUrl(redirectUri: string): Promise<string> {\n this.assertIsSetup()\n const loginUrl: string = await this.api.getLoginUrl(redirectUri)\n return loginUrl\n }\n\n /**\n * Sign-in the user. Using the authorization code, an access and refresh token\n * is retrieved from the OAuth server. These are stored in an Credentials object.\n *\n * @param {string} authorizationCode - The autorization code recieved from OAuth\n * once the user has authorized the request.\n *\n * @param {string} redirectUri - The redirect uri.\n *\n * The URL that the OAuth needs to redirect the browser to once\n * the user has authorized the request.\n *\n * @returns {Promise<Credentials>} The user Crendetials\n */\n async signIn(authorizationCode: string, redirectUri: string): Promise<Credentials> {\n this.assertIsSetup()\n try {\n const credentials: Credentials = await this.api.getToken(authorizationCode, redirectUri)\n return await this._signInWithCredentials(credentials)\n } catch (error) {\n const authorizationError = new AuthorizationError(\n 'Failed to sign in with authorization code and redirect uri',\n { cause: error }\n )\n this.logger?.error(authorizationError)\n throw authorizationError\n }\n }\n\n /**\n * Signs the user out.\n *\n * @param {boolean} remote - When set to false it will not log the user out\n * from the authentication service\n *\n * @returns {Promise<void>}\n */\n async signOut(remote?: boolean, options = { exceptionOnFailure: false }): Promise<void> {\n this.assertIsSetup()\n await this.secureStorage.deleteItem(STORE_CREDENTIALS_KEY)\n if (this.removeCredentialStorageUpdates) {\n this.removeCredentialStorageUpdates()\n this.removeCredentialStorageUpdates = undefined\n }\n\n const credentials = this.credentials\n\n try {\n if (credentials && remote !== false) {\n const { refresh_token, access_token } = credentials\n await this.api.logout(refresh_token, access_token)\n } else {\n this.logger?.log('No credentials were available. No action was executed on logout.')\n }\n } catch (error) {\n const authorizationError = new AuthorizationError('Failed to sign out the user', {\n cause: error,\n })\n this.emit(AuthenticatorEvents.ERROR, authorizationError)\n this.logger?.error(authorizationError)\n if (options?.exceptionOnFailure !== false) {\n throw authorizationError\n }\n } finally {\n await this.emit(INTERNAL_CREDENTIALS, {\n credentials: undefined,\n isFromOtherInstance: false,\n })\n }\n }\n\n /**\n * On wake from sleep, we sign-in with the credentials to force the renewal of the credentials\n * if they expired during the sleep period.\n */\n public async sanityCheck(): Promise<void> {\n this.assertIsSetup()\n if (this._credentials) {\n try {\n await this._signInWithCredentials(this._credentials)\n } catch (error) {\n this.logger?.error('Failed to sign with credentials after sleep', error)\n }\n } else {\n this.logger?.info('No credentials available')\n }\n }\n\n /**\n * Indicates if there are valid credentials.\n *\n * Absent credentials or credentials which have expired are considered not valid.\n */\n public isTokenValid(): boolean {\n if (!this.credentials) {\n return false\n }\n return !this.credentials.isExpired()\n }\n\n public async signInWithCredentials(credentials: Credentials): Promise<Credentials> {\n this.assertIsSetup()\n const credentialsBackup = this._credentials\n try {\n return this._signInWithCredentials(credentials)\n } catch (error) {\n this._credentials = credentialsBackup\n throw error\n }\n }\n\n /**\n *\n * @param credentials\n * @returns {Promise<Credentials>}\n */\n private async _signInWithCredentials(\n credentials: Credentials,\n isFromOtherInstance: boolean = false\n ): Promise<Credentials> {\n this.logger?.log('signInWithCredentials')\n if (!credentials) {\n throw new Error('Invalid argument, credentials cannot be null or undefined.')\n }\n\n if (credentials?.isExpired()) {\n this._credentials = credentials\n await this.refreshTokenWithRetry()\n // _setupRefreshTokenRunner is setup in the refreshToken function\n } else {\n await this.emit(INTERNAL_CREDENTIALS, {\n credentials,\n isFromOtherInstance,\n })\n this._setupRefreshTokenRunner()\n }\n\n if (!this._credentials) {\n throw new Error('Failed to authenticate')\n }\n\n return this._credentials\n }\n\n /**\n * Sets up a timeout which will automatically refresh the token.\n *\n * The timeout is calculated based on the value of the `expires_at` property of\n * the `Credentials`, the refresh is always scheduled at 80% of the token life-time.\n *\n * When there are multiple ConnectMe instances the refresh timeout can vary\n * up to 60 seconds.\n *\n * A token will never be refreshed before at least 10 seconds.\n *\n */\n private _setupRefreshTokenRunner(): void {\n clearTimeout(this.refreshTokenRunnerTimer)\n if (!this.credentials) {\n throw new Error('Unable to start refresh token runner without credentials')\n }\n const refreshIn: number = new Date(this.credentials.expires_at).getTime() - new Date().getTime()\n const refreshTimeout: number =\n this.refreshSeparationMilliseconds + Math.max(10_000, refreshIn - 10_000)\n this.logger?.info(\n `Setting timer to refresh token in ${Math.round(refreshTimeout / 1000)} seconds ` +\n `at ${new Date(new Date().getTime() + refreshTimeout).toTimeString()}`\n )\n this.refreshTokenRunnerTimer = setTimeout(\n async () => {\n try {\n await this.refreshToken()\n } catch (error) {\n const refreshTokenError = new RefreshTokenError(\n 'Refresh runner failed to refresh token with existing credentials',\n { cause: error }\n )\n this.emit(AuthenticatorEvents.ERROR, refreshTokenError)\n this.logger?.error(refreshTokenError)\n }\n },\n Math.min(MAX_TIMEOUT_VALUE, refreshTimeout)\n )\n }\n\n /**\n * Generate a new `access_token` and `refresh_token` using the existing `refresh_token`.\n *\n * This method ensures that no parallel requests to refreshToken are done.\n *\n * @returns {Promise<Credentials>} The new `Credentials` object.\n */\n async refreshToken(): Promise<Credentials> {\n this.assertIsSetup()\n if (this.refreshTokenPromise) {\n this.logger?.info('Refresh token already in progress: returning existing promise.')\n return await this.refreshTokenPromise\n }\n\n const lockManager = getLockManager()\n try {\n if (lockManager) {\n this.refreshTokenPromise = new Promise<Credentials>((resolve, reject) => {\n lockManager.request(\n `@dstny/scp-authenticator/refresh-token-${this.api.clientId}`,\n async () => {\n try {\n const credentials = await this._refreshToken()\n // make sure that all other tabs receive and process the local storage update\n // so that when they attempt to refresh the token, they use updated credentials\n setTimeout(() => {\n resolve(credentials)\n }, 50)\n } catch (error) {\n reject(error)\n }\n }\n )\n })\n } else {\n this.refreshTokenPromise = this._refreshToken()\n }\n return await this.refreshTokenPromise\n } finally {\n this.refreshTokenPromise = undefined\n }\n }\n\n /**\n * Attempts to refresh the credentials.\n *\n * On failure it will throw an exception.\n * This method might end up signing the user out in case the refresh token are invalid.\n * It will not sign you out in case of network issues.\n *\n * @returns\n */\n async refreshTokenWithRetry(): Promise<Credentials> {\n this.assertIsSetup()\n const MAX_DEPTH = 7\n const MAX_TIMEOUT = 30 * 1000\n for (let depth = 0; depth < MAX_DEPTH; depth++) {\n try {\n return await this.refreshToken()\n } catch (err) {\n if (depth + 1 >= MAX_DEPTH) {\n throw err\n }\n if (err instanceof TokenNetworkError) {\n await this.wait(Math.min(2 ** depth * 1000, MAX_TIMEOUT))\n } else {\n throw err\n }\n }\n }\n return await this.refreshToken()\n }\n\n /**\n * Generate a new `access_token` and `refresh_token` using the existing `refresh_token`.\n *\n * This method should only be called by `refreshToken`.\n *\n * Use `refreshToken` method if you need to refresh the token.\n *\n * @returns {Promise<Credentials>} The new `Credentials` object.\n */\n private async _refreshToken(): Promise<Credentials> {\n this.logger?.info('Starting access token refresh')\n try {\n if (!this.credentials) {\n throw new Error('Failed to refresh token. No credentials available.')\n }\n const { refresh_token, access_token } = this.credentials\n const credentials = await this.api.refreshToken(refresh_token, access_token)\n this.logger?.info('Access token refreshed successfully')\n await this.emit(INTERNAL_CREDENTIALS, {\n credentials: credentials,\n isFromOtherInstance: false,\n })\n this._setupRefreshTokenRunner()\n return credentials\n } catch (error) {\n this.logger?.error('Failed to refresh token', error)\n if (error instanceof InvalidClientError) {\n if (typeof location !== 'undefined') {\n location.reload()\n } else {\n this.logger?.warn('Location reload not supported')\n throw error\n }\n }\n if (error instanceof RefreshTokenError) {\n if (this.delegateSignOutOnRefreshFailure) {\n await this.delegateSignOutOnRefreshFailure()\n } else {\n await this.signOut(false)\n }\n }\n throw error\n }\n }\n\n /**\n * Stores the credentials in secureStorage.\n *\n * @param {Credentials} credentials - The credentials to store in the secure storage.\n */\n private async storeCredentials(credentials: Credentials): Promise<void> {\n try {\n await this.secureStorage.setItem(STORE_CREDENTIALS_KEY, JSON.stringify(credentials))\n } catch (error: any) {\n this.logger?.error('Failed to store credentials in storage', error)\n }\n }\n\n private assertIsSetup() {\n if (!this.isSetup) {\n throw new Error('Authenticator needs to be setup before it can be used.')\n }\n }\n}\n\nexport default Authenticator\n","import { Credentials } from '@dstny/scp-credentials'\nimport axios, { AxiosInstance, AxiosRequestConfig } from 'axios'\n\nexport abstract class AbstractAuthenticationApi {\n protected axiosInstance: AxiosInstance\n public abstract readonly clientId: string\n\n constructor(baseURL: string) {\n const config: AxiosRequestConfig = {\n baseURL,\n timeout: 50000,\n }\n this.axiosInstance = axios.create(config)\n }\n\n /**\n * Given a redirectUri it calculates the URL where the browser needs to be\n * redirected in other to authenticate\n *\n * @param {string} redirectUri\n * @returns {string} login url\n */\n abstract getLoginUrl(redirectUri: string): Promise<string>\n\n /**\n * Given the authorizationCode and the redirectUri this method will provide\n * credentials containing an access and refresh token\n *\n * @param {string} authorizationCode\n * @param {string} redirectUri\n * @returns {Promise<Credentials>}\n */\n abstract getToken(authorizationCode: string, redirectUri: string): Promise<Credentials>\n\n /**\n * Given a refresh token this method will provide a new set of credentials\n * containing an access token and a refresh token\n *\n * @param {string} refreshToken\n * @returns {Promise<Credentials>}\n */\n abstract refreshToken(refreshToken: string, accessToken: string): Promise<Credentials>\n\n /**\n * Given a access and refresh token, this method will logout the user from\n * the IAM\n *\n * @param {string} accessToken\n * @param {string} refreshToken\n * @returns {Promise<void>}\n */\n abstract logout(accessToken?: string, refreshToken?: string): Promise<void>\n}\n","/* eslint-disable no-async-promise-executor */\nimport { Credentials } from '@dstny/scp-credentials'\nimport { AbstractAuthenticationApi } from './AbstractAuthenticationApi'\nimport axios from 'axios'\nimport TokenNetworkError from '../errors/TokenNetworkError'\nimport RefreshTokenError from '../errors/RefreshTokenError'\nimport InvalidClientError from '../errors/InvalidClientError'\n\ntype GetTokenResponse = {\n access_token: string\n refresh_token: string\n expires_in: number\n}\n\nexport class OAuthApi extends AbstractAuthenticationApi {\n public readonly clientId: string\n public readonly scope: string\n public readonly authorizationRoute: string\n\n private readonly baseURL: string\n\n constructor(baseURL: string, clientId: string, authorizationRoute: string, scope: string) {\n super(baseURL)\n this.baseURL = baseURL\n this.clientId = clientId\n this.authorizationRoute = authorizationRoute\n this.scope = scope\n }\n\n async getLoginUrl(redirectUri: string) {\n this.axiosInstance.getUri()\n return (\n `${this.baseURL}${this.authorizationRoute}` +\n `?client_id=${encodeURIComponent(this.clientId)}` +\n '&response_type=code' +\n `&redirect_uri=${encodeURIComponent(redirectUri)}` +\n (this.scope ? `&scope=${encodeURIComponent(this.scope)}` : '')\n )\n }\n\n async getToken(authorizationCode: string, redirectUri: string): Promise<Credentials> {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n '/token',\n new URLSearchParams({\n client_id: this.clientId,\n code: authorizationCode,\n grant_type: 'authorization_code',\n redirect_uri: redirectUri,\n })\n )\n return new Credentials(data.access_token, data.refresh_token, data.expires_in)\n }\n\n async loginWithUsernamePassword(username: string, password: string): Promise<Credentials> {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n '/token',\n new URLSearchParams({\n client_id: this.clientId,\n grant_type: 'password',\n username,\n password,\n })\n )\n return new Credentials(data.access_token, data.refresh_token, data.expires_in)\n }\n\n async refreshToken(refreshToken: string, accessToken: string): Promise<Credentials> {\n try {\n const response = await this.axiosInstance.post<GetTokenResponse>(\n '/token',\n new URLSearchParams({\n client_id: this.clientId,\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n })\n )\n return new Credentials(\n response.data.access_token,\n response.data.refresh_token,\n response.data.expires_in\n )\n } catch (error) {\n if (axios.isAxiosError(error)) {\n if (error.message === 'Network Error') {\n throw new TokenNetworkError()\n }\n const statusCode = error.response?.status\n if (statusCode === 401 && error.response?.data?.error === 'unauthorized_client') {\n throw new InvalidClientError()\n }\n if (typeof statusCode === 'number' && statusCode >= 400 && statusCode < 500) {\n throw new RefreshTokenError()\n }\n }\n throw error\n }\n }\n\n async logout(_redirectUri?: string): Promise<void> {\n await this.axiosInstance.post('/logout', null, { withCredentials: true })\n }\n}\n","import { Credentials } from '@dstny/scp-credentials'\nimport { AbstractAuthenticationApi } from './AbstractAuthenticationApi'\nimport RefreshTokenError from '../errors/RefreshTokenError'\nimport TokenNetworkError from '../errors/TokenNetworkError'\nimport axios from 'axios'\nimport { decodeToken } from '../utils/jwt'\nimport InvalidClientError from '../errors/InvalidClientError'\n\ntype GetLoginUrlResponse = {\n loginUrl: string\n}\n\ntype GetTokenResponse = {\n refreshToken: string\n accessToken: string\n message: string\n status: string\n}\n\nexport class SmgAuthApi extends AbstractAuthenticationApi {\n public readonly clientId: string\n public readonly realm: string\n\n constructor(baseURL: string, realm: string, clientId: string) {\n super(baseURL)\n this.clientId = clientId\n this.realm = realm\n }\n\n async getLoginUrl(redirectUri: string) {\n const { data } = await this.axiosInstance.get<GetLoginUrlResponse>(\n `/login/getloginurl/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`\n )\n\n const baseUrl = new URL(data.loginUrl)\n // The redirect_uri provided by the SMG is inacurate, this needs to be rewritten with the actual\n // redirect uri.\n baseUrl.searchParams.set('redirect_uri', redirectUri)\n // The authentication pathname of the SMG cannot be trusted to be configured correctly.\n // Duplicate '/' characters in the authentication URL causes the authentication\n // prompt to be displayed twice. Once when coven attempts to obtain a token, and\n // again when connect me attempts to obtain a token.\n // vv\n // example: https://keycloak.development.aws.d4sp.com//auth/realms/syslab1/protocol/openid-connect/auth\n baseUrl.pathname = baseUrl.pathname.replace(/\\/\\/+/g, '/')\n\n return baseUrl.toString()\n }\n\n async getToken(authorizationCode: string, redirectUri: string): Promise<Credentials> {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n `/login/getaccesstoken/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`,\n {\n code: authorizationCode,\n redirectUri: redirectUri,\n }\n )\n const { refreshToken, accessToken } = data\n\n const { iat = 0, exp = 0 } = decodeToken(accessToken)\n const expires_in = exp - iat\n const expires_at = new Date()\n expires_at.setSeconds(expires_at.getSeconds() + expires_in)\n return new Credentials(accessToken, refreshToken, expires_in)\n }\n\n async refreshToken(refreshToken: string, accessToken: string): Promise<Credentials> {\n try {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n `/login/refreshtoken/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`,\n {\n jwt: accessToken,\n refreshToken: refreshToken,\n }\n )\n const { refreshToken: newRefreshToken, accessToken: newAccessToken } = data\n\n const { iat = 0, exp = 0 } = decodeToken(newAccessToken)\n const expires_in = exp - iat\n return new Credentials(newAccessToken, newRefreshToken, expires_in)\n } catch (error) {\n if (axios.isAxiosError(error)) {\n if (error.message === 'Network Error') {\n throw new TokenNetworkError()\n }\n const statusCode = error.response?.status\n if (statusCode === 401 && error.response?.data?.error === 'invalid_client') {\n throw new InvalidClientError()\n }\n if (typeof statusCode === 'number' && statusCode >= 400 && statusCode < 500) {\n throw new RefreshTokenError()\n }\n }\n throw error\n }\n }\n\n async logout(refreshToken: string, accessToken: string): Promise<void> {\n await this.axiosInstance.post(\n `/login/logout/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`,\n {\n jwt: accessToken,\n refreshToken: refreshToken,\n }\n )\n }\n}\n\nexport default SmgAuthApi\n"],"mappings":"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","names":["eventName","AuthenticatorEvents","credentials","axios","import_axios","axios","import_axios","axios"]}
1
+ {"version":3,"sources":["../src/index.ts","../../../node_modules/.pnpm/emittery@1.1.0/node_modules/emittery/maps.js","../../../node_modules/.pnpm/emittery@1.1.0/node_modules/emittery/index.js","../../credentials/src/utils.ts","../../credentials/src/Credentials.ts","../src/utils/jwt.ts","../src/events.ts","../src/types.ts","../src/utils/separation.ts","../src/errors/TokenNetworkError.ts","../src/errors/RefreshTokenError.ts","../src/errors/AuthorizationError.ts","../src/errors/InvalidClientError.ts","../src/Authenticator.ts","../src/api/AbstractAuthenticationApi.ts","../src/api/OAuthApi.ts","../src/api/SmgAuthApi.ts"],"sourcesContent":["import Authenticator from './Authenticator'\n\nexport * from './types'\nexport * from './events'\nexport * from './errors/AuthorizationError'\nexport * from './errors/InvalidClientError'\nexport * from './errors/RefreshTokenError'\nexport * from './errors/TokenNetworkError'\n\nexport * from './api/AbstractAuthenticationApi'\nexport * from './api/OAuthApi'\nexport * from './api/SmgAuthApi'\n\nexport default Authenticator\n","export const anyMap = new WeakMap();\nexport const eventsMap = new WeakMap();\nexport const producersMap = new WeakMap();\n","import {anyMap, producersMap, eventsMap} from './maps.js';\n\nconst anyProducer = Symbol('anyProducer');\nconst resolvedPromise = Promise.resolve();\n\n// Define symbols for \"meta\" events.\nconst listenerAdded = Symbol('listenerAdded');\nconst listenerRemoved = Symbol('listenerRemoved');\n\nlet canEmitMetaEvents = false;\nlet isGlobalDebugEnabled = false;\n\nconst isEventKeyType = key => typeof key === 'string' || typeof key === 'symbol' || typeof key === 'number';\n\nfunction assertEventName(eventName) {\n\tif (!isEventKeyType(eventName)) {\n\t\tthrow new TypeError('`eventName` must be a string, symbol, or number');\n\t}\n}\n\nfunction assertListener(listener) {\n\tif (typeof listener !== 'function') {\n\t\tthrow new TypeError('listener must be a function');\n\t}\n}\n\nfunction getListeners(instance, eventName) {\n\tconst events = eventsMap.get(instance);\n\tif (!events.has(eventName)) {\n\t\treturn;\n\t}\n\n\treturn events.get(eventName);\n}\n\nfunction getEventProducers(instance, eventName) {\n\tconst key = isEventKeyType(eventName) ? eventName : anyProducer;\n\tconst producers = producersMap.get(instance);\n\tif (!producers.has(key)) {\n\t\treturn;\n\t}\n\n\treturn producers.get(key);\n}\n\nfunction enqueueProducers(instance, eventName, eventData) {\n\tconst producers = producersMap.get(instance);\n\tif (producers.has(eventName)) {\n\t\tfor (const producer of producers.get(eventName)) {\n\t\t\tproducer.enqueue(eventData);\n\t\t}\n\t}\n\n\tif (producers.has(anyProducer)) {\n\t\tconst item = Promise.all([eventName, eventData]);\n\t\tfor (const producer of producers.get(anyProducer)) {\n\t\t\tproducer.enqueue(item);\n\t\t}\n\t}\n}\n\nfunction iterator(instance, eventNames) {\n\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\n\tlet isFinished = false;\n\tlet flush = () => {};\n\tlet queue = [];\n\n\tconst producer = {\n\t\tenqueue(item) {\n\t\t\tqueue.push(item);\n\t\t\tflush();\n\t\t},\n\t\tfinish() {\n\t\t\tisFinished = true;\n\t\t\tflush();\n\t\t},\n\t};\n\n\tfor (const eventName of eventNames) {\n\t\tlet set = getEventProducers(instance, eventName);\n\t\tif (!set) {\n\t\t\tset = new Set();\n\t\t\tconst producers = producersMap.get(instance);\n\t\t\tproducers.set(eventName, set);\n\t\t}\n\n\t\tset.add(producer);\n\t}\n\n\treturn {\n\t\tasync next() {\n\t\t\tif (!queue) {\n\t\t\t\treturn {done: true};\n\t\t\t}\n\n\t\t\tif (queue.length === 0) {\n\t\t\t\tif (isFinished) {\n\t\t\t\t\tqueue = undefined;\n\t\t\t\t\treturn this.next();\n\t\t\t\t}\n\n\t\t\t\tawait new Promise(resolve => {\n\t\t\t\t\tflush = resolve;\n\t\t\t\t});\n\n\t\t\t\treturn this.next();\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdone: false,\n\t\t\t\tvalue: await queue.shift(),\n\t\t\t};\n\t\t},\n\n\t\tasync return(value) {\n\t\t\tqueue = undefined;\n\n\t\t\tfor (const eventName of eventNames) {\n\t\t\t\tconst set = getEventProducers(instance, eventName);\n\t\t\t\tif (set) {\n\t\t\t\t\tset.delete(producer);\n\t\t\t\t\tif (set.size === 0) {\n\t\t\t\t\t\tconst producers = producersMap.get(instance);\n\t\t\t\t\t\tproducers.delete(eventName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tflush();\n\n\t\t\treturn arguments.length > 0\n\t\t\t\t? {done: true, value: await value}\n\t\t\t\t: {done: true};\n\t\t},\n\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn this;\n\t\t},\n\t};\n}\n\nfunction defaultMethodNamesOrAssert(methodNames) {\n\tif (methodNames === undefined) {\n\t\treturn allEmitteryMethods;\n\t}\n\n\tif (!Array.isArray(methodNames)) {\n\t\tthrow new TypeError('`methodNames` must be an array of strings');\n\t}\n\n\tfor (const methodName of methodNames) {\n\t\tif (!allEmitteryMethods.includes(methodName)) {\n\t\t\tif (typeof methodName !== 'string') {\n\t\t\t\tthrow new TypeError('`methodNames` element must be a string');\n\t\t\t}\n\n\t\t\tthrow new Error(`${methodName} is not Emittery method`);\n\t\t}\n\t}\n\n\treturn methodNames;\n}\n\nconst isMetaEvent = eventName => eventName === listenerAdded || eventName === listenerRemoved;\n\nfunction emitMetaEvent(emitter, eventName, eventData) {\n\tif (!isMetaEvent(eventName)) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tcanEmitMetaEvents = true;\n\t\temitter.emit(eventName, eventData);\n\t} finally {\n\t\tcanEmitMetaEvents = false;\n\t}\n}\n\nexport default class Emittery {\n\tstatic mixin(emitteryPropertyName, methodNames) {\n\t\tmethodNames = defaultMethodNamesOrAssert(methodNames);\n\t\treturn target => {\n\t\t\tif (typeof target !== 'function') {\n\t\t\t\tthrow new TypeError('`target` must be function');\n\t\t\t}\n\n\t\t\tfor (const methodName of methodNames) {\n\t\t\t\tif (target.prototype[methodName] !== undefined) {\n\t\t\t\t\tthrow new Error(`The property \\`${methodName}\\` already exists on \\`target\\``);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction getEmitteryProperty() {\n\t\t\t\tObject.defineProperty(this, emitteryPropertyName, {\n\t\t\t\t\tenumerable: false,\n\t\t\t\t\tvalue: new Emittery(),\n\t\t\t\t});\n\t\t\t\treturn this[emitteryPropertyName];\n\t\t\t}\n\n\t\t\tObject.defineProperty(target.prototype, emitteryPropertyName, {\n\t\t\t\tenumerable: false,\n\t\t\t\tget: getEmitteryProperty,\n\t\t\t});\n\n\t\t\tconst emitteryMethodCaller = methodName => function (...args) {\n\t\t\t\treturn this[emitteryPropertyName][methodName](...args);\n\t\t\t};\n\n\t\t\tfor (const methodName of methodNames) {\n\t\t\t\tObject.defineProperty(target.prototype, methodName, {\n\t\t\t\t\tenumerable: false,\n\t\t\t\t\tvalue: emitteryMethodCaller(methodName),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn target;\n\t\t};\n\t}\n\n\tstatic get isDebugEnabled() {\n\t\t// In a browser environment, `globalThis.process` can potentially reference a DOM Element with a `#process` ID,\n\t\t// so instead of just type checking `globalThis.process`, we need to make sure that `globalThis.process.env` exists.\n\t\t// eslint-disable-next-line n/prefer-global/process\n\t\tif (typeof globalThis.process?.env !== 'object') {\n\t\t\treturn isGlobalDebugEnabled;\n\t\t}\n\n\t\t// eslint-disable-next-line n/prefer-global/process\n\t\tconst {env} = globalThis.process ?? {env: {}};\n\t\treturn env.DEBUG === 'emittery' || env.DEBUG === '*' || isGlobalDebugEnabled;\n\t}\n\n\tstatic set isDebugEnabled(newValue) {\n\t\tisGlobalDebugEnabled = newValue;\n\t}\n\n\tconstructor(options = {}) {\n\t\tanyMap.set(this, new Set());\n\t\teventsMap.set(this, new Map());\n\t\tproducersMap.set(this, new Map());\n\n\t\tproducersMap.get(this).set(anyProducer, new Set());\n\n\t\tthis.debug = options.debug ?? {};\n\n\t\tif (this.debug.enabled === undefined) {\n\t\t\tthis.debug.enabled = false;\n\t\t}\n\n\t\tif (!this.debug.logger) {\n\t\t\tthis.debug.logger = (type, debugName, eventName, eventData) => {\n\t\t\t\ttry {\n\t\t\t\t\t// TODO: Use https://github.com/sindresorhus/safe-stringify when the package is more mature. Just copy-paste the code.\n\t\t\t\t\teventData = JSON.stringify(eventData);\n\t\t\t\t} catch {\n\t\t\t\t\teventData = `Object with the following keys failed to stringify: ${Object.keys(eventData).join(',')}`;\n\t\t\t\t}\n\n\t\t\t\tif (typeof eventName === 'symbol' || typeof eventName === 'number') {\n\t\t\t\t\teventName = eventName.toString();\n\t\t\t\t}\n\n\t\t\t\tconst currentTime = new Date();\n\t\t\t\tconst logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`;\n\t\t\t\tconsole.log(`[${logTime}][emittery:${type}][${debugName}] Event Name: ${eventName}\\n\\tdata: ${eventData}`);\n\t\t\t};\n\t\t}\n\t}\n\n\tlogIfDebugEnabled(type, eventName, eventData) {\n\t\tif (Emittery.isDebugEnabled || this.debug.enabled) {\n\t\t\tthis.debug.logger(type, this.debug.name, eventName, eventData);\n\t\t}\n\t}\n\n\ton(eventNames, listener, {signal} = {}) {\n\t\tassertListener(listener);\n\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tfor (const eventName of eventNames) {\n\t\t\tassertEventName(eventName);\n\t\t\tlet set = getListeners(this, eventName);\n\t\t\tif (!set) {\n\t\t\t\tset = new Set();\n\t\t\t\tconst events = eventsMap.get(this);\n\t\t\t\tevents.set(eventName, set);\n\t\t\t}\n\n\t\t\tset.add(listener);\n\n\t\t\tthis.logIfDebugEnabled('subscribe', eventName, undefined);\n\n\t\t\tif (!isMetaEvent(eventName)) {\n\t\t\t\temitMetaEvent(this, listenerAdded, {eventName, listener});\n\t\t\t}\n\t\t}\n\n\t\tconst off = () => {\n\t\t\tthis.off(eventNames, listener);\n\t\t\tsignal?.removeEventListener('abort', off);\n\t\t};\n\n\t\tsignal?.addEventListener('abort', off, {once: true});\n\n\t\tif (signal?.aborted) {\n\t\t\toff();\n\t\t}\n\n\t\treturn off;\n\t}\n\n\toff(eventNames, listener) {\n\t\tassertListener(listener);\n\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tfor (const eventName of eventNames) {\n\t\t\tassertEventName(eventName);\n\t\t\tconst set = getListeners(this, eventName);\n\t\t\tif (set) {\n\t\t\t\tset.delete(listener);\n\t\t\t\tif (set.size === 0) {\n\t\t\t\t\tconst events = eventsMap.get(this);\n\t\t\t\t\tevents.delete(eventName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.logIfDebugEnabled('unsubscribe', eventName, undefined);\n\n\t\t\tif (!isMetaEvent(eventName)) {\n\t\t\t\temitMetaEvent(this, listenerRemoved, {eventName, listener});\n\t\t\t}\n\t\t}\n\t}\n\n\tonce(eventNames) {\n\t\tlet off_;\n\n\t\tconst promise = new Promise(resolve => {\n\t\t\toff_ = this.on(eventNames, data => {\n\t\t\t\toff_();\n\t\t\t\tresolve(data);\n\t\t\t});\n\t\t});\n\n\t\tpromise.off = off_;\n\t\treturn promise;\n\t}\n\n\tevents(eventNames) {\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tfor (const eventName of eventNames) {\n\t\t\tassertEventName(eventName);\n\t\t}\n\n\t\treturn iterator(this, eventNames);\n\t}\n\n\tasync emit(eventName, eventData) {\n\t\tassertEventName(eventName);\n\n\t\tif (isMetaEvent(eventName) && !canEmitMetaEvents) {\n\t\t\tthrow new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`');\n\t\t}\n\n\t\tthis.logIfDebugEnabled('emit', eventName, eventData);\n\n\t\tenqueueProducers(this, eventName, eventData);\n\n\t\tconst listeners = getListeners(this, eventName) ?? new Set();\n\t\tconst anyListeners = anyMap.get(this);\n\t\tconst staticListeners = [...listeners];\n\t\tconst staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];\n\n\t\tawait resolvedPromise;\n\t\tawait Promise.all([\n\t\t\t...staticListeners.map(async listener => {\n\t\t\t\tif (listeners.has(listener)) {\n\t\t\t\t\treturn listener(eventData);\n\t\t\t\t}\n\t\t\t}),\n\t\t\t...staticAnyListeners.map(async listener => {\n\t\t\t\tif (anyListeners.has(listener)) {\n\t\t\t\t\treturn listener(eventName, eventData);\n\t\t\t\t}\n\t\t\t}),\n\t\t]);\n\t}\n\n\tasync emitSerial(eventName, eventData) {\n\t\tassertEventName(eventName);\n\n\t\tif (isMetaEvent(eventName) && !canEmitMetaEvents) {\n\t\t\tthrow new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`');\n\t\t}\n\n\t\tthis.logIfDebugEnabled('emitSerial', eventName, eventData);\n\n\t\tconst listeners = getListeners(this, eventName) ?? new Set();\n\t\tconst anyListeners = anyMap.get(this);\n\t\tconst staticListeners = [...listeners];\n\t\tconst staticAnyListeners = [...anyListeners];\n\n\t\tawait resolvedPromise;\n\t\t/* eslint-disable no-await-in-loop */\n\t\tfor (const listener of staticListeners) {\n\t\t\tif (listeners.has(listener)) {\n\t\t\t\tawait listener(eventData);\n\t\t\t}\n\t\t}\n\n\t\tfor (const listener of staticAnyListeners) {\n\t\t\tif (anyListeners.has(listener)) {\n\t\t\t\tawait listener(eventName, eventData);\n\t\t\t}\n\t\t}\n\t\t/* eslint-enable no-await-in-loop */\n\t}\n\n\tonAny(listener, {signal} = {}) {\n\t\tassertListener(listener);\n\n\t\tthis.logIfDebugEnabled('subscribeAny', undefined, undefined);\n\n\t\tanyMap.get(this).add(listener);\n\t\temitMetaEvent(this, listenerAdded, {listener});\n\n\t\tconst offAny = () => {\n\t\t\tthis.offAny(listener);\n\t\t\tsignal?.removeEventListener('abort', offAny);\n\t\t};\n\n\t\tsignal?.addEventListener('abort', offAny, {once: true});\n\n\t\tif (signal?.aborted) {\n\t\t\toffAny();\n\t\t}\n\n\t\treturn offAny;\n\t}\n\n\tanyEvent() {\n\t\treturn iterator(this);\n\t}\n\n\toffAny(listener) {\n\t\tassertListener(listener);\n\n\t\tthis.logIfDebugEnabled('unsubscribeAny', undefined, undefined);\n\n\t\temitMetaEvent(this, listenerRemoved, {listener});\n\t\tanyMap.get(this).delete(listener);\n\t}\n\n\tclearListeners(eventNames) {\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\n\t\tfor (const eventName of eventNames) {\n\t\t\tthis.logIfDebugEnabled('clear', eventName, undefined);\n\n\t\t\tif (isEventKeyType(eventName)) {\n\t\t\t\tconst set = getListeners(this, eventName);\n\t\t\t\tif (set) {\n\t\t\t\t\tset.clear();\n\t\t\t\t}\n\n\t\t\t\tconst producers = getEventProducers(this, eventName);\n\t\t\t\tif (producers) {\n\t\t\t\t\tfor (const producer of producers) {\n\t\t\t\t\t\tproducer.finish();\n\t\t\t\t\t}\n\n\t\t\t\t\tproducers.clear();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tanyMap.get(this).clear();\n\n\t\t\t\tfor (const [eventName, listeners] of eventsMap.get(this).entries()) {\n\t\t\t\t\tlisteners.clear();\n\t\t\t\t\teventsMap.get(this).delete(eventName);\n\t\t\t\t}\n\n\t\t\t\tfor (const [eventName, producers] of producersMap.get(this).entries()) {\n\t\t\t\t\tfor (const producer of producers) {\n\t\t\t\t\t\tproducer.finish();\n\t\t\t\t\t}\n\n\t\t\t\t\tproducers.clear();\n\t\t\t\t\tproducersMap.get(this).delete(eventName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlistenerCount(eventNames) {\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tlet count = 0;\n\n\t\tfor (const eventName of eventNames) {\n\t\t\tif (isEventKeyType(eventName)) {\n\t\t\t\tcount += anyMap.get(this).size\n\t\t\t\t\t+ (getListeners(this, eventName)?.size ?? 0)\n\t\t\t\t\t+ (getEventProducers(this, eventName)?.size ?? 0)\n\t\t\t\t\t+ (getEventProducers(this)?.size ?? 0);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (eventName !== undefined) {\n\t\t\t\tassertEventName(eventName);\n\t\t\t}\n\n\t\t\tcount += anyMap.get(this).size;\n\n\t\t\tfor (const value of eventsMap.get(this).values()) {\n\t\t\t\tcount += value.size;\n\t\t\t}\n\n\t\t\tfor (const value of producersMap.get(this).values()) {\n\t\t\t\tcount += value.size;\n\t\t\t}\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tbindMethods(target, methodNames) {\n\t\tif (typeof target !== 'object' || target === null) {\n\t\t\tthrow new TypeError('`target` must be an object');\n\t\t}\n\n\t\tmethodNames = defaultMethodNamesOrAssert(methodNames);\n\n\t\tfor (const methodName of methodNames) {\n\t\t\tif (target[methodName] !== undefined) {\n\t\t\t\tthrow new Error(`The property \\`${methodName}\\` already exists on \\`target\\``);\n\t\t\t}\n\n\t\t\tObject.defineProperty(target, methodName, {\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: this[methodName].bind(this),\n\t\t\t});\n\t\t}\n\t}\n}\n\nconst allEmitteryMethods = Object.getOwnPropertyNames(Emittery.prototype).filter(v => v !== 'constructor');\n\nObject.defineProperty(Emittery, 'listenerAdded', {\n\tvalue: listenerAdded,\n\twritable: false,\n\tenumerable: true,\n\tconfigurable: false,\n});\nObject.defineProperty(Emittery, 'listenerRemoved', {\n\tvalue: listenerRemoved,\n\twritable: false,\n\tenumerable: true,\n\tconfigurable: false,\n});\n","// declare const Buffer\n\nfunction byteToPercent(b: string) {\n return `%${`00${b.charCodeAt(0).toString(16)}`.slice(-2)}`\n}\n\nexport function base64decode(str: string): string | undefined {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n let output: string = ''\n\n str = String(str).replace(/={1,10}$/, '')\n\n if (str.length % 4 === 1) {\n throw new Error(\"'atob' failed: The string to be decoded is not correctly encoded.\")\n }\n\n for (\n // initialize result and counters\n let bc: number = 0, bs: any, buffer: any, idx: number = 0;\n // tslint:disable-next-line:no-conditional-assignment\n (buffer = str.charAt(idx++));\n // tslint:disable-next-line:no-bitwise\n ~buffer &&\n // tslint:disable-next-line:no-conditional-assignment\n ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4)\n ? // tslint:disable-next-line:no-bitwise\n (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer)\n }\n return output\n}\n\nexport async function sha1(str: string) {\n if (typeof crypto === 'object') {\n const hash = await crypto.subtle.digest('SHA-1', new TextEncoder().encode(str))\n return Array.from(new Uint8Array(hash))\n .map((v) => v.toString(16).padStart(2, '0'))\n .join('')\n } else {\n return binb2hex(core_sha1(str2binb(str), str.length * chrsz))\n }\n}\n\nconst hexcase = 0 /* hex output format. 0 - lowercase; 1 - uppercase */\nconst b64pad = '' /* base-64 pad character. \"=\" for strict RFC compliance */\nconst chrsz = 8 /* bits per input character. 8 - ASCII; 16 - Unicode */\n\n/*\n * Calculate the SHA-1 of an array of big-endian words, and a bit length\n */\nfunction core_sha1(x: Array<number>, len: number) {\n /* append padding */\n x[len >> 5] |= 0x80 << (24 - (len % 32))\n x[(((len + 64) >> 9) << 4) + 15] = len\n\n var w = Array(80)\n var a = 1732584193\n var b = -271733879\n var c = -1732584194\n var d = 271733878\n var e = -1009589776\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a\n var oldb = b\n var oldc = c\n var oldd = d\n var olde = e\n\n for (var j = 0; j < 80; j++) {\n if (j < 16) w[j] = x[i + j]\n else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1)\n var t = safe_add(\n safe_add(rol(a, 5), sha1_ft(j, b, c, d)),\n safe_add(safe_add(e, w[j]), sha1_kt(j))\n )\n e = d\n d = c\n c = rol(b, 30)\n b = a\n a = t\n }\n\n a = safe_add(a, olda)\n b = safe_add(b, oldb)\n c = safe_add(c, oldc)\n d = safe_add(d, oldd)\n e = safe_add(e, olde)\n }\n return Array(a, b, c, d, e)\n}\n\n/*\n * Perform the appropriate triplet combination function for the current\n * iteration\n */\nfunction sha1_ft(t: number, b: number, c: number, d: number) {\n if (t < 20) return (b & c) | (~b & d)\n if (t < 40) return b ^ c ^ d\n if (t < 60) return (b & c) | (b & d) | (c & d)\n return b ^ c ^ d\n}\n\n/*\n * Determine the appropriate additive constant for the current iteration\n */\nfunction sha1_kt(t: number) {\n return t < 20 ? 1518500249 : t < 40 ? 1859775393 : t < 60 ? -1894007588 : -899497514\n}\n\n/*\n * Calculate the HMAC-SHA1 of a key and some data\n */\nfunction core_hmac_sha1(key: string, data: string) {\n let bkey = str2binb(key)\n if (bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz)\n\n let ipad = Array(16),\n opad = Array(16)\n for (let i = 0; i < 16; i++) {\n ipad[i] = bkey[i] ^ 0x36363636\n opad[i] = bkey[i] ^ 0x5c5c5c5c\n }\n\n let hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz)\n return core_sha1(opad.concat(hash), 512 + 160)\n}\n\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\nfunction safe_add(x: number, y: number) {\n const lsw = (x & 0xffff) + (y & 0xffff)\n const msw = (x >> 16) + (y >> 16) + (lsw >> 16)\n return (msw << 16) | (lsw & 0xffff)\n}\n\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\nfunction rol(num: number, cnt: number) {\n return (num << cnt) | (num >>> (32 - cnt))\n}\n\n/*\n * Convert an 8-bit or 16-bit string to an array of big-endian words\n * In 8-bit function, characters >255 have their hi-byte silently ignored.\n */\nfunction str2binb(str: string): Array<number> {\n const bin: Array<number> = []\n const mask = (1 << chrsz) - 1\n for (let i = 0; i < str.length * chrsz; i += chrsz)\n bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - (i % 32))\n return bin\n}\n\n/*\n * Convert an array of big-endian words to a string\n */\nfunction binb2str(bin: Array<number>): string {\n let str = ''\n let mask = (1 << chrsz) - 1\n for (let i = 0; i < bin.length * 32; i += chrsz)\n str += String.fromCharCode((bin[i >> 5] >>> (32 - chrsz - (i % 32))) & mask)\n return str\n}\n\n/*\n * Convert an array of big-endian words to a hex string.\n */\nfunction binb2hex(binarray: Array<number>) {\n let hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef'\n let str = ''\n for (let i = 0; i < binarray.length * 4; i++) {\n str +=\n hex_tab.charAt((binarray[i >> 2] >> ((3 - (i % 4)) * 8 + 4)) & 0xf) +\n hex_tab.charAt((binarray[i >> 2] >> ((3 - (i % 4)) * 8)) & 0xf)\n }\n return str\n}\n\n/*\n * Convert an array of big-endian words to a base-64 string\n */\nfunction binb2b64(binarray: Array<number>) {\n let tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n let str = ''\n for (let i = 0; i < binarray.length * 4; i += 3) {\n let triplet =\n (((binarray[i >> 2] >> (8 * (3 - (i % 4)))) & 0xff) << 16) |\n (((binarray[(i + 1) >> 2] >> (8 * (3 - ((i + 1) % 4)))) & 0xff) << 8) |\n ((binarray[(i + 2) >> 2] >> (8 * (3 - ((i + 2) % 4)))) & 0xff)\n for (let j = 0; j < 4; j++) {\n if (i * 8 + j * 6 > binarray.length * 32) str += b64pad\n else str += tab.charAt((triplet >> (6 * (3 - j))) & 0x3f)\n }\n }\n return str\n}\n","import { base64decode, sha1 } from './utils'\nimport { SecureStorageHandler } from '@dstny/scp-storage'\n\nexport const STORE_CREDENTILAS_KEY = 'sdk-auth-credential'\n\ntype CredentialsCallback = (callback: Credentials) => void\ntype JSONCredentials = {\n access_token: string\n refresh_token: string\n expires_in: number\n expires_at: Date\n token_type: 'Bearer' | string\n}\n\nexport default class Credentials {\n static async fromStorage(storage: SecureStorageHandler): Promise<Credentials> {\n const str: string | null = await storage.getItem(STORE_CREDENTILAS_KEY)\n if (str == null || str == undefined) {\n throw new Error('No credentials found in storage.')\n }\n return Credentials.fromJSON(str)\n }\n\n static async toStorage(storage: SecureStorageHandler, credentials: Credentials): Promise<void> {\n await storage.setItem(STORE_CREDENTILAS_KEY, JSON.stringify(credentials))\n }\n\n static async clearFromStorage(storage: SecureStorageHandler): Promise<void> {\n await storage.deleteItem(STORE_CREDENTILAS_KEY)\n }\n\n static fromJSON(str: string): Credentials {\n const { access_token, refresh_token, expires_in } = JSON.parse(str)\n return new Credentials(access_token, refresh_token, expires_in)\n }\n\n static onStorageUpdate(storage: SecureStorageHandler, callback: CredentialsCallback): () => void {\n return storage.on(STORE_CREDENTILAS_KEY, (credentials: string | null) => {\n if (typeof credentials === 'string') {\n callback(Credentials.fromJSON(credentials))\n }\n })\n }\n\n static equals(a?: Credentials, b?: Credentials) {\n if (!a && !b) {\n return true\n }\n if ((a && !b) || (b && !a)) {\n return false\n }\n return (\n a?.access_token === b?.access_token &&\n a?._refresh_token === b?.refresh_token &&\n a?.expires_in === b?.expires_in\n )\n }\n\n /**\n * Used to access resources.\n */\n private _access_token: string\n /**\n * Used to obtain a new access token.\n */\n private _refresh_token: string\n /**\n * Number of seconds until the access token expires.\n * This value is calculated at the moment the access token is generated.\n */\n private _expires_in: number\n\n constructor(access_token: string, refresh_token: string, expires_in: number) {\n this._access_token = access_token\n this._refresh_token = refresh_token\n this._expires_in = expires_in\n }\n\n /**\n * Lists the claims present in the access token.\n */\n get claims() {\n const fallback = {}\n if (typeof this._access_token != 'string') {\n return fallback\n }\n const [, b64payload] = this._access_token.split('.')\n const payload = base64decode(b64payload)\n if (!payload) {\n return fallback\n }\n try {\n return JSON.parse(payload)\n } catch (err) {\n return {}\n }\n }\n\n get access_token(): string {\n return this._access_token\n }\n\n get refresh_token(): string {\n return this._refresh_token\n }\n\n get expires_in(): number {\n return this._expires_in\n }\n\n get token_type(): string {\n return 'Bearer'\n }\n\n get expires_at(): Date {\n if (typeof this.claims?.exp === 'number') {\n return new Date(this.claims?.exp * 1000)\n }\n const expiryDate = new Date()\n expiryDate.setSeconds(expiryDate.getSeconds() + this._expires_in)\n return expiryDate\n }\n\n isExpired(): boolean {\n return this.expires_at && new Date().getTime() > new Date(this.expires_at).getTime()\n }\n\n async getUepId(): Promise<string> {\n const { sub, uep_id: rawUepId } = this.claims \n if (!sub) {\n throw new Error(\"Missing 'sub' claim.\")\n }\n\n if (rawUepId) {\n return rawUepId\n }\n \n return await sha1(sub)\n }\n\n toJSON(): JSONCredentials {\n return {\n access_token: this._access_token,\n refresh_token: this._refresh_token,\n expires_in: this._expires_in,\n expires_at: this.expires_at,\n token_type: this.token_type,\n }\n }\n}\n","export interface JwtPayload {\n [key: string]: any\n iss?: string | undefined\n sub?: string | undefined\n aud?: string | string[] | undefined\n exp?: number | undefined\n nbf?: number | undefined\n iat?: number | undefined\n jti?: string | undefined\n}\n\nexport function decodeToken(token: string): JwtPayload {\n if (!token) {\n throw new Error('No token provided')\n }\n const parts = token.split('.')\n\n if (parts.length !== 3) {\n throw new Error('JWT must have 3 parts')\n }\n\n const decoded = urlBase64Decode(parts[1])\n if (!decoded) {\n throw new Error('Cannot decode the token')\n }\n\n return JSON.parse(decoded)\n}\n\nfunction urlBase64Decode(str: string): string {\n let output = str.replace(/-/g, '+').replace(/_/g, '/')\n switch (output.length % 4) {\n case 0: {\n break\n }\n case 2: {\n output += '=='\n break\n }\n case 3: {\n output += '='\n break\n }\n default: {\n // TODO\n throw new Error('Illegal base64url string!')\n }\n }\n return b64DecodeUnicode(output)\n}\n\nfunction b64DecodeUnicode(str: any): any {\n return decodeURIComponent(\n Array.prototype.map\n .call(b64decode(str), (c: any) => {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)\n })\n .join('')\n )\n}\n\nexport function b64decode(str: string): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n let output: string = ''\n\n str = String(str).replace(/={1,10}$/, '')\n\n if (str.length % 4 === 1) {\n throw new Error(\"'atob' failed: The string to be decoded is not correctly encoded.\")\n }\n\n for (\n // initialize result and counters\n let bc: number = 0, bs: any, buffer: any, idx: number = 0;\n // tslint:disable-next-line:no-conditional-assignment\n (buffer = str.charAt(idx++));\n // tslint:disable-next-line:no-bitwise\n ~buffer &&\n // tslint:disable-next-line:no-conditional-assignment\n ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4)\n ? // tslint:disable-next-line:no-bitwise\n (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer)\n }\n return output\n}\nexport function b64encode(input: string, encode = true) {\n let output = ''\n let chr1, chr2, chr3, enc1, enc2, enc3, enc4\n let i = 0\n const _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n if (encode) {\n input = _utf8_encode(input)\n }\n\n while (i < input.length) {\n chr1 = input.charCodeAt(i++)\n chr2 = input.charCodeAt(i++)\n chr3 = input.charCodeAt(i++)\n\n enc1 = chr1 >> 2\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4)\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6)\n enc4 = chr3 & 63\n\n if (isNaN(chr2)) {\n enc3 = enc4 = 64\n } else if (isNaN(chr3)) {\n enc4 = 64\n }\n\n output =\n output +\n _keyStr.charAt(enc1) +\n _keyStr.charAt(enc2) +\n _keyStr.charAt(enc3) +\n _keyStr.charAt(enc4)\n }\n return output\n}\n\nexport function _utf8_encode(string: string) {\n string = string.replace(/\\r\\n/g, '\\n')\n let utftext = ''\n\n for (let n = 0; n < string.length; n++) {\n const c = string.charCodeAt(n)\n\n if (c < 128) {\n utftext += String.fromCharCode(c)\n } else if (c > 127 && c < 2048) {\n utftext += String.fromCharCode((c >> 6) | 192)\n utftext += String.fromCharCode((c & 63) | 128)\n } else {\n utftext += String.fromCharCode((c >> 12) | 224)\n utftext += String.fromCharCode(((c >> 6) & 63) | 128)\n utftext += String.fromCharCode((c & 63) | 128)\n }\n }\n return utftext\n}\n","export enum AuthenticatorEvents {\n CREDENTIALS = 'CREDENTIALS',\n ACCESS_TOKEN = 'ACCESS_TOKEN',\n JWT_PAYLOAD = 'JWT_PAYLOAD',\n STATE_CHANGE = 'STATE_CHANGE',\n ERROR = 'ERROR',\n}\n","import { Credentials } from '@dstny/scp-credentials'\n\nexport const STORE_CREDENTIALS_KEY = 'sdk-auth-credential'\nexport const STORE_REFRESH_SEPARATION_SECONDS = 'sdk-separation-seconds'\n\nexport type AuthenticatorState = boolean\n\nexport type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\nexport interface Logger {\n log(...arg: any[]): void\n error(...arg: any[]): void\n warn(...arg: any[]): void\n info(...arg: any[]): void\n debug(...arg: any[]): void\n trace(...arg: any[]): void\n\n setLevel(level: LogLevel, persist?: boolean): void\n resetLevel(): void\n}\n\nexport interface AuthenticatorOptions {\n /**\n * The authenticator library will try to use these credentials\n * when the setup method is invoked.\n *\n * This might be useful if you already have credentials available\n * and want to avoid doing the authentication procedure.\n */\n credentials?: Credentials\n /**\n * The authenticator library will use this logger instance for its\n * log statements.\n */\n logger?: Logger\n}\n\ndeclare global {\n interface Navigator {\n locks: LockManager\n }\n}\n","import { SecureStorageHandler } from '@dstny/scp-storage'\nimport { STORE_REFRESH_SEPARATION_SECONDS } from '../types'\n\nexport const getRefreshSeparationMilliseconds = async (\n storage: SecureStorageHandler\n): Promise<number> => {\n const next = parseInt((await storage.getItem(STORE_REFRESH_SEPARATION_SECONDS)) || '0') || 0\n await storage.setItem(STORE_REFRESH_SEPARATION_SECONDS, '' + ((next + 5) % 60))\n return next * 1000\n}\n\n\n","class TokenNetworkError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Network unavailable to refresh the network', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'NetworkError'\n }\n}\n\nexport default TokenNetworkError\n","/**\n * This kind of exceptions are using for reporting error cases for refresh token action such as update, request and ect.\n */\nclass RefreshTokenError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Your token or session is expired.', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'RefreshTokenError'\n }\n}\n\nexport default RefreshTokenError\n","/**\n * Use it for authorization specific errors\n * Depends on reason of exception use proper type\n */\nclass AuthorizationError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Authorization failed', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'AuthorizationError'\n }\n}\n\nexport default AuthorizationError\n","/**\n * This kind of is launched when the configured client is invalid\n */\nclass InvalidClientError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Your client is invalid.', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'InvalidClientError'\n }\n}\n\nexport default InvalidClientError\n","import Emittery from 'emittery'\n\nimport { Credentials } from '@dstny/scp-credentials'\nimport { SecureStorageHandler } from '@dstny/scp-storage'\nimport { AbstractAuthenticationApi } from './api/AbstractAuthenticationApi'\nimport { decodeToken, JwtPayload } from './utils/jwt'\nimport { AuthenticatorEvents } from './events'\nimport { AuthenticatorOptions, AuthenticatorState, Logger, STORE_CREDENTIALS_KEY } from './types'\nimport { getRefreshSeparationMilliseconds } from './utils/separation'\nimport TokenNetworkError from './errors/TokenNetworkError'\nimport RefreshTokenError from './errors/RefreshTokenError'\nimport AuthorizationError from './errors/AuthorizationError'\nimport InvalidClientError from './errors/InvalidClientError'\n\nconst INTERNAL_CREDENTIALS = 'INTERNAL_CREDENTIALS'\nconst MAX_TIMEOUT_VALUE = 2147483646\nconst REFRESH_BUFFER_MILLISECONDS = 120_000\n\ndeclare global {\n interface Navigator {\n locks: LockManager\n }\n}\n\nfunction getLockManager(): LockManager | undefined {\n if (typeof navigator === 'object') {\n const n = navigator as Navigator\n return n.locks\n }\n}\n\nclass Authenticator extends Emittery {\n private readonly api: AbstractAuthenticationApi\n private readonly secureStorage: SecureStorageHandler\n private readonly logger?: Logger\n private readonly initialCredentials?: Credentials\n\n private _state?: boolean = false\n private _credentials?: Credentials\n private _jwtPayload?: JwtPayload\n\n private isSetup: boolean = false\n private refreshTokenRunnerTimer?: any\n private refreshSeparationMilliseconds: number = 0\n private refreshTokenPromise?: Promise<Credentials>\n private removeCredentialStorageUpdates?: () => void\n private unsubscribeListenerAdded?: () => void\n private unsubscribeUpdateState?: () => void\n private timers: Map<ReturnType<typeof setTimeout>, (error: any) => void> = new Map()\n\n /**\n * In some cases we don't want to trigger the logout automatically\n * on refresh failure.\n *\n * When defined, this method will be invoked after the refresh failure\n * allowing you to define the behavior in that case.\n *\n * Example: You might not want sign out the user immediately\n * when your application is handling calls and you have ongoing calls.\n *\n * @returns {Promise<void>}\n */\n public delegateSignOutOnRefreshFailure?: () => Promise<void>\n\n public get jwtPayload(): JwtPayload | undefined {\n return this._jwtPayload\n }\n\n public get credentials(): Credentials | undefined {\n return this._credentials\n }\n\n public get state(): AuthenticatorState {\n return this._state ?? false\n }\n\n /**\n *\n * @param api\n * @param secureStorage\n * @param options\n */\n constructor(\n api: AbstractAuthenticationApi,\n secureStorage: SecureStorageHandler,\n options?: AuthenticatorOptions\n ) {\n super()\n this.api = api\n this.secureStorage = secureStorage\n this.logger = options?.logger\n this.initialCredentials = options?.credentials\n }\n\n /**\n * Starts the authenticator.\n *\n * @returns Returns either the initialCredentials or credentials stored in local storage.\n * It is usual that authenticator.signInWithCredentials is invoked with the credentials\n * returned by this method.\n */\n async setup(): Promise<Credentials | undefined> {\n let credentials\n\n if (this.initialCredentials) {\n credentials = this.initialCredentials\n } else {\n const localStorageCredentials = await this.secureStorage.getItem(STORE_CREDENTIALS_KEY)\n if (typeof localStorageCredentials === 'string') {\n credentials = Credentials.fromJSON(localStorageCredentials)\n }\n }\n\n // When loading a second instance of ConnectMe on the same browser,\n // the second instance cannot use the refresh token at the same time\n // as the first instance. In that case they will try to use the same\n // refresh_token and the instance that comes last will be returned an error.\n\n // Two mechanisms are put in place to mitigate this:\n // - The first instance to obtain the refresh token will save it to the SecureStorageHandler.\n // Other instances will be notified of the new token. When an instance recevices\n // credentials from another instance they will reset their _setupRefreshTokenRunner,\n // effectively becoming slave from the first instance.\n // - An instance separation delay is added, which separates the refresh of each instance\n // by 5 seconds. Up to 12 instance supported. 60 secs / 5 seconds delay\n this.removeCredentialStorageUpdates = Credentials.onStorageUpdate(\n this.secureStorage,\n (credentials: Credentials) => {\n this._signInWithCredentials(credentials, true)\n }\n )\n // _refreshSeparationMilliseconds is used in _setupRefreshTokenRunner\n this.refreshSeparationMilliseconds = await getRefreshSeparationMilliseconds(this.secureStorage)\n\n // Emit current credentials/access_token/jwt if they are defined when someone registers a listener\n this.unsubscribeListenerAdded = this.on(Emittery.listenerAdded, ({ listener, eventName }) => {\n if (eventName === AuthenticatorEvents.CREDENTIALS && this._credentials) {\n listener(this._credentials)\n } else if (eventName === AuthenticatorEvents.ACCESS_TOKEN && this._credentials) {\n listener(this._credentials.access_token)\n } else if (eventName === AuthenticatorEvents.JWT_PAYLOAD && this._jwtPayload) {\n listener(this._jwtPayload)\n } else if (eventName === AuthenticatorEvents.STATE_CHANGE) {\n listener(this._state)\n }\n })\n\n // Update jwt payload and state, and re-broadcast credentials update\n this.unsubscribeUpdateState = this.on(\n INTERNAL_CREDENTIALS,\n async ({ credentials, isFromOtherInstance }) => {\n if (Credentials.equals(this._credentials, credentials)) {\n return\n }\n this._credentials = credentials\n this.emit(AuthenticatorEvents.CREDENTIALS, credentials)\n if (credentials) {\n this.emit(AuthenticatorEvents.ACCESS_TOKEN, credentials.access_token)\n this._jwtPayload = decodeToken(credentials.access_token)\n this.emit(AuthenticatorEvents.JWT_PAYLOAD, this._jwtPayload)\n this._state = true\n this.emit(AuthenticatorEvents.STATE_CHANGE, this._state)\n if (isFromOtherInstance === false) {\n this.storeCredentials(credentials)\n }\n } else {\n this.emit(AuthenticatorEvents.ACCESS_TOKEN, undefined)\n this._jwtPayload = undefined\n this.emit(AuthenticatorEvents.JWT_PAYLOAD, undefined)\n this._state = false\n this.emit(AuthenticatorEvents.STATE_CHANGE, this._state)\n // Credentials are not removed from the store here as the user\n // might only be stopping the authenticator, not necessarily signin out.\n }\n }\n )\n\n this.isSetup = true\n\n return credentials\n }\n\n /**\n * Destroys the authenticator.\n * This method is called when the user signs-out.\n *\n * @returns {Promise}\n */\n async destroy(): Promise<void> {\n this.refreshTokenRunnerTimer && clearTimeout(this.refreshTokenRunnerTimer)\n\n await this.emit(INTERNAL_CREDENTIALS, { credentials: undefined, isFromOtherInstance: false })\n\n if (this.unsubscribeListenerAdded) {\n this.unsubscribeListenerAdded()\n }\n if (this.unsubscribeUpdateState) {\n this.unsubscribeUpdateState()\n }\n\n this.isSetup = false\n\n for (const [timer, reject] of this.timers.entries()) {\n clearTimeout(timer)\n reject(new Error('Authenticator is being destroyed. Wait functions are rejected.'))\n }\n this.timers.clear()\n }\n\n /**\n * Waits for the given number of milliseconds before resolving the promise.\n *\n * @param waitMilliseconds\n * @returns {Promise<void>}\n */\n private wait(waitMilliseconds: number): Promise<void> {\n try {\n this.assertIsSetup()\n } catch (err) {\n return Promise.reject(err)\n }\n return new Promise((resolve, reject) => {\n const fn = () => {\n this.timers.delete(timer)\n resolve()\n }\n const timer = setTimeout(fn, waitMilliseconds)\n this.timers.set(timer, reject)\n })\n }\n\n /**\n * Generates the login uri for OAuth authentication.\n * Supports escaux-oauth and SMG providers.\n *\n * @param {string} redirectUri - The redirect uri.\n *\n * The URL that the OAuth needs to redirect the browser to once\n * the user has authorized the request.\n *\n * @returns {Promise<string>} The authorization URI.\n *\n * The browser should be redirected to this URI.\n */\n async getLoginUrl(redirectUri: string): Promise<string> {\n this.assertIsSetup()\n const loginUrl: string = await this.api.getLoginUrl(redirectUri)\n return loginUrl\n }\n\n /**\n * Sign-in the user. Using the authorization code, an access and refresh token\n * is retrieved from the OAuth server. These are stored in an Credentials object.\n *\n * @param {string} authorizationCode - The autorization code recieved from OAuth\n * once the user has authorized the request.\n *\n * @param {string} redirectUri - The redirect uri.\n *\n * The URL that the OAuth needs to redirect the browser to once\n * the user has authorized the request.\n *\n * @returns {Promise<Credentials>} The user Crendetials\n */\n async signIn(authorizationCode: string, redirectUri: string): Promise<Credentials> {\n this.assertIsSetup()\n try {\n const credentials: Credentials = await this.api.getToken(authorizationCode, redirectUri)\n return await this._signInWithCredentials(credentials)\n } catch (error) {\n const authorizationError = new AuthorizationError(\n 'Failed to sign in with authorization code and redirect uri',\n { cause: error }\n )\n this.logger?.error(authorizationError)\n throw authorizationError\n }\n }\n\n /**\n * Signs the user out.\n *\n * @param {boolean} remote - When set to false it will not log the user out\n * from the authentication service\n *\n * @returns {Promise<void>}\n */\n async signOut(remote?: boolean, options = { exceptionOnFailure: false }): Promise<void> {\n this.assertIsSetup()\n await this.secureStorage.deleteItem(STORE_CREDENTIALS_KEY)\n if (this.removeCredentialStorageUpdates) {\n this.removeCredentialStorageUpdates()\n this.removeCredentialStorageUpdates = undefined\n }\n\n const credentials = this.credentials\n\n try {\n if (credentials && remote !== false) {\n const { refresh_token, access_token } = credentials\n await this.api.logout(refresh_token, access_token)\n } else {\n this.logger?.log('No credentials were available. No action was executed on logout.')\n }\n } catch (error) {\n const authorizationError = new AuthorizationError('Failed to sign out the user', {\n cause: error,\n })\n this.emit(AuthenticatorEvents.ERROR, authorizationError)\n this.logger?.error(authorizationError)\n if (options?.exceptionOnFailure !== false) {\n throw authorizationError\n }\n } finally {\n await this.emit(INTERNAL_CREDENTIALS, {\n credentials: undefined,\n isFromOtherInstance: false,\n })\n }\n }\n\n /**\n * On wake from sleep, we sign-in with the credentials to force the renewal of the credentials\n * if they expired during the sleep period.\n */\n public async sanityCheck(): Promise<void> {\n this.assertIsSetup()\n if (this._credentials) {\n try {\n await this._signInWithCredentials(this._credentials)\n } catch (error) {\n this.logger?.error('Failed to sign with credentials after sleep', error)\n }\n } else {\n this.logger?.info('No credentials available')\n }\n }\n\n /**\n * Indicates if there are valid credentials.\n *\n * Absent credentials or credentials which have expired are considered not valid.\n */\n public isTokenValid(): boolean {\n if (!this.credentials) {\n return false\n }\n return !this.credentials.isExpired()\n }\n\n public async signInWithCredentials(credentials: Credentials): Promise<Credentials> {\n this.assertIsSetup()\n const credentialsBackup = this._credentials\n try {\n return this._signInWithCredentials(credentials)\n } catch (error) {\n this._credentials = credentialsBackup\n throw error\n }\n }\n\n /**\n *\n * @param credentials\n * @returns {Promise<Credentials>}\n */\n private async _signInWithCredentials(\n credentials: Credentials,\n isFromOtherInstance: boolean = false\n ): Promise<Credentials> {\n this.logger?.log('signInWithCredentials')\n if (!credentials) {\n throw new Error('Invalid argument, credentials cannot be null or undefined.')\n }\n\n if (credentials?.isExpired()) {\n this._credentials = credentials\n await this.refreshTokenWithRetry()\n // _setupRefreshTokenRunner is setup in the refreshToken function\n } else {\n await this.emit(INTERNAL_CREDENTIALS, {\n credentials,\n isFromOtherInstance,\n })\n this._setupRefreshTokenRunner()\n }\n\n if (!this._credentials) {\n throw new Error('Failed to authenticate')\n }\n\n return this._credentials\n }\n\n /**\n * Sets up a timeout which will automatically refresh the token.\n *\n * The timeout is calculated based on the value of the `expires_at` property of\n * the `Credentials`, the refresh is always scheduled at 80% of the token life-time.\n *\n * When there are multiple ConnectMe instances the refresh timeout can vary\n * up to 60 seconds.\n *\n * A token will never be refreshed before at least 10 seconds.\n *\n */\n private _setupRefreshTokenRunner(): void {\n clearTimeout(this.refreshTokenRunnerTimer)\n if (!this.credentials) {\n throw new Error('Unable to start refresh token runner without credentials')\n }\n const refreshIn: number = new Date(this.credentials.expires_at).getTime() - new Date().getTime()\n const refreshTimeout: number = Math.max(\n 10_000,\n refreshIn - REFRESH_BUFFER_MILLISECONDS - this.refreshSeparationMilliseconds\n )\n this.logger?.info(\n `Setting timer to refresh token in ${Math.round(refreshTimeout / 1000)} seconds ` +\n `at ${new Date(new Date().getTime() + refreshTimeout).toTimeString()}`\n )\n this.refreshTokenRunnerTimer = setTimeout(\n async () => {\n try {\n await this.refreshToken()\n } catch (error) {\n const refreshTokenError = new RefreshTokenError(\n 'Refresh runner failed to refresh token with existing credentials',\n { cause: error }\n )\n this.emit(AuthenticatorEvents.ERROR, refreshTokenError)\n this.logger?.error(refreshTokenError)\n }\n },\n Math.min(MAX_TIMEOUT_VALUE, refreshTimeout)\n )\n }\n\n /**\n * Generate a new `access_token` and `refresh_token` using the existing `refresh_token`.\n *\n * This method ensures that no parallel requests to refreshToken are done.\n *\n * @returns {Promise<Credentials>} The new `Credentials` object.\n */\n async refreshToken(): Promise<Credentials> {\n this.assertIsSetup()\n if (this.refreshTokenPromise) {\n this.logger?.info('Refresh token already in progress: returning existing promise.')\n return await this.refreshTokenPromise\n }\n\n const lockManager = getLockManager()\n try {\n if (lockManager) {\n this.refreshTokenPromise = new Promise<Credentials>((resolve, reject) => {\n lockManager.request(\n `@dstny/scp-authenticator/refresh-token-${this.api.clientId}`,\n async () => {\n try {\n const credentials = await this._refreshToken()\n // make sure that all other tabs receive and process the local storage update\n // so that when they attempt to refresh the token, they use updated credentials\n setTimeout(() => {\n resolve(credentials)\n }, 50)\n } catch (error) {\n reject(error)\n }\n }\n )\n })\n } else {\n this.refreshTokenPromise = this._refreshToken()\n }\n return await this.refreshTokenPromise\n } finally {\n this.refreshTokenPromise = undefined\n }\n }\n\n /**\n * Attempts to refresh the credentials.\n *\n * On failure it will throw an exception.\n * This method might end up signing the user out in case the refresh token are invalid.\n * It will not sign you out in case of network issues.\n *\n * @returns\n */\n async refreshTokenWithRetry(): Promise<Credentials> {\n this.assertIsSetup()\n const MAX_DEPTH = 7\n const MAX_TIMEOUT = 30 * 1000\n for (let depth = 0; depth < MAX_DEPTH; depth++) {\n try {\n return await this.refreshToken()\n } catch (err) {\n if (depth + 1 >= MAX_DEPTH) {\n throw err\n }\n if (err instanceof TokenNetworkError) {\n await this.wait(Math.min(2 ** depth * 1000, MAX_TIMEOUT))\n } else {\n throw err\n }\n }\n }\n return await this.refreshToken()\n }\n\n /**\n * Generate a new `access_token` and `refresh_token` using the existing `refresh_token`.\n *\n * This method should only be called by `refreshToken`.\n *\n * Use `refreshToken` method if you need to refresh the token.\n *\n * @returns {Promise<Credentials>} The new `Credentials` object.\n */\n private async _refreshToken(): Promise<Credentials> {\n this.logger?.info('Starting access token refresh')\n try {\n if (!this.credentials) {\n throw new Error('Failed to refresh token. No credentials available.')\n }\n const { refresh_token, access_token } = this.credentials\n const credentials = await this.api.refreshToken(refresh_token, access_token)\n this.logger?.info('Access token refreshed successfully')\n await this.emit(INTERNAL_CREDENTIALS, {\n credentials: credentials,\n isFromOtherInstance: false,\n })\n this._setupRefreshTokenRunner()\n return credentials\n } catch (error) {\n this.logger?.error('Failed to refresh token', error)\n if (error instanceof InvalidClientError) {\n if (typeof location !== 'undefined') {\n location.reload()\n } else {\n this.logger?.warn('Location reload not supported')\n throw error\n }\n }\n if (error instanceof RefreshTokenError) {\n if (this.delegateSignOutOnRefreshFailure) {\n await this.delegateSignOutOnRefreshFailure()\n } else {\n await this.signOut(false)\n }\n }\n throw error\n }\n }\n\n /**\n * Stores the credentials in secureStorage.\n *\n * @param {Credentials} credentials - The credentials to store in the secure storage.\n */\n private async storeCredentials(credentials: Credentials): Promise<void> {\n try {\n await this.secureStorage.setItem(STORE_CREDENTIALS_KEY, JSON.stringify(credentials))\n } catch (error: any) {\n this.logger?.error('Failed to store credentials in storage', error)\n }\n }\n\n private assertIsSetup() {\n if (!this.isSetup) {\n throw new Error('Authenticator needs to be setup before it can be used.')\n }\n }\n}\n\nexport default Authenticator\n","import { Credentials } from '@dstny/scp-credentials'\nimport axios, { AxiosInstance, AxiosRequestConfig } from 'axios'\n\nexport abstract class AbstractAuthenticationApi {\n protected axiosInstance: AxiosInstance\n public abstract readonly clientId: string\n\n constructor(baseURL: string) {\n const config: AxiosRequestConfig = {\n baseURL,\n timeout: 50000,\n }\n this.axiosInstance = axios.create(config)\n }\n\n /**\n * Given a redirectUri it calculates the URL where the browser needs to be\n * redirected in other to authenticate\n *\n * @param {string} redirectUri\n * @returns {string} login url\n */\n abstract getLoginUrl(redirectUri: string): Promise<string>\n\n /**\n * Given the authorizationCode and the redirectUri this method will provide\n * credentials containing an access and refresh token\n *\n * @param {string} authorizationCode\n * @param {string} redirectUri\n * @returns {Promise<Credentials>}\n */\n abstract getToken(authorizationCode: string, redirectUri: string): Promise<Credentials>\n\n /**\n * Given a refresh token this method will provide a new set of credentials\n * containing an access token and a refresh token\n *\n * @param {string} refreshToken\n * @returns {Promise<Credentials>}\n */\n abstract refreshToken(refreshToken: string, accessToken: string): Promise<Credentials>\n\n /**\n * Given a access and refresh token, this method will logout the user from\n * the IAM\n *\n * @param {string} accessToken\n * @param {string} refreshToken\n * @returns {Promise<void>}\n */\n abstract logout(accessToken?: string, refreshToken?: string): Promise<void>\n}\n","/* eslint-disable no-async-promise-executor */\nimport { Credentials } from '@dstny/scp-credentials'\nimport { AbstractAuthenticationApi } from './AbstractAuthenticationApi'\nimport axios from 'axios'\nimport TokenNetworkError from '../errors/TokenNetworkError'\nimport RefreshTokenError from '../errors/RefreshTokenError'\nimport InvalidClientError from '../errors/InvalidClientError'\n\ntype GetTokenResponse = {\n access_token: string\n refresh_token: string\n expires_in: number\n}\n\nexport class OAuthApi extends AbstractAuthenticationApi {\n public readonly clientId: string\n public readonly scope: string\n public readonly authorizationRoute: string\n\n private readonly baseURL: string\n\n constructor(baseURL: string, clientId: string, authorizationRoute: string, scope: string) {\n super(baseURL)\n this.baseURL = baseURL\n this.clientId = clientId\n this.authorizationRoute = authorizationRoute\n this.scope = scope\n }\n\n async getLoginUrl(redirectUri: string) {\n this.axiosInstance.getUri()\n return (\n `${this.baseURL}${this.authorizationRoute}` +\n `?client_id=${encodeURIComponent(this.clientId)}` +\n '&response_type=code' +\n `&redirect_uri=${encodeURIComponent(redirectUri)}` +\n (this.scope ? `&scope=${encodeURIComponent(this.scope)}` : '')\n )\n }\n\n async getToken(authorizationCode: string, redirectUri: string): Promise<Credentials> {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n '/token',\n new URLSearchParams({\n client_id: this.clientId,\n code: authorizationCode,\n grant_type: 'authorization_code',\n redirect_uri: redirectUri,\n })\n )\n return new Credentials(data.access_token, data.refresh_token, data.expires_in)\n }\n\n async loginWithUsernamePassword(username: string, password: string): Promise<Credentials> {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n '/token',\n new URLSearchParams({\n client_id: this.clientId,\n grant_type: 'password',\n username,\n password,\n })\n )\n return new Credentials(data.access_token, data.refresh_token, data.expires_in)\n }\n\n async refreshToken(refreshToken: string, accessToken: string): Promise<Credentials> {\n try {\n const response = await this.axiosInstance.post<GetTokenResponse>(\n '/token',\n new URLSearchParams({\n client_id: this.clientId,\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n })\n )\n return new Credentials(\n response.data.access_token,\n response.data.refresh_token,\n response.data.expires_in\n )\n } catch (error) {\n if (axios.isAxiosError(error)) {\n if (error.message === 'Network Error') {\n throw new TokenNetworkError()\n }\n const statusCode = error.response?.status\n if (statusCode === 401 && error.response?.data?.error === 'unauthorized_client') {\n throw new InvalidClientError()\n }\n if (typeof statusCode === 'number' && statusCode >= 400 && statusCode < 500) {\n throw new RefreshTokenError()\n }\n }\n throw error\n }\n }\n\n async logout(_redirectUri?: string): Promise<void> {\n await this.axiosInstance.post('/logout', null, { withCredentials: true })\n }\n}\n","import { Credentials } from '@dstny/scp-credentials'\nimport { AbstractAuthenticationApi } from './AbstractAuthenticationApi'\nimport RefreshTokenError from '../errors/RefreshTokenError'\nimport TokenNetworkError from '../errors/TokenNetworkError'\nimport axios from 'axios'\nimport { decodeToken } from '../utils/jwt'\nimport InvalidClientError from '../errors/InvalidClientError'\n\ntype GetLoginUrlResponse = {\n loginUrl: string\n}\n\ntype GetTokenResponse = {\n refreshToken: string\n accessToken: string\n message: string\n status: string\n}\n\nexport class SmgAuthApi extends AbstractAuthenticationApi {\n public readonly clientId: string\n public readonly realm: string\n\n constructor(baseURL: string, realm: string, clientId: string) {\n super(baseURL)\n this.clientId = clientId\n this.realm = realm\n }\n\n async getLoginUrl(redirectUri: string) {\n const { data } = await this.axiosInstance.get<GetLoginUrlResponse>(\n `/login/getloginurl/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`\n )\n\n const baseUrl = new URL(data.loginUrl)\n // The redirect_uri provided by the SMG is inacurate, this needs to be rewritten with the actual\n // redirect uri.\n baseUrl.searchParams.set('redirect_uri', redirectUri)\n // The authentication pathname of the SMG cannot be trusted to be configured correctly.\n // Duplicate '/' characters in the authentication URL causes the authentication\n // prompt to be displayed twice. Once when coven attempts to obtain a token, and\n // again when connect me attempts to obtain a token.\n // vv\n // example: https://keycloak.development.aws.d4sp.com//auth/realms/syslab1/protocol/openid-connect/auth\n baseUrl.pathname = baseUrl.pathname.replace(/\\/\\/+/g, '/')\n\n return baseUrl.toString()\n }\n\n async getToken(authorizationCode: string, redirectUri: string): Promise<Credentials> {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n `/login/getaccesstoken/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`,\n {\n code: authorizationCode,\n redirectUri: redirectUri,\n }\n )\n const { refreshToken, accessToken } = data\n\n const { iat = 0, exp = 0 } = decodeToken(accessToken)\n const expires_in = exp - iat\n const expires_at = new Date()\n expires_at.setSeconds(expires_at.getSeconds() + expires_in)\n return new Credentials(accessToken, refreshToken, expires_in)\n }\n\n async refreshToken(refreshToken: string, accessToken: string): Promise<Credentials> {\n try {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n `/login/refreshtoken/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`,\n {\n jwt: accessToken,\n refreshToken: refreshToken,\n }\n )\n const { refreshToken: newRefreshToken, accessToken: newAccessToken } = data\n\n const { iat = 0, exp = 0 } = decodeToken(newAccessToken)\n const expires_in = exp - iat\n return new Credentials(newAccessToken, newRefreshToken, expires_in)\n } catch (error) {\n if (axios.isAxiosError(error)) {\n if (error.message === 'Network Error') {\n throw new TokenNetworkError()\n }\n const statusCode = error.response?.status\n if (statusCode === 401 && error.response?.data?.error === 'invalid_client') {\n throw new InvalidClientError()\n }\n if (typeof statusCode === 'number' && statusCode >= 400 && statusCode < 500) {\n throw new RefreshTokenError()\n }\n }\n throw error\n }\n }\n\n async logout(refreshToken: string, accessToken: string): Promise<void> {\n await this.axiosInstance.post(\n `/login/logout/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`,\n {\n jwt: accessToken,\n refreshToken: refreshToken,\n }\n )\n }\n}\n\nexport default SmgAuthApi\n"],"mappings":"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","names":["eventName","AuthenticatorEvents","credentials","axios","import_axios","axios","import_axios","axios"]}
package/dist/index.mjs CHANGED
@@ -789,6 +789,7 @@ var InvalidClientError_default = InvalidClientError;
789
789
  // src/Authenticator.ts
790
790
  var INTERNAL_CREDENTIALS = "INTERNAL_CREDENTIALS";
791
791
  var MAX_TIMEOUT_VALUE = 2147483646;
792
+ var REFRESH_BUFFER_MILLISECONDS = 12e4;
792
793
  function getLockManager() {
793
794
  if (typeof navigator === "object") {
794
795
  const n = navigator;
@@ -1118,7 +1119,10 @@ var Authenticator = class extends Emittery {
1118
1119
  throw new Error("Unable to start refresh token runner without credentials");
1119
1120
  }
1120
1121
  const refreshIn = new Date(this.credentials.expires_at).getTime() - (/* @__PURE__ */ new Date()).getTime();
1121
- const refreshTimeout = this.refreshSeparationMilliseconds + Math.max(1e4, refreshIn - 1e4);
1122
+ const refreshTimeout = Math.max(
1123
+ 1e4,
1124
+ refreshIn - REFRESH_BUFFER_MILLISECONDS - this.refreshSeparationMilliseconds
1125
+ );
1122
1126
  this.logger?.info(
1123
1127
  `Setting timer to refresh token in ${Math.round(refreshTimeout / 1e3)} seconds at ${new Date((/* @__PURE__ */ new Date()).getTime() + refreshTimeout).toTimeString()}`
1124
1128
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/emittery@1.1.0/node_modules/emittery/maps.js","../../../node_modules/.pnpm/emittery@1.1.0/node_modules/emittery/index.js","../../credentials/src/utils.ts","../../credentials/src/Credentials.ts","../src/utils/jwt.ts","../src/events.ts","../src/types.ts","../src/utils/separation.ts","../src/errors/TokenNetworkError.ts","../src/errors/RefreshTokenError.ts","../src/errors/AuthorizationError.ts","../src/errors/InvalidClientError.ts","../src/Authenticator.ts","../src/api/AbstractAuthenticationApi.ts","../src/api/OAuthApi.ts","../src/api/SmgAuthApi.ts","../src/index.ts"],"sourcesContent":["export const anyMap = new WeakMap();\nexport const eventsMap = new WeakMap();\nexport const producersMap = new WeakMap();\n","import {anyMap, producersMap, eventsMap} from './maps.js';\n\nconst anyProducer = Symbol('anyProducer');\nconst resolvedPromise = Promise.resolve();\n\n// Define symbols for \"meta\" events.\nconst listenerAdded = Symbol('listenerAdded');\nconst listenerRemoved = Symbol('listenerRemoved');\n\nlet canEmitMetaEvents = false;\nlet isGlobalDebugEnabled = false;\n\nconst isEventKeyType = key => typeof key === 'string' || typeof key === 'symbol' || typeof key === 'number';\n\nfunction assertEventName(eventName) {\n\tif (!isEventKeyType(eventName)) {\n\t\tthrow new TypeError('`eventName` must be a string, symbol, or number');\n\t}\n}\n\nfunction assertListener(listener) {\n\tif (typeof listener !== 'function') {\n\t\tthrow new TypeError('listener must be a function');\n\t}\n}\n\nfunction getListeners(instance, eventName) {\n\tconst events = eventsMap.get(instance);\n\tif (!events.has(eventName)) {\n\t\treturn;\n\t}\n\n\treturn events.get(eventName);\n}\n\nfunction getEventProducers(instance, eventName) {\n\tconst key = isEventKeyType(eventName) ? eventName : anyProducer;\n\tconst producers = producersMap.get(instance);\n\tif (!producers.has(key)) {\n\t\treturn;\n\t}\n\n\treturn producers.get(key);\n}\n\nfunction enqueueProducers(instance, eventName, eventData) {\n\tconst producers = producersMap.get(instance);\n\tif (producers.has(eventName)) {\n\t\tfor (const producer of producers.get(eventName)) {\n\t\t\tproducer.enqueue(eventData);\n\t\t}\n\t}\n\n\tif (producers.has(anyProducer)) {\n\t\tconst item = Promise.all([eventName, eventData]);\n\t\tfor (const producer of producers.get(anyProducer)) {\n\t\t\tproducer.enqueue(item);\n\t\t}\n\t}\n}\n\nfunction iterator(instance, eventNames) {\n\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\n\tlet isFinished = false;\n\tlet flush = () => {};\n\tlet queue = [];\n\n\tconst producer = {\n\t\tenqueue(item) {\n\t\t\tqueue.push(item);\n\t\t\tflush();\n\t\t},\n\t\tfinish() {\n\t\t\tisFinished = true;\n\t\t\tflush();\n\t\t},\n\t};\n\n\tfor (const eventName of eventNames) {\n\t\tlet set = getEventProducers(instance, eventName);\n\t\tif (!set) {\n\t\t\tset = new Set();\n\t\t\tconst producers = producersMap.get(instance);\n\t\t\tproducers.set(eventName, set);\n\t\t}\n\n\t\tset.add(producer);\n\t}\n\n\treturn {\n\t\tasync next() {\n\t\t\tif (!queue) {\n\t\t\t\treturn {done: true};\n\t\t\t}\n\n\t\t\tif (queue.length === 0) {\n\t\t\t\tif (isFinished) {\n\t\t\t\t\tqueue = undefined;\n\t\t\t\t\treturn this.next();\n\t\t\t\t}\n\n\t\t\t\tawait new Promise(resolve => {\n\t\t\t\t\tflush = resolve;\n\t\t\t\t});\n\n\t\t\t\treturn this.next();\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdone: false,\n\t\t\t\tvalue: await queue.shift(),\n\t\t\t};\n\t\t},\n\n\t\tasync return(value) {\n\t\t\tqueue = undefined;\n\n\t\t\tfor (const eventName of eventNames) {\n\t\t\t\tconst set = getEventProducers(instance, eventName);\n\t\t\t\tif (set) {\n\t\t\t\t\tset.delete(producer);\n\t\t\t\t\tif (set.size === 0) {\n\t\t\t\t\t\tconst producers = producersMap.get(instance);\n\t\t\t\t\t\tproducers.delete(eventName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tflush();\n\n\t\t\treturn arguments.length > 0\n\t\t\t\t? {done: true, value: await value}\n\t\t\t\t: {done: true};\n\t\t},\n\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn this;\n\t\t},\n\t};\n}\n\nfunction defaultMethodNamesOrAssert(methodNames) {\n\tif (methodNames === undefined) {\n\t\treturn allEmitteryMethods;\n\t}\n\n\tif (!Array.isArray(methodNames)) {\n\t\tthrow new TypeError('`methodNames` must be an array of strings');\n\t}\n\n\tfor (const methodName of methodNames) {\n\t\tif (!allEmitteryMethods.includes(methodName)) {\n\t\t\tif (typeof methodName !== 'string') {\n\t\t\t\tthrow new TypeError('`methodNames` element must be a string');\n\t\t\t}\n\n\t\t\tthrow new Error(`${methodName} is not Emittery method`);\n\t\t}\n\t}\n\n\treturn methodNames;\n}\n\nconst isMetaEvent = eventName => eventName === listenerAdded || eventName === listenerRemoved;\n\nfunction emitMetaEvent(emitter, eventName, eventData) {\n\tif (!isMetaEvent(eventName)) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tcanEmitMetaEvents = true;\n\t\temitter.emit(eventName, eventData);\n\t} finally {\n\t\tcanEmitMetaEvents = false;\n\t}\n}\n\nexport default class Emittery {\n\tstatic mixin(emitteryPropertyName, methodNames) {\n\t\tmethodNames = defaultMethodNamesOrAssert(methodNames);\n\t\treturn target => {\n\t\t\tif (typeof target !== 'function') {\n\t\t\t\tthrow new TypeError('`target` must be function');\n\t\t\t}\n\n\t\t\tfor (const methodName of methodNames) {\n\t\t\t\tif (target.prototype[methodName] !== undefined) {\n\t\t\t\t\tthrow new Error(`The property \\`${methodName}\\` already exists on \\`target\\``);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction getEmitteryProperty() {\n\t\t\t\tObject.defineProperty(this, emitteryPropertyName, {\n\t\t\t\t\tenumerable: false,\n\t\t\t\t\tvalue: new Emittery(),\n\t\t\t\t});\n\t\t\t\treturn this[emitteryPropertyName];\n\t\t\t}\n\n\t\t\tObject.defineProperty(target.prototype, emitteryPropertyName, {\n\t\t\t\tenumerable: false,\n\t\t\t\tget: getEmitteryProperty,\n\t\t\t});\n\n\t\t\tconst emitteryMethodCaller = methodName => function (...args) {\n\t\t\t\treturn this[emitteryPropertyName][methodName](...args);\n\t\t\t};\n\n\t\t\tfor (const methodName of methodNames) {\n\t\t\t\tObject.defineProperty(target.prototype, methodName, {\n\t\t\t\t\tenumerable: false,\n\t\t\t\t\tvalue: emitteryMethodCaller(methodName),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn target;\n\t\t};\n\t}\n\n\tstatic get isDebugEnabled() {\n\t\t// In a browser environment, `globalThis.process` can potentially reference a DOM Element with a `#process` ID,\n\t\t// so instead of just type checking `globalThis.process`, we need to make sure that `globalThis.process.env` exists.\n\t\t// eslint-disable-next-line n/prefer-global/process\n\t\tif (typeof globalThis.process?.env !== 'object') {\n\t\t\treturn isGlobalDebugEnabled;\n\t\t}\n\n\t\t// eslint-disable-next-line n/prefer-global/process\n\t\tconst {env} = globalThis.process ?? {env: {}};\n\t\treturn env.DEBUG === 'emittery' || env.DEBUG === '*' || isGlobalDebugEnabled;\n\t}\n\n\tstatic set isDebugEnabled(newValue) {\n\t\tisGlobalDebugEnabled = newValue;\n\t}\n\n\tconstructor(options = {}) {\n\t\tanyMap.set(this, new Set());\n\t\teventsMap.set(this, new Map());\n\t\tproducersMap.set(this, new Map());\n\n\t\tproducersMap.get(this).set(anyProducer, new Set());\n\n\t\tthis.debug = options.debug ?? {};\n\n\t\tif (this.debug.enabled === undefined) {\n\t\t\tthis.debug.enabled = false;\n\t\t}\n\n\t\tif (!this.debug.logger) {\n\t\t\tthis.debug.logger = (type, debugName, eventName, eventData) => {\n\t\t\t\ttry {\n\t\t\t\t\t// TODO: Use https://github.com/sindresorhus/safe-stringify when the package is more mature. Just copy-paste the code.\n\t\t\t\t\teventData = JSON.stringify(eventData);\n\t\t\t\t} catch {\n\t\t\t\t\teventData = `Object with the following keys failed to stringify: ${Object.keys(eventData).join(',')}`;\n\t\t\t\t}\n\n\t\t\t\tif (typeof eventName === 'symbol' || typeof eventName === 'number') {\n\t\t\t\t\teventName = eventName.toString();\n\t\t\t\t}\n\n\t\t\t\tconst currentTime = new Date();\n\t\t\t\tconst logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`;\n\t\t\t\tconsole.log(`[${logTime}][emittery:${type}][${debugName}] Event Name: ${eventName}\\n\\tdata: ${eventData}`);\n\t\t\t};\n\t\t}\n\t}\n\n\tlogIfDebugEnabled(type, eventName, eventData) {\n\t\tif (Emittery.isDebugEnabled || this.debug.enabled) {\n\t\t\tthis.debug.logger(type, this.debug.name, eventName, eventData);\n\t\t}\n\t}\n\n\ton(eventNames, listener, {signal} = {}) {\n\t\tassertListener(listener);\n\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tfor (const eventName of eventNames) {\n\t\t\tassertEventName(eventName);\n\t\t\tlet set = getListeners(this, eventName);\n\t\t\tif (!set) {\n\t\t\t\tset = new Set();\n\t\t\t\tconst events = eventsMap.get(this);\n\t\t\t\tevents.set(eventName, set);\n\t\t\t}\n\n\t\t\tset.add(listener);\n\n\t\t\tthis.logIfDebugEnabled('subscribe', eventName, undefined);\n\n\t\t\tif (!isMetaEvent(eventName)) {\n\t\t\t\temitMetaEvent(this, listenerAdded, {eventName, listener});\n\t\t\t}\n\t\t}\n\n\t\tconst off = () => {\n\t\t\tthis.off(eventNames, listener);\n\t\t\tsignal?.removeEventListener('abort', off);\n\t\t};\n\n\t\tsignal?.addEventListener('abort', off, {once: true});\n\n\t\tif (signal?.aborted) {\n\t\t\toff();\n\t\t}\n\n\t\treturn off;\n\t}\n\n\toff(eventNames, listener) {\n\t\tassertListener(listener);\n\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tfor (const eventName of eventNames) {\n\t\t\tassertEventName(eventName);\n\t\t\tconst set = getListeners(this, eventName);\n\t\t\tif (set) {\n\t\t\t\tset.delete(listener);\n\t\t\t\tif (set.size === 0) {\n\t\t\t\t\tconst events = eventsMap.get(this);\n\t\t\t\t\tevents.delete(eventName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.logIfDebugEnabled('unsubscribe', eventName, undefined);\n\n\t\t\tif (!isMetaEvent(eventName)) {\n\t\t\t\temitMetaEvent(this, listenerRemoved, {eventName, listener});\n\t\t\t}\n\t\t}\n\t}\n\n\tonce(eventNames) {\n\t\tlet off_;\n\n\t\tconst promise = new Promise(resolve => {\n\t\t\toff_ = this.on(eventNames, data => {\n\t\t\t\toff_();\n\t\t\t\tresolve(data);\n\t\t\t});\n\t\t});\n\n\t\tpromise.off = off_;\n\t\treturn promise;\n\t}\n\n\tevents(eventNames) {\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tfor (const eventName of eventNames) {\n\t\t\tassertEventName(eventName);\n\t\t}\n\n\t\treturn iterator(this, eventNames);\n\t}\n\n\tasync emit(eventName, eventData) {\n\t\tassertEventName(eventName);\n\n\t\tif (isMetaEvent(eventName) && !canEmitMetaEvents) {\n\t\t\tthrow new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`');\n\t\t}\n\n\t\tthis.logIfDebugEnabled('emit', eventName, eventData);\n\n\t\tenqueueProducers(this, eventName, eventData);\n\n\t\tconst listeners = getListeners(this, eventName) ?? new Set();\n\t\tconst anyListeners = anyMap.get(this);\n\t\tconst staticListeners = [...listeners];\n\t\tconst staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];\n\n\t\tawait resolvedPromise;\n\t\tawait Promise.all([\n\t\t\t...staticListeners.map(async listener => {\n\t\t\t\tif (listeners.has(listener)) {\n\t\t\t\t\treturn listener(eventData);\n\t\t\t\t}\n\t\t\t}),\n\t\t\t...staticAnyListeners.map(async listener => {\n\t\t\t\tif (anyListeners.has(listener)) {\n\t\t\t\t\treturn listener(eventName, eventData);\n\t\t\t\t}\n\t\t\t}),\n\t\t]);\n\t}\n\n\tasync emitSerial(eventName, eventData) {\n\t\tassertEventName(eventName);\n\n\t\tif (isMetaEvent(eventName) && !canEmitMetaEvents) {\n\t\t\tthrow new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`');\n\t\t}\n\n\t\tthis.logIfDebugEnabled('emitSerial', eventName, eventData);\n\n\t\tconst listeners = getListeners(this, eventName) ?? new Set();\n\t\tconst anyListeners = anyMap.get(this);\n\t\tconst staticListeners = [...listeners];\n\t\tconst staticAnyListeners = [...anyListeners];\n\n\t\tawait resolvedPromise;\n\t\t/* eslint-disable no-await-in-loop */\n\t\tfor (const listener of staticListeners) {\n\t\t\tif (listeners.has(listener)) {\n\t\t\t\tawait listener(eventData);\n\t\t\t}\n\t\t}\n\n\t\tfor (const listener of staticAnyListeners) {\n\t\t\tif (anyListeners.has(listener)) {\n\t\t\t\tawait listener(eventName, eventData);\n\t\t\t}\n\t\t}\n\t\t/* eslint-enable no-await-in-loop */\n\t}\n\n\tonAny(listener, {signal} = {}) {\n\t\tassertListener(listener);\n\n\t\tthis.logIfDebugEnabled('subscribeAny', undefined, undefined);\n\n\t\tanyMap.get(this).add(listener);\n\t\temitMetaEvent(this, listenerAdded, {listener});\n\n\t\tconst offAny = () => {\n\t\t\tthis.offAny(listener);\n\t\t\tsignal?.removeEventListener('abort', offAny);\n\t\t};\n\n\t\tsignal?.addEventListener('abort', offAny, {once: true});\n\n\t\tif (signal?.aborted) {\n\t\t\toffAny();\n\t\t}\n\n\t\treturn offAny;\n\t}\n\n\tanyEvent() {\n\t\treturn iterator(this);\n\t}\n\n\toffAny(listener) {\n\t\tassertListener(listener);\n\n\t\tthis.logIfDebugEnabled('unsubscribeAny', undefined, undefined);\n\n\t\temitMetaEvent(this, listenerRemoved, {listener});\n\t\tanyMap.get(this).delete(listener);\n\t}\n\n\tclearListeners(eventNames) {\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\n\t\tfor (const eventName of eventNames) {\n\t\t\tthis.logIfDebugEnabled('clear', eventName, undefined);\n\n\t\t\tif (isEventKeyType(eventName)) {\n\t\t\t\tconst set = getListeners(this, eventName);\n\t\t\t\tif (set) {\n\t\t\t\t\tset.clear();\n\t\t\t\t}\n\n\t\t\t\tconst producers = getEventProducers(this, eventName);\n\t\t\t\tif (producers) {\n\t\t\t\t\tfor (const producer of producers) {\n\t\t\t\t\t\tproducer.finish();\n\t\t\t\t\t}\n\n\t\t\t\t\tproducers.clear();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tanyMap.get(this).clear();\n\n\t\t\t\tfor (const [eventName, listeners] of eventsMap.get(this).entries()) {\n\t\t\t\t\tlisteners.clear();\n\t\t\t\t\teventsMap.get(this).delete(eventName);\n\t\t\t\t}\n\n\t\t\t\tfor (const [eventName, producers] of producersMap.get(this).entries()) {\n\t\t\t\t\tfor (const producer of producers) {\n\t\t\t\t\t\tproducer.finish();\n\t\t\t\t\t}\n\n\t\t\t\t\tproducers.clear();\n\t\t\t\t\tproducersMap.get(this).delete(eventName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlistenerCount(eventNames) {\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tlet count = 0;\n\n\t\tfor (const eventName of eventNames) {\n\t\t\tif (isEventKeyType(eventName)) {\n\t\t\t\tcount += anyMap.get(this).size\n\t\t\t\t\t+ (getListeners(this, eventName)?.size ?? 0)\n\t\t\t\t\t+ (getEventProducers(this, eventName)?.size ?? 0)\n\t\t\t\t\t+ (getEventProducers(this)?.size ?? 0);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (eventName !== undefined) {\n\t\t\t\tassertEventName(eventName);\n\t\t\t}\n\n\t\t\tcount += anyMap.get(this).size;\n\n\t\t\tfor (const value of eventsMap.get(this).values()) {\n\t\t\t\tcount += value.size;\n\t\t\t}\n\n\t\t\tfor (const value of producersMap.get(this).values()) {\n\t\t\t\tcount += value.size;\n\t\t\t}\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tbindMethods(target, methodNames) {\n\t\tif (typeof target !== 'object' || target === null) {\n\t\t\tthrow new TypeError('`target` must be an object');\n\t\t}\n\n\t\tmethodNames = defaultMethodNamesOrAssert(methodNames);\n\n\t\tfor (const methodName of methodNames) {\n\t\t\tif (target[methodName] !== undefined) {\n\t\t\t\tthrow new Error(`The property \\`${methodName}\\` already exists on \\`target\\``);\n\t\t\t}\n\n\t\t\tObject.defineProperty(target, methodName, {\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: this[methodName].bind(this),\n\t\t\t});\n\t\t}\n\t}\n}\n\nconst allEmitteryMethods = Object.getOwnPropertyNames(Emittery.prototype).filter(v => v !== 'constructor');\n\nObject.defineProperty(Emittery, 'listenerAdded', {\n\tvalue: listenerAdded,\n\twritable: false,\n\tenumerable: true,\n\tconfigurable: false,\n});\nObject.defineProperty(Emittery, 'listenerRemoved', {\n\tvalue: listenerRemoved,\n\twritable: false,\n\tenumerable: true,\n\tconfigurable: false,\n});\n","// declare const Buffer\n\nfunction byteToPercent(b: string) {\n return `%${`00${b.charCodeAt(0).toString(16)}`.slice(-2)}`\n}\n\nexport function base64decode(str: string): string | undefined {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n let output: string = ''\n\n str = String(str).replace(/={1,10}$/, '')\n\n if (str.length % 4 === 1) {\n throw new Error(\"'atob' failed: The string to be decoded is not correctly encoded.\")\n }\n\n for (\n // initialize result and counters\n let bc: number = 0, bs: any, buffer: any, idx: number = 0;\n // tslint:disable-next-line:no-conditional-assignment\n (buffer = str.charAt(idx++));\n // tslint:disable-next-line:no-bitwise\n ~buffer &&\n // tslint:disable-next-line:no-conditional-assignment\n ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4)\n ? // tslint:disable-next-line:no-bitwise\n (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer)\n }\n return output\n}\n\nexport async function sha1(str: string) {\n if (typeof crypto === 'object') {\n const hash = await crypto.subtle.digest('SHA-1', new TextEncoder().encode(str))\n return Array.from(new Uint8Array(hash))\n .map((v) => v.toString(16).padStart(2, '0'))\n .join('')\n } else {\n return binb2hex(core_sha1(str2binb(str), str.length * chrsz))\n }\n}\n\nconst hexcase = 0 /* hex output format. 0 - lowercase; 1 - uppercase */\nconst b64pad = '' /* base-64 pad character. \"=\" for strict RFC compliance */\nconst chrsz = 8 /* bits per input character. 8 - ASCII; 16 - Unicode */\n\n/*\n * Calculate the SHA-1 of an array of big-endian words, and a bit length\n */\nfunction core_sha1(x: Array<number>, len: number) {\n /* append padding */\n x[len >> 5] |= 0x80 << (24 - (len % 32))\n x[(((len + 64) >> 9) << 4) + 15] = len\n\n var w = Array(80)\n var a = 1732584193\n var b = -271733879\n var c = -1732584194\n var d = 271733878\n var e = -1009589776\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a\n var oldb = b\n var oldc = c\n var oldd = d\n var olde = e\n\n for (var j = 0; j < 80; j++) {\n if (j < 16) w[j] = x[i + j]\n else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1)\n var t = safe_add(\n safe_add(rol(a, 5), sha1_ft(j, b, c, d)),\n safe_add(safe_add(e, w[j]), sha1_kt(j))\n )\n e = d\n d = c\n c = rol(b, 30)\n b = a\n a = t\n }\n\n a = safe_add(a, olda)\n b = safe_add(b, oldb)\n c = safe_add(c, oldc)\n d = safe_add(d, oldd)\n e = safe_add(e, olde)\n }\n return Array(a, b, c, d, e)\n}\n\n/*\n * Perform the appropriate triplet combination function for the current\n * iteration\n */\nfunction sha1_ft(t: number, b: number, c: number, d: number) {\n if (t < 20) return (b & c) | (~b & d)\n if (t < 40) return b ^ c ^ d\n if (t < 60) return (b & c) | (b & d) | (c & d)\n return b ^ c ^ d\n}\n\n/*\n * Determine the appropriate additive constant for the current iteration\n */\nfunction sha1_kt(t: number) {\n return t < 20 ? 1518500249 : t < 40 ? 1859775393 : t < 60 ? -1894007588 : -899497514\n}\n\n/*\n * Calculate the HMAC-SHA1 of a key and some data\n */\nfunction core_hmac_sha1(key: string, data: string) {\n let bkey = str2binb(key)\n if (bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz)\n\n let ipad = Array(16),\n opad = Array(16)\n for (let i = 0; i < 16; i++) {\n ipad[i] = bkey[i] ^ 0x36363636\n opad[i] = bkey[i] ^ 0x5c5c5c5c\n }\n\n let hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz)\n return core_sha1(opad.concat(hash), 512 + 160)\n}\n\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\nfunction safe_add(x: number, y: number) {\n const lsw = (x & 0xffff) + (y & 0xffff)\n const msw = (x >> 16) + (y >> 16) + (lsw >> 16)\n return (msw << 16) | (lsw & 0xffff)\n}\n\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\nfunction rol(num: number, cnt: number) {\n return (num << cnt) | (num >>> (32 - cnt))\n}\n\n/*\n * Convert an 8-bit or 16-bit string to an array of big-endian words\n * In 8-bit function, characters >255 have their hi-byte silently ignored.\n */\nfunction str2binb(str: string): Array<number> {\n const bin: Array<number> = []\n const mask = (1 << chrsz) - 1\n for (let i = 0; i < str.length * chrsz; i += chrsz)\n bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - (i % 32))\n return bin\n}\n\n/*\n * Convert an array of big-endian words to a string\n */\nfunction binb2str(bin: Array<number>): string {\n let str = ''\n let mask = (1 << chrsz) - 1\n for (let i = 0; i < bin.length * 32; i += chrsz)\n str += String.fromCharCode((bin[i >> 5] >>> (32 - chrsz - (i % 32))) & mask)\n return str\n}\n\n/*\n * Convert an array of big-endian words to a hex string.\n */\nfunction binb2hex(binarray: Array<number>) {\n let hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef'\n let str = ''\n for (let i = 0; i < binarray.length * 4; i++) {\n str +=\n hex_tab.charAt((binarray[i >> 2] >> ((3 - (i % 4)) * 8 + 4)) & 0xf) +\n hex_tab.charAt((binarray[i >> 2] >> ((3 - (i % 4)) * 8)) & 0xf)\n }\n return str\n}\n\n/*\n * Convert an array of big-endian words to a base-64 string\n */\nfunction binb2b64(binarray: Array<number>) {\n let tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n let str = ''\n for (let i = 0; i < binarray.length * 4; i += 3) {\n let triplet =\n (((binarray[i >> 2] >> (8 * (3 - (i % 4)))) & 0xff) << 16) |\n (((binarray[(i + 1) >> 2] >> (8 * (3 - ((i + 1) % 4)))) & 0xff) << 8) |\n ((binarray[(i + 2) >> 2] >> (8 * (3 - ((i + 2) % 4)))) & 0xff)\n for (let j = 0; j < 4; j++) {\n if (i * 8 + j * 6 > binarray.length * 32) str += b64pad\n else str += tab.charAt((triplet >> (6 * (3 - j))) & 0x3f)\n }\n }\n return str\n}\n","import { base64decode, sha1 } from './utils'\nimport { SecureStorageHandler } from '@dstny/scp-storage'\n\nexport const STORE_CREDENTILAS_KEY = 'sdk-auth-credential'\n\ntype CredentialsCallback = (callback: Credentials) => void\ntype JSONCredentials = {\n access_token: string\n refresh_token: string\n expires_in: number\n expires_at: Date\n token_type: 'Bearer' | string\n}\n\nexport default class Credentials {\n static async fromStorage(storage: SecureStorageHandler): Promise<Credentials> {\n const str: string | null = await storage.getItem(STORE_CREDENTILAS_KEY)\n if (str == null || str == undefined) {\n throw new Error('No credentials found in storage.')\n }\n return Credentials.fromJSON(str)\n }\n\n static async toStorage(storage: SecureStorageHandler, credentials: Credentials): Promise<void> {\n await storage.setItem(STORE_CREDENTILAS_KEY, JSON.stringify(credentials))\n }\n\n static async clearFromStorage(storage: SecureStorageHandler): Promise<void> {\n await storage.deleteItem(STORE_CREDENTILAS_KEY)\n }\n\n static fromJSON(str: string): Credentials {\n const { access_token, refresh_token, expires_in } = JSON.parse(str)\n return new Credentials(access_token, refresh_token, expires_in)\n }\n\n static onStorageUpdate(storage: SecureStorageHandler, callback: CredentialsCallback): () => void {\n return storage.on(STORE_CREDENTILAS_KEY, (credentials: string | null) => {\n if (typeof credentials === 'string') {\n callback(Credentials.fromJSON(credentials))\n }\n })\n }\n\n static equals(a?: Credentials, b?: Credentials) {\n if (!a && !b) {\n return true\n }\n if ((a && !b) || (b && !a)) {\n return false\n }\n return (\n a?.access_token === b?.access_token &&\n a?._refresh_token === b?.refresh_token &&\n a?.expires_in === b?.expires_in\n )\n }\n\n /**\n * Used to access resources.\n */\n private _access_token: string\n /**\n * Used to obtain a new access token.\n */\n private _refresh_token: string\n /**\n * Number of seconds until the access token expires.\n * This value is calculated at the moment the access token is generated.\n */\n private _expires_in: number\n\n constructor(access_token: string, refresh_token: string, expires_in: number) {\n this._access_token = access_token\n this._refresh_token = refresh_token\n this._expires_in = expires_in\n }\n\n /**\n * Lists the claims present in the access token.\n */\n get claims() {\n const fallback = {}\n if (typeof this._access_token != 'string') {\n return fallback\n }\n const [, b64payload] = this._access_token.split('.')\n const payload = base64decode(b64payload)\n if (!payload) {\n return fallback\n }\n try {\n return JSON.parse(payload)\n } catch (err) {\n return {}\n }\n }\n\n get access_token(): string {\n return this._access_token\n }\n\n get refresh_token(): string {\n return this._refresh_token\n }\n\n get expires_in(): number {\n return this._expires_in\n }\n\n get token_type(): string {\n return 'Bearer'\n }\n\n get expires_at(): Date {\n if (typeof this.claims?.exp === 'number') {\n return new Date(this.claims?.exp * 1000)\n }\n const expiryDate = new Date()\n expiryDate.setSeconds(expiryDate.getSeconds() + this._expires_in)\n return expiryDate\n }\n\n isExpired(): boolean {\n return this.expires_at && new Date().getTime() > new Date(this.expires_at).getTime()\n }\n\n async getUepId(): Promise<string> {\n const { sub, uep_id: rawUepId } = this.claims \n if (!sub) {\n throw new Error(\"Missing 'sub' claim.\")\n }\n\n if (rawUepId) {\n return rawUepId\n }\n \n return await sha1(sub)\n }\n\n toJSON(): JSONCredentials {\n return {\n access_token: this._access_token,\n refresh_token: this._refresh_token,\n expires_in: this._expires_in,\n expires_at: this.expires_at,\n token_type: this.token_type,\n }\n }\n}\n","export interface JwtPayload {\n [key: string]: any\n iss?: string | undefined\n sub?: string | undefined\n aud?: string | string[] | undefined\n exp?: number | undefined\n nbf?: number | undefined\n iat?: number | undefined\n jti?: string | undefined\n}\n\nexport function decodeToken(token: string): JwtPayload {\n if (!token) {\n throw new Error('No token provided')\n }\n const parts = token.split('.')\n\n if (parts.length !== 3) {\n throw new Error('JWT must have 3 parts')\n }\n\n const decoded = urlBase64Decode(parts[1])\n if (!decoded) {\n throw new Error('Cannot decode the token')\n }\n\n return JSON.parse(decoded)\n}\n\nfunction urlBase64Decode(str: string): string {\n let output = str.replace(/-/g, '+').replace(/_/g, '/')\n switch (output.length % 4) {\n case 0: {\n break\n }\n case 2: {\n output += '=='\n break\n }\n case 3: {\n output += '='\n break\n }\n default: {\n // TODO\n throw new Error('Illegal base64url string!')\n }\n }\n return b64DecodeUnicode(output)\n}\n\nfunction b64DecodeUnicode(str: any): any {\n return decodeURIComponent(\n Array.prototype.map\n .call(b64decode(str), (c: any) => {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)\n })\n .join('')\n )\n}\n\nexport function b64decode(str: string): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n let output: string = ''\n\n str = String(str).replace(/={1,10}$/, '')\n\n if (str.length % 4 === 1) {\n throw new Error(\"'atob' failed: The string to be decoded is not correctly encoded.\")\n }\n\n for (\n // initialize result and counters\n let bc: number = 0, bs: any, buffer: any, idx: number = 0;\n // tslint:disable-next-line:no-conditional-assignment\n (buffer = str.charAt(idx++));\n // tslint:disable-next-line:no-bitwise\n ~buffer &&\n // tslint:disable-next-line:no-conditional-assignment\n ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4)\n ? // tslint:disable-next-line:no-bitwise\n (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer)\n }\n return output\n}\nexport function b64encode(input: string, encode = true) {\n let output = ''\n let chr1, chr2, chr3, enc1, enc2, enc3, enc4\n let i = 0\n const _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n if (encode) {\n input = _utf8_encode(input)\n }\n\n while (i < input.length) {\n chr1 = input.charCodeAt(i++)\n chr2 = input.charCodeAt(i++)\n chr3 = input.charCodeAt(i++)\n\n enc1 = chr1 >> 2\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4)\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6)\n enc4 = chr3 & 63\n\n if (isNaN(chr2)) {\n enc3 = enc4 = 64\n } else if (isNaN(chr3)) {\n enc4 = 64\n }\n\n output =\n output +\n _keyStr.charAt(enc1) +\n _keyStr.charAt(enc2) +\n _keyStr.charAt(enc3) +\n _keyStr.charAt(enc4)\n }\n return output\n}\n\nexport function _utf8_encode(string: string) {\n string = string.replace(/\\r\\n/g, '\\n')\n let utftext = ''\n\n for (let n = 0; n < string.length; n++) {\n const c = string.charCodeAt(n)\n\n if (c < 128) {\n utftext += String.fromCharCode(c)\n } else if (c > 127 && c < 2048) {\n utftext += String.fromCharCode((c >> 6) | 192)\n utftext += String.fromCharCode((c & 63) | 128)\n } else {\n utftext += String.fromCharCode((c >> 12) | 224)\n utftext += String.fromCharCode(((c >> 6) & 63) | 128)\n utftext += String.fromCharCode((c & 63) | 128)\n }\n }\n return utftext\n}\n","export enum AuthenticatorEvents {\n CREDENTIALS = 'CREDENTIALS',\n ACCESS_TOKEN = 'ACCESS_TOKEN',\n JWT_PAYLOAD = 'JWT_PAYLOAD',\n STATE_CHANGE = 'STATE_CHANGE',\n ERROR = 'ERROR',\n}\n","import { Credentials } from '@dstny/scp-credentials'\n\nexport const STORE_CREDENTIALS_KEY = 'sdk-auth-credential'\nexport const STORE_REFRESH_SEPARATION_SECONDS = 'sdk-separation-seconds'\n\nexport type AuthenticatorState = boolean\n\nexport type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\nexport interface Logger {\n log(...arg: any[]): void\n error(...arg: any[]): void\n warn(...arg: any[]): void\n info(...arg: any[]): void\n debug(...arg: any[]): void\n trace(...arg: any[]): void\n\n setLevel(level: LogLevel, persist?: boolean): void\n resetLevel(): void\n}\n\nexport interface AuthenticatorOptions {\n /**\n * The authenticator library will try to use these credentials\n * when the setup method is invoked.\n *\n * This might be useful if you already have credentials available\n * and want to avoid doing the authentication procedure.\n */\n credentials?: Credentials\n /**\n * The authenticator library will use this logger instance for its\n * log statements.\n */\n logger?: Logger\n}\n\ndeclare global {\n interface Navigator {\n locks: LockManager\n }\n}\n","import { SecureStorageHandler } from '@dstny/scp-storage'\nimport { STORE_REFRESH_SEPARATION_SECONDS } from '../types'\n\nexport const getRefreshSeparationMilliseconds = async (\n storage: SecureStorageHandler\n): Promise<number> => {\n const next = parseInt((await storage.getItem(STORE_REFRESH_SEPARATION_SECONDS)) || '0') || 0\n await storage.setItem(STORE_REFRESH_SEPARATION_SECONDS, '' + ((next + 5) % 60))\n return next * 1000\n}\n\n\n","class TokenNetworkError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Network unavailable to refresh the network', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'NetworkError'\n }\n}\n\nexport default TokenNetworkError\n","/**\n * This kind of exceptions are using for reporting error cases for refresh token action such as update, request and ect.\n */\nclass RefreshTokenError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Your token or session is expired.', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'RefreshTokenError'\n }\n}\n\nexport default RefreshTokenError\n","/**\n * Use it for authorization specific errors\n * Depends on reason of exception use proper type\n */\nclass AuthorizationError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Authorization failed', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'AuthorizationError'\n }\n}\n\nexport default AuthorizationError\n","/**\n * This kind of is launched when the configured client is invalid\n */\nclass InvalidClientError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Your client is invalid.', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'InvalidClientError'\n }\n}\n\nexport default InvalidClientError\n","import Emittery from 'emittery'\n\nimport { Credentials } from '@dstny/scp-credentials'\nimport { SecureStorageHandler } from '@dstny/scp-storage'\nimport { AbstractAuthenticationApi } from './api/AbstractAuthenticationApi'\nimport { decodeToken, JwtPayload } from './utils/jwt'\nimport { AuthenticatorEvents } from './events'\nimport { AuthenticatorOptions, AuthenticatorState, Logger, STORE_CREDENTIALS_KEY } from './types'\nimport { getRefreshSeparationMilliseconds } from './utils/separation'\nimport TokenNetworkError from './errors/TokenNetworkError'\nimport RefreshTokenError from './errors/RefreshTokenError'\nimport AuthorizationError from './errors/AuthorizationError'\nimport InvalidClientError from './errors/InvalidClientError'\n\nconst INTERNAL_CREDENTIALS = 'INTERNAL_CREDENTIALS'\nconst MAX_TIMEOUT_VALUE = 2147483646\n\ndeclare global {\n interface Navigator {\n locks: LockManager\n }\n}\n\nfunction getLockManager(): LockManager | undefined {\n if (typeof navigator === 'object') {\n const n = navigator as Navigator\n return n.locks\n }\n}\n\nclass Authenticator extends Emittery {\n private readonly api: AbstractAuthenticationApi\n private readonly secureStorage: SecureStorageHandler\n private readonly logger?: Logger\n private readonly initialCredentials?: Credentials\n\n private _state?: boolean = false\n private _credentials?: Credentials\n private _jwtPayload?: JwtPayload\n\n private isSetup: boolean = false\n private refreshTokenRunnerTimer?: any\n private refreshSeparationMilliseconds: number = 0\n private refreshTokenPromise?: Promise<Credentials>\n private removeCredentialStorageUpdates?: () => void\n private unsubscribeListenerAdded?: () => void\n private unsubscribeUpdateState?: () => void\n private timers: Map<ReturnType<typeof setTimeout>, (error: any) => void> = new Map()\n\n /**\n * In some cases we don't want to trigger the logout automatically\n * on refresh failure.\n *\n * When defined, this method will be invoked after the refresh failure\n * allowing you to define the behavior in that case.\n *\n * Example: You might not want sign out the user immediately\n * when your application is handling calls and you have ongoing calls.\n *\n * @returns {Promise<void>}\n */\n public delegateSignOutOnRefreshFailure?: () => Promise<void>\n\n public get jwtPayload(): JwtPayload | undefined {\n return this._jwtPayload\n }\n\n public get credentials(): Credentials | undefined {\n return this._credentials\n }\n\n public get state(): AuthenticatorState {\n return this._state ?? false\n }\n\n /**\n *\n * @param api\n * @param secureStorage\n * @param options\n */\n constructor(\n api: AbstractAuthenticationApi,\n secureStorage: SecureStorageHandler,\n options?: AuthenticatorOptions\n ) {\n super()\n this.api = api\n this.secureStorage = secureStorage\n this.logger = options?.logger\n this.initialCredentials = options?.credentials\n }\n\n /**\n * Starts the authenticator.\n *\n * @returns Returns either the initialCredentials or credentials stored in local storage.\n * It is usual that authenticator.signInWithCredentials is invoked with the credentials\n * returned by this method.\n */\n async setup(): Promise<Credentials | undefined> {\n let credentials\n\n if (this.initialCredentials) {\n credentials = this.initialCredentials\n } else {\n const localStorageCredentials = await this.secureStorage.getItem(STORE_CREDENTIALS_KEY)\n if (typeof localStorageCredentials === 'string') {\n credentials = Credentials.fromJSON(localStorageCredentials)\n }\n }\n\n // When loading a second instance of ConnectMe on the same browser,\n // the second instance cannot use the refresh token at the same time\n // as the first instance. In that case they will try to use the same\n // refresh_token and the instance that comes last will be returned an error.\n\n // Two mechanisms are put in place to mitigate this:\n // - The first instance to obtain the refresh token will save it to the SecureStorageHandler.\n // Other instances will be notified of the new token. When an instance recevices\n // credentials from another instance they will reset their _setupRefreshTokenRunner,\n // effectively becoming slave from the first instance.\n // - An instance separation delay is added, which separates the refresh of each instance\n // by 5 seconds. Up to 12 instance supported. 60 secs / 5 seconds delay\n this.removeCredentialStorageUpdates = Credentials.onStorageUpdate(\n this.secureStorage,\n (credentials: Credentials) => {\n this._signInWithCredentials(credentials, true)\n }\n )\n // _refreshSeparationMilliseconds is used in _setupRefreshTokenRunner\n this.refreshSeparationMilliseconds = await getRefreshSeparationMilliseconds(this.secureStorage)\n\n // Emit current credentials/access_token/jwt if they are defined when someone registers a listener\n this.unsubscribeListenerAdded = this.on(Emittery.listenerAdded, ({ listener, eventName }) => {\n if (eventName === AuthenticatorEvents.CREDENTIALS && this._credentials) {\n listener(this._credentials)\n } else if (eventName === AuthenticatorEvents.ACCESS_TOKEN && this._credentials) {\n listener(this._credentials.access_token)\n } else if (eventName === AuthenticatorEvents.JWT_PAYLOAD && this._jwtPayload) {\n listener(this._jwtPayload)\n } else if (eventName === AuthenticatorEvents.STATE_CHANGE) {\n listener(this._state)\n }\n })\n\n // Update jwt payload and state, and re-broadcast credentials update\n this.unsubscribeUpdateState = this.on(\n INTERNAL_CREDENTIALS,\n async ({ credentials, isFromOtherInstance }) => {\n if (Credentials.equals(this._credentials, credentials)) {\n return\n }\n this._credentials = credentials\n this.emit(AuthenticatorEvents.CREDENTIALS, credentials)\n if (credentials) {\n this.emit(AuthenticatorEvents.ACCESS_TOKEN, credentials.access_token)\n this._jwtPayload = decodeToken(credentials.access_token)\n this.emit(AuthenticatorEvents.JWT_PAYLOAD, this._jwtPayload)\n this._state = true\n this.emit(AuthenticatorEvents.STATE_CHANGE, this._state)\n if (isFromOtherInstance === false) {\n this.storeCredentials(credentials)\n }\n } else {\n this.emit(AuthenticatorEvents.ACCESS_TOKEN, undefined)\n this._jwtPayload = undefined\n this.emit(AuthenticatorEvents.JWT_PAYLOAD, undefined)\n this._state = false\n this.emit(AuthenticatorEvents.STATE_CHANGE, this._state)\n // Credentials are not removed from the store here as the user\n // might only be stopping the authenticator, not necessarily signin out.\n }\n }\n )\n\n this.isSetup = true\n\n return credentials\n }\n\n /**\n * Destroys the authenticator.\n * This method is called when the user signs-out.\n *\n * @returns {Promise}\n */\n async destroy(): Promise<void> {\n this.refreshTokenRunnerTimer && clearTimeout(this.refreshTokenRunnerTimer)\n\n await this.emit(INTERNAL_CREDENTIALS, { credentials: undefined, isFromOtherInstance: false })\n\n if (this.unsubscribeListenerAdded) {\n this.unsubscribeListenerAdded()\n }\n if (this.unsubscribeUpdateState) {\n this.unsubscribeUpdateState()\n }\n\n this.isSetup = false\n\n for (const [timer, reject] of this.timers.entries()) {\n clearTimeout(timer)\n reject(new Error('Authenticator is being destroyed. Wait functions are rejected.'))\n }\n this.timers.clear()\n }\n\n /**\n * Waits for the given number of milliseconds before resolving the promise.\n *\n * @param waitMilliseconds\n * @returns {Promise<void>}\n */\n private wait(waitMilliseconds: number): Promise<void> {\n try {\n this.assertIsSetup()\n } catch (err) {\n return Promise.reject(err)\n }\n return new Promise((resolve, reject) => {\n const fn = () => {\n this.timers.delete(timer)\n resolve()\n }\n const timer = setTimeout(fn, waitMilliseconds)\n this.timers.set(timer, reject)\n })\n }\n\n /**\n * Generates the login uri for OAuth authentication.\n * Supports escaux-oauth and SMG providers.\n *\n * @param {string} redirectUri - The redirect uri.\n *\n * The URL that the OAuth needs to redirect the browser to once\n * the user has authorized the request.\n *\n * @returns {Promise<string>} The authorization URI.\n *\n * The browser should be redirected to this URI.\n */\n async getLoginUrl(redirectUri: string): Promise<string> {\n this.assertIsSetup()\n const loginUrl: string = await this.api.getLoginUrl(redirectUri)\n return loginUrl\n }\n\n /**\n * Sign-in the user. Using the authorization code, an access and refresh token\n * is retrieved from the OAuth server. These are stored in an Credentials object.\n *\n * @param {string} authorizationCode - The autorization code recieved from OAuth\n * once the user has authorized the request.\n *\n * @param {string} redirectUri - The redirect uri.\n *\n * The URL that the OAuth needs to redirect the browser to once\n * the user has authorized the request.\n *\n * @returns {Promise<Credentials>} The user Crendetials\n */\n async signIn(authorizationCode: string, redirectUri: string): Promise<Credentials> {\n this.assertIsSetup()\n try {\n const credentials: Credentials = await this.api.getToken(authorizationCode, redirectUri)\n return await this._signInWithCredentials(credentials)\n } catch (error) {\n const authorizationError = new AuthorizationError(\n 'Failed to sign in with authorization code and redirect uri',\n { cause: error }\n )\n this.logger?.error(authorizationError)\n throw authorizationError\n }\n }\n\n /**\n * Signs the user out.\n *\n * @param {boolean} remote - When set to false it will not log the user out\n * from the authentication service\n *\n * @returns {Promise<void>}\n */\n async signOut(remote?: boolean, options = { exceptionOnFailure: false }): Promise<void> {\n this.assertIsSetup()\n await this.secureStorage.deleteItem(STORE_CREDENTIALS_KEY)\n if (this.removeCredentialStorageUpdates) {\n this.removeCredentialStorageUpdates()\n this.removeCredentialStorageUpdates = undefined\n }\n\n const credentials = this.credentials\n\n try {\n if (credentials && remote !== false) {\n const { refresh_token, access_token } = credentials\n await this.api.logout(refresh_token, access_token)\n } else {\n this.logger?.log('No credentials were available. No action was executed on logout.')\n }\n } catch (error) {\n const authorizationError = new AuthorizationError('Failed to sign out the user', {\n cause: error,\n })\n this.emit(AuthenticatorEvents.ERROR, authorizationError)\n this.logger?.error(authorizationError)\n if (options?.exceptionOnFailure !== false) {\n throw authorizationError\n }\n } finally {\n await this.emit(INTERNAL_CREDENTIALS, {\n credentials: undefined,\n isFromOtherInstance: false,\n })\n }\n }\n\n /**\n * On wake from sleep, we sign-in with the credentials to force the renewal of the credentials\n * if they expired during the sleep period.\n */\n public async sanityCheck(): Promise<void> {\n this.assertIsSetup()\n if (this._credentials) {\n try {\n await this._signInWithCredentials(this._credentials)\n } catch (error) {\n this.logger?.error('Failed to sign with credentials after sleep', error)\n }\n } else {\n this.logger?.info('No credentials available')\n }\n }\n\n /**\n * Indicates if there are valid credentials.\n *\n * Absent credentials or credentials which have expired are considered not valid.\n */\n public isTokenValid(): boolean {\n if (!this.credentials) {\n return false\n }\n return !this.credentials.isExpired()\n }\n\n public async signInWithCredentials(credentials: Credentials): Promise<Credentials> {\n this.assertIsSetup()\n const credentialsBackup = this._credentials\n try {\n return this._signInWithCredentials(credentials)\n } catch (error) {\n this._credentials = credentialsBackup\n throw error\n }\n }\n\n /**\n *\n * @param credentials\n * @returns {Promise<Credentials>}\n */\n private async _signInWithCredentials(\n credentials: Credentials,\n isFromOtherInstance: boolean = false\n ): Promise<Credentials> {\n this.logger?.log('signInWithCredentials')\n if (!credentials) {\n throw new Error('Invalid argument, credentials cannot be null or undefined.')\n }\n\n if (credentials?.isExpired()) {\n this._credentials = credentials\n await this.refreshTokenWithRetry()\n // _setupRefreshTokenRunner is setup in the refreshToken function\n } else {\n await this.emit(INTERNAL_CREDENTIALS, {\n credentials,\n isFromOtherInstance,\n })\n this._setupRefreshTokenRunner()\n }\n\n if (!this._credentials) {\n throw new Error('Failed to authenticate')\n }\n\n return this._credentials\n }\n\n /**\n * Sets up a timeout which will automatically refresh the token.\n *\n * The timeout is calculated based on the value of the `expires_at` property of\n * the `Credentials`, the refresh is always scheduled at 80% of the token life-time.\n *\n * When there are multiple ConnectMe instances the refresh timeout can vary\n * up to 60 seconds.\n *\n * A token will never be refreshed before at least 10 seconds.\n *\n */\n private _setupRefreshTokenRunner(): void {\n clearTimeout(this.refreshTokenRunnerTimer)\n if (!this.credentials) {\n throw new Error('Unable to start refresh token runner without credentials')\n }\n const refreshIn: number = new Date(this.credentials.expires_at).getTime() - new Date().getTime()\n const refreshTimeout: number =\n this.refreshSeparationMilliseconds + Math.max(10_000, refreshIn - 10_000)\n this.logger?.info(\n `Setting timer to refresh token in ${Math.round(refreshTimeout / 1000)} seconds ` +\n `at ${new Date(new Date().getTime() + refreshTimeout).toTimeString()}`\n )\n this.refreshTokenRunnerTimer = setTimeout(\n async () => {\n try {\n await this.refreshToken()\n } catch (error) {\n const refreshTokenError = new RefreshTokenError(\n 'Refresh runner failed to refresh token with existing credentials',\n { cause: error }\n )\n this.emit(AuthenticatorEvents.ERROR, refreshTokenError)\n this.logger?.error(refreshTokenError)\n }\n },\n Math.min(MAX_TIMEOUT_VALUE, refreshTimeout)\n )\n }\n\n /**\n * Generate a new `access_token` and `refresh_token` using the existing `refresh_token`.\n *\n * This method ensures that no parallel requests to refreshToken are done.\n *\n * @returns {Promise<Credentials>} The new `Credentials` object.\n */\n async refreshToken(): Promise<Credentials> {\n this.assertIsSetup()\n if (this.refreshTokenPromise) {\n this.logger?.info('Refresh token already in progress: returning existing promise.')\n return await this.refreshTokenPromise\n }\n\n const lockManager = getLockManager()\n try {\n if (lockManager) {\n this.refreshTokenPromise = new Promise<Credentials>((resolve, reject) => {\n lockManager.request(\n `@dstny/scp-authenticator/refresh-token-${this.api.clientId}`,\n async () => {\n try {\n const credentials = await this._refreshToken()\n // make sure that all other tabs receive and process the local storage update\n // so that when they attempt to refresh the token, they use updated credentials\n setTimeout(() => {\n resolve(credentials)\n }, 50)\n } catch (error) {\n reject(error)\n }\n }\n )\n })\n } else {\n this.refreshTokenPromise = this._refreshToken()\n }\n return await this.refreshTokenPromise\n } finally {\n this.refreshTokenPromise = undefined\n }\n }\n\n /**\n * Attempts to refresh the credentials.\n *\n * On failure it will throw an exception.\n * This method might end up signing the user out in case the refresh token are invalid.\n * It will not sign you out in case of network issues.\n *\n * @returns\n */\n async refreshTokenWithRetry(): Promise<Credentials> {\n this.assertIsSetup()\n const MAX_DEPTH = 7\n const MAX_TIMEOUT = 30 * 1000\n for (let depth = 0; depth < MAX_DEPTH; depth++) {\n try {\n return await this.refreshToken()\n } catch (err) {\n if (depth + 1 >= MAX_DEPTH) {\n throw err\n }\n if (err instanceof TokenNetworkError) {\n await this.wait(Math.min(2 ** depth * 1000, MAX_TIMEOUT))\n } else {\n throw err\n }\n }\n }\n return await this.refreshToken()\n }\n\n /**\n * Generate a new `access_token` and `refresh_token` using the existing `refresh_token`.\n *\n * This method should only be called by `refreshToken`.\n *\n * Use `refreshToken` method if you need to refresh the token.\n *\n * @returns {Promise<Credentials>} The new `Credentials` object.\n */\n private async _refreshToken(): Promise<Credentials> {\n this.logger?.info('Starting access token refresh')\n try {\n if (!this.credentials) {\n throw new Error('Failed to refresh token. No credentials available.')\n }\n const { refresh_token, access_token } = this.credentials\n const credentials = await this.api.refreshToken(refresh_token, access_token)\n this.logger?.info('Access token refreshed successfully')\n await this.emit(INTERNAL_CREDENTIALS, {\n credentials: credentials,\n isFromOtherInstance: false,\n })\n this._setupRefreshTokenRunner()\n return credentials\n } catch (error) {\n this.logger?.error('Failed to refresh token', error)\n if (error instanceof InvalidClientError) {\n if (typeof location !== 'undefined') {\n location.reload()\n } else {\n this.logger?.warn('Location reload not supported')\n throw error\n }\n }\n if (error instanceof RefreshTokenError) {\n if (this.delegateSignOutOnRefreshFailure) {\n await this.delegateSignOutOnRefreshFailure()\n } else {\n await this.signOut(false)\n }\n }\n throw error\n }\n }\n\n /**\n * Stores the credentials in secureStorage.\n *\n * @param {Credentials} credentials - The credentials to store in the secure storage.\n */\n private async storeCredentials(credentials: Credentials): Promise<void> {\n try {\n await this.secureStorage.setItem(STORE_CREDENTIALS_KEY, JSON.stringify(credentials))\n } catch (error: any) {\n this.logger?.error('Failed to store credentials in storage', error)\n }\n }\n\n private assertIsSetup() {\n if (!this.isSetup) {\n throw new Error('Authenticator needs to be setup before it can be used.')\n }\n }\n}\n\nexport default Authenticator\n","import { Credentials } from '@dstny/scp-credentials'\nimport axios, { AxiosInstance, AxiosRequestConfig } from 'axios'\n\nexport abstract class AbstractAuthenticationApi {\n protected axiosInstance: AxiosInstance\n public abstract readonly clientId: string\n\n constructor(baseURL: string) {\n const config: AxiosRequestConfig = {\n baseURL,\n timeout: 50000,\n }\n this.axiosInstance = axios.create(config)\n }\n\n /**\n * Given a redirectUri it calculates the URL where the browser needs to be\n * redirected in other to authenticate\n *\n * @param {string} redirectUri\n * @returns {string} login url\n */\n abstract getLoginUrl(redirectUri: string): Promise<string>\n\n /**\n * Given the authorizationCode and the redirectUri this method will provide\n * credentials containing an access and refresh token\n *\n * @param {string} authorizationCode\n * @param {string} redirectUri\n * @returns {Promise<Credentials>}\n */\n abstract getToken(authorizationCode: string, redirectUri: string): Promise<Credentials>\n\n /**\n * Given a refresh token this method will provide a new set of credentials\n * containing an access token and a refresh token\n *\n * @param {string} refreshToken\n * @returns {Promise<Credentials>}\n */\n abstract refreshToken(refreshToken: string, accessToken: string): Promise<Credentials>\n\n /**\n * Given a access and refresh token, this method will logout the user from\n * the IAM\n *\n * @param {string} accessToken\n * @param {string} refreshToken\n * @returns {Promise<void>}\n */\n abstract logout(accessToken?: string, refreshToken?: string): Promise<void>\n}\n","/* eslint-disable no-async-promise-executor */\nimport { Credentials } from '@dstny/scp-credentials'\nimport { AbstractAuthenticationApi } from './AbstractAuthenticationApi'\nimport axios from 'axios'\nimport TokenNetworkError from '../errors/TokenNetworkError'\nimport RefreshTokenError from '../errors/RefreshTokenError'\nimport InvalidClientError from '../errors/InvalidClientError'\n\ntype GetTokenResponse = {\n access_token: string\n refresh_token: string\n expires_in: number\n}\n\nexport class OAuthApi extends AbstractAuthenticationApi {\n public readonly clientId: string\n public readonly scope: string\n public readonly authorizationRoute: string\n\n private readonly baseURL: string\n\n constructor(baseURL: string, clientId: string, authorizationRoute: string, scope: string) {\n super(baseURL)\n this.baseURL = baseURL\n this.clientId = clientId\n this.authorizationRoute = authorizationRoute\n this.scope = scope\n }\n\n async getLoginUrl(redirectUri: string) {\n this.axiosInstance.getUri()\n return (\n `${this.baseURL}${this.authorizationRoute}` +\n `?client_id=${encodeURIComponent(this.clientId)}` +\n '&response_type=code' +\n `&redirect_uri=${encodeURIComponent(redirectUri)}` +\n (this.scope ? `&scope=${encodeURIComponent(this.scope)}` : '')\n )\n }\n\n async getToken(authorizationCode: string, redirectUri: string): Promise<Credentials> {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n '/token',\n new URLSearchParams({\n client_id: this.clientId,\n code: authorizationCode,\n grant_type: 'authorization_code',\n redirect_uri: redirectUri,\n })\n )\n return new Credentials(data.access_token, data.refresh_token, data.expires_in)\n }\n\n async loginWithUsernamePassword(username: string, password: string): Promise<Credentials> {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n '/token',\n new URLSearchParams({\n client_id: this.clientId,\n grant_type: 'password',\n username,\n password,\n })\n )\n return new Credentials(data.access_token, data.refresh_token, data.expires_in)\n }\n\n async refreshToken(refreshToken: string, accessToken: string): Promise<Credentials> {\n try {\n const response = await this.axiosInstance.post<GetTokenResponse>(\n '/token',\n new URLSearchParams({\n client_id: this.clientId,\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n })\n )\n return new Credentials(\n response.data.access_token,\n response.data.refresh_token,\n response.data.expires_in\n )\n } catch (error) {\n if (axios.isAxiosError(error)) {\n if (error.message === 'Network Error') {\n throw new TokenNetworkError()\n }\n const statusCode = error.response?.status\n if (statusCode === 401 && error.response?.data?.error === 'unauthorized_client') {\n throw new InvalidClientError()\n }\n if (typeof statusCode === 'number' && statusCode >= 400 && statusCode < 500) {\n throw new RefreshTokenError()\n }\n }\n throw error\n }\n }\n\n async logout(_redirectUri?: string): Promise<void> {\n await this.axiosInstance.post('/logout', null, { withCredentials: true })\n }\n}\n","import { Credentials } from '@dstny/scp-credentials'\nimport { AbstractAuthenticationApi } from './AbstractAuthenticationApi'\nimport RefreshTokenError from '../errors/RefreshTokenError'\nimport TokenNetworkError from '../errors/TokenNetworkError'\nimport axios from 'axios'\nimport { decodeToken } from '../utils/jwt'\nimport InvalidClientError from '../errors/InvalidClientError'\n\ntype GetLoginUrlResponse = {\n loginUrl: string\n}\n\ntype GetTokenResponse = {\n refreshToken: string\n accessToken: string\n message: string\n status: string\n}\n\nexport class SmgAuthApi extends AbstractAuthenticationApi {\n public readonly clientId: string\n public readonly realm: string\n\n constructor(baseURL: string, realm: string, clientId: string) {\n super(baseURL)\n this.clientId = clientId\n this.realm = realm\n }\n\n async getLoginUrl(redirectUri: string) {\n const { data } = await this.axiosInstance.get<GetLoginUrlResponse>(\n `/login/getloginurl/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`\n )\n\n const baseUrl = new URL(data.loginUrl)\n // The redirect_uri provided by the SMG is inacurate, this needs to be rewritten with the actual\n // redirect uri.\n baseUrl.searchParams.set('redirect_uri', redirectUri)\n // The authentication pathname of the SMG cannot be trusted to be configured correctly.\n // Duplicate '/' characters in the authentication URL causes the authentication\n // prompt to be displayed twice. Once when coven attempts to obtain a token, and\n // again when connect me attempts to obtain a token.\n // vv\n // example: https://keycloak.development.aws.d4sp.com//auth/realms/syslab1/protocol/openid-connect/auth\n baseUrl.pathname = baseUrl.pathname.replace(/\\/\\/+/g, '/')\n\n return baseUrl.toString()\n }\n\n async getToken(authorizationCode: string, redirectUri: string): Promise<Credentials> {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n `/login/getaccesstoken/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`,\n {\n code: authorizationCode,\n redirectUri: redirectUri,\n }\n )\n const { refreshToken, accessToken } = data\n\n const { iat = 0, exp = 0 } = decodeToken(accessToken)\n const expires_in = exp - iat\n const expires_at = new Date()\n expires_at.setSeconds(expires_at.getSeconds() + expires_in)\n return new Credentials(accessToken, refreshToken, expires_in)\n }\n\n async refreshToken(refreshToken: string, accessToken: string): Promise<Credentials> {\n try {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n `/login/refreshtoken/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`,\n {\n jwt: accessToken,\n refreshToken: refreshToken,\n }\n )\n const { refreshToken: newRefreshToken, accessToken: newAccessToken } = data\n\n const { iat = 0, exp = 0 } = decodeToken(newAccessToken)\n const expires_in = exp - iat\n return new Credentials(newAccessToken, newRefreshToken, expires_in)\n } catch (error) {\n if (axios.isAxiosError(error)) {\n if (error.message === 'Network Error') {\n throw new TokenNetworkError()\n }\n const statusCode = error.response?.status\n if (statusCode === 401 && error.response?.data?.error === 'invalid_client') {\n throw new InvalidClientError()\n }\n if (typeof statusCode === 'number' && statusCode >= 400 && statusCode < 500) {\n throw new RefreshTokenError()\n }\n }\n throw error\n }\n }\n\n async logout(refreshToken: string, accessToken: string): Promise<void> {\n await this.axiosInstance.post(\n `/login/logout/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`,\n {\n jwt: accessToken,\n refreshToken: refreshToken,\n }\n )\n }\n}\n\nexport default SmgAuthApi\n","import Authenticator from './Authenticator'\n\nexport * from './types'\nexport * from './events'\nexport * from './errors/AuthorizationError'\nexport * from './errors/InvalidClientError'\nexport * from './errors/RefreshTokenError'\nexport * from './errors/TokenNetworkError'\n\nexport * from './api/AbstractAuthenticationApi'\nexport * from './api/OAuthApi'\nexport * from './api/SmgAuthApi'\n\nexport default Authenticator\n"],"mappings":"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","names":["eventName","AuthenticatorEvents","credentials","axios","axios","axios","axios"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/emittery@1.1.0/node_modules/emittery/maps.js","../../../node_modules/.pnpm/emittery@1.1.0/node_modules/emittery/index.js","../../credentials/src/utils.ts","../../credentials/src/Credentials.ts","../src/utils/jwt.ts","../src/events.ts","../src/types.ts","../src/utils/separation.ts","../src/errors/TokenNetworkError.ts","../src/errors/RefreshTokenError.ts","../src/errors/AuthorizationError.ts","../src/errors/InvalidClientError.ts","../src/Authenticator.ts","../src/api/AbstractAuthenticationApi.ts","../src/api/OAuthApi.ts","../src/api/SmgAuthApi.ts","../src/index.ts"],"sourcesContent":["export const anyMap = new WeakMap();\nexport const eventsMap = new WeakMap();\nexport const producersMap = new WeakMap();\n","import {anyMap, producersMap, eventsMap} from './maps.js';\n\nconst anyProducer = Symbol('anyProducer');\nconst resolvedPromise = Promise.resolve();\n\n// Define symbols for \"meta\" events.\nconst listenerAdded = Symbol('listenerAdded');\nconst listenerRemoved = Symbol('listenerRemoved');\n\nlet canEmitMetaEvents = false;\nlet isGlobalDebugEnabled = false;\n\nconst isEventKeyType = key => typeof key === 'string' || typeof key === 'symbol' || typeof key === 'number';\n\nfunction assertEventName(eventName) {\n\tif (!isEventKeyType(eventName)) {\n\t\tthrow new TypeError('`eventName` must be a string, symbol, or number');\n\t}\n}\n\nfunction assertListener(listener) {\n\tif (typeof listener !== 'function') {\n\t\tthrow new TypeError('listener must be a function');\n\t}\n}\n\nfunction getListeners(instance, eventName) {\n\tconst events = eventsMap.get(instance);\n\tif (!events.has(eventName)) {\n\t\treturn;\n\t}\n\n\treturn events.get(eventName);\n}\n\nfunction getEventProducers(instance, eventName) {\n\tconst key = isEventKeyType(eventName) ? eventName : anyProducer;\n\tconst producers = producersMap.get(instance);\n\tif (!producers.has(key)) {\n\t\treturn;\n\t}\n\n\treturn producers.get(key);\n}\n\nfunction enqueueProducers(instance, eventName, eventData) {\n\tconst producers = producersMap.get(instance);\n\tif (producers.has(eventName)) {\n\t\tfor (const producer of producers.get(eventName)) {\n\t\t\tproducer.enqueue(eventData);\n\t\t}\n\t}\n\n\tif (producers.has(anyProducer)) {\n\t\tconst item = Promise.all([eventName, eventData]);\n\t\tfor (const producer of producers.get(anyProducer)) {\n\t\t\tproducer.enqueue(item);\n\t\t}\n\t}\n}\n\nfunction iterator(instance, eventNames) {\n\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\n\tlet isFinished = false;\n\tlet flush = () => {};\n\tlet queue = [];\n\n\tconst producer = {\n\t\tenqueue(item) {\n\t\t\tqueue.push(item);\n\t\t\tflush();\n\t\t},\n\t\tfinish() {\n\t\t\tisFinished = true;\n\t\t\tflush();\n\t\t},\n\t};\n\n\tfor (const eventName of eventNames) {\n\t\tlet set = getEventProducers(instance, eventName);\n\t\tif (!set) {\n\t\t\tset = new Set();\n\t\t\tconst producers = producersMap.get(instance);\n\t\t\tproducers.set(eventName, set);\n\t\t}\n\n\t\tset.add(producer);\n\t}\n\n\treturn {\n\t\tasync next() {\n\t\t\tif (!queue) {\n\t\t\t\treturn {done: true};\n\t\t\t}\n\n\t\t\tif (queue.length === 0) {\n\t\t\t\tif (isFinished) {\n\t\t\t\t\tqueue = undefined;\n\t\t\t\t\treturn this.next();\n\t\t\t\t}\n\n\t\t\t\tawait new Promise(resolve => {\n\t\t\t\t\tflush = resolve;\n\t\t\t\t});\n\n\t\t\t\treturn this.next();\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdone: false,\n\t\t\t\tvalue: await queue.shift(),\n\t\t\t};\n\t\t},\n\n\t\tasync return(value) {\n\t\t\tqueue = undefined;\n\n\t\t\tfor (const eventName of eventNames) {\n\t\t\t\tconst set = getEventProducers(instance, eventName);\n\t\t\t\tif (set) {\n\t\t\t\t\tset.delete(producer);\n\t\t\t\t\tif (set.size === 0) {\n\t\t\t\t\t\tconst producers = producersMap.get(instance);\n\t\t\t\t\t\tproducers.delete(eventName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tflush();\n\n\t\t\treturn arguments.length > 0\n\t\t\t\t? {done: true, value: await value}\n\t\t\t\t: {done: true};\n\t\t},\n\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn this;\n\t\t},\n\t};\n}\n\nfunction defaultMethodNamesOrAssert(methodNames) {\n\tif (methodNames === undefined) {\n\t\treturn allEmitteryMethods;\n\t}\n\n\tif (!Array.isArray(methodNames)) {\n\t\tthrow new TypeError('`methodNames` must be an array of strings');\n\t}\n\n\tfor (const methodName of methodNames) {\n\t\tif (!allEmitteryMethods.includes(methodName)) {\n\t\t\tif (typeof methodName !== 'string') {\n\t\t\t\tthrow new TypeError('`methodNames` element must be a string');\n\t\t\t}\n\n\t\t\tthrow new Error(`${methodName} is not Emittery method`);\n\t\t}\n\t}\n\n\treturn methodNames;\n}\n\nconst isMetaEvent = eventName => eventName === listenerAdded || eventName === listenerRemoved;\n\nfunction emitMetaEvent(emitter, eventName, eventData) {\n\tif (!isMetaEvent(eventName)) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tcanEmitMetaEvents = true;\n\t\temitter.emit(eventName, eventData);\n\t} finally {\n\t\tcanEmitMetaEvents = false;\n\t}\n}\n\nexport default class Emittery {\n\tstatic mixin(emitteryPropertyName, methodNames) {\n\t\tmethodNames = defaultMethodNamesOrAssert(methodNames);\n\t\treturn target => {\n\t\t\tif (typeof target !== 'function') {\n\t\t\t\tthrow new TypeError('`target` must be function');\n\t\t\t}\n\n\t\t\tfor (const methodName of methodNames) {\n\t\t\t\tif (target.prototype[methodName] !== undefined) {\n\t\t\t\t\tthrow new Error(`The property \\`${methodName}\\` already exists on \\`target\\``);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction getEmitteryProperty() {\n\t\t\t\tObject.defineProperty(this, emitteryPropertyName, {\n\t\t\t\t\tenumerable: false,\n\t\t\t\t\tvalue: new Emittery(),\n\t\t\t\t});\n\t\t\t\treturn this[emitteryPropertyName];\n\t\t\t}\n\n\t\t\tObject.defineProperty(target.prototype, emitteryPropertyName, {\n\t\t\t\tenumerable: false,\n\t\t\t\tget: getEmitteryProperty,\n\t\t\t});\n\n\t\t\tconst emitteryMethodCaller = methodName => function (...args) {\n\t\t\t\treturn this[emitteryPropertyName][methodName](...args);\n\t\t\t};\n\n\t\t\tfor (const methodName of methodNames) {\n\t\t\t\tObject.defineProperty(target.prototype, methodName, {\n\t\t\t\t\tenumerable: false,\n\t\t\t\t\tvalue: emitteryMethodCaller(methodName),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn target;\n\t\t};\n\t}\n\n\tstatic get isDebugEnabled() {\n\t\t// In a browser environment, `globalThis.process` can potentially reference a DOM Element with a `#process` ID,\n\t\t// so instead of just type checking `globalThis.process`, we need to make sure that `globalThis.process.env` exists.\n\t\t// eslint-disable-next-line n/prefer-global/process\n\t\tif (typeof globalThis.process?.env !== 'object') {\n\t\t\treturn isGlobalDebugEnabled;\n\t\t}\n\n\t\t// eslint-disable-next-line n/prefer-global/process\n\t\tconst {env} = globalThis.process ?? {env: {}};\n\t\treturn env.DEBUG === 'emittery' || env.DEBUG === '*' || isGlobalDebugEnabled;\n\t}\n\n\tstatic set isDebugEnabled(newValue) {\n\t\tisGlobalDebugEnabled = newValue;\n\t}\n\n\tconstructor(options = {}) {\n\t\tanyMap.set(this, new Set());\n\t\teventsMap.set(this, new Map());\n\t\tproducersMap.set(this, new Map());\n\n\t\tproducersMap.get(this).set(anyProducer, new Set());\n\n\t\tthis.debug = options.debug ?? {};\n\n\t\tif (this.debug.enabled === undefined) {\n\t\t\tthis.debug.enabled = false;\n\t\t}\n\n\t\tif (!this.debug.logger) {\n\t\t\tthis.debug.logger = (type, debugName, eventName, eventData) => {\n\t\t\t\ttry {\n\t\t\t\t\t// TODO: Use https://github.com/sindresorhus/safe-stringify when the package is more mature. Just copy-paste the code.\n\t\t\t\t\teventData = JSON.stringify(eventData);\n\t\t\t\t} catch {\n\t\t\t\t\teventData = `Object with the following keys failed to stringify: ${Object.keys(eventData).join(',')}`;\n\t\t\t\t}\n\n\t\t\t\tif (typeof eventName === 'symbol' || typeof eventName === 'number') {\n\t\t\t\t\teventName = eventName.toString();\n\t\t\t\t}\n\n\t\t\t\tconst currentTime = new Date();\n\t\t\t\tconst logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`;\n\t\t\t\tconsole.log(`[${logTime}][emittery:${type}][${debugName}] Event Name: ${eventName}\\n\\tdata: ${eventData}`);\n\t\t\t};\n\t\t}\n\t}\n\n\tlogIfDebugEnabled(type, eventName, eventData) {\n\t\tif (Emittery.isDebugEnabled || this.debug.enabled) {\n\t\t\tthis.debug.logger(type, this.debug.name, eventName, eventData);\n\t\t}\n\t}\n\n\ton(eventNames, listener, {signal} = {}) {\n\t\tassertListener(listener);\n\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tfor (const eventName of eventNames) {\n\t\t\tassertEventName(eventName);\n\t\t\tlet set = getListeners(this, eventName);\n\t\t\tif (!set) {\n\t\t\t\tset = new Set();\n\t\t\t\tconst events = eventsMap.get(this);\n\t\t\t\tevents.set(eventName, set);\n\t\t\t}\n\n\t\t\tset.add(listener);\n\n\t\t\tthis.logIfDebugEnabled('subscribe', eventName, undefined);\n\n\t\t\tif (!isMetaEvent(eventName)) {\n\t\t\t\temitMetaEvent(this, listenerAdded, {eventName, listener});\n\t\t\t}\n\t\t}\n\n\t\tconst off = () => {\n\t\t\tthis.off(eventNames, listener);\n\t\t\tsignal?.removeEventListener('abort', off);\n\t\t};\n\n\t\tsignal?.addEventListener('abort', off, {once: true});\n\n\t\tif (signal?.aborted) {\n\t\t\toff();\n\t\t}\n\n\t\treturn off;\n\t}\n\n\toff(eventNames, listener) {\n\t\tassertListener(listener);\n\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tfor (const eventName of eventNames) {\n\t\t\tassertEventName(eventName);\n\t\t\tconst set = getListeners(this, eventName);\n\t\t\tif (set) {\n\t\t\t\tset.delete(listener);\n\t\t\t\tif (set.size === 0) {\n\t\t\t\t\tconst events = eventsMap.get(this);\n\t\t\t\t\tevents.delete(eventName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.logIfDebugEnabled('unsubscribe', eventName, undefined);\n\n\t\t\tif (!isMetaEvent(eventName)) {\n\t\t\t\temitMetaEvent(this, listenerRemoved, {eventName, listener});\n\t\t\t}\n\t\t}\n\t}\n\n\tonce(eventNames) {\n\t\tlet off_;\n\n\t\tconst promise = new Promise(resolve => {\n\t\t\toff_ = this.on(eventNames, data => {\n\t\t\t\toff_();\n\t\t\t\tresolve(data);\n\t\t\t});\n\t\t});\n\n\t\tpromise.off = off_;\n\t\treturn promise;\n\t}\n\n\tevents(eventNames) {\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tfor (const eventName of eventNames) {\n\t\t\tassertEventName(eventName);\n\t\t}\n\n\t\treturn iterator(this, eventNames);\n\t}\n\n\tasync emit(eventName, eventData) {\n\t\tassertEventName(eventName);\n\n\t\tif (isMetaEvent(eventName) && !canEmitMetaEvents) {\n\t\t\tthrow new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`');\n\t\t}\n\n\t\tthis.logIfDebugEnabled('emit', eventName, eventData);\n\n\t\tenqueueProducers(this, eventName, eventData);\n\n\t\tconst listeners = getListeners(this, eventName) ?? new Set();\n\t\tconst anyListeners = anyMap.get(this);\n\t\tconst staticListeners = [...listeners];\n\t\tconst staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];\n\n\t\tawait resolvedPromise;\n\t\tawait Promise.all([\n\t\t\t...staticListeners.map(async listener => {\n\t\t\t\tif (listeners.has(listener)) {\n\t\t\t\t\treturn listener(eventData);\n\t\t\t\t}\n\t\t\t}),\n\t\t\t...staticAnyListeners.map(async listener => {\n\t\t\t\tif (anyListeners.has(listener)) {\n\t\t\t\t\treturn listener(eventName, eventData);\n\t\t\t\t}\n\t\t\t}),\n\t\t]);\n\t}\n\n\tasync emitSerial(eventName, eventData) {\n\t\tassertEventName(eventName);\n\n\t\tif (isMetaEvent(eventName) && !canEmitMetaEvents) {\n\t\t\tthrow new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`');\n\t\t}\n\n\t\tthis.logIfDebugEnabled('emitSerial', eventName, eventData);\n\n\t\tconst listeners = getListeners(this, eventName) ?? new Set();\n\t\tconst anyListeners = anyMap.get(this);\n\t\tconst staticListeners = [...listeners];\n\t\tconst staticAnyListeners = [...anyListeners];\n\n\t\tawait resolvedPromise;\n\t\t/* eslint-disable no-await-in-loop */\n\t\tfor (const listener of staticListeners) {\n\t\t\tif (listeners.has(listener)) {\n\t\t\t\tawait listener(eventData);\n\t\t\t}\n\t\t}\n\n\t\tfor (const listener of staticAnyListeners) {\n\t\t\tif (anyListeners.has(listener)) {\n\t\t\t\tawait listener(eventName, eventData);\n\t\t\t}\n\t\t}\n\t\t/* eslint-enable no-await-in-loop */\n\t}\n\n\tonAny(listener, {signal} = {}) {\n\t\tassertListener(listener);\n\n\t\tthis.logIfDebugEnabled('subscribeAny', undefined, undefined);\n\n\t\tanyMap.get(this).add(listener);\n\t\temitMetaEvent(this, listenerAdded, {listener});\n\n\t\tconst offAny = () => {\n\t\t\tthis.offAny(listener);\n\t\t\tsignal?.removeEventListener('abort', offAny);\n\t\t};\n\n\t\tsignal?.addEventListener('abort', offAny, {once: true});\n\n\t\tif (signal?.aborted) {\n\t\t\toffAny();\n\t\t}\n\n\t\treturn offAny;\n\t}\n\n\tanyEvent() {\n\t\treturn iterator(this);\n\t}\n\n\toffAny(listener) {\n\t\tassertListener(listener);\n\n\t\tthis.logIfDebugEnabled('unsubscribeAny', undefined, undefined);\n\n\t\temitMetaEvent(this, listenerRemoved, {listener});\n\t\tanyMap.get(this).delete(listener);\n\t}\n\n\tclearListeners(eventNames) {\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\n\t\tfor (const eventName of eventNames) {\n\t\t\tthis.logIfDebugEnabled('clear', eventName, undefined);\n\n\t\t\tif (isEventKeyType(eventName)) {\n\t\t\t\tconst set = getListeners(this, eventName);\n\t\t\t\tif (set) {\n\t\t\t\t\tset.clear();\n\t\t\t\t}\n\n\t\t\t\tconst producers = getEventProducers(this, eventName);\n\t\t\t\tif (producers) {\n\t\t\t\t\tfor (const producer of producers) {\n\t\t\t\t\t\tproducer.finish();\n\t\t\t\t\t}\n\n\t\t\t\t\tproducers.clear();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tanyMap.get(this).clear();\n\n\t\t\t\tfor (const [eventName, listeners] of eventsMap.get(this).entries()) {\n\t\t\t\t\tlisteners.clear();\n\t\t\t\t\teventsMap.get(this).delete(eventName);\n\t\t\t\t}\n\n\t\t\t\tfor (const [eventName, producers] of producersMap.get(this).entries()) {\n\t\t\t\t\tfor (const producer of producers) {\n\t\t\t\t\t\tproducer.finish();\n\t\t\t\t\t}\n\n\t\t\t\t\tproducers.clear();\n\t\t\t\t\tproducersMap.get(this).delete(eventName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlistenerCount(eventNames) {\n\t\teventNames = Array.isArray(eventNames) ? eventNames : [eventNames];\n\t\tlet count = 0;\n\n\t\tfor (const eventName of eventNames) {\n\t\t\tif (isEventKeyType(eventName)) {\n\t\t\t\tcount += anyMap.get(this).size\n\t\t\t\t\t+ (getListeners(this, eventName)?.size ?? 0)\n\t\t\t\t\t+ (getEventProducers(this, eventName)?.size ?? 0)\n\t\t\t\t\t+ (getEventProducers(this)?.size ?? 0);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (eventName !== undefined) {\n\t\t\t\tassertEventName(eventName);\n\t\t\t}\n\n\t\t\tcount += anyMap.get(this).size;\n\n\t\t\tfor (const value of eventsMap.get(this).values()) {\n\t\t\t\tcount += value.size;\n\t\t\t}\n\n\t\t\tfor (const value of producersMap.get(this).values()) {\n\t\t\t\tcount += value.size;\n\t\t\t}\n\t\t}\n\n\t\treturn count;\n\t}\n\n\tbindMethods(target, methodNames) {\n\t\tif (typeof target !== 'object' || target === null) {\n\t\t\tthrow new TypeError('`target` must be an object');\n\t\t}\n\n\t\tmethodNames = defaultMethodNamesOrAssert(methodNames);\n\n\t\tfor (const methodName of methodNames) {\n\t\t\tif (target[methodName] !== undefined) {\n\t\t\t\tthrow new Error(`The property \\`${methodName}\\` already exists on \\`target\\``);\n\t\t\t}\n\n\t\t\tObject.defineProperty(target, methodName, {\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: this[methodName].bind(this),\n\t\t\t});\n\t\t}\n\t}\n}\n\nconst allEmitteryMethods = Object.getOwnPropertyNames(Emittery.prototype).filter(v => v !== 'constructor');\n\nObject.defineProperty(Emittery, 'listenerAdded', {\n\tvalue: listenerAdded,\n\twritable: false,\n\tenumerable: true,\n\tconfigurable: false,\n});\nObject.defineProperty(Emittery, 'listenerRemoved', {\n\tvalue: listenerRemoved,\n\twritable: false,\n\tenumerable: true,\n\tconfigurable: false,\n});\n","// declare const Buffer\n\nfunction byteToPercent(b: string) {\n return `%${`00${b.charCodeAt(0).toString(16)}`.slice(-2)}`\n}\n\nexport function base64decode(str: string): string | undefined {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n let output: string = ''\n\n str = String(str).replace(/={1,10}$/, '')\n\n if (str.length % 4 === 1) {\n throw new Error(\"'atob' failed: The string to be decoded is not correctly encoded.\")\n }\n\n for (\n // initialize result and counters\n let bc: number = 0, bs: any, buffer: any, idx: number = 0;\n // tslint:disable-next-line:no-conditional-assignment\n (buffer = str.charAt(idx++));\n // tslint:disable-next-line:no-bitwise\n ~buffer &&\n // tslint:disable-next-line:no-conditional-assignment\n ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4)\n ? // tslint:disable-next-line:no-bitwise\n (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer)\n }\n return output\n}\n\nexport async function sha1(str: string) {\n if (typeof crypto === 'object') {\n const hash = await crypto.subtle.digest('SHA-1', new TextEncoder().encode(str))\n return Array.from(new Uint8Array(hash))\n .map((v) => v.toString(16).padStart(2, '0'))\n .join('')\n } else {\n return binb2hex(core_sha1(str2binb(str), str.length * chrsz))\n }\n}\n\nconst hexcase = 0 /* hex output format. 0 - lowercase; 1 - uppercase */\nconst b64pad = '' /* base-64 pad character. \"=\" for strict RFC compliance */\nconst chrsz = 8 /* bits per input character. 8 - ASCII; 16 - Unicode */\n\n/*\n * Calculate the SHA-1 of an array of big-endian words, and a bit length\n */\nfunction core_sha1(x: Array<number>, len: number) {\n /* append padding */\n x[len >> 5] |= 0x80 << (24 - (len % 32))\n x[(((len + 64) >> 9) << 4) + 15] = len\n\n var w = Array(80)\n var a = 1732584193\n var b = -271733879\n var c = -1732584194\n var d = 271733878\n var e = -1009589776\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a\n var oldb = b\n var oldc = c\n var oldd = d\n var olde = e\n\n for (var j = 0; j < 80; j++) {\n if (j < 16) w[j] = x[i + j]\n else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1)\n var t = safe_add(\n safe_add(rol(a, 5), sha1_ft(j, b, c, d)),\n safe_add(safe_add(e, w[j]), sha1_kt(j))\n )\n e = d\n d = c\n c = rol(b, 30)\n b = a\n a = t\n }\n\n a = safe_add(a, olda)\n b = safe_add(b, oldb)\n c = safe_add(c, oldc)\n d = safe_add(d, oldd)\n e = safe_add(e, olde)\n }\n return Array(a, b, c, d, e)\n}\n\n/*\n * Perform the appropriate triplet combination function for the current\n * iteration\n */\nfunction sha1_ft(t: number, b: number, c: number, d: number) {\n if (t < 20) return (b & c) | (~b & d)\n if (t < 40) return b ^ c ^ d\n if (t < 60) return (b & c) | (b & d) | (c & d)\n return b ^ c ^ d\n}\n\n/*\n * Determine the appropriate additive constant for the current iteration\n */\nfunction sha1_kt(t: number) {\n return t < 20 ? 1518500249 : t < 40 ? 1859775393 : t < 60 ? -1894007588 : -899497514\n}\n\n/*\n * Calculate the HMAC-SHA1 of a key and some data\n */\nfunction core_hmac_sha1(key: string, data: string) {\n let bkey = str2binb(key)\n if (bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz)\n\n let ipad = Array(16),\n opad = Array(16)\n for (let i = 0; i < 16; i++) {\n ipad[i] = bkey[i] ^ 0x36363636\n opad[i] = bkey[i] ^ 0x5c5c5c5c\n }\n\n let hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz)\n return core_sha1(opad.concat(hash), 512 + 160)\n}\n\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\nfunction safe_add(x: number, y: number) {\n const lsw = (x & 0xffff) + (y & 0xffff)\n const msw = (x >> 16) + (y >> 16) + (lsw >> 16)\n return (msw << 16) | (lsw & 0xffff)\n}\n\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\nfunction rol(num: number, cnt: number) {\n return (num << cnt) | (num >>> (32 - cnt))\n}\n\n/*\n * Convert an 8-bit or 16-bit string to an array of big-endian words\n * In 8-bit function, characters >255 have their hi-byte silently ignored.\n */\nfunction str2binb(str: string): Array<number> {\n const bin: Array<number> = []\n const mask = (1 << chrsz) - 1\n for (let i = 0; i < str.length * chrsz; i += chrsz)\n bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - (i % 32))\n return bin\n}\n\n/*\n * Convert an array of big-endian words to a string\n */\nfunction binb2str(bin: Array<number>): string {\n let str = ''\n let mask = (1 << chrsz) - 1\n for (let i = 0; i < bin.length * 32; i += chrsz)\n str += String.fromCharCode((bin[i >> 5] >>> (32 - chrsz - (i % 32))) & mask)\n return str\n}\n\n/*\n * Convert an array of big-endian words to a hex string.\n */\nfunction binb2hex(binarray: Array<number>) {\n let hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef'\n let str = ''\n for (let i = 0; i < binarray.length * 4; i++) {\n str +=\n hex_tab.charAt((binarray[i >> 2] >> ((3 - (i % 4)) * 8 + 4)) & 0xf) +\n hex_tab.charAt((binarray[i >> 2] >> ((3 - (i % 4)) * 8)) & 0xf)\n }\n return str\n}\n\n/*\n * Convert an array of big-endian words to a base-64 string\n */\nfunction binb2b64(binarray: Array<number>) {\n let tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n let str = ''\n for (let i = 0; i < binarray.length * 4; i += 3) {\n let triplet =\n (((binarray[i >> 2] >> (8 * (3 - (i % 4)))) & 0xff) << 16) |\n (((binarray[(i + 1) >> 2] >> (8 * (3 - ((i + 1) % 4)))) & 0xff) << 8) |\n ((binarray[(i + 2) >> 2] >> (8 * (3 - ((i + 2) % 4)))) & 0xff)\n for (let j = 0; j < 4; j++) {\n if (i * 8 + j * 6 > binarray.length * 32) str += b64pad\n else str += tab.charAt((triplet >> (6 * (3 - j))) & 0x3f)\n }\n }\n return str\n}\n","import { base64decode, sha1 } from './utils'\nimport { SecureStorageHandler } from '@dstny/scp-storage'\n\nexport const STORE_CREDENTILAS_KEY = 'sdk-auth-credential'\n\ntype CredentialsCallback = (callback: Credentials) => void\ntype JSONCredentials = {\n access_token: string\n refresh_token: string\n expires_in: number\n expires_at: Date\n token_type: 'Bearer' | string\n}\n\nexport default class Credentials {\n static async fromStorage(storage: SecureStorageHandler): Promise<Credentials> {\n const str: string | null = await storage.getItem(STORE_CREDENTILAS_KEY)\n if (str == null || str == undefined) {\n throw new Error('No credentials found in storage.')\n }\n return Credentials.fromJSON(str)\n }\n\n static async toStorage(storage: SecureStorageHandler, credentials: Credentials): Promise<void> {\n await storage.setItem(STORE_CREDENTILAS_KEY, JSON.stringify(credentials))\n }\n\n static async clearFromStorage(storage: SecureStorageHandler): Promise<void> {\n await storage.deleteItem(STORE_CREDENTILAS_KEY)\n }\n\n static fromJSON(str: string): Credentials {\n const { access_token, refresh_token, expires_in } = JSON.parse(str)\n return new Credentials(access_token, refresh_token, expires_in)\n }\n\n static onStorageUpdate(storage: SecureStorageHandler, callback: CredentialsCallback): () => void {\n return storage.on(STORE_CREDENTILAS_KEY, (credentials: string | null) => {\n if (typeof credentials === 'string') {\n callback(Credentials.fromJSON(credentials))\n }\n })\n }\n\n static equals(a?: Credentials, b?: Credentials) {\n if (!a && !b) {\n return true\n }\n if ((a && !b) || (b && !a)) {\n return false\n }\n return (\n a?.access_token === b?.access_token &&\n a?._refresh_token === b?.refresh_token &&\n a?.expires_in === b?.expires_in\n )\n }\n\n /**\n * Used to access resources.\n */\n private _access_token: string\n /**\n * Used to obtain a new access token.\n */\n private _refresh_token: string\n /**\n * Number of seconds until the access token expires.\n * This value is calculated at the moment the access token is generated.\n */\n private _expires_in: number\n\n constructor(access_token: string, refresh_token: string, expires_in: number) {\n this._access_token = access_token\n this._refresh_token = refresh_token\n this._expires_in = expires_in\n }\n\n /**\n * Lists the claims present in the access token.\n */\n get claims() {\n const fallback = {}\n if (typeof this._access_token != 'string') {\n return fallback\n }\n const [, b64payload] = this._access_token.split('.')\n const payload = base64decode(b64payload)\n if (!payload) {\n return fallback\n }\n try {\n return JSON.parse(payload)\n } catch (err) {\n return {}\n }\n }\n\n get access_token(): string {\n return this._access_token\n }\n\n get refresh_token(): string {\n return this._refresh_token\n }\n\n get expires_in(): number {\n return this._expires_in\n }\n\n get token_type(): string {\n return 'Bearer'\n }\n\n get expires_at(): Date {\n if (typeof this.claims?.exp === 'number') {\n return new Date(this.claims?.exp * 1000)\n }\n const expiryDate = new Date()\n expiryDate.setSeconds(expiryDate.getSeconds() + this._expires_in)\n return expiryDate\n }\n\n isExpired(): boolean {\n return this.expires_at && new Date().getTime() > new Date(this.expires_at).getTime()\n }\n\n async getUepId(): Promise<string> {\n const { sub, uep_id: rawUepId } = this.claims \n if (!sub) {\n throw new Error(\"Missing 'sub' claim.\")\n }\n\n if (rawUepId) {\n return rawUepId\n }\n \n return await sha1(sub)\n }\n\n toJSON(): JSONCredentials {\n return {\n access_token: this._access_token,\n refresh_token: this._refresh_token,\n expires_in: this._expires_in,\n expires_at: this.expires_at,\n token_type: this.token_type,\n }\n }\n}\n","export interface JwtPayload {\n [key: string]: any\n iss?: string | undefined\n sub?: string | undefined\n aud?: string | string[] | undefined\n exp?: number | undefined\n nbf?: number | undefined\n iat?: number | undefined\n jti?: string | undefined\n}\n\nexport function decodeToken(token: string): JwtPayload {\n if (!token) {\n throw new Error('No token provided')\n }\n const parts = token.split('.')\n\n if (parts.length !== 3) {\n throw new Error('JWT must have 3 parts')\n }\n\n const decoded = urlBase64Decode(parts[1])\n if (!decoded) {\n throw new Error('Cannot decode the token')\n }\n\n return JSON.parse(decoded)\n}\n\nfunction urlBase64Decode(str: string): string {\n let output = str.replace(/-/g, '+').replace(/_/g, '/')\n switch (output.length % 4) {\n case 0: {\n break\n }\n case 2: {\n output += '=='\n break\n }\n case 3: {\n output += '='\n break\n }\n default: {\n // TODO\n throw new Error('Illegal base64url string!')\n }\n }\n return b64DecodeUnicode(output)\n}\n\nfunction b64DecodeUnicode(str: any): any {\n return decodeURIComponent(\n Array.prototype.map\n .call(b64decode(str), (c: any) => {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)\n })\n .join('')\n )\n}\n\nexport function b64decode(str: string): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n let output: string = ''\n\n str = String(str).replace(/={1,10}$/, '')\n\n if (str.length % 4 === 1) {\n throw new Error(\"'atob' failed: The string to be decoded is not correctly encoded.\")\n }\n\n for (\n // initialize result and counters\n let bc: number = 0, bs: any, buffer: any, idx: number = 0;\n // tslint:disable-next-line:no-conditional-assignment\n (buffer = str.charAt(idx++));\n // tslint:disable-next-line:no-bitwise\n ~buffer &&\n // tslint:disable-next-line:no-conditional-assignment\n ((bs = bc % 4 ? bs * 64 + buffer : buffer), bc++ % 4)\n ? // tslint:disable-next-line:no-bitwise\n (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer)\n }\n return output\n}\nexport function b64encode(input: string, encode = true) {\n let output = ''\n let chr1, chr2, chr3, enc1, enc2, enc3, enc4\n let i = 0\n const _keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n if (encode) {\n input = _utf8_encode(input)\n }\n\n while (i < input.length) {\n chr1 = input.charCodeAt(i++)\n chr2 = input.charCodeAt(i++)\n chr3 = input.charCodeAt(i++)\n\n enc1 = chr1 >> 2\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4)\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6)\n enc4 = chr3 & 63\n\n if (isNaN(chr2)) {\n enc3 = enc4 = 64\n } else if (isNaN(chr3)) {\n enc4 = 64\n }\n\n output =\n output +\n _keyStr.charAt(enc1) +\n _keyStr.charAt(enc2) +\n _keyStr.charAt(enc3) +\n _keyStr.charAt(enc4)\n }\n return output\n}\n\nexport function _utf8_encode(string: string) {\n string = string.replace(/\\r\\n/g, '\\n')\n let utftext = ''\n\n for (let n = 0; n < string.length; n++) {\n const c = string.charCodeAt(n)\n\n if (c < 128) {\n utftext += String.fromCharCode(c)\n } else if (c > 127 && c < 2048) {\n utftext += String.fromCharCode((c >> 6) | 192)\n utftext += String.fromCharCode((c & 63) | 128)\n } else {\n utftext += String.fromCharCode((c >> 12) | 224)\n utftext += String.fromCharCode(((c >> 6) & 63) | 128)\n utftext += String.fromCharCode((c & 63) | 128)\n }\n }\n return utftext\n}\n","export enum AuthenticatorEvents {\n CREDENTIALS = 'CREDENTIALS',\n ACCESS_TOKEN = 'ACCESS_TOKEN',\n JWT_PAYLOAD = 'JWT_PAYLOAD',\n STATE_CHANGE = 'STATE_CHANGE',\n ERROR = 'ERROR',\n}\n","import { Credentials } from '@dstny/scp-credentials'\n\nexport const STORE_CREDENTIALS_KEY = 'sdk-auth-credential'\nexport const STORE_REFRESH_SEPARATION_SECONDS = 'sdk-separation-seconds'\n\nexport type AuthenticatorState = boolean\n\nexport type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\nexport interface Logger {\n log(...arg: any[]): void\n error(...arg: any[]): void\n warn(...arg: any[]): void\n info(...arg: any[]): void\n debug(...arg: any[]): void\n trace(...arg: any[]): void\n\n setLevel(level: LogLevel, persist?: boolean): void\n resetLevel(): void\n}\n\nexport interface AuthenticatorOptions {\n /**\n * The authenticator library will try to use these credentials\n * when the setup method is invoked.\n *\n * This might be useful if you already have credentials available\n * and want to avoid doing the authentication procedure.\n */\n credentials?: Credentials\n /**\n * The authenticator library will use this logger instance for its\n * log statements.\n */\n logger?: Logger\n}\n\ndeclare global {\n interface Navigator {\n locks: LockManager\n }\n}\n","import { SecureStorageHandler } from '@dstny/scp-storage'\nimport { STORE_REFRESH_SEPARATION_SECONDS } from '../types'\n\nexport const getRefreshSeparationMilliseconds = async (\n storage: SecureStorageHandler\n): Promise<number> => {\n const next = parseInt((await storage.getItem(STORE_REFRESH_SEPARATION_SECONDS)) || '0') || 0\n await storage.setItem(STORE_REFRESH_SEPARATION_SECONDS, '' + ((next + 5) % 60))\n return next * 1000\n}\n\n\n","class TokenNetworkError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Network unavailable to refresh the network', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'NetworkError'\n }\n}\n\nexport default TokenNetworkError\n","/**\n * This kind of exceptions are using for reporting error cases for refresh token action such as update, request and ect.\n */\nclass RefreshTokenError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Your token or session is expired.', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'RefreshTokenError'\n }\n}\n\nexport default RefreshTokenError\n","/**\n * Use it for authorization specific errors\n * Depends on reason of exception use proper type\n */\nclass AuthorizationError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Authorization failed', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'AuthorizationError'\n }\n}\n\nexport default AuthorizationError\n","/**\n * This kind of is launched when the configured client is invalid\n */\nclass InvalidClientError extends Error {\n constructor(message?: string, options?: ErrorOptions) {\n super(message || 'Your client is invalid.', options)\n Object.setPrototypeOf(this, new.target.prototype)\n this.name = 'InvalidClientError'\n }\n}\n\nexport default InvalidClientError\n","import Emittery from 'emittery'\n\nimport { Credentials } from '@dstny/scp-credentials'\nimport { SecureStorageHandler } from '@dstny/scp-storage'\nimport { AbstractAuthenticationApi } from './api/AbstractAuthenticationApi'\nimport { decodeToken, JwtPayload } from './utils/jwt'\nimport { AuthenticatorEvents } from './events'\nimport { AuthenticatorOptions, AuthenticatorState, Logger, STORE_CREDENTIALS_KEY } from './types'\nimport { getRefreshSeparationMilliseconds } from './utils/separation'\nimport TokenNetworkError from './errors/TokenNetworkError'\nimport RefreshTokenError from './errors/RefreshTokenError'\nimport AuthorizationError from './errors/AuthorizationError'\nimport InvalidClientError from './errors/InvalidClientError'\n\nconst INTERNAL_CREDENTIALS = 'INTERNAL_CREDENTIALS'\nconst MAX_TIMEOUT_VALUE = 2147483646\nconst REFRESH_BUFFER_MILLISECONDS = 120_000\n\ndeclare global {\n interface Navigator {\n locks: LockManager\n }\n}\n\nfunction getLockManager(): LockManager | undefined {\n if (typeof navigator === 'object') {\n const n = navigator as Navigator\n return n.locks\n }\n}\n\nclass Authenticator extends Emittery {\n private readonly api: AbstractAuthenticationApi\n private readonly secureStorage: SecureStorageHandler\n private readonly logger?: Logger\n private readonly initialCredentials?: Credentials\n\n private _state?: boolean = false\n private _credentials?: Credentials\n private _jwtPayload?: JwtPayload\n\n private isSetup: boolean = false\n private refreshTokenRunnerTimer?: any\n private refreshSeparationMilliseconds: number = 0\n private refreshTokenPromise?: Promise<Credentials>\n private removeCredentialStorageUpdates?: () => void\n private unsubscribeListenerAdded?: () => void\n private unsubscribeUpdateState?: () => void\n private timers: Map<ReturnType<typeof setTimeout>, (error: any) => void> = new Map()\n\n /**\n * In some cases we don't want to trigger the logout automatically\n * on refresh failure.\n *\n * When defined, this method will be invoked after the refresh failure\n * allowing you to define the behavior in that case.\n *\n * Example: You might not want sign out the user immediately\n * when your application is handling calls and you have ongoing calls.\n *\n * @returns {Promise<void>}\n */\n public delegateSignOutOnRefreshFailure?: () => Promise<void>\n\n public get jwtPayload(): JwtPayload | undefined {\n return this._jwtPayload\n }\n\n public get credentials(): Credentials | undefined {\n return this._credentials\n }\n\n public get state(): AuthenticatorState {\n return this._state ?? false\n }\n\n /**\n *\n * @param api\n * @param secureStorage\n * @param options\n */\n constructor(\n api: AbstractAuthenticationApi,\n secureStorage: SecureStorageHandler,\n options?: AuthenticatorOptions\n ) {\n super()\n this.api = api\n this.secureStorage = secureStorage\n this.logger = options?.logger\n this.initialCredentials = options?.credentials\n }\n\n /**\n * Starts the authenticator.\n *\n * @returns Returns either the initialCredentials or credentials stored in local storage.\n * It is usual that authenticator.signInWithCredentials is invoked with the credentials\n * returned by this method.\n */\n async setup(): Promise<Credentials | undefined> {\n let credentials\n\n if (this.initialCredentials) {\n credentials = this.initialCredentials\n } else {\n const localStorageCredentials = await this.secureStorage.getItem(STORE_CREDENTIALS_KEY)\n if (typeof localStorageCredentials === 'string') {\n credentials = Credentials.fromJSON(localStorageCredentials)\n }\n }\n\n // When loading a second instance of ConnectMe on the same browser,\n // the second instance cannot use the refresh token at the same time\n // as the first instance. In that case they will try to use the same\n // refresh_token and the instance that comes last will be returned an error.\n\n // Two mechanisms are put in place to mitigate this:\n // - The first instance to obtain the refresh token will save it to the SecureStorageHandler.\n // Other instances will be notified of the new token. When an instance recevices\n // credentials from another instance they will reset their _setupRefreshTokenRunner,\n // effectively becoming slave from the first instance.\n // - An instance separation delay is added, which separates the refresh of each instance\n // by 5 seconds. Up to 12 instance supported. 60 secs / 5 seconds delay\n this.removeCredentialStorageUpdates = Credentials.onStorageUpdate(\n this.secureStorage,\n (credentials: Credentials) => {\n this._signInWithCredentials(credentials, true)\n }\n )\n // _refreshSeparationMilliseconds is used in _setupRefreshTokenRunner\n this.refreshSeparationMilliseconds = await getRefreshSeparationMilliseconds(this.secureStorage)\n\n // Emit current credentials/access_token/jwt if they are defined when someone registers a listener\n this.unsubscribeListenerAdded = this.on(Emittery.listenerAdded, ({ listener, eventName }) => {\n if (eventName === AuthenticatorEvents.CREDENTIALS && this._credentials) {\n listener(this._credentials)\n } else if (eventName === AuthenticatorEvents.ACCESS_TOKEN && this._credentials) {\n listener(this._credentials.access_token)\n } else if (eventName === AuthenticatorEvents.JWT_PAYLOAD && this._jwtPayload) {\n listener(this._jwtPayload)\n } else if (eventName === AuthenticatorEvents.STATE_CHANGE) {\n listener(this._state)\n }\n })\n\n // Update jwt payload and state, and re-broadcast credentials update\n this.unsubscribeUpdateState = this.on(\n INTERNAL_CREDENTIALS,\n async ({ credentials, isFromOtherInstance }) => {\n if (Credentials.equals(this._credentials, credentials)) {\n return\n }\n this._credentials = credentials\n this.emit(AuthenticatorEvents.CREDENTIALS, credentials)\n if (credentials) {\n this.emit(AuthenticatorEvents.ACCESS_TOKEN, credentials.access_token)\n this._jwtPayload = decodeToken(credentials.access_token)\n this.emit(AuthenticatorEvents.JWT_PAYLOAD, this._jwtPayload)\n this._state = true\n this.emit(AuthenticatorEvents.STATE_CHANGE, this._state)\n if (isFromOtherInstance === false) {\n this.storeCredentials(credentials)\n }\n } else {\n this.emit(AuthenticatorEvents.ACCESS_TOKEN, undefined)\n this._jwtPayload = undefined\n this.emit(AuthenticatorEvents.JWT_PAYLOAD, undefined)\n this._state = false\n this.emit(AuthenticatorEvents.STATE_CHANGE, this._state)\n // Credentials are not removed from the store here as the user\n // might only be stopping the authenticator, not necessarily signin out.\n }\n }\n )\n\n this.isSetup = true\n\n return credentials\n }\n\n /**\n * Destroys the authenticator.\n * This method is called when the user signs-out.\n *\n * @returns {Promise}\n */\n async destroy(): Promise<void> {\n this.refreshTokenRunnerTimer && clearTimeout(this.refreshTokenRunnerTimer)\n\n await this.emit(INTERNAL_CREDENTIALS, { credentials: undefined, isFromOtherInstance: false })\n\n if (this.unsubscribeListenerAdded) {\n this.unsubscribeListenerAdded()\n }\n if (this.unsubscribeUpdateState) {\n this.unsubscribeUpdateState()\n }\n\n this.isSetup = false\n\n for (const [timer, reject] of this.timers.entries()) {\n clearTimeout(timer)\n reject(new Error('Authenticator is being destroyed. Wait functions are rejected.'))\n }\n this.timers.clear()\n }\n\n /**\n * Waits for the given number of milliseconds before resolving the promise.\n *\n * @param waitMilliseconds\n * @returns {Promise<void>}\n */\n private wait(waitMilliseconds: number): Promise<void> {\n try {\n this.assertIsSetup()\n } catch (err) {\n return Promise.reject(err)\n }\n return new Promise((resolve, reject) => {\n const fn = () => {\n this.timers.delete(timer)\n resolve()\n }\n const timer = setTimeout(fn, waitMilliseconds)\n this.timers.set(timer, reject)\n })\n }\n\n /**\n * Generates the login uri for OAuth authentication.\n * Supports escaux-oauth and SMG providers.\n *\n * @param {string} redirectUri - The redirect uri.\n *\n * The URL that the OAuth needs to redirect the browser to once\n * the user has authorized the request.\n *\n * @returns {Promise<string>} The authorization URI.\n *\n * The browser should be redirected to this URI.\n */\n async getLoginUrl(redirectUri: string): Promise<string> {\n this.assertIsSetup()\n const loginUrl: string = await this.api.getLoginUrl(redirectUri)\n return loginUrl\n }\n\n /**\n * Sign-in the user. Using the authorization code, an access and refresh token\n * is retrieved from the OAuth server. These are stored in an Credentials object.\n *\n * @param {string} authorizationCode - The autorization code recieved from OAuth\n * once the user has authorized the request.\n *\n * @param {string} redirectUri - The redirect uri.\n *\n * The URL that the OAuth needs to redirect the browser to once\n * the user has authorized the request.\n *\n * @returns {Promise<Credentials>} The user Crendetials\n */\n async signIn(authorizationCode: string, redirectUri: string): Promise<Credentials> {\n this.assertIsSetup()\n try {\n const credentials: Credentials = await this.api.getToken(authorizationCode, redirectUri)\n return await this._signInWithCredentials(credentials)\n } catch (error) {\n const authorizationError = new AuthorizationError(\n 'Failed to sign in with authorization code and redirect uri',\n { cause: error }\n )\n this.logger?.error(authorizationError)\n throw authorizationError\n }\n }\n\n /**\n * Signs the user out.\n *\n * @param {boolean} remote - When set to false it will not log the user out\n * from the authentication service\n *\n * @returns {Promise<void>}\n */\n async signOut(remote?: boolean, options = { exceptionOnFailure: false }): Promise<void> {\n this.assertIsSetup()\n await this.secureStorage.deleteItem(STORE_CREDENTIALS_KEY)\n if (this.removeCredentialStorageUpdates) {\n this.removeCredentialStorageUpdates()\n this.removeCredentialStorageUpdates = undefined\n }\n\n const credentials = this.credentials\n\n try {\n if (credentials && remote !== false) {\n const { refresh_token, access_token } = credentials\n await this.api.logout(refresh_token, access_token)\n } else {\n this.logger?.log('No credentials were available. No action was executed on logout.')\n }\n } catch (error) {\n const authorizationError = new AuthorizationError('Failed to sign out the user', {\n cause: error,\n })\n this.emit(AuthenticatorEvents.ERROR, authorizationError)\n this.logger?.error(authorizationError)\n if (options?.exceptionOnFailure !== false) {\n throw authorizationError\n }\n } finally {\n await this.emit(INTERNAL_CREDENTIALS, {\n credentials: undefined,\n isFromOtherInstance: false,\n })\n }\n }\n\n /**\n * On wake from sleep, we sign-in with the credentials to force the renewal of the credentials\n * if they expired during the sleep period.\n */\n public async sanityCheck(): Promise<void> {\n this.assertIsSetup()\n if (this._credentials) {\n try {\n await this._signInWithCredentials(this._credentials)\n } catch (error) {\n this.logger?.error('Failed to sign with credentials after sleep', error)\n }\n } else {\n this.logger?.info('No credentials available')\n }\n }\n\n /**\n * Indicates if there are valid credentials.\n *\n * Absent credentials or credentials which have expired are considered not valid.\n */\n public isTokenValid(): boolean {\n if (!this.credentials) {\n return false\n }\n return !this.credentials.isExpired()\n }\n\n public async signInWithCredentials(credentials: Credentials): Promise<Credentials> {\n this.assertIsSetup()\n const credentialsBackup = this._credentials\n try {\n return this._signInWithCredentials(credentials)\n } catch (error) {\n this._credentials = credentialsBackup\n throw error\n }\n }\n\n /**\n *\n * @param credentials\n * @returns {Promise<Credentials>}\n */\n private async _signInWithCredentials(\n credentials: Credentials,\n isFromOtherInstance: boolean = false\n ): Promise<Credentials> {\n this.logger?.log('signInWithCredentials')\n if (!credentials) {\n throw new Error('Invalid argument, credentials cannot be null or undefined.')\n }\n\n if (credentials?.isExpired()) {\n this._credentials = credentials\n await this.refreshTokenWithRetry()\n // _setupRefreshTokenRunner is setup in the refreshToken function\n } else {\n await this.emit(INTERNAL_CREDENTIALS, {\n credentials,\n isFromOtherInstance,\n })\n this._setupRefreshTokenRunner()\n }\n\n if (!this._credentials) {\n throw new Error('Failed to authenticate')\n }\n\n return this._credentials\n }\n\n /**\n * Sets up a timeout which will automatically refresh the token.\n *\n * The timeout is calculated based on the value of the `expires_at` property of\n * the `Credentials`, the refresh is always scheduled at 80% of the token life-time.\n *\n * When there are multiple ConnectMe instances the refresh timeout can vary\n * up to 60 seconds.\n *\n * A token will never be refreshed before at least 10 seconds.\n *\n */\n private _setupRefreshTokenRunner(): void {\n clearTimeout(this.refreshTokenRunnerTimer)\n if (!this.credentials) {\n throw new Error('Unable to start refresh token runner without credentials')\n }\n const refreshIn: number = new Date(this.credentials.expires_at).getTime() - new Date().getTime()\n const refreshTimeout: number = Math.max(\n 10_000,\n refreshIn - REFRESH_BUFFER_MILLISECONDS - this.refreshSeparationMilliseconds\n )\n this.logger?.info(\n `Setting timer to refresh token in ${Math.round(refreshTimeout / 1000)} seconds ` +\n `at ${new Date(new Date().getTime() + refreshTimeout).toTimeString()}`\n )\n this.refreshTokenRunnerTimer = setTimeout(\n async () => {\n try {\n await this.refreshToken()\n } catch (error) {\n const refreshTokenError = new RefreshTokenError(\n 'Refresh runner failed to refresh token with existing credentials',\n { cause: error }\n )\n this.emit(AuthenticatorEvents.ERROR, refreshTokenError)\n this.logger?.error(refreshTokenError)\n }\n },\n Math.min(MAX_TIMEOUT_VALUE, refreshTimeout)\n )\n }\n\n /**\n * Generate a new `access_token` and `refresh_token` using the existing `refresh_token`.\n *\n * This method ensures that no parallel requests to refreshToken are done.\n *\n * @returns {Promise<Credentials>} The new `Credentials` object.\n */\n async refreshToken(): Promise<Credentials> {\n this.assertIsSetup()\n if (this.refreshTokenPromise) {\n this.logger?.info('Refresh token already in progress: returning existing promise.')\n return await this.refreshTokenPromise\n }\n\n const lockManager = getLockManager()\n try {\n if (lockManager) {\n this.refreshTokenPromise = new Promise<Credentials>((resolve, reject) => {\n lockManager.request(\n `@dstny/scp-authenticator/refresh-token-${this.api.clientId}`,\n async () => {\n try {\n const credentials = await this._refreshToken()\n // make sure that all other tabs receive and process the local storage update\n // so that when they attempt to refresh the token, they use updated credentials\n setTimeout(() => {\n resolve(credentials)\n }, 50)\n } catch (error) {\n reject(error)\n }\n }\n )\n })\n } else {\n this.refreshTokenPromise = this._refreshToken()\n }\n return await this.refreshTokenPromise\n } finally {\n this.refreshTokenPromise = undefined\n }\n }\n\n /**\n * Attempts to refresh the credentials.\n *\n * On failure it will throw an exception.\n * This method might end up signing the user out in case the refresh token are invalid.\n * It will not sign you out in case of network issues.\n *\n * @returns\n */\n async refreshTokenWithRetry(): Promise<Credentials> {\n this.assertIsSetup()\n const MAX_DEPTH = 7\n const MAX_TIMEOUT = 30 * 1000\n for (let depth = 0; depth < MAX_DEPTH; depth++) {\n try {\n return await this.refreshToken()\n } catch (err) {\n if (depth + 1 >= MAX_DEPTH) {\n throw err\n }\n if (err instanceof TokenNetworkError) {\n await this.wait(Math.min(2 ** depth * 1000, MAX_TIMEOUT))\n } else {\n throw err\n }\n }\n }\n return await this.refreshToken()\n }\n\n /**\n * Generate a new `access_token` and `refresh_token` using the existing `refresh_token`.\n *\n * This method should only be called by `refreshToken`.\n *\n * Use `refreshToken` method if you need to refresh the token.\n *\n * @returns {Promise<Credentials>} The new `Credentials` object.\n */\n private async _refreshToken(): Promise<Credentials> {\n this.logger?.info('Starting access token refresh')\n try {\n if (!this.credentials) {\n throw new Error('Failed to refresh token. No credentials available.')\n }\n const { refresh_token, access_token } = this.credentials\n const credentials = await this.api.refreshToken(refresh_token, access_token)\n this.logger?.info('Access token refreshed successfully')\n await this.emit(INTERNAL_CREDENTIALS, {\n credentials: credentials,\n isFromOtherInstance: false,\n })\n this._setupRefreshTokenRunner()\n return credentials\n } catch (error) {\n this.logger?.error('Failed to refresh token', error)\n if (error instanceof InvalidClientError) {\n if (typeof location !== 'undefined') {\n location.reload()\n } else {\n this.logger?.warn('Location reload not supported')\n throw error\n }\n }\n if (error instanceof RefreshTokenError) {\n if (this.delegateSignOutOnRefreshFailure) {\n await this.delegateSignOutOnRefreshFailure()\n } else {\n await this.signOut(false)\n }\n }\n throw error\n }\n }\n\n /**\n * Stores the credentials in secureStorage.\n *\n * @param {Credentials} credentials - The credentials to store in the secure storage.\n */\n private async storeCredentials(credentials: Credentials): Promise<void> {\n try {\n await this.secureStorage.setItem(STORE_CREDENTIALS_KEY, JSON.stringify(credentials))\n } catch (error: any) {\n this.logger?.error('Failed to store credentials in storage', error)\n }\n }\n\n private assertIsSetup() {\n if (!this.isSetup) {\n throw new Error('Authenticator needs to be setup before it can be used.')\n }\n }\n}\n\nexport default Authenticator\n","import { Credentials } from '@dstny/scp-credentials'\nimport axios, { AxiosInstance, AxiosRequestConfig } from 'axios'\n\nexport abstract class AbstractAuthenticationApi {\n protected axiosInstance: AxiosInstance\n public abstract readonly clientId: string\n\n constructor(baseURL: string) {\n const config: AxiosRequestConfig = {\n baseURL,\n timeout: 50000,\n }\n this.axiosInstance = axios.create(config)\n }\n\n /**\n * Given a redirectUri it calculates the URL where the browser needs to be\n * redirected in other to authenticate\n *\n * @param {string} redirectUri\n * @returns {string} login url\n */\n abstract getLoginUrl(redirectUri: string): Promise<string>\n\n /**\n * Given the authorizationCode and the redirectUri this method will provide\n * credentials containing an access and refresh token\n *\n * @param {string} authorizationCode\n * @param {string} redirectUri\n * @returns {Promise<Credentials>}\n */\n abstract getToken(authorizationCode: string, redirectUri: string): Promise<Credentials>\n\n /**\n * Given a refresh token this method will provide a new set of credentials\n * containing an access token and a refresh token\n *\n * @param {string} refreshToken\n * @returns {Promise<Credentials>}\n */\n abstract refreshToken(refreshToken: string, accessToken: string): Promise<Credentials>\n\n /**\n * Given a access and refresh token, this method will logout the user from\n * the IAM\n *\n * @param {string} accessToken\n * @param {string} refreshToken\n * @returns {Promise<void>}\n */\n abstract logout(accessToken?: string, refreshToken?: string): Promise<void>\n}\n","/* eslint-disable no-async-promise-executor */\nimport { Credentials } from '@dstny/scp-credentials'\nimport { AbstractAuthenticationApi } from './AbstractAuthenticationApi'\nimport axios from 'axios'\nimport TokenNetworkError from '../errors/TokenNetworkError'\nimport RefreshTokenError from '../errors/RefreshTokenError'\nimport InvalidClientError from '../errors/InvalidClientError'\n\ntype GetTokenResponse = {\n access_token: string\n refresh_token: string\n expires_in: number\n}\n\nexport class OAuthApi extends AbstractAuthenticationApi {\n public readonly clientId: string\n public readonly scope: string\n public readonly authorizationRoute: string\n\n private readonly baseURL: string\n\n constructor(baseURL: string, clientId: string, authorizationRoute: string, scope: string) {\n super(baseURL)\n this.baseURL = baseURL\n this.clientId = clientId\n this.authorizationRoute = authorizationRoute\n this.scope = scope\n }\n\n async getLoginUrl(redirectUri: string) {\n this.axiosInstance.getUri()\n return (\n `${this.baseURL}${this.authorizationRoute}` +\n `?client_id=${encodeURIComponent(this.clientId)}` +\n '&response_type=code' +\n `&redirect_uri=${encodeURIComponent(redirectUri)}` +\n (this.scope ? `&scope=${encodeURIComponent(this.scope)}` : '')\n )\n }\n\n async getToken(authorizationCode: string, redirectUri: string): Promise<Credentials> {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n '/token',\n new URLSearchParams({\n client_id: this.clientId,\n code: authorizationCode,\n grant_type: 'authorization_code',\n redirect_uri: redirectUri,\n })\n )\n return new Credentials(data.access_token, data.refresh_token, data.expires_in)\n }\n\n async loginWithUsernamePassword(username: string, password: string): Promise<Credentials> {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n '/token',\n new URLSearchParams({\n client_id: this.clientId,\n grant_type: 'password',\n username,\n password,\n })\n )\n return new Credentials(data.access_token, data.refresh_token, data.expires_in)\n }\n\n async refreshToken(refreshToken: string, accessToken: string): Promise<Credentials> {\n try {\n const response = await this.axiosInstance.post<GetTokenResponse>(\n '/token',\n new URLSearchParams({\n client_id: this.clientId,\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n })\n )\n return new Credentials(\n response.data.access_token,\n response.data.refresh_token,\n response.data.expires_in\n )\n } catch (error) {\n if (axios.isAxiosError(error)) {\n if (error.message === 'Network Error') {\n throw new TokenNetworkError()\n }\n const statusCode = error.response?.status\n if (statusCode === 401 && error.response?.data?.error === 'unauthorized_client') {\n throw new InvalidClientError()\n }\n if (typeof statusCode === 'number' && statusCode >= 400 && statusCode < 500) {\n throw new RefreshTokenError()\n }\n }\n throw error\n }\n }\n\n async logout(_redirectUri?: string): Promise<void> {\n await this.axiosInstance.post('/logout', null, { withCredentials: true })\n }\n}\n","import { Credentials } from '@dstny/scp-credentials'\nimport { AbstractAuthenticationApi } from './AbstractAuthenticationApi'\nimport RefreshTokenError from '../errors/RefreshTokenError'\nimport TokenNetworkError from '../errors/TokenNetworkError'\nimport axios from 'axios'\nimport { decodeToken } from '../utils/jwt'\nimport InvalidClientError from '../errors/InvalidClientError'\n\ntype GetLoginUrlResponse = {\n loginUrl: string\n}\n\ntype GetTokenResponse = {\n refreshToken: string\n accessToken: string\n message: string\n status: string\n}\n\nexport class SmgAuthApi extends AbstractAuthenticationApi {\n public readonly clientId: string\n public readonly realm: string\n\n constructor(baseURL: string, realm: string, clientId: string) {\n super(baseURL)\n this.clientId = clientId\n this.realm = realm\n }\n\n async getLoginUrl(redirectUri: string) {\n const { data } = await this.axiosInstance.get<GetLoginUrlResponse>(\n `/login/getloginurl/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`\n )\n\n const baseUrl = new URL(data.loginUrl)\n // The redirect_uri provided by the SMG is inacurate, this needs to be rewritten with the actual\n // redirect uri.\n baseUrl.searchParams.set('redirect_uri', redirectUri)\n // The authentication pathname of the SMG cannot be trusted to be configured correctly.\n // Duplicate '/' characters in the authentication URL causes the authentication\n // prompt to be displayed twice. Once when coven attempts to obtain a token, and\n // again when connect me attempts to obtain a token.\n // vv\n // example: https://keycloak.development.aws.d4sp.com//auth/realms/syslab1/protocol/openid-connect/auth\n baseUrl.pathname = baseUrl.pathname.replace(/\\/\\/+/g, '/')\n\n return baseUrl.toString()\n }\n\n async getToken(authorizationCode: string, redirectUri: string): Promise<Credentials> {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n `/login/getaccesstoken/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`,\n {\n code: authorizationCode,\n redirectUri: redirectUri,\n }\n )\n const { refreshToken, accessToken } = data\n\n const { iat = 0, exp = 0 } = decodeToken(accessToken)\n const expires_in = exp - iat\n const expires_at = new Date()\n expires_at.setSeconds(expires_at.getSeconds() + expires_in)\n return new Credentials(accessToken, refreshToken, expires_in)\n }\n\n async refreshToken(refreshToken: string, accessToken: string): Promise<Credentials> {\n try {\n const { data } = await this.axiosInstance.post<GetTokenResponse>(\n `/login/refreshtoken/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`,\n {\n jwt: accessToken,\n refreshToken: refreshToken,\n }\n )\n const { refreshToken: newRefreshToken, accessToken: newAccessToken } = data\n\n const { iat = 0, exp = 0 } = decodeToken(newAccessToken)\n const expires_in = exp - iat\n return new Credentials(newAccessToken, newRefreshToken, expires_in)\n } catch (error) {\n if (axios.isAxiosError(error)) {\n if (error.message === 'Network Error') {\n throw new TokenNetworkError()\n }\n const statusCode = error.response?.status\n if (statusCode === 401 && error.response?.data?.error === 'invalid_client') {\n throw new InvalidClientError()\n }\n if (typeof statusCode === 'number' && statusCode >= 400 && statusCode < 500) {\n throw new RefreshTokenError()\n }\n }\n throw error\n }\n }\n\n async logout(refreshToken: string, accessToken: string): Promise<void> {\n await this.axiosInstance.post(\n `/login/logout/realm/${encodeURIComponent(this.realm)}/client/${encodeURIComponent(\n this.clientId\n )}`,\n {\n jwt: accessToken,\n refreshToken: refreshToken,\n }\n )\n }\n}\n\nexport default SmgAuthApi\n","import Authenticator from './Authenticator'\n\nexport * from './types'\nexport * from './events'\nexport * from './errors/AuthorizationError'\nexport * from './errors/InvalidClientError'\nexport * from './errors/RefreshTokenError'\nexport * from './errors/TokenNetworkError'\n\nexport * from './api/AbstractAuthenticationApi'\nexport * from './api/OAuthApi'\nexport * from './api/SmgAuthApi'\n\nexport default Authenticator\n"],"mappings":"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","names":["eventName","AuthenticatorEvents","credentials","axios","axios","axios","axios"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dstny/scp-authenticator",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -39,4 +39,4 @@
39
39
  "@dstny/scp-credentials",
40
40
  "@dstny/scp-storage"
41
41
  ]
42
- }
42
+ }