From 0f434a21d4f49f86889f21369025bf995e341f0e Mon Sep 17 00:00:00 2001 From: ShiKhu Date: Fri, 27 May 2022 21:25:21 +0200 Subject: [PATCH] fix(tracker): 3.5.12: resolve Promise returning on start() with success:false instead of rejecting --- tracker/tracker/README.md | 6 ++++- tracker/tracker/package.json | 2 +- tracker/tracker/src/main/app/index.ts | 39 ++++++++++++++++----------- tracker/tracker/src/main/index.ts | 4 +-- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/tracker/tracker/README.md b/tracker/tracker/README.md index bd06c1f97..c47f301dc 100644 --- a/tracker/tracker/README.md +++ b/tracker/tracker/README.md @@ -25,7 +25,11 @@ tracker.start({ balance: "10M", role: "admin", } -}); +}).then(startedSession => { + if (startedSession.success) { + console.log(startedSession) + } +}) ``` Then you can use OpenReplay JavaScript API anywhere in your code. diff --git a/tracker/tracker/package.json b/tracker/tracker/package.json index 22d39de12..fec46d597 100644 --- a/tracker/tracker/package.json +++ b/tracker/tracker/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker", "description": "The OpenReplay tracker main package", - "version": "3.5.11", + "version": "3.5.12", "keywords": [ "logging", "replay" diff --git a/tracker/tracker/src/main/app/index.ts b/tracker/tracker/src/main/app/index.ts index 2874a8867..78208722f 100644 --- a/tracker/tracker/src/main/app/index.ts +++ b/tracker/tracker/src/main/app/index.ts @@ -23,11 +23,21 @@ export interface StartOptions { forceNew?: boolean, } -export interface OnStartInfo { +interface OnStartInfo { sessionID: string, sessionToken: string, userUUID: string, } +const CANCELED = "canceled" as const +const START_ERROR = ":(" as const +type SuccessfulStart = OnStartInfo & { success: true } +type UnsuccessfulStart = { + reason: typeof CANCELED | string + success: false +} +const UnsuccessfulStart = (reason: string): UnsuccessfulStart => ({ reason, success: false}) +const SuccessfulStart = (body: OnStartInfo): SuccessfulStart => ({ ...body, success: true}) +export type StartPromiseReturn = SuccessfulStart | UnsuccessfulStart type StartCallback = (i: OnStartInfo) => void type CommitCallback = (messages: Array) => void @@ -58,7 +68,6 @@ type AppOptions = { export type Options = AppOptions & ObserverOptions & SanitizerOptions -export const CANCELED = "canceled" // TODO: use backendHost only export const DEFAULT_INGEST_POINT = 'https://api.openreplay.com/ingest'; @@ -306,12 +315,12 @@ export default class App { sessionStorage.removeItem(this.options.session_reset_key); } } - private _start(startOpts: StartOptions): Promise { + private _start(startOpts: StartOptions): Promise { if (!this.worker) { - return Promise.reject("No worker found: perhaps, CSP is not set."); + return Promise.resolve(UnsuccessfulStart("No worker found: perhaps, CSP is not set.")) } if (this.activityState !== ActivityState.NotActive) { - return Promise.reject("OpenReplay: trying to call `start()` on the instance that has been started already.") + return Promise.resolve(UnsuccessfulStart("OpenReplay: trying to call `start()` on the instance that has been started already.")) } this.activityState = ActivityState.Starting; @@ -395,24 +404,22 @@ export default class App { this.notify.log("OpenReplay tracking started."); // TODO: get rid of onStart if (typeof this.options.onStart === 'function') { - this.options.onStart(onStartInfo); + this.options.onStart(onStartInfo) } - return onStartInfo; + return SuccessfulStart(onStartInfo) }) .catch(reason => { sessionStorage.removeItem(this.options.session_token_key) this.stop() - //if (reason === CANCELED) { return Promise.resolve(CANCELED) } // TODO: what to return ????? Throwing is baad + if (reason === CANCELED) { return UnsuccessfulStart(CANCELED) } - if (reason !== CANCELED) { - this.notify.log("OpenReplay was unable to start. ", reason) - this._debug("session_start", reason) - } - return Promise.reject(reason) + this.notify.log("OpenReplay was unable to start. ", reason) + this._debug("session_start", reason) + return UnsuccessfulStart(START_ERROR) }) } - start(options: StartOptions = {}): Promise { + start(options: StartOptions = {}): Promise { if (!document.hidden) { return this._start(options); } else { @@ -420,11 +427,11 @@ export default class App { const onVisibilityChange = () => { if (!document.hidden) { document.removeEventListener("visibilitychange", onVisibilityChange); - resolve(this._start(options)); + resolve(this._start(options)) } } document.addEventListener("visibilitychange", onVisibilityChange); - }); + }) } } stop(): void { diff --git a/tracker/tracker/src/main/index.ts b/tracker/tracker/src/main/index.ts index e1b25b43b..d33ae708b 100644 --- a/tracker/tracker/src/main/index.ts +++ b/tracker/tracker/src/main/index.ts @@ -26,7 +26,7 @@ import type { Options as PerformanceOptions } from "./modules/performance.js"; import type { Options as TimingOptions } from "./modules/timing.js"; import type { StartOptions } from './app/index.js' //TODO: unique options init -import type { OnStartInfo } from './app/index.js'; +import type { StartPromiseReturn } from './app/index.js'; export type Options = Partial< AppOptions & ConsoleOptions & ExceptionOptions & InputOptions & PerformanceOptions & TimingOptions @@ -151,7 +151,7 @@ export default class API { return this.app.active(); } - start(startOpts?: Partial) : Promise { + start(startOpts?: Partial) : Promise { if (!IN_BROWSER) { console.error(`OpenReplay: you are trying to start Tracker on a node.js environment. If you want to use OpenReplay with SSR, please, use componentDidMount or useEffect API for placing the \`tracker.start()\` line. Check documentation on ${DOCS_HOST}${DOCS_SETUP}`) return Promise.reject("Trying to start not in browser.");