@dasasian/firebase-structured-logger 0.6.0 → 0.8.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/README.md +669 -103
- package/dist/client/logger.d.ts.map +1 -1
- package/dist/client/logger.js +16 -2
- package/dist/client/logger.js.map +1 -1
- package/dist/functions/httpHandler.d.ts +89 -0
- package/dist/functions/httpHandler.d.ts.map +1 -0
- package/dist/functions/httpHandler.js +115 -0
- package/dist/functions/httpHandler.js.map +1 -0
- package/dist/functions/index.d.ts +5 -2
- package/dist/functions/index.d.ts.map +1 -1
- package/dist/functions/index.js +6 -1
- package/dist/functions/index.js.map +1 -1
- package/dist/functions/logHandler.d.ts +55 -3
- package/dist/functions/logHandler.d.ts.map +1 -1
- package/dist/functions/logHandler.js +51 -8
- package/dist/functions/logHandler.js.map +1 -1
- package/dist/functions/logger.d.ts +13 -0
- package/dist/functions/logger.d.ts.map +1 -1
- package/dist/functions/logger.js +128 -14
- package/dist/functions/logger.js.map +1 -1
- package/dist/functions/sourceMapCache.d.ts +39 -3
- package/dist/functions/sourceMapCache.d.ts.map +1 -1
- package/dist/functions/sourceMapCache.js +176 -12
- package/dist/functions/sourceMapCache.js.map +1 -1
- package/dist/functions/traceContext.d.ts +54 -0
- package/dist/functions/traceContext.d.ts.map +1 -0
- package/dist/functions/traceContext.js +141 -0
- package/dist/functions/traceContext.js.map +1 -0
- package/dist/shared/paths.d.ts +59 -0
- package/dist/shared/paths.d.ts.map +1 -0
- package/dist/shared/paths.js +126 -0
- package/dist/shared/paths.js.map +1 -0
- package/dist/tools/index.js +13 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/uploadSourceMaps.d.ts +24 -1
- package/dist/tools/uploadSourceMaps.d.ts.map +1 -1
- package/dist/tools/uploadSourceMaps.js +31 -4
- package/dist/tools/uploadSourceMaps.js.map +1 -1
- package/package.json +12 -6
- package/skills/query-logs/SKILL.md +14 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/client/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAgB,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAWxF,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,eAAe,CAAA;AAEtB,YAAY,EAAE,eAAe,EAAE,CAAA;AAE/B,KAAK,WAAW,GAAG,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAEzD,MAAM,WAAW,eAAe,CAC9B,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAEzF,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,CAAA;IAClD,mFAAmF;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC,CAAA;CACzC;AAED,MAAM,WAAW,gBAAgB,CAC/B,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAEzF,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,WAAW,CAAA;IACxB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,gBAAgB,CAAC,EAAE,eAAe,CAAA;CACnC;
|
|
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
|
@@ -9,9 +9,23 @@ const severity_1 = require("../shared/severity");
|
|
|
9
9
|
const error_1 = require("../shared/error");
|
|
10
10
|
const breadcrumbs_1 = require("./breadcrumbs");
|
|
11
11
|
const rateLimiter_1 = require("./rateLimiter");
|
|
12
|
+
/**
|
|
13
|
+
* No `typeof process` guard, on purpose. Every bundler folds `process.env.NODE_ENV` to a
|
|
14
|
+
* string literal at build time, so the comparison is safe in a browser — but `process`
|
|
15
|
+
* itself does not exist there, and guarding on it meant the folded branch was never
|
|
16
|
+
* reached: every browser build defaulted to DEBUG in production, and the README's
|
|
17
|
+
* "WARNING in production" was true only under Node. Seen in a real Vite bundle as
|
|
18
|
+
* `typeof process<"u"?"WARNING":"DEBUG"`. A runtime with neither the fold nor
|
|
19
|
+
* `process` throws on the read, and that is the case the catch is for.
|
|
20
|
+
*/
|
|
12
21
|
function defaultMinLevel() {
|
|
13
|
-
|
|
14
|
-
|
|
22
|
+
try {
|
|
23
|
+
if (process.env.NODE_ENV === 'production')
|
|
24
|
+
return 'WARNING';
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Not Node and not folded: development.
|
|
28
|
+
}
|
|
15
29
|
return 'DEBUG';
|
|
16
30
|
}
|
|
17
31
|
// Order matters — first match wins.
|
|
@@ -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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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Receive client logs over plain HTTP, for a backend that is not Cloud Functions
|
|
3
|
+
* (#34).
|
|
4
|
+
*
|
|
5
|
+
* The client half was already portable — `logFunction` is any
|
|
6
|
+
* `(payload) => Promise<unknown>`, and `httpsCallable()` merely happens to fit.
|
|
7
|
+
* What was missing was a receiving end that does not require a callable.
|
|
8
|
+
*
|
|
9
|
+
* This is deliberately framework-agnostic. It reads `method`, `headers` and a
|
|
10
|
+
* parsed `body`, and writes through `statusCode` / `setHeader` / `end` — the
|
|
11
|
+
* Node core shapes, which Express, Fastify's compat layer and Cloud Run's raw
|
|
12
|
+
* server all satisfy. Parsing the body is the caller's job (`express.json()` or
|
|
13
|
+
* equivalent); reading the stream here would mean guessing at limits and
|
|
14
|
+
* encodings that the host framework already has opinions about.
|
|
15
|
+
*/
|
|
16
|
+
import { type ClientLogHandlerConfig } from './logHandler';
|
|
17
|
+
/** The parts of a request this handler reads. */
|
|
18
|
+
export interface HttpLogRequest {
|
|
19
|
+
method?: string;
|
|
20
|
+
headers: Record<string, string | string[] | undefined>;
|
|
21
|
+
body?: unknown;
|
|
22
|
+
}
|
|
23
|
+
/** The parts of a response this handler writes. */
|
|
24
|
+
export interface HttpLogResponse {
|
|
25
|
+
statusCode: number;
|
|
26
|
+
setHeader(name: string, value: string): unknown;
|
|
27
|
+
end(body?: string): unknown;
|
|
28
|
+
}
|
|
29
|
+
export interface HttpLogHandlerConfig extends ClientLogHandlerConfig {
|
|
30
|
+
/**
|
|
31
|
+
* Who is allowed to POST a log.
|
|
32
|
+
*
|
|
33
|
+
* Required, and with no default, because the honest default does not exist. A
|
|
34
|
+
* callable gets Firebase's own token check for free; an HTTP endpoint gets
|
|
35
|
+
* nothing, and an open one writes to the customer's Cloud Logging bill on
|
|
36
|
+
* anyone's say-so.
|
|
37
|
+
*
|
|
38
|
+
* This is a **gate, not an identity check**. The handler never reads
|
|
39
|
+
* `request.auth` — `userId` arrives self-reported in the client's own labels
|
|
40
|
+
* either way. Its job is to keep strangers out, not to establish who is
|
|
41
|
+
* speaking.
|
|
42
|
+
*
|
|
43
|
+
* Verify a Firebase ID token:
|
|
44
|
+
*
|
|
45
|
+
* import { getAuth } from 'firebase-admin/auth'
|
|
46
|
+
* authorize: async (req) => {
|
|
47
|
+
* const header = String(req.headers.authorization ?? '')
|
|
48
|
+
* if (!header.startsWith('Bearer ')) return false
|
|
49
|
+
* try { await getAuth().verifyIdToken(header.slice(7)); return true }
|
|
50
|
+
* catch { return false }
|
|
51
|
+
* }
|
|
52
|
+
*
|
|
53
|
+
* Pass the literal `'unauthenticated'` to open the endpoint deliberately —
|
|
54
|
+
* behind a VPC, an API gateway, or IAM that already did the work. It is spelled
|
|
55
|
+
* out at the call site so nobody arrives there by omission.
|
|
56
|
+
*/
|
|
57
|
+
authorize: ((request: HttpLogRequest) => boolean | Promise<boolean>) | 'unauthenticated';
|
|
58
|
+
/**
|
|
59
|
+
* Value for `Access-Control-Allow-Origin`. Defaults to `*`, matching
|
|
60
|
+
* `createClientLogFunction`'s `cors: true`.
|
|
61
|
+
*
|
|
62
|
+
* A browser cannot send credentials to a wildcard origin, so name your origins
|
|
63
|
+
* if the gate above reads a cookie. A bearer token in a header is unaffected.
|
|
64
|
+
*/
|
|
65
|
+
allowOrigin?: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Build a request handler that receives `LogPayload` over HTTP.
|
|
69
|
+
*
|
|
70
|
+
* import express from 'express'
|
|
71
|
+
* import { createHttpLogHandler } from '@dasasian/firebase-structured-logger/functions'
|
|
72
|
+
*
|
|
73
|
+
* const app = express()
|
|
74
|
+
* app.use(express.json({ limit: '10mb' })) // attachments ride in the body
|
|
75
|
+
* app.post('/log', createHttpLogHandler({ bucketName, authorize }))
|
|
76
|
+
*
|
|
77
|
+
* On the client, point `logFunction` at it:
|
|
78
|
+
*
|
|
79
|
+
* logFunction: async (payload) => {
|
|
80
|
+
* const res = await fetch('/log', {
|
|
81
|
+
* method: 'POST',
|
|
82
|
+
* headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${await user.getIdToken()}` },
|
|
83
|
+
* body: JSON.stringify(payload),
|
|
84
|
+
* })
|
|
85
|
+
* if (!res.ok) throw new Error(`log rejected: ${res.status}`)
|
|
86
|
+
* }
|
|
87
|
+
*/
|
|
88
|
+
export declare function createHttpLogHandler(config: HttpLogHandlerConfig): (req: HttpLogRequest, res: HttpLogResponse) => Promise<void>;
|
|
89
|
+
//# sourceMappingURL=httpHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpHandler.d.ts","sourceRoot":"","sources":["../../src/functions/httpHandler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAA0C,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAIlG,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;IACtD,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;IAC/C,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,oBAAqB,SAAQ,sBAAsB;IAClE;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,iBAAiB,CAAA;IAExF;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAiBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,oBAAoB,GAC3B,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CA+D9D"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Receive client logs over plain HTTP, for a backend that is not Cloud Functions
|
|
4
|
+
* (#34).
|
|
5
|
+
*
|
|
6
|
+
* The client half was already portable — `logFunction` is any
|
|
7
|
+
* `(payload) => Promise<unknown>`, and `httpsCallable()` merely happens to fit.
|
|
8
|
+
* What was missing was a receiving end that does not require a callable.
|
|
9
|
+
*
|
|
10
|
+
* This is deliberately framework-agnostic. It reads `method`, `headers` and a
|
|
11
|
+
* parsed `body`, and writes through `statusCode` / `setHeader` / `end` — the
|
|
12
|
+
* Node core shapes, which Express, Fastify's compat layer and Cloud Run's raw
|
|
13
|
+
* server all satisfy. Parsing the body is the caller's job (`express.json()` or
|
|
14
|
+
* equivalent); reading the stream here would mean guessing at limits and
|
|
15
|
+
* encodings that the host framework already has opinions about.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.createHttpLogHandler = createHttpLogHandler;
|
|
19
|
+
const logHandler_1 = require("./logHandler");
|
|
20
|
+
const traceContext_1 = require("./traceContext");
|
|
21
|
+
const STATUS = {
|
|
22
|
+
'invalid-argument': 400,
|
|
23
|
+
internal: 500,
|
|
24
|
+
};
|
|
25
|
+
function send(res, status, body) {
|
|
26
|
+
res.statusCode = status;
|
|
27
|
+
if (body) {
|
|
28
|
+
res.setHeader('Content-Type', 'application/json');
|
|
29
|
+
res.end(JSON.stringify(body));
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
res.end();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build a request handler that receives `LogPayload` over HTTP.
|
|
37
|
+
*
|
|
38
|
+
* import express from 'express'
|
|
39
|
+
* import { createHttpLogHandler } from '@dasasian/firebase-structured-logger/functions'
|
|
40
|
+
*
|
|
41
|
+
* const app = express()
|
|
42
|
+
* app.use(express.json({ limit: '10mb' })) // attachments ride in the body
|
|
43
|
+
* app.post('/log', createHttpLogHandler({ bucketName, authorize }))
|
|
44
|
+
*
|
|
45
|
+
* On the client, point `logFunction` at it:
|
|
46
|
+
*
|
|
47
|
+
* logFunction: async (payload) => {
|
|
48
|
+
* const res = await fetch('/log', {
|
|
49
|
+
* method: 'POST',
|
|
50
|
+
* headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${await user.getIdToken()}` },
|
|
51
|
+
* body: JSON.stringify(payload),
|
|
52
|
+
* })
|
|
53
|
+
* if (!res.ok) throw new Error(`log rejected: ${res.status}`)
|
|
54
|
+
* }
|
|
55
|
+
*/
|
|
56
|
+
function createHttpLogHandler(config) {
|
|
57
|
+
const handler = (0, logHandler_1.createClientLogHandler)(config);
|
|
58
|
+
const allowOrigin = config.allowOrigin ?? '*';
|
|
59
|
+
return async (req, res) => {
|
|
60
|
+
res.setHeader('Access-Control-Allow-Origin', allowOrigin);
|
|
61
|
+
res.setHeader('Vary', 'Origin');
|
|
62
|
+
// Preflight. The client sends Content-Type and usually Authorization, both
|
|
63
|
+
// of which make the request non-simple.
|
|
64
|
+
if (req.method === 'OPTIONS') {
|
|
65
|
+
res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
|
|
66
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
67
|
+
res.setHeader('Access-Control-Max-Age', '3600');
|
|
68
|
+
return send(res, 204);
|
|
69
|
+
}
|
|
70
|
+
if (req.method !== 'POST') {
|
|
71
|
+
res.setHeader('Allow', 'POST, OPTIONS');
|
|
72
|
+
return send(res, 405, { error: 'Use POST' });
|
|
73
|
+
}
|
|
74
|
+
if (config.authorize !== 'unauthenticated') {
|
|
75
|
+
let allowed = false;
|
|
76
|
+
try {
|
|
77
|
+
allowed = await config.authorize(req);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
// A gate that threw is a gate that did not pass. Say so on the server
|
|
81
|
+
// and tell the caller nothing about why.
|
|
82
|
+
console.warn('[fsl] authorize() threw; rejecting the request:', err);
|
|
83
|
+
}
|
|
84
|
+
if (!allowed)
|
|
85
|
+
return send(res, 401, { error: 'Unauthorized' });
|
|
86
|
+
}
|
|
87
|
+
if (req.body === null || typeof req.body !== 'object') {
|
|
88
|
+
// Almost always a missing body parser rather than a bad client, and that
|
|
89
|
+
// is a five-minute fix once someone says it out loud.
|
|
90
|
+
return send(res, 400, {
|
|
91
|
+
error: 'Expected a parsed JSON body. Is express.json() (or equivalent) mounted before this handler?',
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
// Cloud Logging groups a request's entries by trace. firebase-functions
|
|
96
|
+
// only attaches one inside its own wrapper, so out here we read the
|
|
97
|
+
// headers ourselves — otherwise the logs arrive uncorrelated and nothing
|
|
98
|
+
// says why.
|
|
99
|
+
// Once per process, and a no-op off Cloud Run: the trace needs the project
|
|
100
|
+
// id, which Cloud Run does not put in the environment.
|
|
101
|
+
await (0, traceContext_1.resolveTraceProject)();
|
|
102
|
+
await (0, traceContext_1.runWithTrace)((0, traceContext_1.traceIdFromHeaders)(req.headers), () => handler({ data: req.body }));
|
|
103
|
+
return send(res, 204);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
if (err instanceof logHandler_1.ClientLogError) {
|
|
107
|
+
// 'internal' has already been logged with its cause by the handler.
|
|
108
|
+
return send(res, STATUS[err.code], { error: err.message });
|
|
109
|
+
}
|
|
110
|
+
console.error('[fsl] Unhandled error in the HTTP log handler:', err);
|
|
111
|
+
return send(res, 500, { error: 'Failed to process log' });
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=httpHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpHandler.js","sourceRoot":"","sources":["../../src/functions/httpHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,11 @@ import type { LogWriter } from './logger';
|
|
|
2
2
|
export { initLogger } from './logger';
|
|
3
3
|
export type { LogWriter } from './logger';
|
|
4
4
|
export { withLogging, getLogger } from './requestLogger';
|
|
5
|
-
export {
|
|
6
|
-
export
|
|
5
|
+
export { configureAttachments } from './sourceMapCache';
|
|
6
|
+
export { createClientLogHandler, createClientLogFunction, ClientLogError } from './logHandler';
|
|
7
|
+
export { createHttpLogHandler } from './httpHandler';
|
|
8
|
+
export type { ClientLogHandlerConfig, ClientLogRequest } from './logHandler';
|
|
9
|
+
export type { HttpLogHandlerConfig, HttpLogRequest, HttpLogResponse } from './httpHandler';
|
|
7
10
|
export type { LogSeverity, LogPayload, BaseLabels } from '../shared/types';
|
|
8
11
|
export declare const logError: (...args: Parameters<LogWriter["error"]>) => void;
|
|
9
12
|
export declare const logWarn: (...args: Parameters<LogWriter["warning"]>) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/functions/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/functions/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC5E,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC1F,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE1E,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAG,IAAkC,CAAA;AACrG,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,KAAG,IAAoC,CAAA;AACxG,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAG,IAAiC,CAAA;AAClG,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAG,IAAkC,CAAA"}
|
package/dist/functions/index.js
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.logDebug = exports.logInfo = exports.logWarn = exports.logError = exports.createClientLogFunction = exports.createClientLogHandler = exports.getLogger = exports.withLogging = exports.initLogger = void 0;
|
|
3
|
+
exports.logDebug = exports.logInfo = exports.logWarn = exports.logError = exports.createHttpLogHandler = exports.ClientLogError = exports.createClientLogFunction = exports.createClientLogHandler = exports.configureAttachments = exports.getLogger = exports.withLogging = exports.initLogger = void 0;
|
|
4
4
|
const requestLogger_1 = require("./requestLogger");
|
|
5
5
|
var logger_1 = require("./logger");
|
|
6
6
|
Object.defineProperty(exports, "initLogger", { enumerable: true, get: function () { return logger_1.initLogger; } });
|
|
7
7
|
var requestLogger_2 = require("./requestLogger");
|
|
8
8
|
Object.defineProperty(exports, "withLogging", { enumerable: true, get: function () { return requestLogger_2.withLogging; } });
|
|
9
9
|
Object.defineProperty(exports, "getLogger", { enumerable: true, get: function () { return requestLogger_2.getLogger; } });
|
|
10
|
+
var sourceMapCache_1 = require("./sourceMapCache");
|
|
11
|
+
Object.defineProperty(exports, "configureAttachments", { enumerable: true, get: function () { return sourceMapCache_1.configureAttachments; } });
|
|
10
12
|
var logHandler_1 = require("./logHandler");
|
|
11
13
|
Object.defineProperty(exports, "createClientLogHandler", { enumerable: true, get: function () { return logHandler_1.createClientLogHandler; } });
|
|
12
14
|
Object.defineProperty(exports, "createClientLogFunction", { enumerable: true, get: function () { return logHandler_1.createClientLogFunction; } });
|
|
15
|
+
Object.defineProperty(exports, "ClientLogError", { enumerable: true, get: function () { return logHandler_1.ClientLogError; } });
|
|
16
|
+
var httpHandler_1 = require("./httpHandler");
|
|
17
|
+
Object.defineProperty(exports, "createHttpLogHandler", { enumerable: true, get: function () { return httpHandler_1.createHttpLogHandler; } });
|
|
13
18
|
const logError = (...args) => (0, requestLogger_1.getLogger)().error(...args);
|
|
14
19
|
exports.logError = logError;
|
|
15
20
|
const logWarn = (...args) => (0, requestLogger_1.getLogger)().warning(...args);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/functions/index.ts"],"names":[],"mappings":";;;AAAA,mDAA2C;AAG3C,mCAAqC;AAA5B,oGAAA,UAAU,OAAA;AAEnB,iDAAwD;AAA/C,4GAAA,WAAW,OAAA;AAAE,0GAAA,SAAS,OAAA;AAC/B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/functions/index.ts"],"names":[],"mappings":";;;AAAA,mDAA2C;AAG3C,mCAAqC;AAA5B,oGAAA,UAAU,OAAA;AAEnB,iDAAwD;AAA/C,4GAAA,WAAW,OAAA;AAAE,0GAAA,SAAS,OAAA;AAC/B,mDAAuD;AAA9C,sHAAA,oBAAoB,OAAA;AAC7B,2CAA8F;AAArF,oHAAA,sBAAsB,OAAA;AAAE,qHAAA,uBAAuB,OAAA;AAAE,4GAAA,cAAc,OAAA;AACxE,6CAAoD;AAA3C,mHAAA,oBAAoB,OAAA;AAKtB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAoC,EAAQ,EAAE,CAAC,IAAA,yBAAS,GAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AAAxF,QAAA,QAAQ,YAAgF;AAC9F,MAAM,OAAO,GAAG,CAAC,GAAG,IAAsC,EAAQ,EAAE,CAAC,IAAA,yBAAS,GAAE,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;AAA3F,QAAA,OAAO,WAAoF;AACjG,MAAM,OAAO,GAAG,CAAC,GAAG,IAAmC,EAAQ,EAAE,CAAC,IAAA,yBAAS,GAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;AAArF,QAAA,OAAO,WAA8E;AAC3F,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAoC,EAAQ,EAAE,CAAC,IAAA,yBAAS,GAAE,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;AAAxF,QAAA,QAAQ,YAAgF"}
|
|
@@ -1,9 +1,61 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type * as FirebaseHttps from 'firebase-functions/v2/https';
|
|
2
2
|
import type { LogPayload } from '../shared/types';
|
|
3
3
|
export interface ClientLogHandlerConfig {
|
|
4
|
+
/**
|
|
5
|
+
* Storage bucket for **both** source maps and attachments.
|
|
6
|
+
*
|
|
7
|
+
* Maps go to `sourcemaps/{releaseId}/`, attachments to `logAttachments/{logId}/`.
|
|
8
|
+
* Defaults to the project's default bucket.
|
|
9
|
+
*
|
|
10
|
+
* Attachments read it as a fallback, not directly — this sets the process-wide
|
|
11
|
+
* default that `writeLog` reaches for, since the upload happens outside any
|
|
12
|
+
* handler. Override either half independently with `sourceMaps` below or
|
|
13
|
+
* `configureAttachments()`.
|
|
14
|
+
*/
|
|
4
15
|
bucketName?: string;
|
|
5
16
|
cors?: boolean | string | string[];
|
|
6
17
|
maxInstances?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Where this handler looks for source maps in Cloud Storage.
|
|
20
|
+
*
|
|
21
|
+
* Genuinely per-handler: both values travel explicitly to `getSourceMap`, so
|
|
22
|
+
* two handlers configured differently cannot resolve to whichever was
|
|
23
|
+
* constructed last. `bucket` overrides `bucketName` for map lookups only.
|
|
24
|
+
*
|
|
25
|
+
* `prefix` must match `fsl upload-sourcemaps --prefix`. They are the two ends
|
|
26
|
+
* of one contract (#35) and nothing checks them against each other — when they
|
|
27
|
+
* disagree the maps are simply not found and stacks stay minified.
|
|
28
|
+
*
|
|
29
|
+
* Attachments are configured separately, with `configureAttachments()` — the
|
|
30
|
+
* upload happens outside any handler, so a field here would be a lie.
|
|
31
|
+
*/
|
|
32
|
+
sourceMaps?: {
|
|
33
|
+
bucket?: string;
|
|
34
|
+
prefix?: string;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* What the bare handler throws.
|
|
39
|
+
*
|
|
40
|
+
* It used to throw `HttpsError` directly, which made the handler
|
|
41
|
+
* Firebase-shaped in its failures as well as its input — a caller running it
|
|
42
|
+
* behind anything else got an error carrying a callable protocol's vocabulary.
|
|
43
|
+
* `createClientLogFunction` converts these back, so a callable client sees
|
|
44
|
+
* exactly what it saw before.
|
|
45
|
+
*/
|
|
46
|
+
export declare class ClientLogError extends Error {
|
|
47
|
+
readonly code: 'invalid-argument' | 'internal';
|
|
48
|
+
constructor(code: 'invalid-argument' | 'internal', message: string);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The minimum the handler actually reads.
|
|
52
|
+
*
|
|
53
|
+
* `CallableRequest` was in the signature and only `.data` was ever touched —
|
|
54
|
+
* not `.auth`, not `.rawRequest`. Saying so is what lets an Express adapter, or
|
|
55
|
+
* anything else, call this without constructing a callable request (#34).
|
|
56
|
+
*/
|
|
57
|
+
export interface ClientLogRequest {
|
|
58
|
+
data: LogPayload;
|
|
7
59
|
}
|
|
8
60
|
/**
|
|
9
61
|
* Create an onCall handler that receives LogPayload from the client,
|
|
@@ -12,7 +64,7 @@ export interface ClientLogHandlerConfig {
|
|
|
12
64
|
* @example
|
|
13
65
|
* export const logFrontendEvent = onCall(createClientLogHandler({ bucketName: 'my-bucket' }))
|
|
14
66
|
*/
|
|
15
|
-
export declare function createClientLogHandler(config: ClientLogHandlerConfig): (request:
|
|
67
|
+
export declare function createClientLogHandler(config: ClientLogHandlerConfig): (request: ClientLogRequest) => Promise<void>;
|
|
16
68
|
/**
|
|
17
69
|
* Convenience factory that wraps createClientLogHandler in onCall.
|
|
18
70
|
* Use when you want a ready-to-export Cloud Function.
|
|
@@ -23,5 +75,5 @@ export declare function createClientLogHandler(config: ClientLogHandlerConfig):
|
|
|
23
75
|
export declare function createClientLogFunction(config: ClientLogHandlerConfig & {
|
|
24
76
|
cors?: boolean | string | string[];
|
|
25
77
|
maxInstances?: number;
|
|
26
|
-
}):
|
|
78
|
+
}): FirebaseHttps.CallableFunction<LogPayload, Promise<void>, unknown>;
|
|
27
79
|
//# sourceMappingURL=logHandler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logHandler.d.ts","sourceRoot":"","sources":["../../src/functions/logHandler.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"logHandler.d.ts","sourceRoot":"","sources":["../../src/functions/logHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,aAAa,MAAM,6BAA6B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,iBAAiB,CAAA;AAuB/D,MAAM,WAAW,sBAAsB;IACrC;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;IAClC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAClD;AAID;;;;;;;;GAQG;AACH,qBAAa,cAAe,SAAQ,KAAK;IAErC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,GAAG,UAAU;gBAArC,IAAI,EAAE,kBAAkB,GAAG,UAAU,EAC9C,OAAO,EAAE,MAAM;CAKlB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAA;CACjB;AA6DD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,IAGrD,SAAS,gBAAgB,KAAG,OAAO,CAAC,IAAI,CAAC,CAqCxD;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,sEAiB/F"}
|
|
@@ -1,13 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClientLogError = void 0;
|
|
3
4
|
exports.createClientLogHandler = createClientLogHandler;
|
|
4
5
|
exports.createClientLogFunction = createClientLogFunction;
|
|
5
|
-
const https_1 = require("firebase-functions/v2/https");
|
|
6
6
|
const severity_1 = require("../shared/severity");
|
|
7
7
|
const logger_1 = require("./logger");
|
|
8
8
|
const sourceMapCache_1 = require("./sourceMapCache");
|
|
9
9
|
const symbolicate_1 = require("./symbolicate");
|
|
10
|
+
/**
|
|
11
|
+
* OPTIONAL PEER — firebase-functions is loaded lazily, on purpose.
|
|
12
|
+
*
|
|
13
|
+
* Only createClientLogFunction needs it, and that only runs on Cloud Functions, where
|
|
14
|
+
* it is always installed. A top-level import made the whole `/functions` entry point
|
|
15
|
+
* fail on `require` on a backend that wants createHttpLogHandler and nothing else
|
|
16
|
+
* (#39). `require` rather than `await import`: createClientLogFunction must return
|
|
17
|
+
* the function synchronously, because `firebase deploy` reads the export at load.
|
|
18
|
+
*/
|
|
19
|
+
function loadFirebaseHttps() {
|
|
20
|
+
return require('firebase-functions/v2/https');
|
|
21
|
+
}
|
|
10
22
|
const VALID_SEVERITIES = new Set(severity_1.SEVERITIES);
|
|
23
|
+
/**
|
|
24
|
+
* What the bare handler throws.
|
|
25
|
+
*
|
|
26
|
+
* It used to throw `HttpsError` directly, which made the handler
|
|
27
|
+
* Firebase-shaped in its failures as well as its input — a caller running it
|
|
28
|
+
* behind anything else got an error carrying a callable protocol's vocabulary.
|
|
29
|
+
* `createClientLogFunction` converts these back, so a callable client sees
|
|
30
|
+
* exactly what it saw before.
|
|
31
|
+
*/
|
|
32
|
+
class ClientLogError extends Error {
|
|
33
|
+
code;
|
|
34
|
+
constructor(code, message) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.code = code;
|
|
37
|
+
this.name = 'ClientLogError';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.ClientLogError = ClientLogError;
|
|
11
41
|
/**
|
|
12
42
|
* Extract the bundle filename (e.g. "index-DnZ05f3M.js") from a frame URL.
|
|
13
43
|
*/
|
|
@@ -19,7 +49,7 @@ function bundleFileFromUrl(url) {
|
|
|
19
49
|
* Attempt to symbolicate a minified error stack trace using source maps.
|
|
20
50
|
* Loads source maps per-bundle so multiple chunks are handled correctly.
|
|
21
51
|
*/
|
|
22
|
-
async function symbolicateError(releaseId, error, bucketName) {
|
|
52
|
+
async function symbolicateError(releaseId, error, bucketName, prefix) {
|
|
23
53
|
if (!error?.stack)
|
|
24
54
|
return error;
|
|
25
55
|
try {
|
|
@@ -38,7 +68,7 @@ async function symbolicateError(releaseId, error, bucketName) {
|
|
|
38
68
|
// Load source map for each unique bundle (getSourceMap handles caching)
|
|
39
69
|
const sourceMaps = new Map();
|
|
40
70
|
await Promise.all(Array.from(bundleFiles).map(async (bundle) => {
|
|
41
|
-
const map = await (0, sourceMapCache_1.getSourceMap)(releaseId, bundle, bucketName);
|
|
71
|
+
const map = await (0, sourceMapCache_1.getSourceMap)(releaseId, bundle, bucketName, prefix);
|
|
42
72
|
if (map)
|
|
43
73
|
sourceMaps.set(bundle, map);
|
|
44
74
|
}));
|
|
@@ -69,17 +99,17 @@ function createClientLogHandler(config) {
|
|
|
69
99
|
return async (request) => {
|
|
70
100
|
const { message, severity, labels, jsonPayload } = request.data;
|
|
71
101
|
if (!message || !severity) {
|
|
72
|
-
throw new
|
|
102
|
+
throw new ClientLogError('invalid-argument', 'Missing message or severity');
|
|
73
103
|
}
|
|
74
104
|
if (!VALID_SEVERITIES.has(severity)) {
|
|
75
|
-
throw new
|
|
105
|
+
throw new ClientLogError('invalid-argument', `Invalid severity: ${severity}`);
|
|
76
106
|
}
|
|
77
107
|
const isEmulator = process.env.FUNCTIONS_EMULATOR === 'true';
|
|
78
108
|
try {
|
|
79
109
|
let processedError = jsonPayload?.error;
|
|
80
110
|
if (processedError?.stack && !isEmulator) {
|
|
81
111
|
const releaseId = labels?.releaseId ?? 'unknown';
|
|
82
|
-
processedError = await symbolicateError(releaseId, processedError, config.bucketName);
|
|
112
|
+
processedError = await symbolicateError(releaseId, processedError, config.sourceMaps?.bucket ?? config.bucketName, config.sourceMaps?.prefix);
|
|
83
113
|
}
|
|
84
114
|
(0, logger_1.writeLog)({
|
|
85
115
|
message,
|
|
@@ -91,7 +121,7 @@ function createClientLogHandler(config) {
|
|
|
91
121
|
}
|
|
92
122
|
catch (err) {
|
|
93
123
|
console.error('[fsl] Error processing client log:', err);
|
|
94
|
-
throw new
|
|
124
|
+
throw new ClientLogError('internal', 'Failed to process log');
|
|
95
125
|
}
|
|
96
126
|
};
|
|
97
127
|
}
|
|
@@ -103,6 +133,19 @@ function createClientLogHandler(config) {
|
|
|
103
133
|
* export const logFrontendEvent = createClientLogFunction({ bucketName: 'my-bucket' })
|
|
104
134
|
*/
|
|
105
135
|
function createClientLogFunction(config) {
|
|
106
|
-
|
|
136
|
+
const handler = createClientLogHandler(config);
|
|
137
|
+
const { onCall, HttpsError } = loadFirebaseHttps();
|
|
138
|
+
return onCall({ cors: config.cors ?? true, maxInstances: config.maxInstances ?? 1 }, async (request) => {
|
|
139
|
+
try {
|
|
140
|
+
await handler(request);
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
// Convert back at the Firebase boundary, so a callable client sees the
|
|
144
|
+
// same error it always did.
|
|
145
|
+
if (err instanceof ClientLogError)
|
|
146
|
+
throw new HttpsError(err.code, err.message);
|
|
147
|
+
throw err;
|
|
148
|
+
}
|
|
149
|
+
});
|
|
107
150
|
}
|
|
108
151
|
//# sourceMappingURL=logHandler.js.map
|
|
@@ -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,17 @@
|
|
|
1
|
+
import type { write as FirebaseWrite } from "firebase-functions/logger";
|
|
1
2
|
import type { LogSeverity, LogPayload } from "../shared/types";
|
|
3
|
+
type EntryWriter = typeof FirebaseWrite;
|
|
4
|
+
/**
|
|
5
|
+
* What firebase-functions' `write()` does, minus the trace id: one JSON line, WARNING
|
|
6
|
+
* and above to stderr and the rest to stdout (its console mapping), and a
|
|
7
|
+
* self-referencing object written as "[Circular]" rather than throwing. Cloud Run's log
|
|
8
|
+
* agent promotes `severity`, `message` and the `logging.googleapis.com/*` keys exactly
|
|
9
|
+
* as Cloud Functions does.
|
|
10
|
+
*
|
|
11
|
+
* Writes to the streams, not `console`: firebase-functions' compat module patches
|
|
12
|
+
* `console`, and a patched `console.error` would wrap this line a second time.
|
|
13
|
+
*/
|
|
14
|
+
export declare function writeJsonLine(entry: Parameters<EntryWriter>[0]): void;
|
|
2
15
|
export declare const LOG_FILENAME = "dev.jsonl";
|
|
3
16
|
interface FunctionsLoggerConfig {
|
|
4
17
|
appId: string;
|
|
@@ -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":"AAGA,OAAO,KAAK,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAQ/D,KAAK,WAAW,GAAG,OAAO,aAAa,CAAC;AAgCxC;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAWrE;AAGD,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;AAoFD;;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,CAkKN;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"}
|