@dasasian/firebase-structured-logger 0.1.0 → 0.1.1
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/README.md +6 -4
- package/dist/client/breadcrumbs.d.ts.map +1 -1
- package/dist/client/breadcrumbs.js +8 -3
- package/dist/client/breadcrumbs.js.map +1 -1
- package/dist/client/logger.d.ts.map +1 -1
- package/dist/client/logger.js +28 -43
- package/dist/client/logger.js.map +1 -1
- package/dist/client/rateLimiter.d.ts.map +1 -1
- package/dist/client/rateLimiter.js +13 -7
- package/dist/client/rateLimiter.js.map +1 -1
- package/dist/functions/logHandler.d.ts.map +1 -1
- package/dist/functions/logHandler.js +6 -35
- package/dist/functions/logHandler.js.map +1 -1
- package/dist/functions/logger.d.ts +8 -3
- package/dist/functions/logger.d.ts.map +1 -1
- package/dist/functions/logger.js +46 -68
- package/dist/functions/logger.js.map +1 -1
- package/dist/functions/requestLogger.d.ts.map +1 -1
- package/dist/functions/requestLogger.js +2 -5
- package/dist/functions/requestLogger.js.map +1 -1
- package/dist/functions/sourceMapCache.d.ts +2 -1
- package/dist/functions/sourceMapCache.d.ts.map +1 -1
- package/dist/functions/sourceMapCache.js +18 -7
- package/dist/functions/sourceMapCache.js.map +1 -1
- package/dist/functions/symbolicate.d.ts +6 -2
- package/dist/functions/symbolicate.d.ts.map +1 -1
- package/dist/functions/symbolicate.js +23 -5
- package/dist/functions/symbolicate.js.map +1 -1
- package/dist/shared/error.d.ts +6 -0
- package/dist/shared/error.d.ts.map +1 -0
- package/dist/shared/error.js +18 -0
- package/dist/shared/error.js.map +1 -0
- package/dist/shared/severity.d.ts +9 -0
- package/dist/shared/severity.d.ts.map +1 -0
- package/dist/shared/severity.js +16 -0
- package/dist/shared/severity.js.map +1 -0
- package/dist/shared/types.d.ts +7 -6
- package/dist/shared/types.d.ts.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
|
-
<a href="https://www.npmjs.com/package/@dasasian/firebase-structured-logger"><img alt="npm" src="https://img.shields.io/npm/v/@dasasian/firebase-structured-logger?style=flat-square&color=235a9b"></a>
|
|
7
|
-
<a href="
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
<a href="https://www.npmjs.com/package/@dasasian/firebase-structured-logger"><img alt="npm" src="https://img.shields.io/npm/v/@dasasian/firebase-structured-logger?style=flat-square&label=npm&color=235a9b"></a>
|
|
7
|
+
<a href="https://github.com/dasasian/firebase-structured-logger/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/dasasian/firebase-structured-logger/ci.yml?branch=main&style=flat-square&label=CI"></a>
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<a href="https://dasasian.com/firebase-structured-logger"><strong>dasasian.com/firebase-structured-logger</strong></a>
|
|
10
12
|
</p>
|
|
11
13
|
|
|
12
14
|
# @dasasian/firebase-structured-logger
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumbs.d.ts","sourceRoot":"","sources":["../../src/client/breadcrumbs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAStD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAGrD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEpE;AAED,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAErD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEtD;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,IAAI,
|
|
1
|
+
{"version":3,"file":"breadcrumbs.d.ts","sourceRoot":"","sources":["../../src/client/breadcrumbs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAStD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAGrD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEpE;AAED,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAErD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEtD;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,IAAI,CAeN;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE,CAEnE;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;AAED,eAAO,MAAM,EAAE;mBACE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;kBACtC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;kBACpC,MAAM;kBACR,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CACtD,CAAA"}
|
|
@@ -27,10 +27,15 @@ function getActiveActivity() {
|
|
|
27
27
|
return activeActivity;
|
|
28
28
|
}
|
|
29
29
|
function addBreadcrumb(type, name, data) {
|
|
30
|
-
const
|
|
30
|
+
const now = Date.now();
|
|
31
|
+
const entry = { timestamp: now, type, name, data };
|
|
31
32
|
breadcrumbs.push(entry);
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
// Entries are appended in timestamp order, so only rebuild the array when the
|
|
34
|
+
// oldest one has actually aged out — otherwise there is nothing to drop.
|
|
35
|
+
const cutoff = now - MAX_AGE_MS;
|
|
36
|
+
if (breadcrumbs[0].timestamp <= cutoff) {
|
|
37
|
+
breadcrumbs = breadcrumbs.filter((bc) => bc.timestamp > cutoff);
|
|
38
|
+
}
|
|
34
39
|
if (breadcrumbs.length > MAX_BREADCRUMBS) {
|
|
35
40
|
breadcrumbs = breadcrumbs.slice(breadcrumbs.length - MAX_BREADCRUMBS);
|
|
36
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumbs.js","sourceRoot":"","sources":["../../src/client/breadcrumbs.ts"],"names":[],"mappings":";;;AASA,4CAGC;AAED,8CAEC;AAED,4CAEC;AAED,8CAEC;AAED,
|
|
1
|
+
{"version":3,"file":"breadcrumbs.js","sourceRoot":"","sources":["../../src/client/breadcrumbs.ts"],"names":[],"mappings":";;;AASA,4CAGC;AAED,8CAEC;AAED,4CAEC;AAED,8CAEC;AAED,sCAmBC;AAED,gDAEC;AAED,4CAIC;AArDD,MAAM,eAAe,GAAG,EAAE,CAAA;AAC1B,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,YAAY;AAE7C,IAAI,aAAiC,CAAA;AACrC,IAAI,cAAkC,CAAA;AACtC,IAAI,WAAW,GAAsB,EAAE,CAAA;AAEvC,SAAgB,gBAAgB,CAAC,MAAc;IAC7C,aAAa,GAAG,MAAM,CAAA;IACtB,aAAa,CAAC,KAAK,EAAE,YAAY,MAAM,EAAE,CAAC,CAAA;AAC5C,CAAC;AAED,SAAgB,iBAAiB,CAAC,QAA4B;IAC5D,cAAc,GAAG,QAAQ,CAAA;AAC3B,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,SAAgB,iBAAiB;IAC/B,OAAO,cAAc,CAAA;AACvB,CAAC;AAED,SAAgB,aAAa,CAC3B,IAA6B,EAC7B,IAAY,EACZ,IAA8B;IAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,MAAM,KAAK,GAAoB,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACnE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAEvB,8EAA8E;IAC9E,yEAAyE;IACzE,MAAM,MAAM,GAAG,GAAG,GAAG,UAAU,CAAA;IAC/B,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,MAAM,EAAE,CAAC;QACvC,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,GAAG,MAAM,CAAC,CAAA;IACjE,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QACzC,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,eAAe,CAAC,CAAA;IACvE,CAAC;AACH,CAAC;AAED,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAA;AACnE,CAAC;AAED,SAAgB,gBAAgB;IAC9B,WAAW,GAAG,EAAE,CAAA;IAChB,aAAa,GAAG,SAAS,CAAA;IACzB,cAAc,GAAG,SAAS,CAAA;AAC5B,CAAC;AAEY,QAAA,EAAE,GAAG;IAChB,MAAM,EAAE,CAAC,IAAY,EAAE,IAA8B,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;IAC7F,KAAK,EAAG,CAAC,IAAY,EAAE,IAA8B,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;IAC5F,GAAG,EAAK,CAAC,MAAc,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACpD,KAAK,EAAG,CAAC,IAAY,EAAE,IAA8B,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;CAC7F,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/client/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/client/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/client/logger.js
CHANGED
|
@@ -4,49 +4,39 @@ exports.Logger = void 0;
|
|
|
4
4
|
exports.triggerTestLog = triggerTestLog;
|
|
5
5
|
exports.initLogger = initLogger;
|
|
6
6
|
exports.getClientLogger = getClientLogger;
|
|
7
|
+
const severity_1 = require("../shared/severity");
|
|
8
|
+
const error_1 = require("../shared/error");
|
|
7
9
|
const breadcrumbs_1 = require("./breadcrumbs");
|
|
8
10
|
const rateLimiter_1 = require("./rateLimiter");
|
|
9
|
-
const SEVERITY_ORDER = {
|
|
10
|
-
ERROR: 0,
|
|
11
|
-
WARNING: 1,
|
|
12
|
-
INFO: 2,
|
|
13
|
-
DEBUG: 3,
|
|
14
|
-
};
|
|
15
11
|
function defaultMinLevel() {
|
|
16
12
|
if (typeof process !== 'undefined' && process.env?.NODE_ENV === 'production')
|
|
17
13
|
return 'WARNING';
|
|
18
14
|
return 'DEBUG';
|
|
19
15
|
}
|
|
20
|
-
|
|
16
|
+
// Order matters — first match wins.
|
|
17
|
+
const PLATFORMS = [
|
|
18
|
+
[/iPhone|iPad|iPod/, 'ios'],
|
|
19
|
+
[/Android/, 'android'],
|
|
20
|
+
[/Mac/, 'macos'],
|
|
21
|
+
[/Win/, 'windows'],
|
|
22
|
+
[/Linux/, 'linux'],
|
|
23
|
+
];
|
|
24
|
+
const BROWSERS = [
|
|
25
|
+
[/Firefox/, 'firefox'],
|
|
26
|
+
[/Edg/, 'edge'],
|
|
27
|
+
[/Chrome/, 'chrome'],
|
|
28
|
+
[/Safari/, 'safari'],
|
|
29
|
+
];
|
|
30
|
+
function matchUserAgent(table, fallback) {
|
|
21
31
|
if (typeof navigator === 'undefined')
|
|
22
32
|
return 'unknown';
|
|
23
33
|
const ua = navigator.userAgent;
|
|
24
|
-
|
|
25
|
-
return 'ios';
|
|
26
|
-
if (/Android/.test(ua))
|
|
27
|
-
return 'android';
|
|
28
|
-
if (/Mac/.test(ua))
|
|
29
|
-
return 'macos';
|
|
30
|
-
if (/Win/.test(ua))
|
|
31
|
-
return 'windows';
|
|
32
|
-
if (/Linux/.test(ua))
|
|
33
|
-
return 'linux';
|
|
34
|
-
return 'web';
|
|
35
|
-
}
|
|
36
|
-
function getBrowser() {
|
|
37
|
-
if (typeof navigator === 'undefined')
|
|
38
|
-
return 'unknown';
|
|
39
|
-
const ua = navigator.userAgent;
|
|
40
|
-
if (/Firefox/.test(ua))
|
|
41
|
-
return 'firefox';
|
|
42
|
-
if (/Edg/.test(ua))
|
|
43
|
-
return 'edge';
|
|
44
|
-
if (/Chrome/.test(ua))
|
|
45
|
-
return 'chrome';
|
|
46
|
-
if (/Safari/.test(ua))
|
|
47
|
-
return 'safari';
|
|
48
|
-
return 'unknown';
|
|
34
|
+
return table.find(([pattern]) => pattern.test(ua))?.[1] ?? fallback;
|
|
49
35
|
}
|
|
36
|
+
// The user agent never changes for the lifetime of the page, so resolve both
|
|
37
|
+
// once at module load rather than re-running the regexes on every log call.
|
|
38
|
+
const PLATFORM = matchUserAgent(PLATFORMS, 'web');
|
|
39
|
+
const BROWSER = matchUserAgent(BROWSERS, 'unknown');
|
|
50
40
|
async function blobToBase64(blob) {
|
|
51
41
|
return new Promise((resolve, reject) => {
|
|
52
42
|
const reader = new FileReader();
|
|
@@ -70,7 +60,7 @@ class Logger {
|
|
|
70
60
|
userLabels = {};
|
|
71
61
|
constructor(config) {
|
|
72
62
|
this.config = config;
|
|
73
|
-
this.minLevel = SEVERITY_ORDER[config.minLogLevel ?? defaultMinLevel()];
|
|
63
|
+
this.minLevel = severity_1.SEVERITY_ORDER[config.minLogLevel ?? defaultMinLevel()];
|
|
74
64
|
if (config.rateLimitOptions) {
|
|
75
65
|
(0, rateLimiter_1.configureRateLimiter)(config.rateLimitOptions);
|
|
76
66
|
}
|
|
@@ -91,7 +81,7 @@ class Logger {
|
|
|
91
81
|
(0, breadcrumbs_1.addBreadcrumb)(type, name, data);
|
|
92
82
|
}
|
|
93
83
|
error(raw, labels, context, attachments) {
|
|
94
|
-
const error =
|
|
84
|
+
const error = (0, error_1.toError)(raw);
|
|
95
85
|
const screen = (0, breadcrumbs_1.getCurrentScreen)();
|
|
96
86
|
const activity = (0, breadcrumbs_1.getActiveActivity)();
|
|
97
87
|
if (!(0, rateLimiter_1.canLogError)(error, screen, activity)) {
|
|
@@ -103,12 +93,7 @@ class Logger {
|
|
|
103
93
|
errorType: error.name || 'UnknownError',
|
|
104
94
|
...labels,
|
|
105
95
|
};
|
|
106
|
-
void this.send(error.message, 'ERROR', errorLabels, context, attachments,
|
|
107
|
-
message: error.message,
|
|
108
|
-
stack: error.stack,
|
|
109
|
-
name: error.name,
|
|
110
|
-
cause: error.cause != null ? String(error.cause) : undefined,
|
|
111
|
-
});
|
|
96
|
+
void this.send(error.message, 'ERROR', errorLabels, context, attachments, (0, error_1.toErrorPayload)(error));
|
|
112
97
|
}
|
|
113
98
|
info(message, labels, context, attachments) {
|
|
114
99
|
void this.send(message, 'INFO', labels, context, attachments);
|
|
@@ -120,7 +105,7 @@ class Logger {
|
|
|
120
105
|
void this.send(message, 'DEBUG', labels, context, attachments);
|
|
121
106
|
}
|
|
122
107
|
async send(message, severity, labels, context, attachments, error) {
|
|
123
|
-
if (SEVERITY_ORDER[severity] > this.minLevel)
|
|
108
|
+
if (severity_1.SEVERITY_ORDER[severity] > this.minLevel)
|
|
124
109
|
return;
|
|
125
110
|
if (!(0, rateLimiter_1.canLogEvent)()) {
|
|
126
111
|
console.warn('[fsl] Rate limit exceeded');
|
|
@@ -132,8 +117,8 @@ class Logger {
|
|
|
132
117
|
releaseId: this.config.releaseId,
|
|
133
118
|
screen: (0, breadcrumbs_1.getCurrentScreen)(),
|
|
134
119
|
userId: this.userId,
|
|
135
|
-
platform:
|
|
136
|
-
browser:
|
|
120
|
+
platform: PLATFORM,
|
|
121
|
+
browser: BROWSER,
|
|
137
122
|
...this.userLabels,
|
|
138
123
|
...labels,
|
|
139
124
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/client/logger.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/client/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimiter.d.ts","sourceRoot":"","sources":["../../src/client/rateLimiter.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAaD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAEnE;
|
|
1
|
+
{"version":3,"file":"rateLimiter.d.ts","sourceRoot":"","sources":["../../src/client/rateLimiter.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAaD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAEnE;AAmCD,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,GAAG,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAYT;AAED,wBAAgB,SAAS,IAAI,IAAI,CAIhC;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,GAAG,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI,CAMN;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAMvC"}
|
|
@@ -34,6 +34,12 @@ function saveState(state) {
|
|
|
34
34
|
// Silently fail if sessionStorage is full
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
+
/** Read-modify-write the persisted state in one round-trip. */
|
|
38
|
+
function mutateState(mutate) {
|
|
39
|
+
const state = getState();
|
|
40
|
+
mutate(state);
|
|
41
|
+
saveState(state);
|
|
42
|
+
}
|
|
37
43
|
function getErrorSignature(error, screen, activity) {
|
|
38
44
|
const str = error instanceof Error ? `${error.name}:${error.message}` : String(error);
|
|
39
45
|
return `${str}|${screen ?? ''}|${activity ?? ''}`;
|
|
@@ -55,16 +61,16 @@ function canLogError(error, screen, activity) {
|
|
|
55
61
|
return true;
|
|
56
62
|
}
|
|
57
63
|
function recordLog() {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
64
|
+
mutateState((state) => {
|
|
65
|
+
state.logCount++;
|
|
66
|
+
});
|
|
61
67
|
}
|
|
62
68
|
function recordError(error, screen, activity) {
|
|
63
|
-
const state = getState();
|
|
64
69
|
const sig = getErrorSignature(error, screen, activity);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
70
|
+
mutateState((state) => {
|
|
71
|
+
state.errorSignatures[sig] = (state.errorSignatures[sig] ?? 0) + 1;
|
|
72
|
+
state.logCount++;
|
|
73
|
+
});
|
|
68
74
|
}
|
|
69
75
|
function resetRateLimiter() {
|
|
70
76
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../../src/client/rateLimiter.ts"],"names":[],"mappings":";;AAqBA,oDAEC;
|
|
1
|
+
{"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../../src/client/rateLimiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logHandler.d.ts","sourceRoot":"","sources":["../../src/functions/logHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAA;AACtF,OAAO,KAAK,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"logHandler.d.ts","sourceRoot":"","sources":["../../src/functions/logHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAA;AACtF,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,iBAAiB,CAAA;AAU/D,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;IAClC,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AA6DD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,IAGrD,SAAS,eAAe,CAAC,UAAU,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAgCnE;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,sBAAsB,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,8FAM/F"}
|
|
@@ -3,10 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createClientLogHandler = createClientLogHandler;
|
|
4
4
|
exports.createClientLogFunction = createClientLogFunction;
|
|
5
5
|
const https_1 = require("firebase-functions/v2/https");
|
|
6
|
+
const severity_1 = require("../shared/severity");
|
|
6
7
|
const logger_1 = require("./logger");
|
|
7
8
|
const sourceMapCache_1 = require("./sourceMapCache");
|
|
8
9
|
const symbolicate_1 = require("./symbolicate");
|
|
9
|
-
const VALID_SEVERITIES = new Set(
|
|
10
|
+
const VALID_SEVERITIES = new Set(severity_1.SEVERITIES);
|
|
10
11
|
/**
|
|
11
12
|
* Extract the bundle filename (e.g. "index-DnZ05f3M.js") from a frame URL.
|
|
12
13
|
*/
|
|
@@ -44,25 +45,9 @@ async function symbolicateError(releaseId, error) {
|
|
|
44
45
|
if (sourceMaps.size === 0)
|
|
45
46
|
return error;
|
|
46
47
|
// Symbolicate each frame with its bundle's source map
|
|
47
|
-
const symbolicated =
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const bundle = bundleFileFromUrl(frame.fileName);
|
|
51
|
-
if (!bundle)
|
|
52
|
-
return frame;
|
|
53
|
-
const sourceMap = sourceMaps.get(bundle);
|
|
54
|
-
if (!sourceMap)
|
|
55
|
-
return frame;
|
|
56
|
-
const result = (0, symbolicate_1.symbolicate)(sourceMap, frame.lineNumber, frame.columnNumber);
|
|
57
|
-
if (!result)
|
|
58
|
-
return frame;
|
|
59
|
-
return {
|
|
60
|
-
...frame,
|
|
61
|
-
fileName: result.source,
|
|
62
|
-
lineNumber: result.line,
|
|
63
|
-
columnNumber: result.column,
|
|
64
|
-
functionName: result.name ?? frame.functionName,
|
|
65
|
-
};
|
|
48
|
+
const symbolicated = (0, symbolicate_1.symbolicateStackTrace)(frames, (frame) => {
|
|
49
|
+
const bundle = frame.fileName && bundleFileFromUrl(frame.fileName);
|
|
50
|
+
return bundle ? sourceMaps.get(bundle) : null;
|
|
66
51
|
});
|
|
67
52
|
return { ...error, stack: (0, symbolicate_1.formatStackTrace)(symbolicated) };
|
|
68
53
|
}
|
|
@@ -71,20 +56,6 @@ async function symbolicateError(releaseId, error) {
|
|
|
71
56
|
}
|
|
72
57
|
return error;
|
|
73
58
|
}
|
|
74
|
-
/**
|
|
75
|
-
* Strip null/undefined labels and convert all values to strings for Cloud Logging.
|
|
76
|
-
*/
|
|
77
|
-
function cleanLabels(labels) {
|
|
78
|
-
if (!labels)
|
|
79
|
-
return {};
|
|
80
|
-
const cleaned = {};
|
|
81
|
-
for (const [key, value] of Object.entries(labels)) {
|
|
82
|
-
if (value !== null && value !== undefined) {
|
|
83
|
-
cleaned[key] = String(value);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return cleaned;
|
|
87
|
-
}
|
|
88
59
|
/**
|
|
89
60
|
* Create an onCall handler that receives LogPayload from the client,
|
|
90
61
|
* symbolicates stack traces, and writes structured entries to Cloud Logging.
|
|
@@ -113,7 +84,7 @@ function createClientLogHandler(config) {
|
|
|
113
84
|
(0, logger_1.writeLog)({
|
|
114
85
|
message,
|
|
115
86
|
severity,
|
|
116
|
-
labels: cleanLabels(labels),
|
|
87
|
+
labels: (0, logger_1.cleanLabels)(labels),
|
|
117
88
|
jsonPayload: { ...jsonPayload, error: processedError },
|
|
118
89
|
attachments: request.data.attachments,
|
|
119
90
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logHandler.js","sourceRoot":"","sources":["../../src/functions/logHandler.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"logHandler.js","sourceRoot":"","sources":["../../src/functions/logHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { LogSeverity, LogPayload } from "../shared/types";
|
|
2
|
+
export declare const LOG_FILENAME = "dev.jsonl";
|
|
2
3
|
interface FunctionsLoggerConfig {
|
|
3
4
|
appId: string;
|
|
4
5
|
logLocalDir?: string;
|
|
@@ -11,6 +12,10 @@ interface FunctionsLoggerConfig {
|
|
|
11
12
|
* Call once at module load (before any onCall handlers run).
|
|
12
13
|
*/
|
|
13
14
|
export declare function initLogger(config: FunctionsLoggerConfig): void;
|
|
15
|
+
/**
|
|
16
|
+
* Strip null/undefined labels and convert all values to strings for Cloud Logging.
|
|
17
|
+
*/
|
|
18
|
+
export declare function cleanLabels(labels: Record<string, unknown> | undefined): Record<string, string>;
|
|
14
19
|
/**
|
|
15
20
|
* Write a structured log entry. Transport depends on environment.
|
|
16
21
|
*/
|
|
@@ -23,9 +28,9 @@ export declare function writeLog(payload: LogPayload & {
|
|
|
23
28
|
*/
|
|
24
29
|
export declare function createLogWriter(baseLabels: Record<string, string | undefined>): {
|
|
25
30
|
error(raw: unknown, labels?: Record<string, string | undefined>, context?: Record<string, unknown>, attachments?: Record<string, string | Buffer>): void;
|
|
26
|
-
info(message: string, labels?: Record<string, string | undefined>, context?: Record<string, unknown>, attachments?: Record<string, string | Buffer>)
|
|
27
|
-
warning(message: string, labels?: Record<string, string | undefined>, context?: Record<string, unknown>, attachments?: Record<string, string | Buffer>)
|
|
28
|
-
debug(message: string, labels?: Record<string, string | undefined>, context?: Record<string, unknown>, attachments?: Record<string, string | Buffer>)
|
|
31
|
+
info: (message: string, labels?: Record<string, string | undefined>, context?: Record<string, unknown>, attachments?: Record<string, string | Buffer>) => void;
|
|
32
|
+
warning: (message: string, labels?: Record<string, string | undefined>, context?: Record<string, unknown>, attachments?: Record<string, string | Buffer>) => void;
|
|
33
|
+
debug: (message: string, labels?: Record<string, string | undefined>, context?: Record<string, unknown>, attachments?: Record<string, string | Buffer>) => void;
|
|
29
34
|
};
|
|
30
35
|
export type LogWriter = ReturnType<typeof createLogWriter>;
|
|
31
36
|
export type { LogSeverity };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/functions/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/functions/logger.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAM/D,eAAO,MAAM,YAAY,cAAc,CAAC;AAExC,UAAU,qBAAqB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAKD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAQ9D;AAkED;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC1C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASxB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,UAAU,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAClE,IAAI,CAiEN;AAaD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;eAuBrC,OAAO,WACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,YACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,gBACnB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAC5C,IAAI;oBAWI,MAAM,WACN,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,YACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,gBACnB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAC5C,IAAI;uBAEI,MAAM,WACN,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,YACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,gBACnB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAC5C,IAAI;qBAEI,MAAM,WACN,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,YACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,gBACnB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAC5C,IAAI;EAEV;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAG3D,YAAY,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/functions/logger.js
CHANGED
|
@@ -33,23 +33,20 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.LOG_FILENAME = void 0;
|
|
36
37
|
exports.initLogger = initLogger;
|
|
38
|
+
exports.cleanLabels = cleanLabels;
|
|
37
39
|
exports.writeLog = writeLog;
|
|
38
40
|
exports.createLogWriter = createLogWriter;
|
|
39
41
|
const fs = __importStar(require("fs"));
|
|
40
42
|
const path = __importStar(require("path"));
|
|
41
43
|
const logger_1 = require("firebase-functions/logger");
|
|
42
44
|
const ulid_1 = require("ulid");
|
|
43
|
-
const
|
|
45
|
+
const severity_1 = require("../shared/severity");
|
|
46
|
+
const error_1 = require("../shared/error");
|
|
44
47
|
const sourceMapCache_1 = require("./sourceMapCache");
|
|
45
48
|
const IS_EMULATOR = process.env.FUNCTIONS_EMULATOR === "true";
|
|
46
|
-
|
|
47
|
-
const SEVERITY_ORDER = {
|
|
48
|
-
ERROR: 0,
|
|
49
|
-
WARNING: 1,
|
|
50
|
-
INFO: 2,
|
|
51
|
-
DEBUG: 3,
|
|
52
|
-
};
|
|
49
|
+
exports.LOG_FILENAME = "dev.jsonl";
|
|
53
50
|
let globalConfig = null;
|
|
54
51
|
let currentRecordCount = 0;
|
|
55
52
|
/**
|
|
@@ -68,7 +65,7 @@ function initLogger(config) {
|
|
|
68
65
|
* Rotate the current log file to a timestamped backup, delete oldest files beyond limit.
|
|
69
66
|
*/
|
|
70
67
|
function rotateLogFile(logDir, maxRotatedFiles) {
|
|
71
|
-
const current = path.join(logDir, LOG_FILENAME);
|
|
68
|
+
const current = path.join(logDir, exports.LOG_FILENAME);
|
|
72
69
|
try {
|
|
73
70
|
// The functions emulator spawns multiple worker processes that each call
|
|
74
71
|
// initLogger() on startup. existsSync + renameSync is a TOCTOU race:
|
|
@@ -105,21 +102,38 @@ function rotateLogFile(logDir, maxRotatedFiles) {
|
|
|
105
102
|
}
|
|
106
103
|
}
|
|
107
104
|
async function uploadLogAttachments(logId, logAttachments) {
|
|
108
|
-
const
|
|
109
|
-
const bucket = bucketName
|
|
110
|
-
? (0, storage_1.getStorage)().bucket(bucketName)
|
|
111
|
-
: (0, storage_1.getStorage)().bucket();
|
|
105
|
+
const bucket = (0, sourceMapCache_1.getBucket)();
|
|
112
106
|
await Promise.all(Object.entries(logAttachments).map(async ([name, data]) => {
|
|
113
107
|
const file = bucket.file(`logAttachments/${logId}/${name}`);
|
|
114
108
|
await file.save(Buffer.from(data, "base64"));
|
|
115
109
|
}));
|
|
116
110
|
}
|
|
111
|
+
const CONSOLE_FN = {
|
|
112
|
+
ERROR: console.error,
|
|
113
|
+
WARNING: console.warn,
|
|
114
|
+
DEBUG: console.debug,
|
|
115
|
+
INFO: console.log,
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Strip null/undefined labels and convert all values to strings for Cloud Logging.
|
|
119
|
+
*/
|
|
120
|
+
function cleanLabels(labels) {
|
|
121
|
+
if (!labels)
|
|
122
|
+
return {};
|
|
123
|
+
const cleaned = {};
|
|
124
|
+
for (const [key, value] of Object.entries(labels)) {
|
|
125
|
+
if (value !== null && value !== undefined) {
|
|
126
|
+
cleaned[key] = String(value);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return cleaned;
|
|
130
|
+
}
|
|
117
131
|
/**
|
|
118
132
|
* Write a structured log entry. Transport depends on environment.
|
|
119
133
|
*/
|
|
120
134
|
function writeLog(payload) {
|
|
121
135
|
const minSeverity = globalConfig?.minSeverity ?? (IS_EMULATOR ? "DEBUG" : "WARNING");
|
|
122
|
-
if (SEVERITY_ORDER[payload.severity] > SEVERITY_ORDER[minSeverity])
|
|
136
|
+
if (severity_1.SEVERITY_ORDER[payload.severity] > severity_1.SEVERITY_ORDER[minSeverity])
|
|
123
137
|
return;
|
|
124
138
|
const logId = (0, ulid_1.ulid)();
|
|
125
139
|
const hasAttachments = payload.attachments && Object.keys(payload.attachments).length > 0;
|
|
@@ -153,7 +167,7 @@ function writeLog(payload) {
|
|
|
153
167
|
rotateLogFile(globalConfig.logLocalDir, maxRotated);
|
|
154
168
|
currentRecordCount = 0;
|
|
155
169
|
}
|
|
156
|
-
const logFile = path.join(globalConfig.logLocalDir, LOG_FILENAME);
|
|
170
|
+
const logFile = path.join(globalConfig.logLocalDir, exports.LOG_FILENAME);
|
|
157
171
|
fs.appendFileSync(logFile, JSON.stringify(entry) + "\n", "utf-8");
|
|
158
172
|
currentRecordCount++;
|
|
159
173
|
}
|
|
@@ -162,14 +176,7 @@ function writeLog(payload) {
|
|
|
162
176
|
}
|
|
163
177
|
}
|
|
164
178
|
// Also write to console for immediate visibility
|
|
165
|
-
|
|
166
|
-
? console.error
|
|
167
|
-
: payload.severity === "WARNING"
|
|
168
|
-
? console.warn
|
|
169
|
-
: payload.severity === "DEBUG"
|
|
170
|
-
? console.debug
|
|
171
|
-
: console.log;
|
|
172
|
-
consoleFn(`[${payload.severity}] ${payload.message}`, labels);
|
|
179
|
+
CONSOLE_FN[payload.severity](`[${payload.severity}] ${payload.message}`, labels);
|
|
173
180
|
return;
|
|
174
181
|
}
|
|
175
182
|
// Production: use firebase-functions/logger write() directly, bypassing entryFromArgs.
|
|
@@ -195,59 +202,30 @@ function logAttachmentsToBase64(logAttachments) {
|
|
|
195
202
|
* Convenience wrapper that builds a logger object for a given label set.
|
|
196
203
|
*/
|
|
197
204
|
function createLogWriter(baseLabels) {
|
|
198
|
-
const merge = (extra) => ({
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
205
|
+
const merge = (extra) => ({ ...baseLabels, ...extra });
|
|
206
|
+
const write = (severity, message, labels, context, attachments) => {
|
|
207
|
+
writeLog({
|
|
208
|
+
message,
|
|
209
|
+
severity,
|
|
210
|
+
labels: merge(labels),
|
|
211
|
+
jsonPayload: { context },
|
|
212
|
+
attachments: logAttachmentsToBase64(attachments),
|
|
213
|
+
});
|
|
214
|
+
};
|
|
202
215
|
return {
|
|
203
216
|
error(raw, labels, context, attachments) {
|
|
204
|
-
const error =
|
|
217
|
+
const error = (0, error_1.toError)(raw);
|
|
205
218
|
writeLog({
|
|
206
219
|
message: error.message,
|
|
207
220
|
severity: "ERROR",
|
|
208
|
-
labels: merge({
|
|
209
|
-
|
|
210
|
-
...labels,
|
|
211
|
-
}),
|
|
212
|
-
jsonPayload: {
|
|
213
|
-
context,
|
|
214
|
-
error: {
|
|
215
|
-
message: error.message,
|
|
216
|
-
stack: error.stack,
|
|
217
|
-
name: error.name,
|
|
218
|
-
cause: error.cause !== undefined ? String(error.cause) : undefined,
|
|
219
|
-
},
|
|
220
|
-
},
|
|
221
|
-
attachments: logAttachmentsToBase64(attachments),
|
|
222
|
-
});
|
|
223
|
-
},
|
|
224
|
-
info(message, labels, context, attachments) {
|
|
225
|
-
writeLog({
|
|
226
|
-
message,
|
|
227
|
-
severity: "INFO",
|
|
228
|
-
labels: merge(labels),
|
|
229
|
-
jsonPayload: { context },
|
|
230
|
-
attachments: logAttachmentsToBase64(attachments),
|
|
231
|
-
});
|
|
232
|
-
},
|
|
233
|
-
warning(message, labels, context, attachments) {
|
|
234
|
-
writeLog({
|
|
235
|
-
message,
|
|
236
|
-
severity: "WARNING",
|
|
237
|
-
labels: merge(labels),
|
|
238
|
-
jsonPayload: { context },
|
|
239
|
-
attachments: logAttachmentsToBase64(attachments),
|
|
240
|
-
});
|
|
241
|
-
},
|
|
242
|
-
debug(message, labels, context, attachments) {
|
|
243
|
-
writeLog({
|
|
244
|
-
message,
|
|
245
|
-
severity: "DEBUG",
|
|
246
|
-
labels: merge(labels),
|
|
247
|
-
jsonPayload: { context },
|
|
221
|
+
labels: merge({ errorType: error.name, ...labels }),
|
|
222
|
+
jsonPayload: { context, error: (0, error_1.toErrorPayload)(error) },
|
|
248
223
|
attachments: logAttachmentsToBase64(attachments),
|
|
249
224
|
});
|
|
250
225
|
},
|
|
226
|
+
info: (message, labels, context, attachments) => write("INFO", message, labels, context, attachments),
|
|
227
|
+
warning: (message, labels, context, attachments) => write("WARNING", message, labels, context, attachments),
|
|
228
|
+
debug: (message, labels, context, attachments) => write("DEBUG", message, labels, context, attachments),
|
|
251
229
|
};
|
|
252
230
|
}
|
|
253
231
|
//# sourceMappingURL=logger.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/functions/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/functions/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestLogger.d.ts","sourceRoot":"","sources":["../../src/functions/requestLogger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"requestLogger.d.ts","sourceRoot":"","sources":["../../src/functions/requestLogger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,UAAU,CAAA;AAIvE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAEzF,OAAO,EAAE,eAAe,EACxB,KAAK,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;CAAE,GAC7E,SAAS,CAWX;AAED;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAErC"}
|
|
@@ -22,15 +22,12 @@ const storage = new async_hooks_1.AsyncLocalStorage();
|
|
|
22
22
|
* })
|
|
23
23
|
*/
|
|
24
24
|
function initRequestLogger(request, extra) {
|
|
25
|
-
const
|
|
25
|
+
const writer = (0, logger_1.createLogWriter)((0, logger_1.cleanLabels)({
|
|
26
26
|
functionName: extra?.functionName,
|
|
27
27
|
userId: request.auth?.uid,
|
|
28
28
|
appId: extra?.appId,
|
|
29
29
|
...extra?.labels,
|
|
30
|
-
};
|
|
31
|
-
// Remove undefined values
|
|
32
|
-
const cleanLabels = Object.fromEntries(Object.entries(labels).filter(([, v]) => v !== undefined));
|
|
33
|
-
const writer = (0, logger_1.createLogWriter)(cleanLabels);
|
|
30
|
+
}));
|
|
34
31
|
storage.enterWith(writer);
|
|
35
32
|
return writer;
|
|
36
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestLogger.js","sourceRoot":"","sources":["../../src/functions/requestLogger.ts"],"names":[],"mappings":";;AAsBA,
|
|
1
|
+
{"version":3,"file":"requestLogger.js","sourceRoot":"","sources":["../../src/functions/requestLogger.ts"],"names":[],"mappings":";;AAsBA,8CAgBC;AAOD,8BAEC;AA/CD,6CAA+C;AAE/C,qCAAuE;AAEvE,MAAM,OAAO,GAAG,IAAI,+BAAiB,EAAa,CAAA;AAElD;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,iBAAiB,CAG/B,OAAwB,EACxB,KAA8E;IAE9E,MAAM,MAAM,GAAG,IAAA,wBAAe,EAC5B,IAAA,oBAAW,EAAC;QACV,YAAY,EAAE,KAAK,EAAE,YAAY;QACjC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG;QACzB,KAAK,EAAE,KAAK,EAAE,KAAK;QACnB,GAAG,KAAK,EAAE,MAAM;KACjB,CAAC,CACH,CAAA;IACD,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACzB,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;GAIG;AACH,SAAgB,SAAS;IACvB,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAA,wBAAe,EAAC,EAAE,CAAC,CAAA;AAClD,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { EncodedSourceMap } from '@jridgewell/trace-mapping';
|
|
2
2
|
export declare function configureSourceMapBucket(bucketName: string): void;
|
|
3
|
-
|
|
3
|
+
/** Resolve the configured Storage bucket, falling back to the project default. */
|
|
4
|
+
export declare function getBucket(bucketName?: string | undefined): import("@google-cloud/storage").Bucket;
|
|
4
5
|
/**
|
|
5
6
|
* Get source map — checks embedded first (instant), then Storage (for old releases).
|
|
6
7
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sourceMapCache.d.ts","sourceRoot":"","sources":["../../src/functions/sourceMapCache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"sourceMapCache.d.ts","sourceRoot":"","sources":["../../src/functions/sourceMapCache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAUjE,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAEjE;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,UAAU,qBAAmB,0CAEtD;AAyDD;;GAEG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAIlC;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C"}
|
|
@@ -34,7 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.configureSourceMapBucket = configureSourceMapBucket;
|
|
37
|
-
exports.
|
|
37
|
+
exports.getBucket = getBucket;
|
|
38
38
|
exports.getSourceMap = getSourceMap;
|
|
39
39
|
exports.clearSourceMapCache = clearSourceMapCache;
|
|
40
40
|
const fs = __importStar(require("fs"));
|
|
@@ -42,17 +42,30 @@ const path = __importStar(require("path"));
|
|
|
42
42
|
const storage_1 = require("firebase-admin/storage");
|
|
43
43
|
// In-memory cache: cacheKey → EncodedSourceMap | null (null = confirmed not found)
|
|
44
44
|
const cache = new Map();
|
|
45
|
+
// Separate cache for the embedded (current release) maps, keyed by bundle filename.
|
|
46
|
+
const embeddedCache = new Map();
|
|
45
47
|
let configuredBucket;
|
|
46
48
|
function configureSourceMapBucket(bucketName) {
|
|
47
49
|
configuredBucket = bucketName;
|
|
48
50
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
/** Resolve the configured Storage bucket, falling back to the project default. */
|
|
52
|
+
function getBucket(bucketName = configuredBucket) {
|
|
53
|
+
return bucketName ? (0, storage_1.getStorage)().bucket(bucketName) : (0, storage_1.getStorage)().bucket();
|
|
51
54
|
}
|
|
52
55
|
/**
|
|
53
56
|
* Load source map from embedded current release directory (instant for current release).
|
|
57
|
+
* Result is memoised — this sits on the per-error hot path and the embedded maps
|
|
58
|
+
* cannot change while the instance is alive.
|
|
54
59
|
*/
|
|
55
60
|
function loadEmbeddedSourceMap(fileName) {
|
|
61
|
+
const cached = embeddedCache.get(fileName);
|
|
62
|
+
if (cached !== undefined)
|
|
63
|
+
return cached;
|
|
64
|
+
const sourceMap = readEmbeddedSourceMap(fileName);
|
|
65
|
+
embeddedCache.set(fileName, sourceMap);
|
|
66
|
+
return sourceMap;
|
|
67
|
+
}
|
|
68
|
+
function readEmbeddedSourceMap(fileName) {
|
|
56
69
|
try {
|
|
57
70
|
// Looks for sourcemaps/current/{fileName}.map relative to the Cloud Function working directory
|
|
58
71
|
const mapPath = path.join(process.cwd(), 'sourcemaps', 'current', `${fileName}.map`);
|
|
@@ -72,10 +85,7 @@ async function loadStorageSourceMap(releaseId, fileName) {
|
|
|
72
85
|
if (cache.has(cacheKey))
|
|
73
86
|
return cache.get(cacheKey) ?? null;
|
|
74
87
|
try {
|
|
75
|
-
const
|
|
76
|
-
? (0, storage_1.getStorage)().bucket(configuredBucket)
|
|
77
|
-
: (0, storage_1.getStorage)().bucket();
|
|
78
|
-
const file = bucket.file(`sourcemaps/${releaseId}/${fileName}.map`);
|
|
88
|
+
const file = getBucket().file(`sourcemaps/${releaseId}/${fileName}.map`);
|
|
79
89
|
const [exists] = await file.exists();
|
|
80
90
|
if (!exists) {
|
|
81
91
|
cache.set(cacheKey, null);
|
|
@@ -103,5 +113,6 @@ async function getSourceMap(releaseId, fileName) {
|
|
|
103
113
|
}
|
|
104
114
|
function clearSourceMapCache() {
|
|
105
115
|
cache.clear();
|
|
116
|
+
embeddedCache.clear();
|
|
106
117
|
}
|
|
107
118
|
//# sourceMappingURL=sourceMapCache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sourceMapCache.js","sourceRoot":"","sources":["../../src/functions/sourceMapCache.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"sourceMapCache.js","sourceRoot":"","sources":["../../src/functions/sourceMapCache.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,4DAEC;AAGD,8BAEC;AA4DD,oCAOC;AAED,kDAGC;AA5FD,uCAAwB;AACxB,2CAA4B;AAC5B,oDAAmD;AAGnD,mFAAmF;AACnF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmC,CAAA;AAExD,oFAAoF;AACpF,MAAM,aAAa,GAAG,IAAI,GAAG,EAAmC,CAAA;AAEhE,IAAI,gBAAoC,CAAA;AAExC,SAAgB,wBAAwB,CAAC,UAAkB;IACzD,gBAAgB,GAAG,UAAU,CAAA;AAC/B,CAAC;AAED,kFAAkF;AAClF,SAAgB,SAAS,CAAC,UAAU,GAAG,gBAAgB;IACrD,OAAO,UAAU,CAAC,CAAC,CAAC,IAAA,oBAAU,GAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAA,oBAAU,GAAE,CAAC,MAAM,EAAE,CAAA;AAC7E,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,QAAgB;IAC7C,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC1C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IAEvC,MAAM,SAAS,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;IACjD,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IACtC,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAgB;IAC7C,IAAI,CAAC;QACH,+FAA+F;QAC/F,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAA;QACpF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAA;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAqB,CAAA;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CACjC,SAAiB,EACjB,QAAgB;IAEhB,MAAM,QAAQ,GAAG,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAA;IAC3C,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAA;IAE3D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC,IAAI,CAAC,cAAc,SAAS,IAAI,QAAQ,MAAM,CAAC,CAAA;QACxE,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;QAEpC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;YACzB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAA;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAqB,CAAA;QACpE,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QAC9B,OAAO,SAAS,CAAA;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,wCAAwC,SAAS,IAAI,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAA;QACnF,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAA;QAC3C,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,YAAY,CAChC,SAAiB,EACjB,QAAgB;IAEhB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;IAChD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC7B,OAAO,oBAAoB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;AAClD,CAAC;AAED,SAAgB,mBAAmB;IACjC,KAAK,CAAC,KAAK,EAAE,CAAA;IACb,aAAa,CAAC,KAAK,EAAE,CAAA;AACvB,CAAC"}
|
|
@@ -21,9 +21,13 @@ export declare function symbolicate(sourceMap: EncodedSourceMap, generatedLine:
|
|
|
21
21
|
name?: string;
|
|
22
22
|
} | null;
|
|
23
23
|
/**
|
|
24
|
-
* Apply source
|
|
24
|
+
* Apply source maps to all frames in a stack trace.
|
|
25
|
+
*
|
|
26
|
+
* `resolve` picks the source map for a given frame, so a stack spanning several
|
|
27
|
+
* bundles is handled by the same code path as a single-bundle one. Pass
|
|
28
|
+
* `() => map` when one map covers the whole stack.
|
|
25
29
|
*/
|
|
26
|
-
export declare function symbolicateStackTrace(frames: StackFrame[],
|
|
30
|
+
export declare function symbolicateStackTrace(frames: StackFrame[], resolve: (frame: StackFrame) => EncodedSourceMap | null | undefined): StackFrame[];
|
|
27
31
|
/**
|
|
28
32
|
* Format symbolicated frames back to a stack trace string.
|
|
29
33
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbolicate.d.ts","sourceRoot":"","sources":["../../src/functions/symbolicate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAEhG,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAGD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAkD3D;
|
|
1
|
+
{"version":3,"file":"symbolicate.d.ts","sourceRoot":"","sources":["../../src/functions/symbolicate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAEhG,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAGD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAkD3D;AAeD;;GAEG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,gBAAgB,EAC3B,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,GACtB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgBxE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAClE,UAAU,EAAE,CAkBd;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAQ7D"}
|
|
@@ -55,13 +55,26 @@ function parseStackTrace(stack) {
|
|
|
55
55
|
}
|
|
56
56
|
return frames;
|
|
57
57
|
}
|
|
58
|
+
// Building a TraceMap decodes the whole mappings string, so keep one per source
|
|
59
|
+
// map instead of rebuilding it for every frame of every stack.
|
|
60
|
+
const tracers = new WeakMap();
|
|
61
|
+
function tracerFor(sourceMap) {
|
|
62
|
+
let tracer = tracers.get(sourceMap);
|
|
63
|
+
if (!tracer) {
|
|
64
|
+
tracer = new trace_mapping_1.TraceMap(sourceMap);
|
|
65
|
+
tracers.set(sourceMap, tracer);
|
|
66
|
+
}
|
|
67
|
+
return tracer;
|
|
68
|
+
}
|
|
58
69
|
/**
|
|
59
70
|
* Look up original source location for a generated line/column.
|
|
60
71
|
*/
|
|
61
72
|
function symbolicate(sourceMap, generatedLine, generatedColumn) {
|
|
62
73
|
try {
|
|
63
|
-
const
|
|
64
|
-
|
|
74
|
+
const result = (0, trace_mapping_1.originalPositionFor)(tracerFor(sourceMap), {
|
|
75
|
+
line: generatedLine,
|
|
76
|
+
column: generatedColumn,
|
|
77
|
+
});
|
|
65
78
|
if (!result.source)
|
|
66
79
|
return null;
|
|
67
80
|
return {
|
|
@@ -76,13 +89,18 @@ function symbolicate(sourceMap, generatedLine, generatedColumn) {
|
|
|
76
89
|
}
|
|
77
90
|
}
|
|
78
91
|
/**
|
|
79
|
-
* Apply source
|
|
92
|
+
* Apply source maps to all frames in a stack trace.
|
|
93
|
+
*
|
|
94
|
+
* `resolve` picks the source map for a given frame, so a stack spanning several
|
|
95
|
+
* bundles is handled by the same code path as a single-bundle one. Pass
|
|
96
|
+
* `() => map` when one map covers the whole stack.
|
|
80
97
|
*/
|
|
81
|
-
function symbolicateStackTrace(frames,
|
|
98
|
+
function symbolicateStackTrace(frames, resolve) {
|
|
82
99
|
return frames.map((frame) => {
|
|
83
100
|
if (!frame.lineNumber || !frame.columnNumber || !frame.fileName)
|
|
84
101
|
return frame;
|
|
85
|
-
|
|
102
|
+
const sourceMap = resolve(frame);
|
|
103
|
+
if (!sourceMap)
|
|
86
104
|
return frame;
|
|
87
105
|
const result = symbolicate(sourceMap, frame.lineNumber, frame.columnNumber);
|
|
88
106
|
if (!result)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbolicate.js","sourceRoot":"","sources":["../../src/functions/symbolicate.ts"],"names":[],"mappings":";;AAeA,0CAkDC;
|
|
1
|
+
{"version":3,"file":"symbolicate.js","sourceRoot":"","sources":["../../src/functions/symbolicate.ts"],"names":[],"mappings":";;AAeA,0CAkDC;AAkBD,kCAoBC;AASD,sDAqBC;AAKD,4CAQC;AAlJD,6DAAgG;AAWhG;;;GAGG;AACH,SAAgB,eAAe,CAAC,KAAa;IAC3C,MAAM,MAAM,GAAiB,EAAE,CAAA;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,CAAC,OAAO;YAAE,SAAQ;QAEtB,4CAA4C;QAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA;QACzE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,EAAE,OAAO;gBACZ,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC5B,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;gBACxB,UAAU,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACxC,YAAY,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;aAC3C,CAAC,CAAA;YACF,SAAQ;QACV,CAAC;QAED,8CAA8C;QAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC9D,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,EAAE,OAAO;gBACZ,YAAY,EAAE,WAAW;gBACzB,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;gBACzB,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACzC,YAAY,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;aAC5C,CAAC,CAAA;YACF,SAAQ;QACV,CAAC;QAED,+EAA+E;QAC/E,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAC/D,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,EAAE,OAAO;gBACZ,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,WAAW;gBAC5C,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;gBACzB,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACzC,YAAY,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;aAC5C,CAAC,CAAA;YACF,SAAQ;QACV,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;IAC/B,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,gFAAgF;AAChF,+DAA+D;AAC/D,MAAM,OAAO,GAAG,IAAI,OAAO,EAA8B,CAAA;AAEzD,SAAS,SAAS,CAAC,SAA2B;IAC5C,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,wBAAQ,CAAC,SAAS,CAAC,CAAA;QAChC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAChC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CACzB,SAA2B,EAC3B,aAAqB,EACrB,eAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,mCAAmB,EAAC,SAAS,CAAC,SAAS,CAAC,EAAE;YACvD,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,eAAe;SACxB,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAC/B,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,aAAa;YAClC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,eAAe;YACxC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,SAAS;SAC/B,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,qBAAqB,CACnC,MAAoB,EACpB,OAAmE;IAEnE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAA;QAE7E,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;QAChC,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAA;QAE5B,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,CAAA;QAC3E,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QAEzB,OAAO;YACL,GAAG,KAAK;YACR,QAAQ,EAAE,MAAM,CAAC,MAAM;YACvB,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,YAAY,EAAE,MAAM,CAAC,MAAM;YAC3B,YAAY,EAAE,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,YAAY;SAChD,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,MAAoB;IACnD,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,IAAI,CAAC,KAAK,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC,GAAG,CAAA;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,IAAI,WAAW,CAAA;QAC9C,OAAO,UAAU,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,UAAU,IAAI,GAAG,IAAI,KAAK,CAAC,YAAY,IAAI,GAAG,GAAG,CAAA;IACrG,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ErrorPayload } from './types';
|
|
2
|
+
/** Coerce an unknown thrown value into an Error. */
|
|
3
|
+
export declare function toError(raw: unknown): Error;
|
|
4
|
+
/** Build the wire-shape error payload logged under `jsonPayload.error`. */
|
|
5
|
+
export declare function toErrorPayload(error: Error): ErrorPayload;
|
|
6
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/shared/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,oDAAoD;AACpD,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAE3C;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,YAAY,CAOzD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toError = toError;
|
|
4
|
+
exports.toErrorPayload = toErrorPayload;
|
|
5
|
+
/** Coerce an unknown thrown value into an Error. */
|
|
6
|
+
function toError(raw) {
|
|
7
|
+
return raw instanceof Error ? raw : new Error(String(raw));
|
|
8
|
+
}
|
|
9
|
+
/** Build the wire-shape error payload logged under `jsonPayload.error`. */
|
|
10
|
+
function toErrorPayload(error) {
|
|
11
|
+
return {
|
|
12
|
+
message: error.message,
|
|
13
|
+
stack: error.stack,
|
|
14
|
+
name: error.name,
|
|
15
|
+
cause: error.cause != null ? String(error.cause) : undefined,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/shared/error.ts"],"names":[],"mappings":";;AAGA,0BAEC;AAGD,wCAOC;AAbD,oDAAoD;AACpD,SAAgB,OAAO,CAAC,GAAY;IAClC,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,2EAA2E;AAC3E,SAAgB,cAAc,CAAC,KAAY;IACzC,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LogSeverity } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Single source of truth for severity ranking. Lower number = more severe.
|
|
4
|
+
* Both the client and functions loggers filter against this, so a change here
|
|
5
|
+
* keeps min-level behaviour consistent on both sides of the wire.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SEVERITY_ORDER: Record<LogSeverity, number>;
|
|
8
|
+
export declare const SEVERITIES: LogSeverity[];
|
|
9
|
+
//# sourceMappingURL=severity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"severity.d.ts","sourceRoot":"","sources":["../../src/shared/severity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAKtD,CAAA;AAED,eAAO,MAAM,UAAU,EAAkC,WAAW,EAAE,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SEVERITIES = exports.SEVERITY_ORDER = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Single source of truth for severity ranking. Lower number = more severe.
|
|
6
|
+
* Both the client and functions loggers filter against this, so a change here
|
|
7
|
+
* keeps min-level behaviour consistent on both sides of the wire.
|
|
8
|
+
*/
|
|
9
|
+
exports.SEVERITY_ORDER = {
|
|
10
|
+
ERROR: 0,
|
|
11
|
+
WARNING: 1,
|
|
12
|
+
INFO: 2,
|
|
13
|
+
DEBUG: 3,
|
|
14
|
+
};
|
|
15
|
+
exports.SEVERITIES = Object.keys(exports.SEVERITY_ORDER);
|
|
16
|
+
//# sourceMappingURL=severity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"severity.js","sourceRoot":"","sources":["../../src/shared/severity.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACU,QAAA,cAAc,GAAgC;IACzD,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAA;AAEY,QAAA,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,sBAAc,CAAkB,CAAA"}
|
package/dist/shared/types.d.ts
CHANGED
|
@@ -10,6 +10,12 @@ export interface BaseLabels {
|
|
|
10
10
|
errorCategory?: string;
|
|
11
11
|
activity?: string;
|
|
12
12
|
}
|
|
13
|
+
export interface ErrorPayload {
|
|
14
|
+
message: string;
|
|
15
|
+
stack?: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
cause?: string;
|
|
18
|
+
}
|
|
13
19
|
export interface LogPayload {
|
|
14
20
|
message: string;
|
|
15
21
|
severity: LogSeverity;
|
|
@@ -17,12 +23,7 @@ export interface LogPayload {
|
|
|
17
23
|
jsonPayload?: {
|
|
18
24
|
breadcrumbs?: BreadcrumbEntry[];
|
|
19
25
|
context?: Record<string, unknown>;
|
|
20
|
-
error?:
|
|
21
|
-
message: string;
|
|
22
|
-
stack?: string;
|
|
23
|
-
name?: string;
|
|
24
|
-
cause?: string;
|
|
25
|
-
};
|
|
26
|
+
error?: ErrorPayload;
|
|
26
27
|
};
|
|
27
28
|
/** Base64-encoded attachments keyed by name. Uploaded to GCS, stripped before writing to Cloud Logging. */
|
|
28
29
|
attachments?: Record<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAA;AAEhE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,WAAW,CAAA;IACrB,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACvD,WAAW,CAAC,EAAE;QACZ,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;QAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACjC,KAAK,CAAC,EAAE
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAA;AAEhE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,WAAW,CAAA;IACrB,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACvD,WAAW,CAAC,EAAE;QACZ,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;QAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QACjC,KAAK,CAAC,EAAE,YAAY,CAAA;KACrB,CAAA;IACD,2GAA2G;IAC3G,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,CAAA;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dasasian/firebase-structured-logger",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Structured logging for Firebase apps — client, functions, and tools",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Dasasian",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"observability",
|
|
16
16
|
"typescript"
|
|
17
17
|
],
|
|
18
|
-
"homepage": "https://
|
|
18
|
+
"homepage": "https://dasasian.com/firebase-structured-logger",
|
|
19
19
|
"repository": {
|
|
20
20
|
"type": "git",
|
|
21
21
|
"url": "git+https://github.com/dasasian/firebase-structured-logger.git"
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"build:watch": "tsc --watch",
|
|
66
66
|
"clean": "rm -rf dist",
|
|
67
67
|
"typecheck": "tsc --noEmit",
|
|
68
|
-
"test": "tsx tests/logger.ts && FUNCTIONS_EMULATOR=true tsx tests/handler.ts && FUNCTIONS_EMULATOR=true tsx tests/symbolication.ts",
|
|
68
|
+
"test": "tsx tests/logger.ts && tsx tests/breadcrumbs.ts && tsx tests/rateLimiter.ts && tsx tests/errorHandler.ts && FUNCTIONS_EMULATOR=true tsx tests/errorPayload.ts && FUNCTIONS_EMULATOR=true tsx tests/requestLogger.ts && FUNCTIONS_EMULATOR=true tsx tests/handler.ts && FUNCTIONS_EMULATOR=true tsx tests/symbolication.ts",
|
|
69
69
|
"prepublishOnly": "npm run build"
|
|
70
70
|
},
|
|
71
71
|
"dependencies": {
|