From c613c891801c15861d469e6147bae2326bcec985 Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Wed, 6 Nov 2024 12:06:43 -0600 Subject: [PATCH 01/16] refactor debug --- .../signals/src/core/debug-mode/index.ts | 16 ++++++- .../signals/src/core/signals/settings.ts | 48 ++++++++----------- .../signals/src/core/signals/signals.ts | 5 ++ .../signals/signals/src/lib/logger/index.ts | 44 ++++++++++++++--- .../signals/src/plugin/signals-plugin.ts | 12 ++++- 5 files changed, 89 insertions(+), 36 deletions(-) diff --git a/packages/signals/signals/src/core/debug-mode/index.ts b/packages/signals/signals/src/core/debug-mode/index.ts index ba3769efe..42e7f9796 100644 --- a/packages/signals/signals/src/core/debug-mode/index.ts +++ b/packages/signals/signals/src/core/debug-mode/index.ts @@ -5,7 +5,21 @@ export const parseDebugModeQueryString = (): boolean | undefined => { const queryParams = new URLSearchParams(window.location.search) - const val = queryParams.get('segment_signals_debug') + const val = + queryParams.get('segment_signals_debug') || + queryParams.get('seg_signals_debug') + if (val === 'true' || val === 'false') { + return val === 'true' + } + return undefined +} + +export const parseDebugLoggingQueryString = (): boolean | undefined => { + const queryParams = new URLSearchParams(window.location.search) + + const val = + queryParams.get('segment_signals_logging') || + queryParams.get('seg_signals_logging') if (val === 'true' || val === 'false') { return val === 'true' } diff --git a/packages/signals/signals/src/core/signals/settings.ts b/packages/signals/signals/src/core/signals/settings.ts index 6b6a96e3a..8ae55e202 100644 --- a/packages/signals/signals/src/core/signals/settings.ts +++ b/packages/signals/signals/src/core/signals/settings.ts @@ -33,9 +33,9 @@ export class SignalGlobalSettings { signalBuffer: SignalBufferSettingsConfig ingestClient: SignalsIngestSettingsConfig network: NetworkSettingsConfig + signalsDebug: SignalsDebugSettings private sampleSuccess = false - private signalsDebug = new SignalsDebugSettings() constructor(settings: SignalsSettingsConfig) { if (settings.maxBufferSize && settings.signalStorage) { @@ -110,9 +110,11 @@ export class SignalGlobalSettings { } } -class SignalsDebugSettings { +export class SignalsDebugSettings { + private storageType = 'sessionStorage' as const private static redactionKey = 'segment_signals_debug_redaction_disabled' private static ingestionKey = 'segment_signals_debug_ingestion_enabled' + constructor(disableRedaction?: boolean, enableIngestion?: boolean) { if (typeof disableRedaction === 'boolean') { this.setDebugKey(SignalsDebugSettings.redactionKey, disableRedaction) @@ -121,21 +123,22 @@ class SignalsDebugSettings { this.setDebugKey(SignalsDebugSettings.ingestionKey, enableIngestion) } - // setting ?segment_signals_debug=true will disable redaction, enable ingestion, and set keys in local storage - // this setting will persist across page loads (even if there is no query string) - // in order to clear the setting, user must set ?segment_signals_debug=false const debugModeInQs = parseDebugModeQueryString() logger.debug('debugMode is set to true via query string') if (typeof debugModeInQs === 'boolean') { - this.setDebugKey(SignalsDebugSettings.redactionKey, debugModeInQs) - this.setDebugKey(SignalsDebugSettings.ingestionKey, debugModeInQs) + this.setAllDebugging(debugModeInQs) } } - setDebugKey(key: string, enable: boolean) { + setAllDebugging(boolean: boolean) { + this.setDebugKey(SignalsDebugSettings.redactionKey, boolean) + this.setDebugKey(SignalsDebugSettings.ingestionKey, boolean) + } + + private setDebugKey(key: string, enable: boolean) { try { if (enable) { - window.sessionStorage.setItem(key, 'true') + window[this.storageType].setItem(key, 'true') } else { logger.debug(`Removing debug key ${key} from storage`) window.sessionStorage.removeItem(key) @@ -145,13 +148,11 @@ class SignalsDebugSettings { } } - getDisableSignalsRedaction() { + private getDebugKey(key: string): boolean { try { - const isEnabled = Boolean( - window.sessionStorage.getItem(SignalsDebugSettings.redactionKey) - ) + const isEnabled = Boolean(window[this.storageType].getItem(key)) if (isEnabled) { - logger.debug(`${SignalsDebugSettings.redactionKey}=true (app. storage)`) + logger.debug(`${key}=true (app. storage)`) return true } } catch (e) { @@ -160,18 +161,11 @@ class SignalsDebugSettings { return false } - getEnableSignalsIngestion() { - try { - const isEnabled = Boolean( - window.sessionStorage.getItem(SignalsDebugSettings.ingestionKey) - ) - if (isEnabled) { - logger.debug(`${SignalsDebugSettings.ingestionKey}=true (app. storage)`) - return true - } - } catch (e) { - logger.debug('Storage error', e) - } - return false + getDisableSignalsRedaction(): boolean { + return this.getDebugKey(SignalsDebugSettings.redactionKey) + } + + getEnableSignalsIngestion(): boolean { + return this.getDebugKey(SignalsDebugSettings.ingestionKey) } } diff --git a/packages/signals/signals/src/core/signals/signals.ts b/packages/signals/signals/src/core/signals/signals.ts index 207ace283..cd90b9890 100644 --- a/packages/signals/signals/src/core/signals/signals.ts +++ b/packages/signals/signals/src/core/signals/signals.ts @@ -129,6 +129,11 @@ export class Signals implements ISignals { void this.buffer.clear() } + debug() { + this.globalSettings.signalsDebug.setDebugMode(true) + logger.enableDebugLogging() + } + /** * Emit custom signals. */ diff --git a/packages/signals/signals/src/lib/logger/index.ts b/packages/signals/signals/src/lib/logger/index.ts index a8e0923e8..fdd30e6df 100644 --- a/packages/signals/signals/src/lib/logger/index.ts +++ b/packages/signals/signals/src/lib/logger/index.ts @@ -1,15 +1,47 @@ +import { parseDebugLoggingQueryString } from '../../core/debug-mode' + class Logger { - globalKey = 'SEGMENT_SIGNALS_DEBUG' - get debugLoggingEnabled() { - return (window as any)[this.globalKey] === true + private static loggingKey = 'segment_signals_debug_logging_enabled' + constructor() { + const val = parseDebugLoggingQueryString() + if (typeof val === 'boolean') { + this.setDebugKey(Logger.loggingKey, val) + } + } + + private debugLoggingEnabled(): boolean { + try { + const isEnabled = Boolean( + window.sessionStorage.getItem(Logger.loggingKey) + ) + if (isEnabled) { + return true + } + } catch (e) { + logger.debug('Storage error', e) + } + return false + } + + private setDebugKey(key: string, enable: boolean) { + try { + if (enable) { + window.sessionStorage.setItem(key, 'true') + } else { + logger.debug(`Removing debug key ${key} from storage`) + window.sessionStorage.removeItem(key) + } + } catch (e) { + logger.debug('Storage error', e) + } } - enableDebugLogging() { - ;(window as any)[this.globalKey] = true + enableDebugLogging(bool = true) { + this.setDebugKey(Logger.loggingKey, bool) } debug(...args: any[]): void { - if (this.debugLoggingEnabled) { + if (this.debugLoggingEnabled()) { console.log('[signals debug]', ...args) } } diff --git a/packages/signals/signals/src/plugin/signals-plugin.ts b/packages/signals/signals/src/plugin/signals-plugin.ts index 4992bd32a..c1a606874 100644 --- a/packages/signals/signals/src/plugin/signals-plugin.ts +++ b/packages/signals/signals/src/plugin/signals-plugin.ts @@ -1,5 +1,5 @@ import type { Plugin } from '@segment/analytics-next' -import { Signals } from '../core/signals' +import { Signals, SignalsDebugSettings } from '../core/signals' import { logger } from '../lib/logger' import { AnyAnalytics, SignalsPluginSettingsConfig } from '../types' import { Signal } from '@segment/analytics-signals-runtime' @@ -26,12 +26,16 @@ export class SignalsPlugin implements Plugin, SignalsAugmentedFunctionality { readonly name = 'SignalsPlugin' readonly version = version public signals: Signals - constructor(settings: SignalsPluginSettingsConfig = {}) { assertBrowserEnv() + + // assign to window for debugging purposes + Object.assign(window, { SegmentSignalsPlugin: this }) + if (settings.enableDebugLogging) { logger.enableDebugLogging() } + logger.debug('SignalsPlugin initializing', { settings }) this.signals = new Signals({ @@ -79,4 +83,8 @@ export class SignalsPlugin implements Plugin, SignalsAugmentedFunctionality { this.signals.signalEmitter.emit(signal) return this } + + debug(enable = true) { + this.signals.debug(enable) + } } From f3df5df21b3cc31774725e2c515020983ce49958 Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Wed, 6 Nov 2024 12:22:04 -0600 Subject: [PATCH 02/16] wip --- .../signals/signals/src/core/signals/signals.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/signals/signals/src/core/signals/signals.ts b/packages/signals/signals/src/core/signals/signals.ts index cd90b9890..740223fe1 100644 --- a/packages/signals/signals/src/core/signals/signals.ts +++ b/packages/signals/signals/src/core/signals/signals.ts @@ -129,9 +129,17 @@ export class Signals implements ISignals { void this.buffer.clear() } - debug() { - this.globalSettings.signalsDebug.setDebugMode(true) - logger.enableDebugLogging() + debug({ logSignalsOnly = false } = {}): void { + this.globalSettings.signalsDebug.setAllDebugging(true) + if (logSignalsOnly) { + this.signalEmitter.subscribe((signal) => { + console.log('[signals debug]', signal.type, signal.data, { + buffer: this.buffer, + }) + }) + } else { + logger.enableDebugLogging() + } } /** From 48e8703105178fd1232377804f9e8d84ff0c2f14 Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Wed, 6 Nov 2024 12:34:13 -0600 Subject: [PATCH 03/16] wip --- packages/signals/signals/src/plugin/signals-plugin.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/signals/signals/src/plugin/signals-plugin.ts b/packages/signals/signals/src/plugin/signals-plugin.ts index c1a606874..8342a7974 100644 --- a/packages/signals/signals/src/plugin/signals-plugin.ts +++ b/packages/signals/signals/src/plugin/signals-plugin.ts @@ -36,7 +36,9 @@ export class SignalsPlugin implements Plugin, SignalsAugmentedFunctionality { logger.enableDebugLogging() } - logger.debug('SignalsPlugin initializing', { settings }) + logger.debug(`SignalsPlugin v${version} initializing`, { + settings, + }) this.signals = new Signals({ disableSignalsRedaction: settings.disableSignalsRedaction, From 9f5ca1753014dbe58556cceab3ac39d97e47271c Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:13:42 -0600 Subject: [PATCH 04/16] wip --- .../signals/signals/src/core/emitter/index.ts | 2 +- .../signals/src/core/signals/settings.ts | 10 ++++---- .../signals/src/core/signals/signals.ts | 21 +++++++++-------- .../signals/signals/src/lib/logger/index.ts | 23 ++++++++++--------- .../signals/src/plugin/signals-plugin.ts | 9 +++++--- 5 files changed, 35 insertions(+), 30 deletions(-) diff --git a/packages/signals/signals/src/core/emitter/index.ts b/packages/signals/signals/src/core/emitter/index.ts index 47959bdcc..fd7d18e98 100644 --- a/packages/signals/signals/src/core/emitter/index.ts +++ b/packages/signals/signals/src/core/emitter/index.ts @@ -10,7 +10,7 @@ export class SignalEmitter implements EmitSignal { private emitter = new Emitter<{ add: [Signal] }>() emit(signal: Signal) { - logger.debug('new signal emitted', signal) + logger.debug('New signal:', signal.type, signal.data) this.emitter.emit('add', signal) } diff --git a/packages/signals/signals/src/core/signals/settings.ts b/packages/signals/signals/src/core/signals/settings.ts index 8ae55e202..428d0c5a7 100644 --- a/packages/signals/signals/src/core/signals/settings.ts +++ b/packages/signals/signals/src/core/signals/settings.ts @@ -130,12 +130,12 @@ export class SignalsDebugSettings { } } - setAllDebugging(boolean: boolean) { + setAllDebugging = (boolean: boolean) => { this.setDebugKey(SignalsDebugSettings.redactionKey, boolean) this.setDebugKey(SignalsDebugSettings.ingestionKey, boolean) } - private setDebugKey(key: string, enable: boolean) { + private setDebugKey = (key: string, enable: boolean): void => { try { if (enable) { window[this.storageType].setItem(key, 'true') @@ -148,7 +148,7 @@ export class SignalsDebugSettings { } } - private getDebugKey(key: string): boolean { + private getDebugKey = (key: string): boolean => { try { const isEnabled = Boolean(window[this.storageType].getItem(key)) if (isEnabled) { @@ -161,11 +161,11 @@ export class SignalsDebugSettings { return false } - getDisableSignalsRedaction(): boolean { + getDisableSignalsRedaction = (): boolean => { return this.getDebugKey(SignalsDebugSettings.redactionKey) } - getEnableSignalsIngestion(): boolean { + getEnableSignalsIngestion = (): boolean => { return this.getDebugKey(SignalsDebugSettings.ingestionKey) } } diff --git a/packages/signals/signals/src/core/signals/signals.ts b/packages/signals/signals/src/core/signals/signals.ts index 740223fe1..c1c2e29f4 100644 --- a/packages/signals/signals/src/core/signals/signals.ts +++ b/packages/signals/signals/src/core/signals/signals.ts @@ -129,17 +129,18 @@ export class Signals implements ISignals { void this.buffer.clear() } - debug({ logSignalsOnly = false } = {}): void { + /** + * Disable redaction and enable ingestion of signals. + */ + debug(): void { this.globalSettings.signalsDebug.setAllDebugging(true) - if (logSignalsOnly) { - this.signalEmitter.subscribe((signal) => { - console.log('[signals debug]', signal.type, signal.data, { - buffer: this.buffer, - }) - }) - } else { - logger.enableDebugLogging() - } + } + + /** + * Log signals to the console. + */ + enableDebugLogging(): void { + this.enableDebugLogging() } /** diff --git a/packages/signals/signals/src/lib/logger/index.ts b/packages/signals/signals/src/lib/logger/index.ts index fdd30e6df..372c90281 100644 --- a/packages/signals/signals/src/lib/logger/index.ts +++ b/packages/signals/signals/src/lib/logger/index.ts @@ -1,7 +1,9 @@ import { parseDebugLoggingQueryString } from '../../core/debug-mode' class Logger { - private static loggingKey = 'segment_signals_debug_logging_enabled' + private storageType = 'sessionStorage' as const + private static loggingKey = 'segment_signals_debug_logging' + public signalsOnly = false constructor() { const val = parseDebugLoggingQueryString() if (typeof val === 'boolean') { @@ -9,38 +11,37 @@ class Logger { } } - private debugLoggingEnabled(): boolean { + private debugLoggingEnabled = (): boolean => { try { const isEnabled = Boolean( - window.sessionStorage.getItem(Logger.loggingKey) + globalThis[this.storageType].getItem(Logger.loggingKey) ) if (isEnabled) { return true } } catch (e) { - logger.debug('Storage error', e) + console.warn('Storage error', e) } return false } - private setDebugKey(key: string, enable: boolean) { + private setDebugKey = (key: string, enable: boolean) => { try { if (enable) { - window.sessionStorage.setItem(key, 'true') + globalThis[this.storageType].setItem(key, 'true') } else { - logger.debug(`Removing debug key ${key} from storage`) - window.sessionStorage.removeItem(key) + globalThis[this.storageType].removeItem(key) } } catch (e) { - logger.debug('Storage error', e) + console.warn('Storage error', e) } } - enableDebugLogging(bool = true) { + enableDebugLogging = (bool = true) => { this.setDebugKey(Logger.loggingKey, bool) } - debug(...args: any[]): void { + debug = (...args: any[]): void => { if (this.debugLoggingEnabled()) { console.log('[signals debug]', ...args) } diff --git a/packages/signals/signals/src/plugin/signals-plugin.ts b/packages/signals/signals/src/plugin/signals-plugin.ts index 8342a7974..31acf8acb 100644 --- a/packages/signals/signals/src/plugin/signals-plugin.ts +++ b/packages/signals/signals/src/plugin/signals-plugin.ts @@ -1,5 +1,5 @@ import type { Plugin } from '@segment/analytics-next' -import { Signals, SignalsDebugSettings } from '../core/signals' +import { Signals } from '../core/signals' import { logger } from '../lib/logger' import { AnyAnalytics, SignalsPluginSettingsConfig } from '../types' import { Signal } from '@segment/analytics-signals-runtime' @@ -86,7 +86,10 @@ export class SignalsPlugin implements Plugin, SignalsAugmentedFunctionality { return this } - debug(enable = true) { - this.signals.debug(enable) + /** + * Turn on debug logging for signals + */ + debug() { + this.signals.debug() } } From 537dbd331d44c8127c0c3b63cd47819e0249df32 Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:17:04 -0600 Subject: [PATCH 05/16] wip --- packages/signals/signals/src/core/signals/signals.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/signals/signals/src/core/signals/signals.ts b/packages/signals/signals/src/core/signals/signals.ts index c1c2e29f4..5d49c1654 100644 --- a/packages/signals/signals/src/core/signals/signals.ts +++ b/packages/signals/signals/src/core/signals/signals.ts @@ -135,14 +135,7 @@ export class Signals implements ISignals { debug(): void { this.globalSettings.signalsDebug.setAllDebugging(true) } - - /** - * Log signals to the console. - */ - enableDebugLogging(): void { - this.enableDebugLogging() - } - + x /** * Emit custom signals. */ From abf86c1ea126451cfb072317ee2b2237e5da24b5 Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:17:19 -0600 Subject: [PATCH 06/16] wip --- packages/signals/signals/src/core/signals/signals.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/signals/signals/src/core/signals/signals.ts b/packages/signals/signals/src/core/signals/signals.ts index 5d49c1654..e2569f5ec 100644 --- a/packages/signals/signals/src/core/signals/signals.ts +++ b/packages/signals/signals/src/core/signals/signals.ts @@ -135,7 +135,14 @@ export class Signals implements ISignals { debug(): void { this.globalSettings.signalsDebug.setAllDebugging(true) } - x + + /** + * Log signals to the console. + */ + enableDebugLogging(): void { + logger.enableDebugLogging() + } + /** * Emit custom signals. */ From 6f312f3c3d6eff288a87012bb94b5abcdc88522f Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:36:58 -0600 Subject: [PATCH 07/16] wip --- packages/signals/signals/src/core/signals/signals.ts | 10 ++++++++-- packages/signals/signals/src/lib/logger/index.ts | 4 ++++ packages/signals/signals/src/plugin/signals-plugin.ts | 6 ++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/signals/signals/src/core/signals/signals.ts b/packages/signals/signals/src/core/signals/signals.ts index e2569f5ec..c175c8efe 100644 --- a/packages/signals/signals/src/core/signals/signals.ts +++ b/packages/signals/signals/src/core/signals/signals.ts @@ -139,8 +139,14 @@ export class Signals implements ISignals { /** * Log signals to the console. */ - enableDebugLogging(): void { - logger.enableDebugLogging() + enableDebugLogging({ signalsOnly } = { signalsOnly: true }): void { + if (signalsOnly) { + this.signalEmitter.subscribe((signal) => { + logger.log(signal.type, signal.data) + }) + } else { + logger.enableDebugLogging() + } } /** diff --git a/packages/signals/signals/src/lib/logger/index.ts b/packages/signals/signals/src/lib/logger/index.ts index 372c90281..036090a46 100644 --- a/packages/signals/signals/src/lib/logger/index.ts +++ b/packages/signals/signals/src/lib/logger/index.ts @@ -41,6 +41,10 @@ class Logger { this.setDebugKey(Logger.loggingKey, bool) } + log = (...args: any[]): void => { + console.log('[signals]', ...args) + } + debug = (...args: any[]): void => { if (this.debugLoggingEnabled()) { console.log('[signals debug]', ...args) diff --git a/packages/signals/signals/src/plugin/signals-plugin.ts b/packages/signals/signals/src/plugin/signals-plugin.ts index 31acf8acb..341bbb4f4 100644 --- a/packages/signals/signals/src/plugin/signals-plugin.ts +++ b/packages/signals/signals/src/plugin/signals-plugin.ts @@ -92,4 +92,10 @@ export class SignalsPlugin implements Plugin, SignalsAugmentedFunctionality { debug() { this.signals.debug() } + + enableDebugLogging( + ...args: Parameters + ) { + this.signals.enableDebugLogging(...args) + } } From 4689ec3e21aff6e9ef3da58e19bb7c007ae23459 Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:39:32 -0600 Subject: [PATCH 08/16] wip --- packages/signals/signals/src/plugin/signals-plugin.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/signals/signals/src/plugin/signals-plugin.ts b/packages/signals/signals/src/plugin/signals-plugin.ts index 341bbb4f4..952988b63 100644 --- a/packages/signals/signals/src/plugin/signals-plugin.ts +++ b/packages/signals/signals/src/plugin/signals-plugin.ts @@ -87,12 +87,15 @@ export class SignalsPlugin implements Plugin, SignalsAugmentedFunctionality { } /** - * Turn on debug logging for signals + * Enable redaction and disable ingestion of signals. */ debug() { this.signals.debug() } + /** + * Log signals to the console. + */ enableDebugLogging( ...args: Parameters ) { From 3f1063015c764e98e7d282646e9cf509676e4f7a Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:40:53 -0600 Subject: [PATCH 09/16] wip --- packages/signals/signals/src/core/signals/signals.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/signals/signals/src/core/signals/signals.ts b/packages/signals/signals/src/core/signals/signals.ts index c175c8efe..537fda055 100644 --- a/packages/signals/signals/src/core/signals/signals.ts +++ b/packages/signals/signals/src/core/signals/signals.ts @@ -150,7 +150,7 @@ export class Signals implements ISignals { } /** - * Emit custom signals. + * Register custom signal generators to emit signals. */ async registerGenerator( generators: (SignalGeneratorClass | SignalGenerator)[] From 538cce04c17ba6fb941fe4a3a638cbe7eb3b8704 Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:53:15 -0600 Subject: [PATCH 10/16] wip --- packages/signals/signals/src/lib/logger/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/signals/signals/src/lib/logger/index.ts b/packages/signals/signals/src/lib/logger/index.ts index 036090a46..5e8b13c10 100644 --- a/packages/signals/signals/src/lib/logger/index.ts +++ b/packages/signals/signals/src/lib/logger/index.ts @@ -3,7 +3,7 @@ import { parseDebugLoggingQueryString } from '../../core/debug-mode' class Logger { private storageType = 'sessionStorage' as const private static loggingKey = 'segment_signals_debug_logging' - public signalsOnly = false + constructor() { const val = parseDebugLoggingQueryString() if (typeof val === 'boolean') { From e107a9830fa0eb3984cde0fd9bc9ffcb5b378634 Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:07:59 -0600 Subject: [PATCH 11/16] wip --- .../signals/signals/src/core/emitter/index.ts | 16 +++++++++++--- .../signals/src/core/signals/settings.ts | 6 +++++ .../signals/src/core/signals/signals.ts | 22 ++++++------------- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/packages/signals/signals/src/core/emitter/index.ts b/packages/signals/signals/src/core/emitter/index.ts index fd7d18e98..74773cbfb 100644 --- a/packages/signals/signals/src/core/emitter/index.ts +++ b/packages/signals/signals/src/core/emitter/index.ts @@ -8,19 +8,29 @@ export interface EmitSignal { export class SignalEmitter implements EmitSignal { private emitter = new Emitter<{ add: [Signal] }>() + private listeners = new Set<(signal: Signal) => void>() emit(signal: Signal) { logger.debug('New signal:', signal.type, signal.data) this.emitter.emit('add', signal) } - subscribe(broadcaster: (signal: Signal) => void) { - logger.debug('subscribed') - this.emitter.on('add', broadcaster) + subscribe(listener: (signal: Signal) => void) { + // Prevent duplicate subscriptions + if (!this.listeners.has(listener)) { + logger.debug('subscribed') + this.listeners.add(listener) + } + this.emitter.on('add', listener) } unsubscribe(listener: (signal: Signal) => void) { + this.listeners.delete(listener) logger.debug('unsubscribed') this.emitter.off('add', listener) } + + once(listener: (signal: Signal) => void) { + this.emitter.once('add', listener) + } } diff --git a/packages/signals/signals/src/core/signals/settings.ts b/packages/signals/signals/src/core/signals/settings.ts index 428d0c5a7..e884632e4 100644 --- a/packages/signals/signals/src/core/signals/settings.ts +++ b/packages/signals/signals/src/core/signals/settings.ts @@ -114,6 +114,7 @@ export class SignalsDebugSettings { private storageType = 'sessionStorage' as const private static redactionKey = 'segment_signals_debug_redaction_disabled' private static ingestionKey = 'segment_signals_debug_ingestion_enabled' + private static logSignals = 'segment_signals_debug_log_signals_enabled' constructor(disableRedaction?: boolean, enableIngestion?: boolean) { if (typeof disableRedaction === 'boolean') { @@ -133,6 +134,7 @@ export class SignalsDebugSettings { setAllDebugging = (boolean: boolean) => { this.setDebugKey(SignalsDebugSettings.redactionKey, boolean) this.setDebugKey(SignalsDebugSettings.ingestionKey, boolean) + this.setDebugKey(SignalsDebugSettings.logSignals, boolean) } private setDebugKey = (key: string, enable: boolean): void => { @@ -168,4 +170,8 @@ export class SignalsDebugSettings { getEnableSignalsIngestion = (): boolean => { return this.getDebugKey(SignalsDebugSettings.ingestionKey) } + + getEnableLogSignals = (): boolean => { + return this.getDebugKey(SignalsDebugSettings.logSignals) + } } diff --git a/packages/signals/signals/src/core/signals/signals.ts b/packages/signals/signals/src/core/signals/signals.ts index 537fda055..42d7e41b5 100644 --- a/packages/signals/signals/src/core/signals/signals.ts +++ b/packages/signals/signals/src/core/signals/signals.ts @@ -129,24 +129,16 @@ export class Signals implements ISignals { void this.buffer.clear() } - /** - * Disable redaction and enable ingestion of signals. - */ - debug(): void { - this.globalSettings.signalsDebug.setAllDebugging(true) + // create a reference so we prevent duplicate subscriptions + private logSignal = (signal: Signal) => { + logger.log(signal.type, signal.data, signal.metadata) } - /** - * Log signals to the console. + * Disable redaction, ingestion of signals, and other debug logging. */ - enableDebugLogging({ signalsOnly } = { signalsOnly: true }): void { - if (signalsOnly) { - this.signalEmitter.subscribe((signal) => { - logger.log(signal.type, signal.data) - }) - } else { - logger.enableDebugLogging() - } + debug(boolean = true): void { + this.globalSettings.signalsDebug.setAllDebugging(boolean) + this.signalEmitter.subscribe(this.logSignal) } /** From 81fd5531a78867b8df1c11fa208dc0f23cefb8c1 Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:48:51 -0600 Subject: [PATCH 12/16] add debug --- packages/signals/signals/README.md | 10 ++++ .../signals/src/core/debug-mode/index.ts | 11 ++-- .../signals/signals/src/core/emitter/index.ts | 13 ++++- .../signals/src/core/signals/settings.ts | 54 +++++++------------ .../signals/src/core/signals/signals.ts | 10 ++-- .../signals/signals/src/lib/logger/index.ts | 38 ++++--------- .../signals/src/lib/storage/debug-storage.ts | 29 ++++++++++ 7 files changed, 89 insertions(+), 76 deletions(-) create mode 100644 packages/signals/signals/src/lib/storage/debug-storage.ts diff --git a/packages/signals/signals/README.md b/packages/signals/signals/README.md index f63eeb0de..1ca8632b4 100644 --- a/packages/signals/signals/README.md +++ b/packages/signals/signals/README.md @@ -77,6 +77,14 @@ You can *turn off debugging* by doing: https://my-website.com?segment_signals_debug=false ``` +* This also logs all signals to the js console. + +#### Alternative method of enabling debug mode +In your JS console: +```js +SegmentSignalsPlugin.debug() +``` + ### Advanced #### Listening to signals @@ -109,3 +117,5 @@ Network signals emit when an HTTP Request is made, or an HTTP Response is receiv - First party domain (e.g if on `foo.com`, then `foo.com/api/products`, but not `bar.com/api/products`) - Contains the content-type: `application/json` + + diff --git a/packages/signals/signals/src/core/debug-mode/index.ts b/packages/signals/signals/src/core/debug-mode/index.ts index 42e7f9796..e0809d848 100644 --- a/packages/signals/signals/src/core/debug-mode/index.ts +++ b/packages/signals/signals/src/core/debug-mode/index.ts @@ -14,12 +14,17 @@ export const parseDebugModeQueryString = (): boolean | undefined => { return undefined } -export const parseDebugLoggingQueryString = (): boolean | undefined => { +/** + * This turns on advanced logging for signals! + */ +export const parseSignalsLoggingAdvancedQueryString = (): + | boolean + | undefined => { const queryParams = new URLSearchParams(window.location.search) const val = - queryParams.get('segment_signals_logging') || - queryParams.get('seg_signals_logging') + queryParams.get('segment_signals_logging_advanced') || + queryParams.get('seg_signals_logging_advanced') if (val === 'true' || val === 'false') { return val === 'true' } diff --git a/packages/signals/signals/src/core/emitter/index.ts b/packages/signals/signals/src/core/emitter/index.ts index 74773cbfb..cd7880639 100644 --- a/packages/signals/signals/src/core/emitter/index.ts +++ b/packages/signals/signals/src/core/emitter/index.ts @@ -6,12 +6,21 @@ export interface EmitSignal { emit: (signal: Signal) => void } +interface SignalEmitterSettings { + shouldLogSignals: () => boolean +} + export class SignalEmitter implements EmitSignal { private emitter = new Emitter<{ add: [Signal] }>() private listeners = new Set<(signal: Signal) => void>() - + private settings?: SignalEmitterSettings + constructor(settings?: SignalEmitterSettings) { + this.settings = settings + } emit(signal: Signal) { - logger.debug('New signal:', signal.type, signal.data) + if (this.settings?.shouldLogSignals()) { + logger.log('New signal:', signal.type, signal.data) + } this.emitter.emit('add', signal) } diff --git a/packages/signals/signals/src/core/signals/settings.ts b/packages/signals/signals/src/core/signals/settings.ts index e884632e4..322cd5a02 100644 --- a/packages/signals/signals/src/core/signals/settings.ts +++ b/packages/signals/signals/src/core/signals/settings.ts @@ -5,6 +5,7 @@ import { SignalsIngestSettingsConfig } from '../client' import { SandboxSettingsConfig } from '../processor/sandbox' import { NetworkSettingsConfig } from '../signal-generators/network-gen' import { SignalsPluginSettingsConfig } from '../../types' +import { DebugStorage } from '../../lib/storage/debug-storage' export type SignalsSettingsConfig = Pick< SignalsPluginSettingsConfig, @@ -111,17 +112,24 @@ export class SignalGlobalSettings { } export class SignalsDebugSettings { - private storageType = 'sessionStorage' as const private static redactionKey = 'segment_signals_debug_redaction_disabled' private static ingestionKey = 'segment_signals_debug_ingestion_enabled' - private static logSignals = 'segment_signals_debug_log_signals_enabled' + private static logSignals = 'segment_signals_log_signals_enabled' + storage: DebugStorage constructor(disableRedaction?: boolean, enableIngestion?: boolean) { + this.storage = new DebugStorage('sessionStorage') if (typeof disableRedaction === 'boolean') { - this.setDebugKey(SignalsDebugSettings.redactionKey, disableRedaction) + this.storage.setDebugKey( + SignalsDebugSettings.redactionKey, + disableRedaction + ) } if (typeof enableIngestion === 'boolean') { - this.setDebugKey(SignalsDebugSettings.ingestionKey, enableIngestion) + this.storage.setDebugKey( + SignalsDebugSettings.ingestionKey, + enableIngestion + ) } const debugModeInQs = parseDebugModeQueryString() @@ -132,46 +140,20 @@ export class SignalsDebugSettings { } setAllDebugging = (boolean: boolean) => { - this.setDebugKey(SignalsDebugSettings.redactionKey, boolean) - this.setDebugKey(SignalsDebugSettings.ingestionKey, boolean) - this.setDebugKey(SignalsDebugSettings.logSignals, boolean) - } - - private setDebugKey = (key: string, enable: boolean): void => { - try { - if (enable) { - window[this.storageType].setItem(key, 'true') - } else { - logger.debug(`Removing debug key ${key} from storage`) - window.sessionStorage.removeItem(key) - } - } catch (e) { - logger.debug('Storage error', e) - } - } - - private getDebugKey = (key: string): boolean => { - try { - const isEnabled = Boolean(window[this.storageType].getItem(key)) - if (isEnabled) { - logger.debug(`${key}=true (app. storage)`) - return true - } - } catch (e) { - logger.debug('Storage error', e) - } - return false + this.storage.setDebugKey(SignalsDebugSettings.redactionKey, boolean) + this.storage.setDebugKey(SignalsDebugSettings.ingestionKey, boolean) + this.storage.setDebugKey(SignalsDebugSettings.logSignals, boolean) } getDisableSignalsRedaction = (): boolean => { - return this.getDebugKey(SignalsDebugSettings.redactionKey) + return this.storage.getDebugKey(SignalsDebugSettings.redactionKey) } getEnableSignalsIngestion = (): boolean => { - return this.getDebugKey(SignalsDebugSettings.ingestionKey) + return this.storage.getDebugKey(SignalsDebugSettings.ingestionKey) } getEnableLogSignals = (): boolean => { - return this.getDebugKey(SignalsDebugSettings.logSignals) + return this.storage.getDebugKey(SignalsDebugSettings.logSignals) } } diff --git a/packages/signals/signals/src/core/signals/signals.ts b/packages/signals/signals/src/core/signals/signals.ts index 42d7e41b5..26bb54274 100644 --- a/packages/signals/signals/src/core/signals/signals.ts +++ b/packages/signals/signals/src/core/signals/signals.ts @@ -38,7 +38,10 @@ export class Signals implements ISignals { private globalSettings: SignalGlobalSettings constructor(settingsConfig: SignalsSettingsConfig = {}) { this.globalSettings = new SignalGlobalSettings(settingsConfig) - this.signalEmitter = new SignalEmitter() + this.signalEmitter = new SignalEmitter({ + shouldLogSignals: () => + this.globalSettings.signalsDebug.getEnableLogSignals(), + }) this.signalsClient = new SignalsIngestClient( this.globalSettings.ingestClient ) @@ -129,16 +132,11 @@ export class Signals implements ISignals { void this.buffer.clear() } - // create a reference so we prevent duplicate subscriptions - private logSignal = (signal: Signal) => { - logger.log(signal.type, signal.data, signal.metadata) - } /** * Disable redaction, ingestion of signals, and other debug logging. */ debug(boolean = true): void { this.globalSettings.signalsDebug.setAllDebugging(boolean) - this.signalEmitter.subscribe(this.logSignal) } /** diff --git a/packages/signals/signals/src/lib/logger/index.ts b/packages/signals/signals/src/lib/logger/index.ts index 5e8b13c10..0fb5c04e0 100644 --- a/packages/signals/signals/src/lib/logger/index.ts +++ b/packages/signals/signals/src/lib/logger/index.ts @@ -1,48 +1,28 @@ -import { parseDebugLoggingQueryString } from '../../core/debug-mode' +import { parseSignalsLoggingAdvancedQueryString } from '../../core/debug-mode' +import { DebugStorage } from '../storage/debug-storage' class Logger { private storageType = 'sessionStorage' as const - private static loggingKey = 'segment_signals_debug_logging' + private static advancedLogging = 'segment_signals_logging_advanced' + storage = new DebugStorage(this.storageType) constructor() { - const val = parseDebugLoggingQueryString() + const val = parseSignalsLoggingAdvancedQueryString() if (typeof val === 'boolean') { - this.setDebugKey(Logger.loggingKey, val) + this.storage.setDebugKey(Logger.advancedLogging, val) } } private debugLoggingEnabled = (): boolean => { - try { - const isEnabled = Boolean( - globalThis[this.storageType].getItem(Logger.loggingKey) - ) - if (isEnabled) { - return true - } - } catch (e) { - console.warn('Storage error', e) - } - return false - } - - private setDebugKey = (key: string, enable: boolean) => { - try { - if (enable) { - globalThis[this.storageType].setItem(key, 'true') - } else { - globalThis[this.storageType].removeItem(key) - } - } catch (e) { - console.warn('Storage error', e) - } + return this.storage.getDebugKey(Logger.advancedLogging) } enableDebugLogging = (bool = true) => { - this.setDebugKey(Logger.loggingKey, bool) + this.storage.setDebugKey(Logger.advancedLogging, bool) } log = (...args: any[]): void => { - console.log('[signals]', ...args) + console.log('[signals log]', ...args) } debug = (...args: any[]): void => { diff --git a/packages/signals/signals/src/lib/storage/debug-storage.ts b/packages/signals/signals/src/lib/storage/debug-storage.ts new file mode 100644 index 000000000..55a88baa7 --- /dev/null +++ b/packages/signals/signals/src/lib/storage/debug-storage.ts @@ -0,0 +1,29 @@ +export class DebugStorage { + private storageType: 'localStorage' | 'sessionStorage' + constructor(type: 'localStorage' | 'sessionStorage') { + this.storageType = type + } + public setDebugKey = (key: string, enable: boolean): void => { + try { + if (enable) { + window[this.storageType].setItem(key, 'true') + } else { + window.sessionStorage.removeItem(key) + } + } catch (e) { + console.warn('Storage error', e) + } + } + + public getDebugKey = (key: string): boolean => { + try { + const isEnabled = Boolean(window[this.storageType].getItem(key)) + if (isEnabled) { + return true + } + } catch (e) { + console.warn('Storage error', e) + } + return false + } +} From cfb52ea5131e133c8b60e6df5dcbfa0719f4ad19 Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:52:27 -0600 Subject: [PATCH 13/16] wip --- packages/signals/signals/src/lib/logger/index.ts | 3 +-- .../signals/signals/src/plugin/signals-plugin.ts | 15 +++------------ 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/packages/signals/signals/src/lib/logger/index.ts b/packages/signals/signals/src/lib/logger/index.ts index 0fb5c04e0..9bb7c0367 100644 --- a/packages/signals/signals/src/lib/logger/index.ts +++ b/packages/signals/signals/src/lib/logger/index.ts @@ -2,10 +2,9 @@ import { parseSignalsLoggingAdvancedQueryString } from '../../core/debug-mode' import { DebugStorage } from '../storage/debug-storage' class Logger { - private storageType = 'sessionStorage' as const private static advancedLogging = 'segment_signals_logging_advanced' - storage = new DebugStorage(this.storageType) + storage = new DebugStorage('sessionStorage') constructor() { const val = parseSignalsLoggingAdvancedQueryString() if (typeof val === 'boolean') { diff --git a/packages/signals/signals/src/plugin/signals-plugin.ts b/packages/signals/signals/src/plugin/signals-plugin.ts index 952988b63..c5f731fde 100644 --- a/packages/signals/signals/src/plugin/signals-plugin.ts +++ b/packages/signals/signals/src/plugin/signals-plugin.ts @@ -87,18 +87,9 @@ export class SignalsPlugin implements Plugin, SignalsAugmentedFunctionality { } /** - * Enable redaction and disable ingestion of signals. + * Enable redaction and disable ingestion of signals. Also, logs signals to the console. */ - debug() { - this.signals.debug() - } - - /** - * Log signals to the console. - */ - enableDebugLogging( - ...args: Parameters - ) { - this.signals.enableDebugLogging(...args) + debug(boolean = true): void { + this.signals.debug(boolean) } } From f94a8562ce64815849777da869582cc658c9c8f3 Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:07:02 -0600 Subject: [PATCH 14/16] wip --- packages/signals/signals-example/src/lib/analytics.ts | 2 +- packages/signals/signals/src/types/process-signal.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/signals/signals-example/src/lib/analytics.ts b/packages/signals/signals-example/src/lib/analytics.ts index 57e088043..821965552 100644 --- a/packages/signals/signals-example/src/lib/analytics.ts +++ b/packages/signals/signals-example/src/lib/analytics.ts @@ -33,7 +33,7 @@ const isStage = process.env.STAGE === 'true' const signalsPlugin = new SignalsPlugin({ ...(isStage ? { apiHost: 'signals.segment.build/v1' } : {}), - enableDebugLogging: true, + // enableDebugLogging: true, // processSignal: processSignalExample, }) diff --git a/packages/signals/signals/src/types/process-signal.ts b/packages/signals/signals/src/types/process-signal.ts index 906e17e7b..24d8b8cd4 100644 --- a/packages/signals/signals/src/types/process-signal.ts +++ b/packages/signals/signals/src/types/process-signal.ts @@ -18,7 +18,7 @@ export interface AnalyticsRuntimePublicApi { export type ProcessSignalScope = { analytics: AnalyticsRuntimePublicApi - signals: SignalsRuntime + signals: SignalsRuntime } & typeof WebRuntimeConstants export interface ProcessSignal { From b1d94c0c5838e1a54a2613fe1d705a154ce81c7c Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:17:27 -0600 Subject: [PATCH 15/16] update README --- packages/signals/signals/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/signals/signals/README.md b/packages/signals/signals/README.md index 1ca8632b4..5ae77c2ce 100644 --- a/packages/signals/signals/README.md +++ b/packages/signals/signals/README.md @@ -116,6 +116,3 @@ Network signals emit when an HTTP Request is made, or an HTTP Response is receiv - Initiated using the `fetch` API - First party domain (e.g if on `foo.com`, then `foo.com/api/products`, but not `bar.com/api/products`) - Contains the content-type: `application/json` - - - From 04de4f039b1e1c1ef0783605b921e0638762b21f Mon Sep 17 00:00:00 2001 From: Seth Silesky <5115498+silesky@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:18:19 -0600 Subject: [PATCH 16/16] update logging --- .changeset/silly-papayas-buy.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/silly-papayas-buy.md diff --git a/.changeset/silly-papayas-buy.md b/.changeset/silly-papayas-buy.md new file mode 100644 index 000000000..73d1b1a62 --- /dev/null +++ b/.changeset/silly-papayas-buy.md @@ -0,0 +1,5 @@ +--- +'@segment/analytics-signals': minor +--- + +Update logging