@bifold/remote-logs 2.4.6 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export * from './logger';
2
- export { RemoteLoggerOptions } from './transports';
2
+ export * from './transports';
package/build/index.js CHANGED
@@ -15,3 +15,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./logger"), exports);
18
+ __exportStar(require("./transports"), exports);
package/build/logger.d.ts CHANGED
@@ -37,12 +37,12 @@ export declare class RemoteLogger extends BifoldLogger {
37
37
  startEventListeners(): void;
38
38
  stopEventListeners(): void;
39
39
  overrideCurrentAutoDisableExpiration(expirationInMinutes: number): void;
40
- test(...msgs: unknown[]): void;
41
- trace(...msgs: unknown[]): void;
42
- debug(...msgs: unknown[]): void;
43
- info(...msgs: unknown[]): void;
44
- warn(...msgs: unknown[]): void;
45
- error(...msgs: unknown[]): void;
46
- fatal(...msgs: unknown[]): void;
40
+ test(message: string, data?: Record<string, unknown> | Error): void;
41
+ trace(message: string, data?: Record<string, unknown> | Error): void;
42
+ debug(message: string, data?: Record<string, unknown> | Error): void;
43
+ info(message: string, data?: Record<string, unknown> | Error): void;
44
+ warn(message: string, data?: Record<string, unknown> | Error): void;
45
+ error(message: string, data?: Record<string, unknown> | Error): void;
46
+ fatal(message: string, data?: Record<string, unknown> | Error): void;
47
47
  report(bifoldError: BifoldError): void;
48
48
  }
package/build/logger.js CHANGED
@@ -60,7 +60,7 @@ class RemoteLogger extends core_1.BifoldLogger {
60
60
  }
61
61
  configureLogger() {
62
62
  const transportOptions = {};
63
- const transport = [react_native_logs_1.consoleTransport];
63
+ const transport = [transports_1.consoleTransport];
64
64
  const config = Object.assign(Object.assign({}, this._config), { transport,
65
65
  transportOptions });
66
66
  if (this.remoteLoggingEnabled && this.lokiUrl) {
@@ -96,33 +96,33 @@ class RemoteLogger extends core_1.BifoldLogger {
96
96
  this.remoteLoggingEnabled = false;
97
97
  }, expirationInMinutes * 60000);
98
98
  }
99
- test(...msgs) {
99
+ test(message, data) {
100
100
  var _a;
101
- (_a = this._log) === null || _a === void 0 ? void 0 : _a.test(...this.messageFormatter(...msgs));
101
+ (_a = this._log) === null || _a === void 0 ? void 0 : _a.test({ message, data });
102
102
  }
103
- trace(...msgs) {
103
+ trace(message, data) {
104
104
  var _a;
105
- (_a = this._log) === null || _a === void 0 ? void 0 : _a.trace(...this.messageFormatter(...msgs));
105
+ (_a = this._log) === null || _a === void 0 ? void 0 : _a.trace({ message, data });
106
106
  }
107
- debug(...msgs) {
107
+ debug(message, data) {
108
108
  var _a;
109
- (_a = this._log) === null || _a === void 0 ? void 0 : _a.debug(...this.messageFormatter(...msgs));
109
+ (_a = this._log) === null || _a === void 0 ? void 0 : _a.debug({ message, data });
110
110
  }
111
- info(...msgs) {
111
+ info(message, data) {
112
112
  var _a;
113
- (_a = this._log) === null || _a === void 0 ? void 0 : _a.info(...this.messageFormatter(...msgs));
113
+ (_a = this._log) === null || _a === void 0 ? void 0 : _a.info({ message, data });
114
114
  }
115
- warn(...msgs) {
115
+ warn(message, data) {
116
116
  var _a;
117
- (_a = this._log) === null || _a === void 0 ? void 0 : _a.warn(...this.messageFormatter(...msgs));
117
+ (_a = this._log) === null || _a === void 0 ? void 0 : _a.warn({ message, data });
118
118
  }
119
- error(...msgs) {
119
+ error(message, data) {
120
120
  var _a;
121
- (_a = this._log) === null || _a === void 0 ? void 0 : _a.error(...this.messageFormatter(...msgs));
121
+ (_a = this._log) === null || _a === void 0 ? void 0 : _a.error({ message, data });
122
122
  }
123
- fatal(...msgs) {
123
+ fatal(message, data) {
124
124
  var _a;
125
- (_a = this._log) === null || _a === void 0 ? void 0 : _a.fatal(...this.messageFormatter(...msgs));
125
+ (_a = this._log) === null || _a === void 0 ? void 0 : _a.fatal({ message, data });
126
126
  }
127
127
  report(bifoldError) {
128
128
  var _a;
@@ -0,0 +1,38 @@
1
+ import { transportFunctionType } from 'react-native-logs';
2
+ declare const availableColors: {
3
+ readonly default: null;
4
+ readonly black: 30;
5
+ readonly red: 31;
6
+ readonly green: 32;
7
+ readonly yellow: 33;
8
+ readonly blue: 34;
9
+ readonly magenta: 35;
10
+ readonly cyan: 36;
11
+ readonly white: 37;
12
+ readonly grey: 90;
13
+ readonly redBright: 91;
14
+ readonly greenBright: 92;
15
+ readonly yellowBright: 93;
16
+ readonly blueBright: 94;
17
+ readonly magentaBright: 95;
18
+ readonly cyanBright: 96;
19
+ readonly whiteBright: 97;
20
+ };
21
+ type Color = keyof typeof availableColors;
22
+ export interface ConsoleLoggerOptions {
23
+ colors?: Record<string, Color>;
24
+ extensionColors?: Record<string, Color>;
25
+ consoleFunc?: (msg: string) => void;
26
+ }
27
+ export type ConsoleTransportProps = {
28
+ msg: any;
29
+ rawMsg: any;
30
+ level: {
31
+ severity: number;
32
+ text: string;
33
+ };
34
+ extension?: string | null | undefined;
35
+ options?: ConsoleLoggerOptions;
36
+ };
37
+ export declare const consoleTransport: transportFunctionType;
38
+ export {};
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ /* eslint-disable no-console */
3
+ var __rest = (this && this.__rest) || function (s, e) {
4
+ var t = {};
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
6
+ t[p] = s[p];
7
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
8
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
9
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
10
+ t[p[i]] = s[p[i]];
11
+ }
12
+ return t;
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.consoleTransport = void 0;
16
+ const availableColors = {
17
+ default: null,
18
+ black: 30,
19
+ red: 31,
20
+ green: 32,
21
+ yellow: 33,
22
+ blue: 34,
23
+ magenta: 35,
24
+ cyan: 36,
25
+ white: 37,
26
+ grey: 90,
27
+ redBright: 91,
28
+ greenBright: 92,
29
+ yellowBright: 93,
30
+ blueBright: 94,
31
+ magentaBright: 95,
32
+ cyanBright: 96,
33
+ whiteBright: 97,
34
+ };
35
+ const resetColors = '\x1b[0m';
36
+ const messageDataFormatter = (...msgs) => {
37
+ return msgs.map((msg) => {
38
+ var _a, _b;
39
+ if (msg instanceof Error) {
40
+ return JSON.stringify({
41
+ name: msg.name,
42
+ message: msg.message,
43
+ stack: (_b = (_a = msg.stack) === null || _a === void 0 ? void 0 : _a.split('\n').slice(1).map((line) => line.trim())) !== null && _b !== void 0 ? _b : [],
44
+ }, null, 2);
45
+ }
46
+ return typeof msg === 'object' ? JSON.stringify(msg, null, 2) : msg;
47
+ });
48
+ };
49
+ const consoleTransport = (props) => {
50
+ var _a, _b, _c;
51
+ if (!props) {
52
+ return;
53
+ }
54
+ // Get the last element without mutating the
55
+ // original array.
56
+ const lastMessage = props.rawMsg[props.rawMsg.length - 1];
57
+ let { message } = lastMessage, rest = __rest(lastMessage, ["message"]);
58
+ let color;
59
+ if (((_a = props.options) === null || _a === void 0 ? void 0 : _a.colors) &&
60
+ props.options.colors[props.level.text] &&
61
+ availableColors[props.options.colors[props.level.text]]) {
62
+ color = `\x1b[${availableColors[props.options.colors[props.level.text]]}m`;
63
+ message = `${color}${message}${resetColors}`;
64
+ }
65
+ if (props.extension && ((_b = props.options) === null || _b === void 0 ? void 0 : _b.extensionColors)) {
66
+ let extensionColor = '\x1b[7m';
67
+ const extColor = props.options.extensionColors[props.extension];
68
+ if (extColor && availableColors[extColor]) {
69
+ extensionColor = `\x1b[${availableColors[extColor] + 10}m`;
70
+ }
71
+ const extStart = color ? resetColors + extensionColor : extensionColor;
72
+ const extEnd = color ? resetColors + color : resetColors;
73
+ message = message.replace(props.extension, `${extStart} ${props.extension} ${extEnd}`);
74
+ }
75
+ let logMessage = message.trim();
76
+ if (Object.keys(rest).length > 0) {
77
+ const formattedData = messageDataFormatter(...Object.values(rest)).join(' ');
78
+ logMessage = `${logMessage} ${formattedData}`;
79
+ }
80
+ if ((_c = props.options) === null || _c === void 0 ? void 0 : _c.consoleFunc) {
81
+ props.options.consoleFunc(logMessage);
82
+ }
83
+ else {
84
+ console.log(logMessage);
85
+ }
86
+ };
87
+ exports.consoleTransport = consoleTransport;
@@ -0,0 +1,2 @@
1
+ export * from './console';
2
+ export * from './loki';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./console"), exports);
18
+ __exportStar(require("./loki"), exports);
@@ -22,7 +22,10 @@ const lokiTransport = (props) => {
22
22
  throw Error('props.options.labels is required');
23
23
  }
24
24
  const { lokiUrl, lokiLabels } = props.options;
25
- const { message, data } = props.rawMsg.pop();
25
+ // Get the last element without mutating the
26
+ // original array.
27
+ const lastMessage = props.rawMsg[props.rawMsg.length - 1];
28
+ const { message, data } = lastMessage;
26
29
  const payload = {
27
30
  streams: [
28
31
  {
package/package.json CHANGED
@@ -1,12 +1,11 @@
1
1
  {
2
2
  "name": "@bifold/remote-logs",
3
- "version": "2.4.6",
3
+ "version": "2.6.0",
4
4
  "description": "Remote logging for credo-ts agents",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
7
- "source": "src/index.ts",
7
+ "source": "build/index.js",
8
8
  "files": [
9
- "src",
10
9
  "build"
11
10
  ],
12
11
  "license": "Apache-2.0",
@@ -48,7 +47,7 @@
48
47
  "hoistingLimits": "workspaces"
49
48
  },
50
49
  "dependencies": {
51
- "@bifold/core": "2.4.6",
50
+ "@bifold/core": "2.6.0",
52
51
  "@credo-ts/core": "0.5.13",
53
52
  "axios": "~1.4.0",
54
53
  "buffer": "~6.0.3",
package/src/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from './logger'
2
- export { RemoteLoggerOptions } from './transports'
package/src/logger.ts DELETED
@@ -1,174 +0,0 @@
1
- import { BifoldError, BifoldLogger } from '@bifold/core'
2
- import { DeviceEventEmitter, EmitterSubscription } from 'react-native'
3
- import { consoleTransport, logger } from 'react-native-logs'
4
-
5
- import { RemoteLoggerOptions, lokiTransport } from './transports'
6
-
7
- export enum RemoteLoggerEventTypes {
8
- ENABLE_REMOTE_LOGGING = 'RemoteLogging.Enable',
9
- }
10
-
11
- export class RemoteLogger extends BifoldLogger {
12
- private _remoteLoggingEnabled = false
13
- private _sessionId: number | undefined
14
- private _autoDisableRemoteLoggingIntervalInMinutes = 0
15
- private lokiUrl: string | undefined
16
- private lokiLabels: Record<string, string>
17
- private remoteLoggingAutoDisableTimer: ReturnType<typeof setTimeout> | undefined
18
- private eventListener: EmitterSubscription | undefined
19
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
- protected _log: any
21
- protected _config = {
22
- levels: {
23
- test: 0,
24
- trace: 0,
25
- debug: 0,
26
- info: 1,
27
- warn: 2,
28
- error: 3,
29
- fatal: 4,
30
- },
31
- severity: 'debug',
32
- async: true,
33
- dateFormat: 'time',
34
- printDate: false,
35
- }
36
-
37
- constructor(options: RemoteLoggerOptions) {
38
- super()
39
-
40
- this.lokiUrl = options.lokiUrl ?? undefined
41
- this.lokiLabels = options.lokiLabels ?? {}
42
- this._autoDisableRemoteLoggingIntervalInMinutes = options.autoDisableRemoteLoggingIntervalInMinutes ?? 0
43
-
44
- this.configureLogger()
45
- }
46
-
47
- get sessionId(): number {
48
- if (!this._sessionId) {
49
- this._sessionId = Math.floor(100000 + Math.random() * 900000)
50
- }
51
-
52
- return this._sessionId
53
- }
54
-
55
- set sessionId(value: number) {
56
- this._sessionId = value
57
-
58
- this.configureLogger()
59
- }
60
-
61
- get autoDisableRemoteLoggingIntervalInMinutes(): number {
62
- return this._autoDisableRemoteLoggingIntervalInMinutes
63
- }
64
-
65
- get remoteLoggingEnabled(): boolean {
66
- return this._remoteLoggingEnabled
67
- }
68
-
69
- set remoteLoggingEnabled(value: boolean) {
70
- this._remoteLoggingEnabled = value
71
-
72
- if (value === false) {
73
- this._sessionId = undefined
74
- }
75
-
76
- this.configureLogger()
77
- }
78
-
79
- private configureLogger() {
80
- const transportOptions = {}
81
- const transport = [consoleTransport]
82
- const config = {
83
- ...this._config,
84
- transport,
85
- transportOptions,
86
- }
87
-
88
- if (this.remoteLoggingEnabled && this.lokiUrl) {
89
- transport.push(lokiTransport)
90
- config['transportOptions'] = {
91
- lokiUrl: this.lokiUrl,
92
- lokiLabels: {
93
- ...this.lokiLabels,
94
- session_id: `${this.sessionId}`,
95
- },
96
- }
97
-
98
- if (this.autoDisableRemoteLoggingIntervalInMinutes && this.autoDisableRemoteLoggingIntervalInMinutes > 0) {
99
- this.remoteLoggingAutoDisableTimer = setTimeout(() => {
100
- this.remoteLoggingEnabled = false
101
- }, this.autoDisableRemoteLoggingIntervalInMinutes * 60000)
102
- }
103
- }
104
-
105
- this._log = logger.createLogger<'test' | 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'>(config)
106
- }
107
-
108
- public startEventListeners() {
109
- this.eventListener = DeviceEventEmitter.addListener(RemoteLoggerEventTypes.ENABLE_REMOTE_LOGGING, (value) => {
110
- this.remoteLoggingEnabled = value
111
- })
112
- }
113
-
114
- public stopEventListeners() {
115
- this.eventListener = undefined
116
- }
117
-
118
- public overrideCurrentAutoDisableExpiration(expirationInMinutes: number) {
119
- if (expirationInMinutes <= 0) {
120
- return
121
- }
122
-
123
- if (this.remoteLoggingAutoDisableTimer) {
124
- clearTimeout(this.remoteLoggingAutoDisableTimer)
125
- }
126
-
127
- this.remoteLoggingAutoDisableTimer = setTimeout(() => {
128
- this.remoteLoggingEnabled = false
129
- }, expirationInMinutes * 60000)
130
- }
131
-
132
- public test(...msgs: unknown[]): void {
133
- this._log?.test(...this.messageFormatter(...msgs))
134
- }
135
-
136
- public trace(...msgs: unknown[]): void {
137
- this._log?.trace(...this.messageFormatter(...msgs))
138
- }
139
-
140
- public debug(...msgs: unknown[]): void {
141
- this._log?.debug(...this.messageFormatter(...msgs))
142
- }
143
-
144
- public info(...msgs: unknown[]): void {
145
- this._log?.info(...this.messageFormatter(...msgs))
146
- }
147
-
148
- public warn(...msgs: unknown[]): void {
149
- this._log?.warn(...this.messageFormatter(...msgs))
150
- }
151
-
152
- public error(...msgs: unknown[]): void {
153
- this._log?.error(...this.messageFormatter(...msgs))
154
- }
155
-
156
- public fatal(...msgs: unknown[]): void {
157
- this._log?.fatal(...this.messageFormatter(...msgs))
158
- }
159
-
160
- public report(bifoldError: BifoldError): void {
161
- this._log?.info({ message: 'Sending Loki report' })
162
- const { title, description, code, message } = bifoldError
163
- lokiTransport({
164
- msg: title,
165
- rawMsg: [{ message: title, data: { title, description, code, message } }],
166
- level: { severity: 3, text: 'error' },
167
- options: {
168
- lokiUrl: this.lokiUrl,
169
- lokiLabels: this.lokiLabels,
170
- job: 'incident-report',
171
- },
172
- })
173
- }
174
- }
package/src/transports.ts DELETED
@@ -1,78 +0,0 @@
1
- /* eslint-disable no-console */
2
- import axios from 'axios'
3
- import { Buffer } from 'buffer'
4
- import { transportFunctionType } from 'react-native-logs'
5
-
6
- export interface RemoteLoggerOptions {
7
- lokiUrl?: string
8
- lokiLabels?: Record<string, string>
9
- autoDisableRemoteLoggingIntervalInMinutes?: number
10
- job?: string
11
- }
12
-
13
- export type LokiTransportProps = {
14
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
- msg: any
16
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
- rawMsg: any
18
- level: {
19
- severity: number
20
- text: string
21
- }
22
- options?: RemoteLoggerOptions
23
- }
24
-
25
- export const lokiTransport: transportFunctionType = (props: LokiTransportProps) => {
26
- // Loki requires a timestamp with nanosecond precision
27
- // however Date.now() only returns milliseconds precision.
28
- const timestampEndPadding = '000000'
29
-
30
- if (!props.options) {
31
- throw Error('props.options is required')
32
- }
33
-
34
- if (!props.options.lokiUrl) {
35
- throw Error('props.options.lokiUrl is required')
36
- }
37
-
38
- if (!props.options.lokiLabels) {
39
- throw Error('props.options.labels is required')
40
- }
41
-
42
- const { lokiUrl, lokiLabels } = props.options
43
- const { message, data } = props.rawMsg.pop()
44
- const payload = {
45
- streams: [
46
- {
47
- stream: {
48
- job: props.options.job ?? 'react-native-logs',
49
- level: props.level.text,
50
- ...lokiLabels,
51
- },
52
- values: [[`${Date.now()}${timestampEndPadding}`, JSON.stringify({ message, data })]],
53
- },
54
- ],
55
- }
56
-
57
- const [credentials, href] = lokiUrl.split('@')
58
- const [username, password] = credentials.split('//')[1].split(':')
59
- const protocol = credentials.split('//')[0]
60
- const authHeader = `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`
61
- const config = {
62
- headers: {
63
- 'Content-Type': 'application/json',
64
- Authorization: authHeader,
65
- },
66
- }
67
-
68
- axios
69
- .post(`${protocol}//${href}`, payload, config)
70
- .then((res) => {
71
- if (res.status !== 204) {
72
- console.warn(`Expected Loki to return 204, received ${res.status}`)
73
- }
74
- })
75
- .catch((error) => {
76
- console.error(`Error while sending to Loki, ${error}`)
77
- })
78
- }
File without changes