logixlysia 6.6.1 → 6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  <div align="center">
2
2
  <h1><code>🦊</code> Logixlysia</h1>
3
3
  <strong>Logixlysia is a logging library for ElysiaJS</strong>
4
- <img src="https://logixlysia.vercel.app/opengraph-image.png" alt="Logixlysia" width="100%" height="auto" />
4
+ <img src="https://github.com/PunGrumpy/logixlysia/blob/main/apps/docs/public/opengraph-image.png?raw=true" alt="Logixlysia" width="100%" height="auto" />
5
5
  </div>
6
6
 
7
7
  ## `📩` Installation
package/dist/ai.d.ts CHANGED
@@ -1,13 +1,20 @@
1
1
  import { Logger as PinoLogger } from "pino";
2
- type Pino = PinoLogger<never, boolean>;
3
- type RequestInfo = Request;
4
- type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
5
- interface StoreData {
6
- beforeTime: bigint;
7
- }
8
2
  interface Logger {
3
+ /**
4
+ * Opens a request for tail sampling. Without it, records this request drops
5
+ * to head sampling are discarded rather than buffered. No-op when sampling
6
+ * is off.
7
+ */
8
+ beginRequest: (request: RequestInfo) => void;
9
9
  debug: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
10
10
  error: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
11
+ /**
12
+ * Closes a request opened by {@link Logger.beginRequest} and resolves its
13
+ * tail-sampling verdict, replaying buffered records when the outcome
14
+ * matches. Call it before the request's final log line. No-op when sampling
15
+ * is off.
16
+ */
17
+ finalizeRequest: (request: RequestInfo, store: StoreData, status: number) => void;
11
18
  getContext: (key: RequestInfo | object) => Readonly<Record<string, unknown>>;
12
19
  handleHttpError: (request: RequestInfo, error: unknown, store: StoreData) => void;
13
20
  info: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
@@ -16,6 +23,12 @@ interface Logger {
16
23
  pino: Pino;
17
24
  warn: (request: RequestInfo, message: string, context?: Record<string, unknown>) => void;
18
25
  }
26
+ type Pino = PinoLogger<never, boolean>;
27
+ type RequestInfo = Request;
28
+ type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
29
+ interface StoreData {
30
+ beforeTime: bigint;
31
+ }
19
32
  interface AIMetrics {
20
33
  calls?: number;
21
34
  finishReason?: string;
@@ -0,0 +1,63 @@
1
+ type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
2
+ interface Transport {
3
+ log: (level: LogLevel, message: string, meta?: Record<string, unknown>) => void | Promise<void>;
4
+ }
5
+ interface BatchTransportOptions {
6
+ /**
7
+ * Max time (ms) an entry waits in the buffer before it is sent.
8
+ * @default 2000
9
+ */
10
+ flushIntervalMs?: number;
11
+ /**
12
+ * Entries buffered before an immediate flush, regardless of the interval.
13
+ * @default 20
14
+ */
15
+ maxBatchSize?: number;
16
+ /**
17
+ * Retry attempts on network errors, 429, and 5xx responses.
18
+ * @default 2
19
+ */
20
+ retries?: number;
21
+ /**
22
+ * Per-request timeout in milliseconds.
23
+ * @default 5000
24
+ */
25
+ timeout?: number;
26
+ }
27
+ /** A {@link Transport} that batches entries and can be flushed on demand. */
28
+ interface AdapterTransport extends Transport {
29
+ /** Sends any buffered entries immediately. Call before process exit. */
30
+ flush: () => Promise<void>;
31
+ }
32
+ interface AxiomTransportOptions extends BatchTransportOptions {
33
+ /**
34
+ * Axiom API token with ingest permission (`xaat-…`).
35
+ * Falls back to the `AXIOM_API_KEY` environment variable.
36
+ */
37
+ apiKey?: string;
38
+ /**
39
+ * API base URL.
40
+ * Falls back to `AXIOM_URL`.
41
+ * @default 'https://api.axiom.co'
42
+ */
43
+ baseUrl?: string;
44
+ /**
45
+ * Target dataset name.
46
+ * Falls back to `AXIOM_DATASET`.
47
+ */
48
+ dataset?: string;
49
+ /**
50
+ * Organization ID — required when using a personal access token.
51
+ * Falls back to `AXIOM_ORG_ID`.
52
+ */
53
+ orgId?: string;
54
+ }
55
+ /**
56
+ * Creates a transport that ships logs to an Axiom dataset via the ingest API.
57
+ * Events keep their nested structure — Axiom indexes every field without a
58
+ * schema, so `request.method`, `context.requestId`, etc. are all queryable.
59
+ *
60
+ * @throws When no API token or dataset is configured.
61
+ */
62
+ declare const createAxiomTransport: (options?: AxiomTransportOptions) => AdapterTransport;
63
+ export { createAxiomTransport, AxiomTransportOptions, AdapterTransport };
package/dist/axiom.js ADDED
@@ -0,0 +1,4 @@
1
+ import{c as G,d as k,e as q,g as J}from"./shared/Logixlysia-7649md6y.js";var P="https://api.axiom.co",V=(j={})=>{let u=j.apiKey??k("AXIOM_API_KEY");if(!u)throw q("Axiom","missing API token. Set AXIOM_API_KEY or pass apiKey to createAxiomTransport()");let x=j.dataset??k("AXIOM_DATASET");if(!x)throw q("Axiom","missing dataset. Set AXIOM_DATASET or pass dataset to createAxiomTransport()");let N=G(j.baseUrl??k("AXIOM_URL")??P),z=j.orgId??k("AXIOM_ORG_ID"),C={Authorization:`Bearer ${u}`,"Content-Type":"application/json"};if(z)C["X-Axiom-Org-Id"]=z;return J({body:(O)=>JSON.stringify(O.map((m)=>({...m.meta,_time:m.timestamp.toISOString(),level:m.level,message:m.message}))),headers:C,name:"Axiom",options:j,url:`${N}/v1/datasets/${encodeURIComponent(x)}/ingest`})};export{V as createAxiomTransport};
2
+
3
+ //# debugId=41DDB4BAEFFD299164756E2164756E21
4
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2F4aW9tLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7XG4gIHR5cGUgQWRhcHRlclRyYW5zcG9ydCxcbiAgdHlwZSBCYXRjaFRyYW5zcG9ydE9wdGlvbnMsXG4gIGNyZWF0ZUh0dHBUcmFuc3BvcnQsXG4gIGVudlN0cmluZyxcbiAgc3RyaXBUcmFpbGluZ1NsYXNoZXMsXG4gIHRyYW5zcG9ydEVycm9yXG59IGZyb20gJy4vYWRhcHRlcnMvc2hhcmVkJ1xuXG5jb25zdCBERUZBVUxUX0JBU0VfVVJMID0gJ2h0dHBzOi8vYXBpLmF4aW9tLmNvJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEF4aW9tVHJhbnNwb3J0T3B0aW9ucyBleHRlbmRzIEJhdGNoVHJhbnNwb3J0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBeGlvbSBBUEkgdG9rZW4gd2l0aCBpbmdlc3QgcGVybWlzc2lvbiAoYHhhYXQt4oCmYCkuXG4gICAqIEZhbGxzIGJhY2sgdG8gdGhlIGBBWElPTV9BUElfS0VZYCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIGFwaUtleT86IHN0cmluZ1xuICAvKipcbiAgICogQVBJIGJhc2UgVVJMLlxuICAgKiBGYWxscyBiYWNrIHRvIGBBWElPTV9VUkxgLlxuICAgKiBAZGVmYXVsdCAnaHR0cHM6Ly9hcGkuYXhpb20uY28nXG4gICAqL1xuICBiYXNlVXJsPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUYXJnZXQgZGF0YXNldCBuYW1lLlxuICAgKiBGYWxscyBiYWNrIHRvIGBBWElPTV9EQVRBU0VUYC5cbiAgICovXG4gIGRhdGFzZXQ/OiBzdHJpbmdcbiAgLyoqXG4gICAqIE9yZ2FuaXphdGlvbiBJRCDigJQgcmVxdWlyZWQgd2hlbiB1c2luZyBhIHBlcnNvbmFsIGFjY2VzcyB0b2tlbi5cbiAgICogRmFsbHMgYmFjayB0byBgQVhJT01fT1JHX0lEYC5cbiAgICovXG4gIG9yZ0lkPzogc3RyaW5nXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRyYW5zcG9ydCB0aGF0IHNoaXBzIGxvZ3MgdG8gYW4gQXhpb20gZGF0YXNldCB2aWEgdGhlIGluZ2VzdCBBUEkuXG4gKiBFdmVudHMga2VlcCB0aGVpciBuZXN0ZWQgc3RydWN0dXJlIOKAlCBBeGlvbSBpbmRleGVzIGV2ZXJ5IGZpZWxkIHdpdGhvdXQgYVxuICogc2NoZW1hLCBzbyBgcmVxdWVzdC5tZXRob2RgLCBgY29udGV4dC5yZXF1ZXN0SWRgLCBldGMuIGFyZSBhbGwgcXVlcnlhYmxlLlxuICpcbiAqIEB0aHJvd3MgV2hlbiBubyBBUEkgdG9rZW4gb3IgZGF0YXNldCBpcyBjb25maWd1cmVkLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQXhpb21UcmFuc3BvcnQgPSAoXG4gIG9wdGlvbnM6IEF4aW9tVHJhbnNwb3J0T3B0aW9ucyA9IHt9XG4pOiBBZGFwdGVyVHJhbnNwb3J0ID0+IHtcbiAgY29uc3QgYXBpS2V5ID0gb3B0aW9ucy5hcGlLZXkgPz8gZW52U3RyaW5nKCdBWElPTV9BUElfS0VZJylcbiAgaWYgKCFhcGlLZXkpIHtcbiAgICB0aHJvdyB0cmFuc3BvcnRFcnJvcihcbiAgICAgICdBeGlvbScsXG4gICAgICAnbWlzc2luZyBBUEkgdG9rZW4uIFNldCBBWElPTV9BUElfS0VZIG9yIHBhc3MgYXBpS2V5IHRvIGNyZWF0ZUF4aW9tVHJhbnNwb3J0KCknXG4gICAgKVxuICB9XG4gIGNvbnN0IGRhdGFzZXQgPSBvcHRpb25zLmRhdGFzZXQgPz8gZW52U3RyaW5nKCdBWElPTV9EQVRBU0VUJylcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgdGhyb3cgdHJhbnNwb3J0RXJyb3IoXG4gICAgICAnQXhpb20nLFxuICAgICAgJ21pc3NpbmcgZGF0YXNldC4gU2V0IEFYSU9NX0RBVEFTRVQgb3IgcGFzcyBkYXRhc2V0IHRvIGNyZWF0ZUF4aW9tVHJhbnNwb3J0KCknXG4gICAgKVxuICB9XG4gIGNvbnN0IGJhc2VVcmwgPSBzdHJpcFRyYWlsaW5nU2xhc2hlcyhcbiAgICBvcHRpb25zLmJhc2VVcmwgPz8gZW52U3RyaW5nKCdBWElPTV9VUkwnKSA/PyBERUZBVUxUX0JBU0VfVVJMXG4gIClcbiAgY29uc3Qgb3JnSWQgPSBvcHRpb25zLm9yZ0lkID8/IGVudlN0cmluZygnQVhJT01fT1JHX0lEJylcblxuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthcGlLZXl9YCxcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gIH1cbiAgaWYgKG9yZ0lkKSB7XG4gICAgaGVhZGVyc1snWC1BeGlvbS1PcmctSWQnXSA9IG9yZ0lkXG4gIH1cblxuICByZXR1cm4gY3JlYXRlSHR0cFRyYW5zcG9ydCh7XG4gICAgYm9keTogZW50cmllcyA9PlxuICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIC8vIE1ldGEgZmlyc3Qgc28gdGhlIGFkYXB0ZXItb3duZWQgZmllbGRzIGJlbG93IGFsd2F5cyB3aW4gb24gY29sbGlzaW9uLlxuICAgICAgICBlbnRyaWVzLm1hcChlbnRyeSA9PiAoe1xuICAgICAgICAgIC4uLmVudHJ5Lm1ldGEsXG4gICAgICAgICAgX3RpbWU6IGVudHJ5LnRpbWVzdGFtcC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGxldmVsOiBlbnRyeS5sZXZlbCxcbiAgICAgICAgICBtZXNzYWdlOiBlbnRyeS5tZXNzYWdlXG4gICAgICAgIH0pKVxuICAgICAgKSxcbiAgICBoZWFkZXJzLFxuICAgIG5hbWU6ICdBeGlvbScsXG4gICAgb3B0aW9ucyxcbiAgICB1cmw6IGAke2Jhc2VVcmx9L3YxL2RhdGFzZXRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGRhdGFzZXQpfS9pbmdlc3RgXG4gIH0pXG59XG5cbmV4cG9ydCB0eXBlIHsgQWRhcHRlclRyYW5zcG9ydCB9IGZyb20gJy4vYWRhcHRlcnMvc2hhcmVkJ1xuIgogIF0sCiAgIm1hcHBpbmdzIjogInlFQVNBLElBQU0sRUFBbUIsdUJBaUNaLEVBQXVCLENBQ2xDLEVBQWlDLENBQUMsSUFDYixDQUNyQixJQUFNLEVBQVMsRUFBUSxRQUFVLEVBQVUsZUFBZSxFQUMxRCxHQUFJLENBQUMsRUFDSCxNQUFNLEVBQ0osUUFDQSwrRUFDRixFQUVGLElBQU0sRUFBVSxFQUFRLFNBQVcsRUFBVSxlQUFlLEVBQzVELEdBQUksQ0FBQyxFQUNILE1BQU0sRUFDSixRQUNBLDhFQUNGLEVBRUYsSUFBTSxFQUFVLEVBQ2QsRUFBUSxTQUFXLEVBQVUsV0FBVyxHQUFLLENBQy9DLEVBQ00sRUFBUSxFQUFRLE9BQVMsRUFBVSxjQUFjLEVBRWpELEVBQWtDLENBQ3RDLGNBQWUsVUFBVSxJQUN6QixlQUFnQixrQkFDbEIsRUFDQSxHQUFJLEVBQ0YsRUFBUSxrQkFBb0IsRUFHOUIsT0FBTyxFQUFvQixDQUN6QixLQUFNLEtBQ0osS0FBSyxVQUVILEVBQVEsSUFBSSxNQUFVLElBQ2pCLEVBQU0sS0FDVCxNQUFPLEVBQU0sVUFBVSxZQUFZLEVBQ25DLE1BQU8sRUFBTSxNQUNiLFFBQVMsRUFBTSxPQUNqQixFQUFFLENBQ0osRUFDRixVQUNBLEtBQU0sUUFDTixVQUNBLElBQUssR0FBRyxpQkFBdUIsbUJBQW1CLENBQU8sVUFDM0QsQ0FBQyIsCiAgImRlYnVnSWQiOiAiNDFEREI0QkFFRkZEMjk5MTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
@@ -0,0 +1,54 @@
1
+ type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
2
+ interface Transport {
3
+ log: (level: LogLevel, message: string, meta?: Record<string, unknown>) => void | Promise<void>;
4
+ }
5
+ interface BatchTransportOptions {
6
+ /**
7
+ * Max time (ms) an entry waits in the buffer before it is sent.
8
+ * @default 2000
9
+ */
10
+ flushIntervalMs?: number;
11
+ /**
12
+ * Entries buffered before an immediate flush, regardless of the interval.
13
+ * @default 20
14
+ */
15
+ maxBatchSize?: number;
16
+ /**
17
+ * Retry attempts on network errors, 429, and 5xx responses.
18
+ * @default 2
19
+ */
20
+ retries?: number;
21
+ /**
22
+ * Per-request timeout in milliseconds.
23
+ * @default 5000
24
+ */
25
+ timeout?: number;
26
+ }
27
+ /** A {@link Transport} that batches entries and can be flushed on demand. */
28
+ interface AdapterTransport extends Transport {
29
+ /** Sends any buffered entries immediately. Call before process exit. */
30
+ flush: () => Promise<void>;
31
+ }
32
+ interface BetterStackTransportOptions extends BatchTransportOptions {
33
+ /**
34
+ * Ingesting URL shown next to the source token — newer sources get a
35
+ * dedicated host like `https://s123456.eu-nbg-2.betterstackdata.com`.
36
+ * Falls back to `BETTER_STACK_INGESTING_HOST`.
37
+ * @default 'https://in.logs.betterstack.com'
38
+ */
39
+ endpoint?: string;
40
+ /**
41
+ * Source token from the Better Stack source settings, sent as a Bearer
42
+ * token. Falls back to the `BETTER_STACK_SOURCE_TOKEN` environment variable.
43
+ */
44
+ sourceToken?: string;
45
+ }
46
+ /**
47
+ * Creates a transport that ships logs to Better Stack (Telemetry / Logs).
48
+ * Each log posts as JSON with a `dt` timestamp, `level`, `message`, and the
49
+ * full meta object — all queryable in Live tail and SQL.
50
+ *
51
+ * @throws When no source token is configured.
52
+ */
53
+ declare const createBetterStackTransport: (options?: BetterStackTransportOptions) => AdapterTransport;
54
+ export { createBetterStackTransport, BetterStackTransportOptions, AdapterTransport };
@@ -0,0 +1,4 @@
1
+ import{c as z,d as q,e as C,g as G,j as J}from"./shared/Logixlysia-7649md6y.js";var Q="https://in.logs.betterstack.com",V=(m={})=>{let x=m.sourceToken??q("BETTER_STACK_SOURCE_TOKEN");if(!x)throw C("Better Stack","missing source token. Set BETTER_STACK_SOURCE_TOKEN or pass sourceToken to createBetterStackTransport()");return G({body:(K)=>JSON.stringify(K.map((j)=>({...j.meta,dt:j.timestamp.toISOString(),level:j.level,message:J(j)}))),headers:{Authorization:`Bearer ${x}`,"Content-Type":"application/json"},name:"Better Stack",options:m,url:z(m.endpoint??q("BETTER_STACK_INGESTING_HOST")??Q)})};export{V as createBetterStackTransport};
2
+
3
+ //# debugId=C72E273C6C4E958A64756E2164756E21
4
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2JldHRlci1zdGFjay50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQge1xuICB0eXBlIEFkYXB0ZXJUcmFuc3BvcnQsXG4gIHR5cGUgQmF0Y2hUcmFuc3BvcnRPcHRpb25zLFxuICBjcmVhdGVIdHRwVHJhbnNwb3J0LFxuICBkZWZhdWx0Qm9keSxcbiAgZW52U3RyaW5nLFxuICBzdHJpcFRyYWlsaW5nU2xhc2hlcyxcbiAgdHJhbnNwb3J0RXJyb3Jcbn0gZnJvbSAnLi9hZGFwdGVycy9zaGFyZWQnXG5cbmNvbnN0IERFRkFVTFRfRU5EUE9JTlQgPSAnaHR0cHM6Ly9pbi5sb2dzLmJldHRlcnN0YWNrLmNvbSdcblxuZXhwb3J0IGludGVyZmFjZSBCZXR0ZXJTdGFja1RyYW5zcG9ydE9wdGlvbnMgZXh0ZW5kcyBCYXRjaFRyYW5zcG9ydE9wdGlvbnMge1xuICAvKipcbiAgICogSW5nZXN0aW5nIFVSTCBzaG93biBuZXh0IHRvIHRoZSBzb3VyY2UgdG9rZW4g4oCUIG5ld2VyIHNvdXJjZXMgZ2V0IGFcbiAgICogZGVkaWNhdGVkIGhvc3QgbGlrZSBgaHR0cHM6Ly9zMTIzNDU2LmV1LW5iZy0yLmJldHRlcnN0YWNrZGF0YS5jb21gLlxuICAgKiBGYWxscyBiYWNrIHRvIGBCRVRURVJfU1RBQ0tfSU5HRVNUSU5HX0hPU1RgLlxuICAgKiBAZGVmYXVsdCAnaHR0cHM6Ly9pbi5sb2dzLmJldHRlcnN0YWNrLmNvbSdcbiAgICovXG4gIGVuZHBvaW50Pzogc3RyaW5nXG4gIC8qKlxuICAgKiBTb3VyY2UgdG9rZW4gZnJvbSB0aGUgQmV0dGVyIFN0YWNrIHNvdXJjZSBzZXR0aW5ncywgc2VudCBhcyBhIEJlYXJlclxuICAgKiB0b2tlbi4gRmFsbHMgYmFjayB0byB0aGUgYEJFVFRFUl9TVEFDS19TT1VSQ0VfVE9LRU5gIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgKi9cbiAgc291cmNlVG9rZW4/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHJhbnNwb3J0IHRoYXQgc2hpcHMgbG9ncyB0byBCZXR0ZXIgU3RhY2sgKFRlbGVtZXRyeSAvIExvZ3MpLlxuICogRWFjaCBsb2cgcG9zdHMgYXMgSlNPTiB3aXRoIGEgYGR0YCB0aW1lc3RhbXAsIGBsZXZlbGAsIGBtZXNzYWdlYCwgYW5kIHRoZVxuICogZnVsbCBtZXRhIG9iamVjdCDigJQgYWxsIHF1ZXJ5YWJsZSBpbiBMaXZlIHRhaWwgYW5kIFNRTC5cbiAqXG4gKiBAdGhyb3dzIFdoZW4gbm8gc291cmNlIHRva2VuIGlzIGNvbmZpZ3VyZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVCZXR0ZXJTdGFja1RyYW5zcG9ydCA9IChcbiAgb3B0aW9uczogQmV0dGVyU3RhY2tUcmFuc3BvcnRPcHRpb25zID0ge31cbik6IEFkYXB0ZXJUcmFuc3BvcnQgPT4ge1xuICBjb25zdCBzb3VyY2VUb2tlbiA9XG4gICAgb3B0aW9ucy5zb3VyY2VUb2tlbiA/PyBlbnZTdHJpbmcoJ0JFVFRFUl9TVEFDS19TT1VSQ0VfVE9LRU4nKVxuICBpZiAoIXNvdXJjZVRva2VuKSB7XG4gICAgdGhyb3cgdHJhbnNwb3J0RXJyb3IoXG4gICAgICAnQmV0dGVyIFN0YWNrJyxcbiAgICAgICdtaXNzaW5nIHNvdXJjZSB0b2tlbi4gU2V0IEJFVFRFUl9TVEFDS19TT1VSQ0VfVE9LRU4gb3IgcGFzcyBzb3VyY2VUb2tlbiB0byBjcmVhdGVCZXR0ZXJTdGFja1RyYW5zcG9ydCgpJ1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVIdHRwVHJhbnNwb3J0KHtcbiAgICBib2R5OiBlbnRyaWVzID0+XG4gICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgLy8gTWV0YSBmaXJzdCBzbyB0aGUgYWRhcHRlci1vd25lZCBmaWVsZHMgYmVsb3cgYWx3YXlzIHdpbiBvbiBjb2xsaXNpb24uXG4gICAgICAgIGVudHJpZXMubWFwKGVudHJ5ID0+ICh7XG4gICAgICAgICAgLi4uZW50cnkubWV0YSxcbiAgICAgICAgICBkdDogZW50cnkudGltZXN0YW1wLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgbGV2ZWw6IGVudHJ5LmxldmVsLFxuICAgICAgICAgIG1lc3NhZ2U6IGRlZmF1bHRCb2R5KGVudHJ5KVxuICAgICAgICB9KSlcbiAgICAgICksXG4gICAgaGVhZGVyczoge1xuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3NvdXJjZVRva2VufWAsXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgfSxcbiAgICBuYW1lOiAnQmV0dGVyIFN0YWNrJyxcbiAgICBvcHRpb25zLFxuICAgIHVybDogc3RyaXBUcmFpbGluZ1NsYXNoZXMoXG4gICAgICBvcHRpb25zLmVuZHBvaW50ID8/XG4gICAgICAgIGVudlN0cmluZygnQkVUVEVSX1NUQUNLX0lOR0VTVElOR19IT1NUJykgPz9cbiAgICAgICAgREVGQVVMVF9FTkRQT0lOVFxuICAgIClcbiAgfSlcbn1cblxuZXhwb3J0IHR5cGUgeyBBZGFwdGVyVHJhbnNwb3J0IH0gZnJvbSAnLi9hZGFwdGVycy9zaGFyZWQnXG4iCiAgXSwKICAibWFwcGluZ3MiOiAiZ0ZBVUEsSUFBTSxFQUFtQixrQ0F3QlosRUFBNkIsQ0FDeEMsRUFBdUMsQ0FBQyxJQUNuQixDQUNyQixJQUFNLEVBQ0osRUFBUSxhQUFlLEVBQVUsMkJBQTJCLEVBQzlELEdBQUksQ0FBQyxFQUNILE1BQU0sRUFDSixlQUNBLHlHQUNGLEVBR0YsT0FBTyxFQUFvQixDQUN6QixLQUFNLEtBQ0osS0FBSyxVQUVILEVBQVEsSUFBSSxNQUFVLElBQ2pCLEVBQU0sS0FDVCxHQUFJLEVBQU0sVUFBVSxZQUFZLEVBQ2hDLE1BQU8sRUFBTSxNQUNiLFFBQVMsRUFBWSxDQUFLLENBQzVCLEVBQUUsQ0FDSixFQUNGLFFBQVMsQ0FDUCxjQUFlLFVBQVUsSUFDekIsZUFBZ0Isa0JBQ2xCLEVBQ0EsS0FBTSxlQUNOLFVBQ0EsSUFBSyxFQUNILEVBQVEsVUFDTixFQUFVLDZCQUE2QixHQUN2QyxDQUNKLENBQ0YsQ0FBQyIsCiAgImRlYnVnSWQiOiAiQzcyRTI3M0M2QzRFOTU4QTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
@@ -0,0 +1,73 @@
1
+ type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
2
+ interface Transport {
3
+ log: (level: LogLevel, message: string, meta?: Record<string, unknown>) => void | Promise<void>;
4
+ }
5
+ interface BatchTransportOptions {
6
+ /**
7
+ * Max time (ms) an entry waits in the buffer before it is sent.
8
+ * @default 2000
9
+ */
10
+ flushIntervalMs?: number;
11
+ /**
12
+ * Entries buffered before an immediate flush, regardless of the interval.
13
+ * @default 20
14
+ */
15
+ maxBatchSize?: number;
16
+ /**
17
+ * Retry attempts on network errors, 429, and 5xx responses.
18
+ * @default 2
19
+ */
20
+ retries?: number;
21
+ /**
22
+ * Per-request timeout in milliseconds.
23
+ * @default 5000
24
+ */
25
+ timeout?: number;
26
+ }
27
+ /** A {@link Transport} that batches entries and can be flushed on demand. */
28
+ interface AdapterTransport extends Transport {
29
+ /** Sends any buffered entries immediately. Call before process exit. */
30
+ flush: () => Promise<void>;
31
+ }
32
+ interface ClickHouseTransportOptions extends BatchTransportOptions {
33
+ /**
34
+ * Target database.
35
+ * Falls back to `CLICKHOUSE_DATABASE`.
36
+ * @default 'default'
37
+ */
38
+ database?: string;
39
+ /**
40
+ * Password, sent as the `X-ClickHouse-Key` header.
41
+ * Falls back to `CLICKHOUSE_PASSWORD`.
42
+ */
43
+ password?: string;
44
+ /**
45
+ * Target table. Expected columns: `timestamp DateTime64(3)`,
46
+ * `level LowCardinality(String)`, `message String`,
47
+ * `attributes Map(String, String)`.
48
+ * Falls back to `CLICKHOUSE_TABLE`.
49
+ * @default 'logs'
50
+ */
51
+ table?: string;
52
+ /**
53
+ * ClickHouse HTTP interface base URL.
54
+ * Falls back to `CLICKHOUSE_URL`.
55
+ * @default 'http://localhost:8123'
56
+ */
57
+ url?: string;
58
+ /**
59
+ * Username, sent as the `X-ClickHouse-User` header.
60
+ * Falls back to `CLICKHOUSE_USERNAME`.
61
+ */
62
+ username?: string;
63
+ }
64
+ /**
65
+ * Creates a transport that inserts logs into a ClickHouse table over the HTTP
66
+ * interface using `JSONEachRow`. Rows carry `timestamp`, `level`, `message`,
67
+ * and an `attributes` map of the flattened meta (`request.method`,
68
+ * `context.requestId`, …) with values rendered as strings.
69
+ *
70
+ * @throws When the database or table name is not a plain identifier.
71
+ */
72
+ declare const createClickHouseTransport: (options?: ClickHouseTransportOptions) => AdapterTransport;
73
+ export { createClickHouseTransport, ClickHouseTransportOptions, AdapterTransport };
@@ -0,0 +1,5 @@
1
+ import{c as $,d as G,e as x,g as J,h as M,j as O}from"./shared/Logixlysia-7649md6y.js";var C="http://localhost:8123",N="default",q="logs",B=/^[A-Za-z0-9_]+$/,Z=(j,z)=>{if(!B.test(j))throw x("ClickHouse",`invalid ${z} '${j}'. Only letters, digits, and underscores are allowed`);return j},H=(j)=>{let z={};for(let[K,Q]of Object.entries(M(j.meta)))z[K]=String(Q);return JSON.stringify({attributes:z,level:j.level,message:O(j),timestamp:j.timestamp.toISOString()})},k=(j={})=>{let z=$(j.url??G("CLICKHOUSE_URL")??C),K=Z(j.database??G("CLICKHOUSE_DATABASE")??N,"database"),Q=Z(j.table??G("CLICKHOUSE_TABLE")??q,"table"),X=j.username??G("CLICKHOUSE_USERNAME"),Y=j.password??G("CLICKHOUSE_PASSWORD"),P=new URLSearchParams({date_time_input_format:"best_effort",query:`INSERT INTO ${K}.${Q} FORMAT JSONEachRow`}),V={"Content-Type":"application/json"};if(X)V["X-ClickHouse-User"]=X;if(Y)V["X-ClickHouse-Key"]=Y;return J({body:(W)=>W.map(H).join(`
2
+ `),headers:V,name:"ClickHouse",options:j,url:`${z}/?${P.toString()}`})};export{k as createClickHouseTransport};
3
+
4
+ //# debugId=10E3033D3FB0473964756E2164756E21
5
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2NsaWNraG91c2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHtcbiAgdHlwZSBBZGFwdGVyVHJhbnNwb3J0LFxuICB0eXBlIEJhdGNoVHJhbnNwb3J0T3B0aW9ucyxcbiAgY3JlYXRlSHR0cFRyYW5zcG9ydCxcbiAgZGVmYXVsdEJvZHksXG4gIGVudlN0cmluZyxcbiAgZmxhdHRlbk1ldGEsXG4gIHR5cGUgTG9nRW50cnksXG4gIHN0cmlwVHJhaWxpbmdTbGFzaGVzLFxuICB0cmFuc3BvcnRFcnJvclxufSBmcm9tICcuL2FkYXB0ZXJzL3NoYXJlZCdcblxuY29uc3QgREVGQVVMVF9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdDo4MTIzJ1xuY29uc3QgREVGQVVMVF9EQVRBQkFTRSA9ICdkZWZhdWx0J1xuY29uc3QgREVGQVVMVF9UQUJMRSA9ICdsb2dzJ1xuY29uc3QgSURFTlRJRklFUiA9IC9eW0EtWmEtejAtOV9dKyQvXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpY2tIb3VzZVRyYW5zcG9ydE9wdGlvbnMgZXh0ZW5kcyBCYXRjaFRyYW5zcG9ydE9wdGlvbnMge1xuICAvKipcbiAgICogVGFyZ2V0IGRhdGFiYXNlLlxuICAgKiBGYWxscyBiYWNrIHRvIGBDTElDS0hPVVNFX0RBVEFCQVNFYC5cbiAgICogQGRlZmF1bHQgJ2RlZmF1bHQnXG4gICAqL1xuICBkYXRhYmFzZT86IHN0cmluZ1xuICAvKipcbiAgICogUGFzc3dvcmQsIHNlbnQgYXMgdGhlIGBYLUNsaWNrSG91c2UtS2V5YCBoZWFkZXIuXG4gICAqIEZhbGxzIGJhY2sgdG8gYENMSUNLSE9VU0VfUEFTU1dPUkRgLlxuICAgKi9cbiAgcGFzc3dvcmQ/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRhcmdldCB0YWJsZS4gRXhwZWN0ZWQgY29sdW1uczogYHRpbWVzdGFtcCBEYXRlVGltZTY0KDMpYCxcbiAgICogYGxldmVsIExvd0NhcmRpbmFsaXR5KFN0cmluZylgLCBgbWVzc2FnZSBTdHJpbmdgLFxuICAgKiBgYXR0cmlidXRlcyBNYXAoU3RyaW5nLCBTdHJpbmcpYC5cbiAgICogRmFsbHMgYmFjayB0byBgQ0xJQ0tIT1VTRV9UQUJMRWAuXG4gICAqIEBkZWZhdWx0ICdsb2dzJ1xuICAgKi9cbiAgdGFibGU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIENsaWNrSG91c2UgSFRUUCBpbnRlcmZhY2UgYmFzZSBVUkwuXG4gICAqIEZhbGxzIGJhY2sgdG8gYENMSUNLSE9VU0VfVVJMYC5cbiAgICogQGRlZmF1bHQgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODEyMydcbiAgICovXG4gIHVybD86IHN0cmluZ1xuICAvKipcbiAgICogVXNlcm5hbWUsIHNlbnQgYXMgdGhlIGBYLUNsaWNrSG91c2UtVXNlcmAgaGVhZGVyLlxuICAgKiBGYWxscyBiYWNrIHRvIGBDTElDS0hPVVNFX1VTRVJOQU1FYC5cbiAgICovXG4gIHVzZXJuYW1lPzogc3RyaW5nXG59XG5cbmNvbnN0IHZhbGlkSWRlbnRpZmllciA9ICh2YWx1ZTogc3RyaW5nLCBraW5kOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIUlERU5USUZJRVIudGVzdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyB0cmFuc3BvcnRFcnJvcihcbiAgICAgICdDbGlja0hvdXNlJyxcbiAgICAgIGBpbnZhbGlkICR7a2luZH0gJyR7dmFsdWV9Jy4gT25seSBsZXR0ZXJzLCBkaWdpdHMsIGFuZCB1bmRlcnNjb3JlcyBhcmUgYWxsb3dlZGBcbiAgICApXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbmNvbnN0IHRvUm93ID0gKGVudHJ5OiBMb2dFbnRyeSk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmbGF0dGVuTWV0YShlbnRyeS5tZXRhKSkpIHtcbiAgICBhdHRyaWJ1dGVzW2tleV0gPSBTdHJpbmcodmFsdWUpXG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICBhdHRyaWJ1dGVzLFxuICAgIGxldmVsOiBlbnRyeS5sZXZlbCxcbiAgICBtZXNzYWdlOiBkZWZhdWx0Qm9keShlbnRyeSksXG4gICAgdGltZXN0YW1wOiBlbnRyeS50aW1lc3RhbXAudG9JU09TdHJpbmcoKVxuICB9KVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0cmFuc3BvcnQgdGhhdCBpbnNlcnRzIGxvZ3MgaW50byBhIENsaWNrSG91c2UgdGFibGUgb3ZlciB0aGUgSFRUUFxuICogaW50ZXJmYWNlIHVzaW5nIGBKU09ORWFjaFJvd2AuIFJvd3MgY2FycnkgYHRpbWVzdGFtcGAsIGBsZXZlbGAsIGBtZXNzYWdlYCxcbiAqIGFuZCBhbiBgYXR0cmlidXRlc2AgbWFwIG9mIHRoZSBmbGF0dGVuZWQgbWV0YSAoYHJlcXVlc3QubWV0aG9kYCxcbiAqIGBjb250ZXh0LnJlcXVlc3RJZGAsIOKApikgd2l0aCB2YWx1ZXMgcmVuZGVyZWQgYXMgc3RyaW5ncy5cbiAqXG4gKiBAdGhyb3dzIFdoZW4gdGhlIGRhdGFiYXNlIG9yIHRhYmxlIG5hbWUgaXMgbm90IGEgcGxhaW4gaWRlbnRpZmllci5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUNsaWNrSG91c2VUcmFuc3BvcnQgPSAoXG4gIG9wdGlvbnM6IENsaWNrSG91c2VUcmFuc3BvcnRPcHRpb25zID0ge31cbik6IEFkYXB0ZXJUcmFuc3BvcnQgPT4ge1xuICBjb25zdCBiYXNlVXJsID0gc3RyaXBUcmFpbGluZ1NsYXNoZXMoXG4gICAgb3B0aW9ucy51cmwgPz8gZW52U3RyaW5nKCdDTElDS0hPVVNFX1VSTCcpID8/IERFRkFVTFRfVVJMXG4gIClcbiAgY29uc3QgZGF0YWJhc2UgPSB2YWxpZElkZW50aWZpZXIoXG4gICAgb3B0aW9ucy5kYXRhYmFzZSA/PyBlbnZTdHJpbmcoJ0NMSUNLSE9VU0VfREFUQUJBU0UnKSA/PyBERUZBVUxUX0RBVEFCQVNFLFxuICAgICdkYXRhYmFzZSdcbiAgKVxuICBjb25zdCB0YWJsZSA9IHZhbGlkSWRlbnRpZmllcihcbiAgICBvcHRpb25zLnRhYmxlID8/IGVudlN0cmluZygnQ0xJQ0tIT1VTRV9UQUJMRScpID8/IERFRkFVTFRfVEFCTEUsXG4gICAgJ3RhYmxlJ1xuICApXG4gIGNvbnN0IHVzZXJuYW1lID0gb3B0aW9ucy51c2VybmFtZSA/PyBlbnZTdHJpbmcoJ0NMSUNLSE9VU0VfVVNFUk5BTUUnKVxuICBjb25zdCBwYXNzd29yZCA9IG9wdGlvbnMucGFzc3dvcmQgPz8gZW52U3RyaW5nKCdDTElDS0hPVVNFX1BBU1NXT1JEJylcblxuICBjb25zdCBxdWVyeSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgIGRhdGVfdGltZV9pbnB1dF9mb3JtYXQ6ICdiZXN0X2VmZm9ydCcsXG4gICAgcXVlcnk6IGBJTlNFUlQgSU5UTyAke2RhdGFiYXNlfS4ke3RhYmxlfSBGT1JNQVQgSlNPTkVhY2hSb3dgXG4gIH0pXG5cbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gIH1cbiAgaWYgKHVzZXJuYW1lKSB7XG4gICAgaGVhZGVyc1snWC1DbGlja0hvdXNlLVVzZXInXSA9IHVzZXJuYW1lXG4gIH1cbiAgaWYgKHBhc3N3b3JkKSB7XG4gICAgaGVhZGVyc1snWC1DbGlja0hvdXNlLUtleSddID0gcGFzc3dvcmRcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVIdHRwVHJhbnNwb3J0KHtcbiAgICBib2R5OiBlbnRyaWVzID0+IGVudHJpZXMubWFwKHRvUm93KS5qb2luKCdcXG4nKSxcbiAgICBoZWFkZXJzLFxuICAgIG5hbWU6ICdDbGlja0hvdXNlJyxcbiAgICBvcHRpb25zLFxuICAgIHVybDogYCR7YmFzZVVybH0vPyR7cXVlcnkudG9TdHJpbmcoKX1gXG4gIH0pXG59XG5cbmV4cG9ydCB0eXBlIHsgQWRhcHRlclRyYW5zcG9ydCB9IGZyb20gJy4vYWRhcHRlcnMvc2hhcmVkJ1xuIgogIF0sCiAgIm1hcHBpbmdzIjogInVGQVlBLElBQU0sRUFBYyx3QkFDZCxFQUFtQixVQUNuQixFQUFnQixPQUNoQixFQUFhLGtCQW1DYixFQUFrQixDQUFDLEVBQWUsSUFBeUIsQ0FDL0QsR0FBSSxDQUFDLEVBQVcsS0FBSyxDQUFLLEVBQ3hCLE1BQU0sRUFDSixhQUNBLFdBQVcsTUFBUyx1REFDdEIsRUFFRixPQUFPLEdBR0gsRUFBUSxDQUFDLElBQTRCLENBQ3pDLElBQU0sRUFBcUMsQ0FBQyxFQUM1QyxRQUFZLEVBQUssS0FBVSxPQUFPLFFBQVEsRUFBWSxFQUFNLElBQUksQ0FBQyxFQUMvRCxFQUFXLEdBQU8sT0FBTyxDQUFLLEVBRWhDLE9BQU8sS0FBSyxVQUFVLENBQ3BCLGFBQ0EsTUFBTyxFQUFNLE1BQ2IsUUFBUyxFQUFZLENBQUssRUFDMUIsVUFBVyxFQUFNLFVBQVUsWUFBWSxDQUN6QyxDQUFDLEdBV1UsRUFBNEIsQ0FDdkMsRUFBc0MsQ0FBQyxJQUNsQixDQUNyQixJQUFNLEVBQVUsRUFDZCxFQUFRLEtBQU8sRUFBVSxnQkFBZ0IsR0FBSyxDQUNoRCxFQUNNLEVBQVcsRUFDZixFQUFRLFVBQVksRUFBVSxxQkFBcUIsR0FBSyxFQUN4RCxVQUNGLEVBQ00sRUFBUSxFQUNaLEVBQVEsT0FBUyxFQUFVLGtCQUFrQixHQUFLLEVBQ2xELE9BQ0YsRUFDTSxFQUFXLEVBQVEsVUFBWSxFQUFVLHFCQUFxQixFQUM5RCxFQUFXLEVBQVEsVUFBWSxFQUFVLHFCQUFxQixFQUU5RCxFQUFRLElBQUksZ0JBQWdCLENBQ2hDLHVCQUF3QixjQUN4QixNQUFPLGVBQWUsS0FBWSxzQkFDcEMsQ0FBQyxFQUVLLEVBQWtDLENBQ3RDLGVBQWdCLGtCQUNsQixFQUNBLEdBQUksRUFDRixFQUFRLHFCQUF1QixFQUVqQyxHQUFJLEVBQ0YsRUFBUSxvQkFBc0IsRUFHaEMsT0FBTyxFQUFvQixDQUN6QixLQUFNLEtBQVcsRUFBUSxJQUFJLENBQUssRUFBRSxLQUFLO0FBQUEsQ0FBSSxFQUM3QyxVQUNBLEtBQU0sYUFDTixVQUNBLElBQUssR0FBRyxNQUFZLEVBQU0sU0FBUyxHQUNyQyxDQUFDIiwKICAiZGVidWdJZCI6ICIxMEUzMDMzRDNGQjA0NzM5NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
@@ -0,0 +1,69 @@
1
+ type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
2
+ interface Transport {
3
+ log: (level: LogLevel, message: string, meta?: Record<string, unknown>) => void | Promise<void>;
4
+ }
5
+ interface BatchTransportOptions {
6
+ /**
7
+ * Max time (ms) an entry waits in the buffer before it is sent.
8
+ * @default 2000
9
+ */
10
+ flushIntervalMs?: number;
11
+ /**
12
+ * Entries buffered before an immediate flush, regardless of the interval.
13
+ * @default 20
14
+ */
15
+ maxBatchSize?: number;
16
+ /**
17
+ * Retry attempts on network errors, 429, and 5xx responses.
18
+ * @default 2
19
+ */
20
+ retries?: number;
21
+ /**
22
+ * Per-request timeout in milliseconds.
23
+ * @default 5000
24
+ */
25
+ timeout?: number;
26
+ }
27
+ /** A {@link Transport} that batches entries and can be flushed on demand. */
28
+ interface AdapterTransport extends Transport {
29
+ /** Sends any buffered entries immediately. Call before process exit. */
30
+ flush: () => Promise<void>;
31
+ }
32
+ interface DatadogTransportOptions extends BatchTransportOptions {
33
+ /**
34
+ * Datadog API key, sent as the `DD-API-KEY` header.
35
+ * Falls back to the `DD_API_KEY` environment variable.
36
+ */
37
+ apiKey?: string;
38
+ /**
39
+ * Hostname reported with each log.
40
+ * Falls back to `DD_HOSTNAME`; omitted when unset.
41
+ */
42
+ hostname?: string;
43
+ /**
44
+ * `service` facet on each log.
45
+ * Falls back to `DD_SERVICE`.
46
+ * @default 'logixlysia'
47
+ */
48
+ service?: string;
49
+ /**
50
+ * Datadog site: `datadoghq.com` (US1), `datadoghq.eu` (EU),
51
+ * `us3.datadoghq.com`, `us5.datadoghq.com`, `ap1.datadoghq.com`, …
52
+ * Falls back to `DD_SITE`.
53
+ * @default 'datadoghq.com'
54
+ */
55
+ site?: string;
56
+ /** `ddsource` facet on each log. @default 'logixlysia' */
57
+ source?: string;
58
+ /** Tags rendered into `ddtags` as `key:value,key2:value2`. */
59
+ tags?: Record<string, string>;
60
+ }
61
+ /**
62
+ * Creates a transport that ships logs to Datadog via the v2 logs intake API.
63
+ * The log level lands in the `status` attribute (Datadog's default status
64
+ * remapper), and the full meta object rides along as searchable attributes.
65
+ *
66
+ * @throws When no API key is configured.
67
+ */
68
+ declare const createDatadogTransport: (options?: DatadogTransportOptions) => AdapterTransport;
69
+ export { createDatadogTransport, DatadogTransportOptions, AdapterTransport };
@@ -0,0 +1,4 @@
1
+ import{d as x,e as N,g as Q,j as V}from"./shared/Logixlysia-7649md6y.js";var $="datadoghq.com",M="logixlysia",B=(q={})=>{let z=q.apiKey??x("DD_API_KEY");if(!z)throw N("Datadog","missing API key. Set DD_API_KEY or pass apiKey to createDatadogTransport()");let W=q.site??x("DD_SITE")??$,X=q.service??x("DD_SERVICE")??M,G=q.hostname??x("DD_HOSTNAME"),Y=q.source??M,J=Object.entries(q.tags??{}).map(([j,w])=>`${j}:${w}`).join(","),Z=(j)=>{let w={...j.meta,ddsource:Y,message:V(j),service:X,status:j.level.toLowerCase(),timestamp:j.timestamp.toISOString()};if(J)w.ddtags=J;if(G)w.hostname=G;if(typeof j.meta.status==="number")w.http={status_code:j.meta.status};return w};return Q({body:(j)=>JSON.stringify(j.map(Z)),headers:{"Content-Type":"application/json","DD-API-KEY":z},name:"Datadog",options:q,url:`https://http-intake.logs.${W}/api/v2/logs`})};export{B as createDatadogTransport};
2
+
3
+ //# debugId=77FD16D03E53F84364756E2164756E21
4
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2RhdGFkb2cudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHtcbiAgdHlwZSBBZGFwdGVyVHJhbnNwb3J0LFxuICB0eXBlIEJhdGNoVHJhbnNwb3J0T3B0aW9ucyxcbiAgY3JlYXRlSHR0cFRyYW5zcG9ydCxcbiAgZGVmYXVsdEJvZHksXG4gIGVudlN0cmluZyxcbiAgdHlwZSBMb2dFbnRyeSxcbiAgdHJhbnNwb3J0RXJyb3Jcbn0gZnJvbSAnLi9hZGFwdGVycy9zaGFyZWQnXG5cbmNvbnN0IERFRkFVTFRfU0lURSA9ICdkYXRhZG9naHEuY29tJ1xuY29uc3QgREVGQVVMVF9TT1VSQ0UgPSAnbG9naXhseXNpYSdcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhZG9nVHJhbnNwb3J0T3B0aW9ucyBleHRlbmRzIEJhdGNoVHJhbnNwb3J0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEYXRhZG9nIEFQSSBrZXksIHNlbnQgYXMgdGhlIGBERC1BUEktS0VZYCBoZWFkZXIuXG4gICAqIEZhbGxzIGJhY2sgdG8gdGhlIGBERF9BUElfS0VZYCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIGFwaUtleT86IHN0cmluZ1xuICAvKipcbiAgICogSG9zdG5hbWUgcmVwb3J0ZWQgd2l0aCBlYWNoIGxvZy5cbiAgICogRmFsbHMgYmFjayB0byBgRERfSE9TVE5BTUVgOyBvbWl0dGVkIHdoZW4gdW5zZXQuXG4gICAqL1xuICBob3N0bmFtZT86IHN0cmluZ1xuICAvKipcbiAgICogYHNlcnZpY2VgIGZhY2V0IG9uIGVhY2ggbG9nLlxuICAgKiBGYWxscyBiYWNrIHRvIGBERF9TRVJWSUNFYC5cbiAgICogQGRlZmF1bHQgJ2xvZ2l4bHlzaWEnXG4gICAqL1xuICBzZXJ2aWNlPzogc3RyaW5nXG4gIC8qKlxuICAgKiBEYXRhZG9nIHNpdGU6IGBkYXRhZG9naHEuY29tYCAoVVMxKSwgYGRhdGFkb2docS5ldWAgKEVVKSxcbiAgICogYHVzMy5kYXRhZG9naHEuY29tYCwgYHVzNS5kYXRhZG9naHEuY29tYCwgYGFwMS5kYXRhZG9naHEuY29tYCwg4oCmXG4gICAqIEZhbGxzIGJhY2sgdG8gYEREX1NJVEVgLlxuICAgKiBAZGVmYXVsdCAnZGF0YWRvZ2hxLmNvbSdcbiAgICovXG4gIHNpdGU/OiBzdHJpbmdcbiAgLyoqIGBkZHNvdXJjZWAgZmFjZXQgb24gZWFjaCBsb2cuIEBkZWZhdWx0ICdsb2dpeGx5c2lhJyAqL1xuICBzb3VyY2U/OiBzdHJpbmdcbiAgLyoqIFRhZ3MgcmVuZGVyZWQgaW50byBgZGR0YWdzYCBhcyBga2V5OnZhbHVlLGtleTI6dmFsdWUyYC4gKi9cbiAgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHJhbnNwb3J0IHRoYXQgc2hpcHMgbG9ncyB0byBEYXRhZG9nIHZpYSB0aGUgdjIgbG9ncyBpbnRha2UgQVBJLlxuICogVGhlIGxvZyBsZXZlbCBsYW5kcyBpbiB0aGUgYHN0YXR1c2AgYXR0cmlidXRlIChEYXRhZG9nJ3MgZGVmYXVsdCBzdGF0dXNcbiAqIHJlbWFwcGVyKSwgYW5kIHRoZSBmdWxsIG1ldGEgb2JqZWN0IHJpZGVzIGFsb25nIGFzIHNlYXJjaGFibGUgYXR0cmlidXRlcy5cbiAqXG4gKiBAdGhyb3dzIFdoZW4gbm8gQVBJIGtleSBpcyBjb25maWd1cmVkLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRGF0YWRvZ1RyYW5zcG9ydCA9IChcbiAgb3B0aW9uczogRGF0YWRvZ1RyYW5zcG9ydE9wdGlvbnMgPSB7fVxuKTogQWRhcHRlclRyYW5zcG9ydCA9PiB7XG4gIGNvbnN0IGFwaUtleSA9IG9wdGlvbnMuYXBpS2V5ID8/IGVudlN0cmluZygnRERfQVBJX0tFWScpXG4gIGlmICghYXBpS2V5KSB7XG4gICAgdGhyb3cgdHJhbnNwb3J0RXJyb3IoXG4gICAgICAnRGF0YWRvZycsXG4gICAgICAnbWlzc2luZyBBUEkga2V5LiBTZXQgRERfQVBJX0tFWSBvciBwYXNzIGFwaUtleSB0byBjcmVhdGVEYXRhZG9nVHJhbnNwb3J0KCknXG4gICAgKVxuICB9XG4gIGNvbnN0IHNpdGUgPSBvcHRpb25zLnNpdGUgPz8gZW52U3RyaW5nKCdERF9TSVRFJykgPz8gREVGQVVMVF9TSVRFXG4gIGNvbnN0IHNlcnZpY2UgPSBvcHRpb25zLnNlcnZpY2UgPz8gZW52U3RyaW5nKCdERF9TRVJWSUNFJykgPz8gREVGQVVMVF9TT1VSQ0VcbiAgY29uc3QgaG9zdG5hbWUgPSBvcHRpb25zLmhvc3RuYW1lID8/IGVudlN0cmluZygnRERfSE9TVE5BTUUnKVxuICBjb25zdCBzb3VyY2UgPSBvcHRpb25zLnNvdXJjZSA/PyBERUZBVUxUX1NPVVJDRVxuICBjb25zdCBkZHRhZ3MgPSBPYmplY3QuZW50cmllcyhvcHRpb25zLnRhZ3MgPz8ge30pXG4gICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9OiR7dmFsdWV9YClcbiAgICAuam9pbignLCcpXG5cbiAgY29uc3QgdG9FdmVudCA9IChlbnRyeTogTG9nRW50cnkpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgLy8gTWV0YSBmaXJzdCBzbyB0aGUgYWRhcHRlci1vd25lZCBmYWNldHMgYmVsb3cgYWx3YXlzIHdpbiDigJQgYWNjZXNzLWxvZ1xuICAgIC8vIG1ldGEgY2FycmllcyBhbiBIVFRQIGBzdGF0dXNgIHRoYXQgbXVzdCBub3QgY2xvYmJlciBEYXRhZG9nJ3Mgc3RhdHVzLlxuICAgIGNvbnN0IGV2ZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIC4uLmVudHJ5Lm1ldGEsXG4gICAgICBkZHNvdXJjZTogc291cmNlLFxuICAgICAgbWVzc2FnZTogZGVmYXVsdEJvZHkoZW50cnkpLFxuICAgICAgc2VydmljZSxcbiAgICAgIHN0YXR1czogZW50cnkubGV2ZWwudG9Mb3dlckNhc2UoKSxcbiAgICAgIHRpbWVzdGFtcDogZW50cnkudGltZXN0YW1wLnRvSVNPU3RyaW5nKClcbiAgICB9XG4gICAgaWYgKGRkdGFncykge1xuICAgICAgZXZlbnQuZGR0YWdzID0gZGR0YWdzXG4gICAgfVxuICAgIGlmIChob3N0bmFtZSkge1xuICAgICAgZXZlbnQuaG9zdG5hbWUgPSBob3N0bmFtZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVudHJ5Lm1ldGEuc3RhdHVzID09PSAnbnVtYmVyJykge1xuICAgICAgZXZlbnQuaHR0cCA9IHsgc3RhdHVzX2NvZGU6IGVudHJ5Lm1ldGEuc3RhdHVzIH1cbiAgICB9XG4gICAgcmV0dXJuIGV2ZW50XG4gIH1cblxuICByZXR1cm4gY3JlYXRlSHR0cFRyYW5zcG9ydCh7XG4gICAgYm9keTogZW50cmllcyA9PiBKU09OLnN0cmluZ2lmeShlbnRyaWVzLm1hcCh0b0V2ZW50KSksXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICdERC1BUEktS0VZJzogYXBpS2V5XG4gICAgfSxcbiAgICBuYW1lOiAnRGF0YWRvZycsXG4gICAgb3B0aW9ucyxcbiAgICB1cmw6IGBodHRwczovL2h0dHAtaW50YWtlLmxvZ3MuJHtzaXRlfS9hcGkvdjIvbG9nc2BcbiAgfSlcbn1cblxuZXhwb3J0IHR5cGUgeyBBZGFwdGVyVHJhbnNwb3J0IH0gZnJvbSAnLi9hZGFwdGVycy9zaGFyZWQnXG4iCiAgXSwKICAibWFwcGluZ3MiOiAieUVBVUEsSUFBTSxFQUFlLGdCQUNmLEVBQWlCLGFBdUNWLEVBQXlCLENBQ3BDLEVBQW1DLENBQUMsSUFDZixDQUNyQixJQUFNLEVBQVMsRUFBUSxRQUFVLEVBQVUsWUFBWSxFQUN2RCxHQUFJLENBQUMsRUFDSCxNQUFNLEVBQ0osVUFDQSw0RUFDRixFQUVGLElBQU0sRUFBTyxFQUFRLE1BQVEsRUFBVSxTQUFTLEdBQUssRUFDL0MsRUFBVSxFQUFRLFNBQVcsRUFBVSxZQUFZLEdBQUssRUFDeEQsRUFBVyxFQUFRLFVBQVksRUFBVSxhQUFhLEVBQ3RELEVBQVMsRUFBUSxRQUFVLEVBQzNCLEVBQVMsT0FBTyxRQUFRLEVBQVEsTUFBUSxDQUFDLENBQUMsRUFDN0MsSUFBSSxFQUFFLEVBQUssS0FBVyxHQUFHLEtBQU8sR0FBTyxFQUN2QyxLQUFLLEdBQUcsRUFFTCxFQUFVLENBQUMsSUFBNkMsQ0FHNUQsSUFBTSxFQUFpQyxJQUNsQyxFQUFNLEtBQ1QsU0FBVSxFQUNWLFFBQVMsRUFBWSxDQUFLLEVBQzFCLFVBQ0EsT0FBUSxFQUFNLE1BQU0sWUFBWSxFQUNoQyxVQUFXLEVBQU0sVUFBVSxZQUFZLENBQ3pDLEVBQ0EsR0FBSSxFQUNGLEVBQU0sT0FBUyxFQUVqQixHQUFJLEVBQ0YsRUFBTSxTQUFXLEVBRW5CLEdBQUksT0FBTyxFQUFNLEtBQUssU0FBVyxTQUMvQixFQUFNLEtBQU8sQ0FBRSxZQUFhLEVBQU0sS0FBSyxNQUFPLEVBRWhELE9BQU8sR0FHVCxPQUFPLEVBQW9CLENBQ3pCLEtBQU0sS0FBVyxLQUFLLFVBQVUsRUFBUSxJQUFJLENBQU8sQ0FBQyxFQUNwRCxRQUFTLENBQ1AsZUFBZ0IsbUJBQ2hCLGFBQWMsQ0FDaEIsRUFDQSxLQUFNLFVBQ04sVUFDQSxJQUFLLDRCQUE0QixlQUNuQyxDQUFDIiwKICAiZGVidWdJZCI6ICI3N0ZEMTZEMDNFNTNGODQzNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
@@ -0,0 +1,74 @@
1
+ /** Fields an enricher contributes, or nothing when it has nothing to add. */
2
+ type EnricherFields = Record<string, unknown> | undefined;
3
+ /** What the response phase of an enricher gets to look at. */
4
+ interface EnricherResponseInput {
5
+ /** Elapsed time for the request in milliseconds. */
6
+ durationMs: number;
7
+ /** Response headers set so far (Elysia's `set.headers`). */
8
+ headers: Record<string, unknown>;
9
+ request: Request;
10
+ status: number;
11
+ }
12
+ /**
13
+ * A two-phase context contributor. Whatever it returns is merged into the
14
+ * request context, so the fields reach every sink at once — the console tree,
15
+ * file logs, and every configured transport.
16
+ */
17
+ interface Enricher {
18
+ /** Runs at request start, before the handler. */
19
+ request?: (request: Request) => EnricherFields;
20
+ /** Runs once the outcome is known, before the request's final log line. */
21
+ response?: (input: EnricherResponseInput) => EnricherFields;
22
+ }
23
+ /** An {@link Enricher}, or just its request phase as a bare function. */
24
+ type EnricherLike = Enricher | ((request: Request) => EnricherFields);
25
+ interface TraceparentEnricherOptions {
26
+ /**
27
+ * Header to read the trace context from.
28
+ * @default 'traceparent'
29
+ */
30
+ header?: string;
31
+ /**
32
+ * Also record the raw `tracestate` header (truncated to 512 characters).
33
+ * @default false
34
+ */
35
+ tracestate?: boolean;
36
+ }
37
+ /**
38
+ * Reads W3C trace context straight off the request headers, so logs link to
39
+ * traces in Sentry, HyperDX, or any OTLP backend without an OpenTelemetry SDK
40
+ * in the process.
41
+ *
42
+ * Use `logixlysia/otel` instead when you already run the SDK and want the ids
43
+ * of the *active span* rather than the ids the caller propagated.
44
+ *
45
+ * Adds `trace_id`, `span_id`, `trace_flags`, and `trace_sampled`.
46
+ */
47
+ declare const traceparentEnricher: (options?: TraceparentEnricherOptions) => Enricher;
48
+ /**
49
+ * Turns the `user-agent` header into queryable fields under `ua`: `browser`,
50
+ * `browserVersion`, `os`, `device` (`desktop` | `mobile` | `tablet` | `bot`),
51
+ * and `bot`.
52
+ *
53
+ * Deliberately a heuristic — user agents are not a parseable grammar. It is
54
+ * built for grouping traffic in a dashboard, not for making access decisions.
55
+ */
56
+ declare const userAgentEnricher: () => Enricher;
57
+ /**
58
+ * Reads the geo headers the edge already attached — Vercel, Cloudflare, or
59
+ * Netlify — into `geo.city`, `geo.country`, `geo.region`, `geo.timezone`,
60
+ * `geo.latitude`, and `geo.longitude`.
61
+ *
62
+ * Nothing is derived from the IP address itself, so behind a platform that
63
+ * does not set these headers the enricher simply adds nothing.
64
+ */
65
+ declare const geoEnricher: () => Enricher;
66
+ /**
67
+ * Records payload sizes as `requestBytes` and `responseBytes`.
68
+ *
69
+ * Both come from `content-length`, which is the only size the plugin can read
70
+ * without buffering a body. A chunked or streamed response has no
71
+ * `content-length`, so `responseBytes` is omitted rather than guessed.
72
+ */
73
+ declare const sizeEnricher: () => Enricher;
74
+ export { userAgentEnricher, traceparentEnricher, sizeEnricher, geoEnricher, TraceparentEnricherOptions, EnricherResponseInput, EnricherLike, EnricherFields, Enricher };
@@ -0,0 +1,4 @@
1
+ var P=/^([\da-f]{2})-([\da-f]{32})-([\da-f]{16})-([\da-f]{2})(?:-.+)?$/,G="0".repeat(32),M="0".repeat(16);var I=(j={})=>{let x=j.header??"traceparent";return{request(K){let F=K.headers.get(x);if(!F)return;let J=F.trim(),Q=P.exec(J);if(!Q)return;let[,X,$,U,V]=Q;if(X==="ff"||$===G||U===M||X==="00"&&J.length!==55)return;let W={span_id:U,trace_flags:V,trace_id:$,trace_sampled:Number.parseInt(V,16)%2===1};if(j.tracestate){let Y=K.headers.get("tracestate");if(Y)W.tracestate=Y.slice(0,512)}return W}}},C=/bot|crawl|spider|slurp|facebookexternalhit|preview|headless/i,L=/ipad|tablet|playbook|silk|kindle/i,H=/mobi|iphone|ipod|windows phone/i,D=/android.*mobile/i,N=[["Edge",/edg(?:a|ios)?\/([\d.]+)/i],["Opera",/(?:opr|opios|opera)\/([\d.]+)/i],["Samsung Internet",/samsungbrowser\/([\d.]+)/i],["Firefox",/(?:firefox|fxios)\/([\d.]+)/i],["Chrome",/(?:chrome|crios)\/([\d.]+)/i],["Safari",/version\/([\d.]+).*safari/i]],S=[["iOS",/iphone|ipad|ipod/i],["Android",/android/i],["ChromeOS",/cros/i],["Windows",/windows nt/i],["macOS",/mac os x/i],["Linux",/linux/i]],k=(j,x)=>{for(let[K,F]of j){let J=F.exec(x);if(J)return{name:K,version:J[1]}}},T=(j,x)=>{if(x)return"bot";if(L.test(j))return"tablet";if(H.test(j)||D.test(j))return"mobile";return"desktop"},R=()=>({request(j){let x=j.headers.get("user-agent");if(!x)return;let K=C.test(x),F=k(N,x),J=k(S,x);return{ua:{bot:K,...F?{browser:F.name}:{},...F?.version?{browserVersion:F.version}:{},device:T(x,K),...J?{os:J.name}:{}}}}}),B=[["city",["x-vercel-ip-city","cf-ipcity"]],["country",["x-vercel-ip-country","cf-ipcountry"]],["region",["x-vercel-ip-country-region","cf-region-code","cf-region"]],["timezone",["x-vercel-ip-timezone","cf-timezone"]]],_=[["latitude",["x-vercel-ip-latitude","cf-iplatitude"]],["longitude",["x-vercel-ip-longitude","cf-iplongitude"]]];var z=(j,x)=>{for(let K of x){let F=j.headers.get(K);if(F)return F}},w=(j)=>{try{return decodeURIComponent(j)}catch{return j}},A=(j)=>{let x=j.headers.get("x-nf-geo");if(!x)return;let K;try{K=JSON.parse(atob(x))}catch{return}if(K===null||typeof K!=="object")return;let F=K,J={};if(F.city)J.city=F.city;if(F.country?.code)J.country=F.country.code;if(F.subdivision?.code)J.region=F.subdivision.code;if(F.timezone)J.timezone=F.timezone;if(typeof F.latitude==="number")J.latitude=F.latitude;if(typeof F.longitude==="number")J.longitude=F.longitude;return Object.keys(J).length>0?J:void 0},b=()=>({request(j){let x={};for(let[F,J]of B){let Q=z(j,J);if(Q)x[F]=w(Q)}for(let[F,J]of _){let Q=z(j,J),X=Q===void 0?Number.NaN:Number(Q);if(Number.isFinite(X))x[F]=X}if(Object.keys(x).length>0)return{geo:x};let K=A(j);return K?{geo:K}:void 0}}),Z=(j)=>{if(typeof j==="number"&&Number.isFinite(j)&&j>=0)return j;if(typeof j!=="string"||j.length===0)return;let x=Number(j);return Number.isFinite(x)&&x>=0?x:void 0},O=(j,x)=>{for(let[K,F]of Object.entries(j))if(K.toLowerCase()===x)return F},y=()=>({request(j){let x=Z(j.headers.get("content-length"));return x===void 0?void 0:{requestBytes:x}},response(j){let x=Z(O(j.headers,"content-length"));return x===void 0?void 0:{responseBytes:x}}});export{R as userAgentEnricher,I as traceparentEnricher,y as sizeEnricher,b as geoEnricher};
2
+
3
+ //# debugId=5E54206C5515EB9664756E2164756E21
4
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2VucmljaGVycy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgdHlwZSB7XG4gIEVucmljaGVyLFxuICBFbnJpY2hlckZpZWxkcyxcbiAgRW5yaWNoZXJSZXNwb25zZUlucHV0XG59IGZyb20gJy4vdHlwZXMvZW5yaWNoZXInXG5cbmV4cG9ydCB0eXBlIHtcbiAgRW5yaWNoZXIsXG4gIEVucmljaGVyRmllbGRzLFxuICBFbnJpY2hlckxpa2UsXG4gIEVucmljaGVyUmVzcG9uc2VJbnB1dFxufSBmcm9tICcuL3R5cGVzL2VucmljaGVyJ1xuXG5jb25zdCBIRVhfUkFESVggPSAxNlxuY29uc3QgTUFYX1RSQUNFU1RBVEVfTEVOR1RIID0gNTEyXG5cbi8vIHZlcnNpb24tdHJhY2VfaWQtcGFyZW50X2lkLWZsYWdzLCB3aXRoIGFuIG9wdGlvbmFsIHRhaWwgZm9yIHZlcnNpb25zID4gMDAuXG5jb25zdCBUUkFDRVBBUkVOVCA9XG4gIC9eKFtcXGRhLWZdezJ9KS0oW1xcZGEtZl17MzJ9KS0oW1xcZGEtZl17MTZ9KS0oW1xcZGEtZl17Mn0pKD86LS4rKT8kL1xuY29uc3QgWkVST19UUkFDRV9JRCA9ICcwJy5yZXBlYXQoMzIpXG5jb25zdCBaRVJPX1NQQU5fSUQgPSAnMCcucmVwZWF0KDE2KVxuY29uc3QgSU5WQUxJRF9WRVJTSU9OID0gJ2ZmJ1xuY29uc3QgQ1VSUkVOVF9WRVJTSU9OID0gJzAwJ1xuLyoqIGAwMC1gICsgMzIgKyBgLWAgKyAxNiArIGAtYCArIDI6IHZlcnNpb24gMDAgaXMgZXhhY3RseSB0aGVzZSBmb3VyIGZpZWxkcy4gKi9cbmNvbnN0IFZFUlNJT05fMDBfTEVOR1RIID0gNTVcblxuZXhwb3J0IGludGVyZmFjZSBUcmFjZXBhcmVudEVucmljaGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIZWFkZXIgdG8gcmVhZCB0aGUgdHJhY2UgY29udGV4dCBmcm9tLlxuICAgKiBAZGVmYXVsdCAndHJhY2VwYXJlbnQnXG4gICAqL1xuICBoZWFkZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEFsc28gcmVjb3JkIHRoZSByYXcgYHRyYWNlc3RhdGVgIGhlYWRlciAodHJ1bmNhdGVkIHRvIDUxMiBjaGFyYWN0ZXJzKS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHRyYWNlc3RhdGU/OiBib29sZWFuXG59XG5cbi8qKlxuICogUmVhZHMgVzNDIHRyYWNlIGNvbnRleHQgc3RyYWlnaHQgb2ZmIHRoZSByZXF1ZXN0IGhlYWRlcnMsIHNvIGxvZ3MgbGluayB0b1xuICogdHJhY2VzIGluIFNlbnRyeSwgSHlwZXJEWCwgb3IgYW55IE9UTFAgYmFja2VuZCB3aXRob3V0IGFuIE9wZW5UZWxlbWV0cnkgU0RLXG4gKiBpbiB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBVc2UgYGxvZ2l4bHlzaWEvb3RlbGAgaW5zdGVhZCB3aGVuIHlvdSBhbHJlYWR5IHJ1biB0aGUgU0RLIGFuZCB3YW50IHRoZSBpZHNcbiAqIG9mIHRoZSAqYWN0aXZlIHNwYW4qIHJhdGhlciB0aGFuIHRoZSBpZHMgdGhlIGNhbGxlciBwcm9wYWdhdGVkLlxuICpcbiAqIEFkZHMgYHRyYWNlX2lkYCwgYHNwYW5faWRgLCBgdHJhY2VfZmxhZ3NgLCBhbmQgYHRyYWNlX3NhbXBsZWRgLlxuICovXG5leHBvcnQgY29uc3QgdHJhY2VwYXJlbnRFbnJpY2hlciA9IChcbiAgb3B0aW9uczogVHJhY2VwYXJlbnRFbnJpY2hlck9wdGlvbnMgPSB7fVxuKTogRW5yaWNoZXIgPT4ge1xuICBjb25zdCBoZWFkZXIgPSBvcHRpb25zLmhlYWRlciA/PyAndHJhY2VwYXJlbnQnXG5cbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgIGNvbnN0IHJhdyA9IHJlcXVlc3QuaGVhZGVycy5nZXQoaGVhZGVyKVxuICAgICAgaWYgKCFyYXcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gcmF3LnRyaW0oKVxuICAgICAgY29uc3QgbWF0Y2ggPSBUUkFDRVBBUkVOVC5leGVjKHZhbHVlKVxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgWywgdmVyc2lvbiwgdHJhY2VJZCwgc3BhbklkLCBmbGFnc10gPSBtYXRjaFxuXG4gICAgICAvLyBgZmZgIGlzIHJlc2VydmVkLCBhbGwtemVybyBpZHMgYXJlIGludmFsaWQsIGFuZCBhIHZlcnNpb24tMDAgaGVhZGVyXG4gICAgICAvLyBjYXJyeWluZyBleHRyYSBmaWVsZHMgaXMgbWFsZm9ybWVkIHJhdGhlciB0aGFuIGZvcndhcmQtY29tcGF0aWJsZS5cbiAgICAgIGlmIChcbiAgICAgICAgdmVyc2lvbiA9PT0gSU5WQUxJRF9WRVJTSU9OIHx8XG4gICAgICAgIHRyYWNlSWQgPT09IFpFUk9fVFJBQ0VfSUQgfHxcbiAgICAgICAgc3BhbklkID09PSBaRVJPX1NQQU5fSUQgfHxcbiAgICAgICAgKHZlcnNpb24gPT09IENVUlJFTlRfVkVSU0lPTiAmJiB2YWx1ZS5sZW5ndGggIT09IFZFUlNJT05fMDBfTEVOR1RIKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICBzcGFuX2lkOiBzcGFuSWQsXG4gICAgICAgIHRyYWNlX2ZsYWdzOiBmbGFncyxcbiAgICAgICAgdHJhY2VfaWQ6IHRyYWNlSWQsXG4gICAgICAgIC8vIGBzYW1wbGVkYCBpcyB0aGUgbG93IGJpdCBvZiB0aGUgZmxhZ3MgYnl0ZSwgc28gYW4gb2RkIHZhbHVlIGlzIHNldC5cbiAgICAgICAgdHJhY2Vfc2FtcGxlZDogTnVtYmVyLnBhcnNlSW50KGZsYWdzLCBIRVhfUkFESVgpICUgMiA9PT0gMVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy50cmFjZXN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gcmVxdWVzdC5oZWFkZXJzLmdldCgndHJhY2VzdGF0ZScpXG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgIGZpZWxkcy50cmFjZXN0YXRlID0gc3RhdGUuc2xpY2UoMCwgTUFYX1RSQUNFU1RBVEVfTEVOR1RIKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWVsZHNcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgQk9UID0gL2JvdHxjcmF3bHxzcGlkZXJ8c2x1cnB8ZmFjZWJvb2tleHRlcm5hbGhpdHxwcmV2aWV3fGhlYWRsZXNzL2lcbmNvbnN0IFRBQkxFVCA9IC9pcGFkfHRhYmxldHxwbGF5Ym9va3xzaWxrfGtpbmRsZS9pXG5jb25zdCBNT0JJTEUgPSAvbW9iaXxpcGhvbmV8aXBvZHx3aW5kb3dzIHBob25lL2lcbmNvbnN0IEFORFJPSURfTU9CSUxFID0gL2FuZHJvaWQuKm1vYmlsZS9pXG5cbi8qKiBGaXJzdCBtYXRjaCB3aW5zLCBzbyBtb3JlIHNwZWNpZmljIGVuZ2luZXMgYXJlIGxpc3RlZCBiZWZvcmUgdGhlaXIgYmFzZS4gKi9cbmNvbnN0IEJST1dTRVJTOiByZWFkb25seSBbbmFtZTogc3RyaW5nLCBwYXR0ZXJuOiBSZWdFeHBdW10gPSBbXG4gIFsnRWRnZScsIC9lZGcoPzphfGlvcyk/XFwvKFtcXGQuXSspL2ldLFxuICBbJ09wZXJhJywgLyg/Om9wcnxvcGlvc3xvcGVyYSlcXC8oW1xcZC5dKykvaV0sXG4gIFsnU2Ftc3VuZyBJbnRlcm5ldCcsIC9zYW1zdW5nYnJvd3NlclxcLyhbXFxkLl0rKS9pXSxcbiAgWydGaXJlZm94JywgLyg/OmZpcmVmb3h8Znhpb3MpXFwvKFtcXGQuXSspL2ldLFxuICBbJ0Nocm9tZScsIC8oPzpjaHJvbWV8Y3Jpb3MpXFwvKFtcXGQuXSspL2ldLFxuICBbJ1NhZmFyaScsIC92ZXJzaW9uXFwvKFtcXGQuXSspLipzYWZhcmkvaV1cbl1cblxuY29uc3QgT1BFUkFUSU5HX1NZU1RFTVM6IHJlYWRvbmx5IFtuYW1lOiBzdHJpbmcsIHBhdHRlcm46IFJlZ0V4cF1bXSA9IFtcbiAgWydpT1MnLCAvaXBob25lfGlwYWR8aXBvZC9pXSxcbiAgWydBbmRyb2lkJywgL2FuZHJvaWQvaV0sXG4gIFsnQ2hyb21lT1MnLCAvY3Jvcy9pXSxcbiAgWydXaW5kb3dzJywgL3dpbmRvd3MgbnQvaV0sXG4gIFsnbWFjT1MnLCAvbWFjIG9zIHgvaV0sXG4gIFsnTGludXgnLCAvbGludXgvaV1cbl1cblxuY29uc3QgbWF0Y2hOYW1lID0gKFxuICBjYW5kaWRhdGVzOiByZWFkb25seSBbc3RyaW5nLCBSZWdFeHBdW10sXG4gIHZhbHVlOiBzdHJpbmdcbik6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uPzogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBmb3IgKGNvbnN0IFtuYW1lLCBwYXR0ZXJuXSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWModmFsdWUpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4geyBuYW1lLCB2ZXJzaW9uOiBtYXRjaFsxXSB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHJlc29sdmVEZXZpY2UgPSAodmFsdWU6IHN0cmluZywgYm90OiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKGJvdCkge1xuICAgIHJldHVybiAnYm90J1xuICB9XG4gIGlmIChUQUJMRVQudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJ3RhYmxldCdcbiAgfVxuICBpZiAoTU9CSUxFLnRlc3QodmFsdWUpIHx8IEFORFJPSURfTU9CSUxFLnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuICdtb2JpbGUnXG4gIH1cbiAgcmV0dXJuICdkZXNrdG9wJ1xufVxuXG4vKipcbiAqIFR1cm5zIHRoZSBgdXNlci1hZ2VudGAgaGVhZGVyIGludG8gcXVlcnlhYmxlIGZpZWxkcyB1bmRlciBgdWFgOiBgYnJvd3NlcmAsXG4gKiBgYnJvd3NlclZlcnNpb25gLCBgb3NgLCBgZGV2aWNlYCAoYGRlc2t0b3BgIHwgYG1vYmlsZWAgfCBgdGFibGV0YCB8IGBib3RgKSxcbiAqIGFuZCBgYm90YC5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgYSBoZXVyaXN0aWMg4oCUIHVzZXIgYWdlbnRzIGFyZSBub3QgYSBwYXJzZWFibGUgZ3JhbW1hci4gSXQgaXNcbiAqIGJ1aWx0IGZvciBncm91cGluZyB0cmFmZmljIGluIGEgZGFzaGJvYXJkLCBub3QgZm9yIG1ha2luZyBhY2Nlc3MgZGVjaXNpb25zLlxuICovXG5leHBvcnQgY29uc3QgdXNlckFnZW50RW5yaWNoZXIgPSAoKTogRW5yaWNoZXIgPT4gKHtcbiAgcmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd1c2VyLWFnZW50JylcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBib3QgPSBCT1QudGVzdCh2YWx1ZSlcbiAgICBjb25zdCBicm93c2VyID0gbWF0Y2hOYW1lKEJST1dTRVJTLCB2YWx1ZSlcbiAgICBjb25zdCBvcyA9IG1hdGNoTmFtZShPUEVSQVRJTkdfU1lTVEVNUywgdmFsdWUpXG5cbiAgICByZXR1cm4ge1xuICAgICAgdWE6IHtcbiAgICAgICAgYm90LFxuICAgICAgICAuLi4oYnJvd3NlciA/IHsgYnJvd3NlcjogYnJvd3Nlci5uYW1lIH0gOiB7fSksXG4gICAgICAgIC4uLihicm93c2VyPy52ZXJzaW9uID8geyBicm93c2VyVmVyc2lvbjogYnJvd3Nlci52ZXJzaW9uIH0gOiB7fSksXG4gICAgICAgIGRldmljZTogcmVzb2x2ZURldmljZSh2YWx1ZSwgYm90KSxcbiAgICAgICAgLi4uKG9zID8geyBvczogb3MubmFtZSB9IDoge30pXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuXG4vKiogSGVhZGVyIGNhbmRpZGF0ZXMgcGVyIGdlbyBmaWVsZCwgaW4gcHJpb3JpdHkgb3JkZXIgYWNyb3NzIHBsYXRmb3Jtcy4gKi9cbmNvbnN0IEdFT19IRUFERVJTOiByZWFkb25seSBbZmllbGQ6IHN0cmluZywgaGVhZGVyczogcmVhZG9ubHkgc3RyaW5nW11dW10gPSBbXG4gIFsnY2l0eScsIFsneC12ZXJjZWwtaXAtY2l0eScsICdjZi1pcGNpdHknXV0sXG4gIFsnY291bnRyeScsIFsneC12ZXJjZWwtaXAtY291bnRyeScsICdjZi1pcGNvdW50cnknXV0sXG4gIFsncmVnaW9uJywgWyd4LXZlcmNlbC1pcC1jb3VudHJ5LXJlZ2lvbicsICdjZi1yZWdpb24tY29kZScsICdjZi1yZWdpb24nXV0sXG4gIFsndGltZXpvbmUnLCBbJ3gtdmVyY2VsLWlwLXRpbWV6b25lJywgJ2NmLXRpbWV6b25lJ11dXG5dXG5cbmNvbnN0IEdFT19OVU1FUklDX0hFQURFUlM6IHJlYWRvbmx5IFtcbiAgZmllbGQ6IHN0cmluZyxcbiAgaGVhZGVyczogcmVhZG9ubHkgc3RyaW5nW11cbl1bXSA9IFtcbiAgWydsYXRpdHVkZScsIFsneC12ZXJjZWwtaXAtbGF0aXR1ZGUnLCAnY2YtaXBsYXRpdHVkZSddXSxcbiAgWydsb25naXR1ZGUnLCBbJ3gtdmVyY2VsLWlwLWxvbmdpdHVkZScsICdjZi1pcGxvbmdpdHVkZSddXVxuXVxuXG5jb25zdCBORVRMSUZZX0dFT19IRUFERVIgPSAneC1uZi1nZW8nXG5cbmNvbnN0IGZpcnN0SGVhZGVyID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBoZWFkZXJzOiByZWFkb25seSBzdHJpbmdbXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgZm9yIChjb25zdCBoZWFkZXIgb2YgaGVhZGVycykge1xuICAgIGNvbnN0IHZhbHVlID0gcmVxdWVzdC5oZWFkZXJzLmdldChoZWFkZXIpXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG4gIH1cbn1cblxuLyoqIFZlcmNlbCBwZXJjZW50LWVuY29kZXMgY2l0eSBuYW1lcywgc28gYFMlQzMlQTNvJTIwUGF1bG9gIG11c3QgYmUgZGVjb2RlZC4gKi9cbmNvbnN0IGRlY29kZUhlYWRlclZhbHVlID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG5cbmludGVyZmFjZSBOZXRsaWZ5R2VvIHtcbiAgY2l0eT86IHN0cmluZ1xuICBjb3VudHJ5PzogeyBjb2RlPzogc3RyaW5nIH1cbiAgbGF0aXR1ZGU/OiBudW1iZXJcbiAgbG9uZ2l0dWRlPzogbnVtYmVyXG4gIHN1YmRpdmlzaW9uPzogeyBjb2RlPzogc3RyaW5nIH1cbiAgdGltZXpvbmU/OiBzdHJpbmdcbn1cblxuY29uc3QgcmVhZE5ldGxpZnlHZW8gPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3Rcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcmF3ID0gcmVxdWVzdC5oZWFkZXJzLmdldChORVRMSUZZX0dFT19IRUFERVIpXG4gIGlmICghcmF3KSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgcGFyc2VkOiB1bmtub3duXG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShhdG9iKHJhdykpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHBhcnNlZCA9PT0gbnVsbCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgZGF0YSA9IHBhcnNlZCBhcyBOZXRsaWZ5R2VvXG4gIGNvbnN0IGdlbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICBpZiAoZGF0YS5jaXR5KSB7XG4gICAgZ2VvLmNpdHkgPSBkYXRhLmNpdHlcbiAgfVxuICBpZiAoZGF0YS5jb3VudHJ5Py5jb2RlKSB7XG4gICAgZ2VvLmNvdW50cnkgPSBkYXRhLmNvdW50cnkuY29kZVxuICB9XG4gIGlmIChkYXRhLnN1YmRpdmlzaW9uPy5jb2RlKSB7XG4gICAgZ2VvLnJlZ2lvbiA9IGRhdGEuc3ViZGl2aXNpb24uY29kZVxuICB9XG4gIGlmIChkYXRhLnRpbWV6b25lKSB7XG4gICAgZ2VvLnRpbWV6b25lID0gZGF0YS50aW1lem9uZVxuICB9XG4gIGlmICh0eXBlb2YgZGF0YS5sYXRpdHVkZSA9PT0gJ251bWJlcicpIHtcbiAgICBnZW8ubGF0aXR1ZGUgPSBkYXRhLmxhdGl0dWRlXG4gIH1cbiAgaWYgKHR5cGVvZiBkYXRhLmxvbmdpdHVkZSA9PT0gJ251bWJlcicpIHtcbiAgICBnZW8ubG9uZ2l0dWRlID0gZGF0YS5sb25naXR1ZGVcbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhnZW8pLmxlbmd0aCA+IDAgPyBnZW8gOiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgZ2VvIGhlYWRlcnMgdGhlIGVkZ2UgYWxyZWFkeSBhdHRhY2hlZCDigJQgVmVyY2VsLCBDbG91ZGZsYXJlLCBvclxuICogTmV0bGlmeSDigJQgaW50byBgZ2VvLmNpdHlgLCBgZ2VvLmNvdW50cnlgLCBgZ2VvLnJlZ2lvbmAsIGBnZW8udGltZXpvbmVgLFxuICogYGdlby5sYXRpdHVkZWAsIGFuZCBgZ2VvLmxvbmdpdHVkZWAuXG4gKlxuICogTm90aGluZyBpcyBkZXJpdmVkIGZyb20gdGhlIElQIGFkZHJlc3MgaXRzZWxmLCBzbyBiZWhpbmQgYSBwbGF0Zm9ybSB0aGF0XG4gKiBkb2VzIG5vdCBzZXQgdGhlc2UgaGVhZGVycyB0aGUgZW5yaWNoZXIgc2ltcGx5IGFkZHMgbm90aGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdlb0VucmljaGVyID0gKCk6IEVucmljaGVyID0+ICh7XG4gIHJlcXVlc3QocmVxdWVzdCkge1xuICAgIGNvbnN0IGdlbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuXG4gICAgZm9yIChjb25zdCBbZmllbGQsIGhlYWRlcnNdIG9mIEdFT19IRUFERVJTKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpcnN0SGVhZGVyKHJlcXVlc3QsIGhlYWRlcnMpXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZ2VvW2ZpZWxkXSA9IGRlY29kZUhlYWRlclZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ZpZWxkLCBoZWFkZXJzXSBvZiBHRU9fTlVNRVJJQ19IRUFERVJTKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpcnN0SGVhZGVyKHJlcXVlc3QsIGhlYWRlcnMpXG4gICAgICBjb25zdCBwYXJzZWQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gTnVtYmVyLk5hTiA6IE51bWJlcih2YWx1ZSlcbiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSkge1xuICAgICAgICBnZW9bZmllbGRdID0gcGFyc2VkXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGdlbykubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHsgZ2VvIH1cbiAgICB9XG5cbiAgICBjb25zdCBuZXRsaWZ5ID0gcmVhZE5ldGxpZnlHZW8ocmVxdWVzdClcbiAgICByZXR1cm4gbmV0bGlmeSA/IHsgZ2VvOiBuZXRsaWZ5IH0gOiB1bmRlZmluZWRcbiAgfVxufSlcblxuY29uc3QgcmVhZENvbnRlbnRMZW5ndGggPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID49IDApIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSAmJiBwYXJzZWQgPj0gMCA/IHBhcnNlZCA6IHVuZGVmaW5lZFxufVxuXG5jb25zdCBmaW5kSGVhZGVyID0gKFxuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgbmFtZTogc3RyaW5nXG4pOiB1bmtub3duID0+IHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaGVhZGVycykpIHtcbiAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlY29yZHMgcGF5bG9hZCBzaXplcyBhcyBgcmVxdWVzdEJ5dGVzYCBhbmQgYHJlc3BvbnNlQnl0ZXNgLlxuICpcbiAqIEJvdGggY29tZSBmcm9tIGBjb250ZW50LWxlbmd0aGAsIHdoaWNoIGlzIHRoZSBvbmx5IHNpemUgdGhlIHBsdWdpbiBjYW4gcmVhZFxuICogd2l0aG91dCBidWZmZXJpbmcgYSBib2R5LiBBIGNodW5rZWQgb3Igc3RyZWFtZWQgcmVzcG9uc2UgaGFzIG5vXG4gKiBgY29udGVudC1sZW5ndGhgLCBzbyBgcmVzcG9uc2VCeXRlc2AgaXMgb21pdHRlZCByYXRoZXIgdGhhbiBndWVzc2VkLlxuICovXG5leHBvcnQgY29uc3Qgc2l6ZUVucmljaGVyID0gKCk6IEVucmljaGVyID0+ICh7XG4gIHJlcXVlc3QocmVxdWVzdCk6IEVucmljaGVyRmllbGRzIHtcbiAgICBjb25zdCBieXRlcyA9IHJlYWRDb250ZW50TGVuZ3RoKHJlcXVlc3QuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJykpXG4gICAgcmV0dXJuIGJ5dGVzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IHJlcXVlc3RCeXRlczogYnl0ZXMgfVxuICB9LFxuICByZXNwb25zZShpbnB1dDogRW5yaWNoZXJSZXNwb25zZUlucHV0KTogRW5yaWNoZXJGaWVsZHMge1xuICAgIGNvbnN0IGJ5dGVzID0gcmVhZENvbnRlbnRMZW5ndGgoZmluZEhlYWRlcihpbnB1dC5oZWFkZXJzLCAnY29udGVudC1sZW5ndGgnKSlcbiAgICByZXR1cm4gYnl0ZXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHsgcmVzcG9uc2VCeXRlczogYnl0ZXMgfVxuICB9XG59KVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBaUJBLElBQU0sRUFDSixrRUFDSSxFQUFnQixJQUFJLE9BQU8sRUFBRSxFQUM3QixFQUFlLElBQUksT0FBTyxFQUFFLEVBNkIzQixJQUFNLEVBQXNCLENBQ2pDLEVBQXNDLENBQUMsSUFDMUIsQ0FDYixJQUFNLEVBQVMsRUFBUSxRQUFVLGNBRWpDLE1BQU8sQ0FDTCxPQUFPLENBQUMsRUFBUyxDQUNmLElBQU0sRUFBTSxFQUFRLFFBQVEsSUFBSSxDQUFNLEVBQ3RDLEdBQUksQ0FBQyxFQUNILE9BR0YsSUFBTSxFQUFRLEVBQUksS0FBSyxFQUNqQixFQUFRLEVBQVksS0FBSyxDQUFLLEVBQ3BDLEdBQUksQ0FBQyxFQUNILE9BR0YsS0FBUyxFQUFTLEVBQVMsRUFBUSxHQUFTLEVBSTVDLEdBQ0UsSUFuRGdCLE1Bb0RoQixJQUFZLEdBQ1osSUFBVyxHQUNWLElBckRlLE1BcURnQixFQUFNLFNBbkRwQixHQXFEbEIsT0FHRixJQUFNLEVBQWtDLENBQ3RDLFFBQVMsRUFDVCxZQUFhLEVBQ2IsU0FBVSxFQUVWLGNBQWUsT0FBTyxTQUFTLEVBeEVyQixFQXdFcUMsRUFBSSxJQUFNLENBQzNELEVBRUEsR0FBSSxFQUFRLFdBQVksQ0FDdEIsSUFBTSxFQUFRLEVBQVEsUUFBUSxJQUFJLFlBQVksRUFDOUMsR0FBSSxFQUNGLEVBQU8sV0FBYSxFQUFNLE1BQU0sRUE3RVosR0E2RW9DLEVBSTVELE9BQU8sRUFFWCxHQUdJLEVBQU0sK0RBQ04sRUFBUyxvQ0FDVCxFQUFTLGtDQUNULEVBQWlCLG1CQUdqQixFQUF1RCxDQUMzRCxDQUFDLE9BQVEsMEJBQTBCLEVBQ25DLENBQUMsUUFBUyxnQ0FBZ0MsRUFDMUMsQ0FBQyxtQkFBb0IsMkJBQTJCLEVBQ2hELENBQUMsVUFBVyw4QkFBOEIsRUFDMUMsQ0FBQyxTQUFVLDZCQUE2QixFQUN4QyxDQUFDLFNBQVUs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
@@ -0,0 +1,63 @@
1
+ type LogLevel = "DEBUG" | "INFO" | "WARNING" | "ERROR";
2
+ interface Transport {
3
+ log: (level: LogLevel, message: string, meta?: Record<string, unknown>) => void | Promise<void>;
4
+ }
5
+ interface BatchTransportOptions {
6
+ /**
7
+ * Max time (ms) an entry waits in the buffer before it is sent.
8
+ * @default 2000
9
+ */
10
+ flushIntervalMs?: number;
11
+ /**
12
+ * Entries buffered before an immediate flush, regardless of the interval.
13
+ * @default 20
14
+ */
15
+ maxBatchSize?: number;
16
+ /**
17
+ * Retry attempts on network errors, 429, and 5xx responses.
18
+ * @default 2
19
+ */
20
+ retries?: number;
21
+ /**
22
+ * Per-request timeout in milliseconds.
23
+ * @default 5000
24
+ */
25
+ timeout?: number;
26
+ }
27
+ /** A {@link Transport} that batches entries and can be flushed on demand. */
28
+ interface AdapterTransport extends Transport {
29
+ /** Sends any buffered entries immediately. Call before process exit. */
30
+ flush: () => Promise<void>;
31
+ }
32
+ interface HyperDXTransportOptions extends BatchTransportOptions {
33
+ /**
34
+ * HyperDX ingestion API key, sent as the `authorization` header.
35
+ * Falls back to the `HYPERDX_API_KEY` environment variable.
36
+ */
37
+ apiKey?: string;
38
+ /**
39
+ * OTLP HTTP base URL — the adapter appends `/v1/logs`. For self-hosted
40
+ * collectors pass the base URL only (port 4318 by default).
41
+ * Falls back to `HYPERDX_OTLP_ENDPOINT`.
42
+ * @default 'https://in-otel.hyperdx.io'
43
+ */
44
+ endpoint?: string;
45
+ /** Extra OTLP resource attributes merged next to `service.name`. */
46
+ resourceAttributes?: Record<string, string>;
47
+ /**
48
+ * Value of the `service.name` resource attribute.
49
+ * Falls back to `HYPERDX_SERVICE_NAME`, then `OTEL_SERVICE_NAME`.
50
+ * @default 'logixlysia'
51
+ */
52
+ serviceName?: string;
53
+ }
54
+ /**
55
+ * Creates a transport that ships logs to HyperDX as OTLP JSON
56
+ * (`ExportLogsServiceRequest`) over HTTP. Meta fields become dot-notation log
57
+ * attributes (`request.method`, `context.requestId`, …) so they are searchable
58
+ * in the HyperDX UI.
59
+ *
60
+ * @throws When no API key is configured.
61
+ */
62
+ declare const createHyperDXTransport: (options?: HyperDXTransportOptions) => AdapterTransport;
63
+ export { createHyperDXTransport, HyperDXTransportOptions, AdapterTransport };
@@ -0,0 +1,4 @@
1
+ import{a as V}from"./shared/Logixlysia-9cedhf19.js";import{c as G,d as z,e as Q}from"./shared/Logixlysia-7649md6y.js";var Z="https://in-otel.hyperdx.io",w=(j={})=>{let B=j.apiKey??z("HYPERDX_API_KEY");if(!B)throw Q("HyperDX","missing API key. Set HYPERDX_API_KEY or pass apiKey to createHyperDXTransport()");let Y=G(j.endpoint??z("HYPERDX_OTLP_ENDPOINT")??Z);return V({headers:{authorization:B},name:"HyperDX",options:j,resourceAttributes:j.resourceAttributes??{},serviceName:j.serviceName??z("HYPERDX_SERVICE_NAME")??z("OTEL_SERVICE_NAME")??"logixlysia",url:`${Y}/v1/logs`})};export{w as createHyperDXTransport};
2
+
3
+ //# debugId=9A8C93AE9F79482964756E2164756E21
4
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2h5cGVyZHgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgY3JlYXRlT3RscENvcmUgfSBmcm9tICcuL2FkYXB0ZXJzL290bHAtY29yZSdcbmltcG9ydCB7XG4gIHR5cGUgQWRhcHRlclRyYW5zcG9ydCxcbiAgdHlwZSBCYXRjaFRyYW5zcG9ydE9wdGlvbnMsXG4gIGVudlN0cmluZyxcbiAgc3RyaXBUcmFpbGluZ1NsYXNoZXMsXG4gIHRyYW5zcG9ydEVycm9yXG59IGZyb20gJy4vYWRhcHRlcnMvc2hhcmVkJ1xuXG5jb25zdCBERUZBVUxUX0VORFBPSU5UID0gJ2h0dHBzOi8vaW4tb3RlbC5oeXBlcmR4LmlvJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEh5cGVyRFhUcmFuc3BvcnRPcHRpb25zIGV4dGVuZHMgQmF0Y2hUcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEh5cGVyRFggaW5nZXN0aW9uIEFQSSBrZXksIHNlbnQgYXMgdGhlIGBhdXRob3JpemF0aW9uYCBoZWFkZXIuXG4gICAqIEZhbGxzIGJhY2sgdG8gdGhlIGBIWVBFUkRYX0FQSV9LRVlgIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgKi9cbiAgYXBpS2V5Pzogc3RyaW5nXG4gIC8qKlxuICAgKiBPVExQIEhUVFAgYmFzZSBVUkwg4oCUIHRoZSBhZGFwdGVyIGFwcGVuZHMgYC92MS9sb2dzYC4gRm9yIHNlbGYtaG9zdGVkXG4gICAqIGNvbGxlY3RvcnMgcGFzcyB0aGUgYmFzZSBVUkwgb25seSAocG9ydCA0MzE4IGJ5IGRlZmF1bHQpLlxuICAgKiBGYWxscyBiYWNrIHRvIGBIWVBFUkRYX09UTFBfRU5EUE9JTlRgLlxuICAgKiBAZGVmYXVsdCAnaHR0cHM6Ly9pbi1vdGVsLmh5cGVyZHguaW8nXG4gICAqL1xuICBlbmRwb2ludD86IHN0cmluZ1xuICAvKiogRXh0cmEgT1RMUCByZXNvdXJjZSBhdHRyaWJ1dGVzIG1lcmdlZCBuZXh0IHRvIGBzZXJ2aWNlLm5hbWVgLiAqL1xuICByZXNvdXJjZUF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIC8qKlxuICAgKiBWYWx1ZSBvZiB0aGUgYHNlcnZpY2UubmFtZWAgcmVzb3VyY2UgYXR0cmlidXRlLlxuICAgKiBGYWxscyBiYWNrIHRvIGBIWVBFUkRYX1NFUlZJQ0VfTkFNRWAsIHRoZW4gYE9URUxfU0VSVklDRV9OQU1FYC5cbiAgICogQGRlZmF1bHQgJ2xvZ2l4bHlzaWEnXG4gICAqL1xuICBzZXJ2aWNlTmFtZT86IHN0cmluZ1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0cmFuc3BvcnQgdGhhdCBzaGlwcyBsb2dzIHRvIEh5cGVyRFggYXMgT1RMUCBKU09OXG4gKiAoYEV4cG9ydExvZ3NTZXJ2aWNlUmVxdWVzdGApIG92ZXIgSFRUUC4gTWV0YSBmaWVsZHMgYmVjb21lIGRvdC1ub3RhdGlvbiBsb2dcbiAqIGF0dHJpYnV0ZXMgKGByZXF1ZXN0Lm1ldGhvZGAsIGBjb250ZXh0LnJlcXVlc3RJZGAsIOKApikgc28gdGhleSBhcmUgc2VhcmNoYWJsZVxuICogaW4gdGhlIEh5cGVyRFggVUkuXG4gKlxuICogQHRocm93cyBXaGVuIG5vIEFQSSBrZXkgaXMgY29uZmlndXJlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUh5cGVyRFhUcmFuc3BvcnQgPSAoXG4gIG9wdGlvbnM6IEh5cGVyRFhUcmFuc3BvcnRPcHRpb25zID0ge31cbik6IEFkYXB0ZXJUcmFuc3BvcnQgPT4ge1xuICBjb25zdCBhcGlLZXkgPSBvcHRpb25zLmFwaUtleSA/PyBlbnZTdHJpbmcoJ0hZUEVSRFhfQVBJX0tFWScpXG4gIGlmICghYXBpS2V5KSB7XG4gICAgdGhyb3cgdHJhbnNwb3J0RXJyb3IoXG4gICAgICAnSHlwZXJEWCcsXG4gICAgICAnbWlzc2luZyBBUEkga2V5LiBTZXQgSFlQRVJEWF9BUElfS0VZIG9yIHBhc3MgYXBpS2V5IHRvIGNyZWF0ZUh5cGVyRFhUcmFuc3BvcnQoKSdcbiAgICApXG4gIH1cblxuICBjb25zdCBlbmRwb2ludCA9IHN0cmlwVHJhaWxpbmdTbGFzaGVzKFxuICAgIG9wdGlvbnMuZW5kcG9pbnQgPz8gZW52U3RyaW5nKCdIWVBFUkRYX09UTFBfRU5EUE9JTlQnKSA/PyBERUZBVUxUX0VORFBPSU5UXG4gIClcblxuICByZXR1cm4gY3JlYXRlT3RscENvcmUoe1xuICAgIGhlYWRlcnM6IHsgYXV0aG9yaXphdGlvbjogYXBpS2V5IH0sXG4gICAgbmFtZTogJ0h5cGVyRFgnLFxuICAgIG9wdGlvbnMsXG4gICAgcmVzb3VyY2VBdHRyaWJ1dGVzOiBvcHRpb25zLnJlc291cmNlQXR0cmlidXRlcyA/PyB7fSxcbiAgICBzZXJ2aWNlTmFtZTpcbiAgICAgIG9wdGlvbnMuc2VydmljZU5hbWUgPz9cbiAgICAgIGVudlN0cmluZygnSFlQRVJEWF9TRVJWSUNFX05BTUUnKSA/P1xuICAgICAgZW52U3RyaW5nKCdPVEVMX1NFUlZJQ0VfTkFNRScpID8/XG4gICAgICAnbG9naXhseXNpYScsXG4gICAgdXJsOiBgJHtlbmRwb2ludH0vdjEvbG9nc2BcbiAgfSlcbn1cblxuZXhwb3J0IHR5cGUgeyBBZGFwdGVyVHJhbnNwb3J0IH0gZnJvbSAnLi9hZGFwdGVycy9zaGFyZWQnXG4iCiAgXSwKICAibWFwcGluZ3MiOiAiZ0hBU0EsVUFBTSxFQUFtQiw2QkFpQ1osRUFBeUIsQ0FDcEMsRUFBbUMsQ0FBQyxJQUNmLENBQ3JCLElBQU0sRUFBUyxFQUFRLFFBQVUsRUFBVSxpQkFBaUIsRUFDNUQsR0FBSSxDQUFDLEVBQ0gsTUFBTSxFQUNKLFVBQ0EsaUZBQ0YsRUFHRixJQUFNLEVBQVcsRUFDZixFQUFRLFVBQVksRUFBVSx1QkFBdUIsR0FBSyxDQUM1RCxFQUVBLE9BQU8sRUFBZSxDQUNwQixRQUFTLENBQUUsY0FBZSxDQUFPLEVBQ2pDLEtBQU0sVUFDTixVQUNBLG1CQUFvQixFQUFRLG9CQUFzQixDQUFDLEVBQ25ELFlBQ0UsRUFBUSxhQUNSLEVBQVUsc0JBQXNCLEdBQ2hDLEVBQVUsbUJBQW1CLEdBQzdCLGFBQ0YsSUFBSyxHQUFHLFdBQ1YsQ0FBQyIsCiAgImRlYnVnSWQiOiAiOUE4QzkzQUU5Rjc5NDgyOTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=