@loglayer/transport-google-cloud-logging 3.2.0 → 3.4.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/dist/index.cjs CHANGED
@@ -4,10 +4,12 @@ let _loglayer_transport = require("@loglayer/transport");
4
4
  var GoogleCloudLoggingTransport = class extends _loglayer_transport.BaseTransport {
5
5
  rootLevelData;
6
6
  rootLevelMetadataFields;
7
+ onError;
7
8
  constructor(config) {
8
9
  super(config);
9
10
  this.rootLevelData = config.rootLevelData || {};
10
11
  this.rootLevelMetadataFields = config.rootLevelMetadataFields ?? [];
12
+ this.onError = config.onError;
11
13
  }
12
14
  mapLogLevel(level) {
13
15
  switch (level) {
@@ -29,19 +31,32 @@ var GoogleCloudLoggingTransport = class extends _loglayer_transport.BaseTranspor
29
31
  }
30
32
  return metadata;
31
33
  }
34
+ handleError(error) {
35
+ if (!this.onError) return;
36
+ try {
37
+ this.onError(error instanceof Error ? error : new Error(String(error)));
38
+ } catch {}
39
+ }
32
40
  shipToLogger({ data, hasData, logLevel, messages }) {
33
41
  const safeData = data && hasData ? data : {};
34
- const metadata = this.extractLogEntryFields(safeData);
35
- const entry = this.logger.entry({
36
- ...this.rootLevelData,
37
- ...metadata,
38
- severity: this.mapLogLevel(logLevel),
39
- timestamp: /* @__PURE__ */ new Date()
40
- }, {
41
- ...safeData,
42
- message: messages.join(" ")
43
- });
44
- this.logger.write(entry);
42
+ try {
43
+ const metadata = this.extractLogEntryFields(safeData);
44
+ const entry = this.logger.entry({
45
+ ...this.rootLevelData,
46
+ ...metadata,
47
+ severity: this.mapLogLevel(logLevel),
48
+ timestamp: /* @__PURE__ */ new Date()
49
+ }, {
50
+ ...safeData,
51
+ message: messages.join(" ")
52
+ });
53
+ const writeResult = this.logger.write(entry);
54
+ if (writeResult && typeof writeResult.then === "function") writeResult.then(void 0, (error) => {
55
+ this.handleError(error);
56
+ });
57
+ } catch (error) {
58
+ this.handleError(error);
59
+ }
45
60
  if (data && hasData) return [data, messages];
46
61
  return [messages];
47
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["BaseTransport","LogLevel"],"sources":["../src/GoogleCloudLoggingTransport.ts"],"sourcesContent":["import type { Log, LogSync } from \"@google-cloud/logging\";\nimport type { LogEntry } from \"@google-cloud/logging/build/src/entry.js\";\nimport type { LogLayerTransportConfig, LogLayerTransportParams } from \"@loglayer/transport\";\nimport { BaseTransport, LogLevel, type LogLevelType } from \"@loglayer/transport\";\n\nexport interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log | LogSync> {\n /**\n * The root level data to include for all log entries.\n * \"severity\", \"timestamp\" and \"jsonPayload\" are already populated by the transport.\n * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry\n */\n rootLevelData?: Omit<\n LogEntry,\n \"severity\" | \"timestamp\" | \"receiveTimestamp\" | \"jsonPayload\" | \"textPayload\" | \"protoPayload\"\n >;\n\n /**\n * List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.\n */\n rootLevelMetadataFields?: Array<string>;\n}\n\nexport class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {\n private rootLevelData: GoogleCloudLoggingTransportConfig[\"rootLevelData\"];\n private rootLevelMetadataFields: Array<string>;\n\n constructor(config: GoogleCloudLoggingTransportConfig) {\n super(config);\n this.rootLevelData = config.rootLevelData || {};\n this.rootLevelMetadataFields = config.rootLevelMetadataFields ?? [];\n }\n\n private mapLogLevel(level: LogLevelType): string {\n switch (level) {\n case LogLevel.fatal:\n return \"CRITICAL\";\n case LogLevel.error:\n return \"ERROR\";\n case LogLevel.warn:\n return \"WARNING\";\n case LogLevel.info:\n return \"INFO\";\n case LogLevel.debug:\n return \"DEBUG\";\n case LogLevel.trace:\n return \"DEBUG\";\n default:\n return \"DEFAULT\";\n }\n }\n\n private extractLogEntryFields(data: Record<string, unknown>) {\n const keys = Object.keys(data);\n const metadata: Record<string, unknown> = {};\n\n for (const key of keys) {\n if (this.rootLevelMetadataFields.includes(key)) {\n metadata[key] = data[key];\n delete data[key];\n }\n }\n\n return metadata;\n }\n\n shipToLogger({ data, hasData, logLevel, messages }: LogLayerTransportParams): any[] {\n const safeData = data && hasData ? data : {};\n const metadata = this.extractLogEntryFields(safeData);\n\n const entry = this.logger.entry(\n {\n ...this.rootLevelData,\n ...metadata,\n severity: this.mapLogLevel(logLevel),\n timestamp: new Date(),\n },\n {\n ...safeData,\n message: messages.join(\" \"),\n },\n );\n\n this.logger.write(entry);\n\n if (data && hasData) {\n return [data, messages];\n }\n\n return [messages];\n }\n}\n"],"mappings":";;;AAsBA,IAAa,8BAAb,cAAiDA,oBAAAA,cAA6B;CAC5E;CACA;CAEA,YAAY,QAA2C;EACrD,MAAM,MAAM;EACZ,KAAK,gBAAgB,OAAO,iBAAiB,CAAC;EAC9C,KAAK,0BAA0B,OAAO,2BAA2B,CAAC;CACpE;CAEA,YAAoB,OAA6B;EAC/C,QAAQ,OAAR;GACE,KAAKC,oBAAAA,SAAS,OACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,OACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,MACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,MACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,OACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,OACZ,OAAO;GACT,SACE,OAAO;EACX;CACF;CAEA,sBAA8B,MAA+B;EAC3D,MAAM,OAAO,OAAO,KAAK,IAAI;EAC7B,MAAM,WAAoC,CAAC;EAE3C,KAAK,MAAM,OAAO,MAChB,IAAI,KAAK,wBAAwB,SAAS,GAAG,GAAG;GAC9C,SAAS,OAAO,KAAK;GACrB,OAAO,KAAK;EACd;EAGF,OAAO;CACT;CAEA,aAAa,EAAE,MAAM,SAAS,UAAU,YAA4C;EAClF,MAAM,WAAW,QAAQ,UAAU,OAAO,CAAC;EAC3C,MAAM,WAAW,KAAK,sBAAsB,QAAQ;EAEpD,MAAM,QAAQ,KAAK,OAAO,MACxB;GACE,GAAG,KAAK;GACR,GAAG;GACH,UAAU,KAAK,YAAY,QAAQ;GACnC,2BAAW,IAAI,KAAK;EACtB,GACA;GACE,GAAG;GACH,SAAS,SAAS,KAAK,GAAG;EAC5B,CACF;EAEA,KAAK,OAAO,MAAM,KAAK;EAEvB,IAAI,QAAQ,SACV,OAAO,CAAC,MAAM,QAAQ;EAGxB,OAAO,CAAC,QAAQ;CAClB;AACF"}
1
+ {"version":3,"file":"index.cjs","names":["BaseTransport","LogLevel"],"sources":["../src/GoogleCloudLoggingTransport.ts"],"sourcesContent":["import type { Log, LogSync } from \"@google-cloud/logging\";\nimport type { LogEntry } from \"@google-cloud/logging/build/src/entry.js\";\nimport type { LogLayerTransportConfig, LogLayerTransportParams } from \"@loglayer/transport\";\nimport { BaseTransport, LogLevel, type LogLevelType } from \"@loglayer/transport\";\n\nexport interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log | LogSync> {\n /**\n * The root level data to include for all log entries.\n * \"severity\", \"timestamp\" and \"jsonPayload\" are already populated by the transport.\n * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry\n */\n rootLevelData?: Omit<\n LogEntry,\n \"severity\" | \"timestamp\" | \"receiveTimestamp\" | \"jsonPayload\" | \"textPayload\" | \"protoPayload\"\n >;\n\n /**\n * List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.\n */\n rootLevelMetadataFields?: Array<string>;\n\n /**\n * Callback to handle errors that occur when creating or writing log entries.\n *\n * Errors are caught by the transport (so logging failures never surface as\n * unhandled rejections or crash the application) and reported here. If `onError`\n * is not provided, errors are silently ignored.\n *\n * If the Google Cloud Logging client was created with a `defaultWriteDeleteCallback`,\n * API-level write failures are reported to that callback instead of rejecting the\n * `write()` promise. `onError` still receives failures that occur before the SDK\n * invokes that callback (for example, project or resource detection failures),\n * so the two are complementary.\n */\n onError?: (error: Error) => void;\n}\n\nexport class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {\n private rootLevelData: GoogleCloudLoggingTransportConfig[\"rootLevelData\"];\n private rootLevelMetadataFields: Array<string>;\n private onError?: (error: Error) => void;\n\n constructor(config: GoogleCloudLoggingTransportConfig) {\n super(config);\n this.rootLevelData = config.rootLevelData || {};\n this.rootLevelMetadataFields = config.rootLevelMetadataFields ?? [];\n this.onError = config.onError;\n }\n\n private mapLogLevel(level: LogLevelType): string {\n switch (level) {\n case LogLevel.fatal:\n return \"CRITICAL\";\n case LogLevel.error:\n return \"ERROR\";\n case LogLevel.warn:\n return \"WARNING\";\n case LogLevel.info:\n return \"INFO\";\n case LogLevel.debug:\n return \"DEBUG\";\n case LogLevel.trace:\n return \"DEBUG\";\n default:\n return \"DEFAULT\";\n }\n }\n\n private extractLogEntryFields(data: Record<string, unknown>) {\n const keys = Object.keys(data);\n const metadata: Record<string, unknown> = {};\n\n for (const key of keys) {\n if (this.rootLevelMetadataFields.includes(key)) {\n metadata[key] = data[key];\n delete data[key];\n }\n }\n\n return metadata;\n }\n\n private handleError(error: unknown) {\n if (!this.onError) {\n return;\n }\n\n try {\n this.onError(error instanceof Error ? error : new Error(String(error)));\n } catch {\n // A throwing onError callback must never escape the transport\n }\n }\n\n shipToLogger({ data, hasData, logLevel, messages }: LogLayerTransportParams): any[] {\n const safeData = data && hasData ? data : {};\n\n try {\n const metadata = this.extractLogEntryFields(safeData);\n\n const entry = this.logger.entry(\n {\n ...this.rootLevelData,\n ...metadata,\n severity: this.mapLogLevel(logLevel),\n timestamp: new Date(),\n },\n {\n ...safeData,\n message: messages.join(\" \"),\n },\n );\n\n // `Log.write()` returns a Promise that can reject for failures that happen before the\n // SDK's `defaultWriteDeleteCallback` is invoked (eg, project/resource detection).\n // `LogSync.write()` returns void. Handle both shapes so logging failures never surface\n // as unhandled rejections.\n const writeResult = this.logger.write(entry) as PromiseLike<unknown> | undefined;\n\n if (writeResult && typeof writeResult.then === \"function\") {\n writeResult.then(undefined, (error: unknown) => {\n this.handleError(error);\n });\n }\n } catch (error) {\n this.handleError(error);\n }\n\n if (data && hasData) {\n return [data, messages];\n }\n\n return [messages];\n }\n}\n"],"mappings":";;;AAqCA,IAAa,8BAAb,cAAiDA,oBAAAA,cAA6B;CAC5E;CACA;CACA;CAEA,YAAY,QAA2C;EACrD,MAAM,MAAM;EACZ,KAAK,gBAAgB,OAAO,iBAAiB,CAAC;EAC9C,KAAK,0BAA0B,OAAO,2BAA2B,CAAC;EAClE,KAAK,UAAU,OAAO;CACxB;CAEA,YAAoB,OAA6B;EAC/C,QAAQ,OAAR;GACE,KAAKC,oBAAAA,SAAS,OACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,OACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,MACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,MACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,OACZ,OAAO;GACT,KAAKA,oBAAAA,SAAS,OACZ,OAAO;GACT,SACE,OAAO;EACX;CACF;CAEA,sBAA8B,MAA+B;EAC3D,MAAM,OAAO,OAAO,KAAK,IAAI;EAC7B,MAAM,WAAoC,CAAC;EAE3C,KAAK,MAAM,OAAO,MAChB,IAAI,KAAK,wBAAwB,SAAS,GAAG,GAAG;GAC9C,SAAS,OAAO,KAAK;GACrB,OAAO,KAAK;EACd;EAGF,OAAO;CACT;CAEA,YAAoB,OAAgB;EAClC,IAAI,CAAC,KAAK,SACR;EAGF,IAAI;GACF,KAAK,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;EACxE,QAAQ,CAER;CACF;CAEA,aAAa,EAAE,MAAM,SAAS,UAAU,YAA4C;EAClF,MAAM,WAAW,QAAQ,UAAU,OAAO,CAAC;EAE3C,IAAI;GACF,MAAM,WAAW,KAAK,sBAAsB,QAAQ;GAEpD,MAAM,QAAQ,KAAK,OAAO,MACxB;IACE,GAAG,KAAK;IACR,GAAG;IACH,UAAU,KAAK,YAAY,QAAQ;IACnC,2BAAW,IAAI,KAAK;GACtB,GACA;IACE,GAAG;IACH,SAAS,SAAS,KAAK,GAAG;GAC5B,CACF;GAMA,MAAM,cAAc,KAAK,OAAO,MAAM,KAAK;GAE3C,IAAI,eAAe,OAAO,YAAY,SAAS,YAC7C,YAAY,KAAK,KAAA,IAAY,UAAmB;IAC9C,KAAK,YAAY,KAAK;GACxB,CAAC;EAEL,SAAS,OAAO;GACd,KAAK,YAAY,KAAK;EACxB;EAEA,IAAI,QAAQ,SACV,OAAO,CAAC,MAAM,QAAQ;EAGxB,OAAO,CAAC,QAAQ;CAClB;AACF"}
package/dist/index.d.cts CHANGED
@@ -14,13 +14,29 @@ interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log
14
14
  * List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.
15
15
  */
16
16
  rootLevelMetadataFields?: Array<string>;
17
+ /**
18
+ * Callback to handle errors that occur when creating or writing log entries.
19
+ *
20
+ * Errors are caught by the transport (so logging failures never surface as
21
+ * unhandled rejections or crash the application) and reported here. If `onError`
22
+ * is not provided, errors are silently ignored.
23
+ *
24
+ * If the Google Cloud Logging client was created with a `defaultWriteDeleteCallback`,
25
+ * API-level write failures are reported to that callback instead of rejecting the
26
+ * `write()` promise. `onError` still receives failures that occur before the SDK
27
+ * invokes that callback (for example, project or resource detection failures),
28
+ * so the two are complementary.
29
+ */
30
+ onError?: (error: Error) => void;
17
31
  }
18
32
  declare class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {
19
33
  private rootLevelData;
20
34
  private rootLevelMetadataFields;
35
+ private onError?;
21
36
  constructor(config: GoogleCloudLoggingTransportConfig);
22
37
  private mapLogLevel;
23
38
  private extractLogEntryFields;
39
+ private handleError;
24
40
  shipToLogger({
25
41
  data,
26
42
  hasData,
package/dist/index.d.mts CHANGED
@@ -14,13 +14,29 @@ interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log
14
14
  * List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.
15
15
  */
16
16
  rootLevelMetadataFields?: Array<string>;
17
+ /**
18
+ * Callback to handle errors that occur when creating or writing log entries.
19
+ *
20
+ * Errors are caught by the transport (so logging failures never surface as
21
+ * unhandled rejections or crash the application) and reported here. If `onError`
22
+ * is not provided, errors are silently ignored.
23
+ *
24
+ * If the Google Cloud Logging client was created with a `defaultWriteDeleteCallback`,
25
+ * API-level write failures are reported to that callback instead of rejecting the
26
+ * `write()` promise. `onError` still receives failures that occur before the SDK
27
+ * invokes that callback (for example, project or resource detection failures),
28
+ * so the two are complementary.
29
+ */
30
+ onError?: (error: Error) => void;
17
31
  }
18
32
  declare class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {
19
33
  private rootLevelData;
20
34
  private rootLevelMetadataFields;
35
+ private onError?;
21
36
  constructor(config: GoogleCloudLoggingTransportConfig);
22
37
  private mapLogLevel;
23
38
  private extractLogEntryFields;
39
+ private handleError;
24
40
  shipToLogger({
25
41
  data,
26
42
  hasData,
package/dist/index.mjs CHANGED
@@ -3,10 +3,12 @@ import { BaseTransport, LogLevel } from "@loglayer/transport";
3
3
  var GoogleCloudLoggingTransport = class extends BaseTransport {
4
4
  rootLevelData;
5
5
  rootLevelMetadataFields;
6
+ onError;
6
7
  constructor(config) {
7
8
  super(config);
8
9
  this.rootLevelData = config.rootLevelData || {};
9
10
  this.rootLevelMetadataFields = config.rootLevelMetadataFields ?? [];
11
+ this.onError = config.onError;
10
12
  }
11
13
  mapLogLevel(level) {
12
14
  switch (level) {
@@ -28,19 +30,32 @@ var GoogleCloudLoggingTransport = class extends BaseTransport {
28
30
  }
29
31
  return metadata;
30
32
  }
33
+ handleError(error) {
34
+ if (!this.onError) return;
35
+ try {
36
+ this.onError(error instanceof Error ? error : new Error(String(error)));
37
+ } catch {}
38
+ }
31
39
  shipToLogger({ data, hasData, logLevel, messages }) {
32
40
  const safeData = data && hasData ? data : {};
33
- const metadata = this.extractLogEntryFields(safeData);
34
- const entry = this.logger.entry({
35
- ...this.rootLevelData,
36
- ...metadata,
37
- severity: this.mapLogLevel(logLevel),
38
- timestamp: /* @__PURE__ */ new Date()
39
- }, {
40
- ...safeData,
41
- message: messages.join(" ")
42
- });
43
- this.logger.write(entry);
41
+ try {
42
+ const metadata = this.extractLogEntryFields(safeData);
43
+ const entry = this.logger.entry({
44
+ ...this.rootLevelData,
45
+ ...metadata,
46
+ severity: this.mapLogLevel(logLevel),
47
+ timestamp: /* @__PURE__ */ new Date()
48
+ }, {
49
+ ...safeData,
50
+ message: messages.join(" ")
51
+ });
52
+ const writeResult = this.logger.write(entry);
53
+ if (writeResult && typeof writeResult.then === "function") writeResult.then(void 0, (error) => {
54
+ this.handleError(error);
55
+ });
56
+ } catch (error) {
57
+ this.handleError(error);
58
+ }
44
59
  if (data && hasData) return [data, messages];
45
60
  return [messages];
46
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/GoogleCloudLoggingTransport.ts"],"sourcesContent":["import type { Log, LogSync } from \"@google-cloud/logging\";\nimport type { LogEntry } from \"@google-cloud/logging/build/src/entry.js\";\nimport type { LogLayerTransportConfig, LogLayerTransportParams } from \"@loglayer/transport\";\nimport { BaseTransport, LogLevel, type LogLevelType } from \"@loglayer/transport\";\n\nexport interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log | LogSync> {\n /**\n * The root level data to include for all log entries.\n * \"severity\", \"timestamp\" and \"jsonPayload\" are already populated by the transport.\n * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry\n */\n rootLevelData?: Omit<\n LogEntry,\n \"severity\" | \"timestamp\" | \"receiveTimestamp\" | \"jsonPayload\" | \"textPayload\" | \"protoPayload\"\n >;\n\n /**\n * List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.\n */\n rootLevelMetadataFields?: Array<string>;\n}\n\nexport class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {\n private rootLevelData: GoogleCloudLoggingTransportConfig[\"rootLevelData\"];\n private rootLevelMetadataFields: Array<string>;\n\n constructor(config: GoogleCloudLoggingTransportConfig) {\n super(config);\n this.rootLevelData = config.rootLevelData || {};\n this.rootLevelMetadataFields = config.rootLevelMetadataFields ?? [];\n }\n\n private mapLogLevel(level: LogLevelType): string {\n switch (level) {\n case LogLevel.fatal:\n return \"CRITICAL\";\n case LogLevel.error:\n return \"ERROR\";\n case LogLevel.warn:\n return \"WARNING\";\n case LogLevel.info:\n return \"INFO\";\n case LogLevel.debug:\n return \"DEBUG\";\n case LogLevel.trace:\n return \"DEBUG\";\n default:\n return \"DEFAULT\";\n }\n }\n\n private extractLogEntryFields(data: Record<string, unknown>) {\n const keys = Object.keys(data);\n const metadata: Record<string, unknown> = {};\n\n for (const key of keys) {\n if (this.rootLevelMetadataFields.includes(key)) {\n metadata[key] = data[key];\n delete data[key];\n }\n }\n\n return metadata;\n }\n\n shipToLogger({ data, hasData, logLevel, messages }: LogLayerTransportParams): any[] {\n const safeData = data && hasData ? data : {};\n const metadata = this.extractLogEntryFields(safeData);\n\n const entry = this.logger.entry(\n {\n ...this.rootLevelData,\n ...metadata,\n severity: this.mapLogLevel(logLevel),\n timestamp: new Date(),\n },\n {\n ...safeData,\n message: messages.join(\" \"),\n },\n );\n\n this.logger.write(entry);\n\n if (data && hasData) {\n return [data, messages];\n }\n\n return [messages];\n }\n}\n"],"mappings":";;AAsBA,IAAa,8BAAb,cAAiD,cAA6B;CAC5E;CACA;CAEA,YAAY,QAA2C;EACrD,MAAM,MAAM;EACZ,KAAK,gBAAgB,OAAO,iBAAiB,CAAC;EAC9C,KAAK,0BAA0B,OAAO,2BAA2B,CAAC;CACpE;CAEA,YAAoB,OAA6B;EAC/C,QAAQ,OAAR;GACE,KAAK,SAAS,OACZ,OAAO;GACT,KAAK,SAAS,OACZ,OAAO;GACT,KAAK,SAAS,MACZ,OAAO;GACT,KAAK,SAAS,MACZ,OAAO;GACT,KAAK,SAAS,OACZ,OAAO;GACT,KAAK,SAAS,OACZ,OAAO;GACT,SACE,OAAO;EACX;CACF;CAEA,sBAA8B,MAA+B;EAC3D,MAAM,OAAO,OAAO,KAAK,IAAI;EAC7B,MAAM,WAAoC,CAAC;EAE3C,KAAK,MAAM,OAAO,MAChB,IAAI,KAAK,wBAAwB,SAAS,GAAG,GAAG;GAC9C,SAAS,OAAO,KAAK;GACrB,OAAO,KAAK;EACd;EAGF,OAAO;CACT;CAEA,aAAa,EAAE,MAAM,SAAS,UAAU,YAA4C;EAClF,MAAM,WAAW,QAAQ,UAAU,OAAO,CAAC;EAC3C,MAAM,WAAW,KAAK,sBAAsB,QAAQ;EAEpD,MAAM,QAAQ,KAAK,OAAO,MACxB;GACE,GAAG,KAAK;GACR,GAAG;GACH,UAAU,KAAK,YAAY,QAAQ;GACnC,2BAAW,IAAI,KAAK;EACtB,GACA;GACE,GAAG;GACH,SAAS,SAAS,KAAK,GAAG;EAC5B,CACF;EAEA,KAAK,OAAO,MAAM,KAAK;EAEvB,IAAI,QAAQ,SACV,OAAO,CAAC,MAAM,QAAQ;EAGxB,OAAO,CAAC,QAAQ;CAClB;AACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/GoogleCloudLoggingTransport.ts"],"sourcesContent":["import type { Log, LogSync } from \"@google-cloud/logging\";\nimport type { LogEntry } from \"@google-cloud/logging/build/src/entry.js\";\nimport type { LogLayerTransportConfig, LogLayerTransportParams } from \"@loglayer/transport\";\nimport { BaseTransport, LogLevel, type LogLevelType } from \"@loglayer/transport\";\n\nexport interface GoogleCloudLoggingTransportConfig extends LogLayerTransportConfig<Log | LogSync> {\n /**\n * The root level data to include for all log entries.\n * \"severity\", \"timestamp\" and \"jsonPayload\" are already populated by the transport.\n * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry\n */\n rootLevelData?: Omit<\n LogEntry,\n \"severity\" | \"timestamp\" | \"receiveTimestamp\" | \"jsonPayload\" | \"textPayload\" | \"protoPayload\"\n >;\n\n /**\n * List of LogLayer metadata fields to merge into `rootLevelData` when creating the log entry.\n */\n rootLevelMetadataFields?: Array<string>;\n\n /**\n * Callback to handle errors that occur when creating or writing log entries.\n *\n * Errors are caught by the transport (so logging failures never surface as\n * unhandled rejections or crash the application) and reported here. If `onError`\n * is not provided, errors are silently ignored.\n *\n * If the Google Cloud Logging client was created with a `defaultWriteDeleteCallback`,\n * API-level write failures are reported to that callback instead of rejecting the\n * `write()` promise. `onError` still receives failures that occur before the SDK\n * invokes that callback (for example, project or resource detection failures),\n * so the two are complementary.\n */\n onError?: (error: Error) => void;\n}\n\nexport class GoogleCloudLoggingTransport extends BaseTransport<Log | LogSync> {\n private rootLevelData: GoogleCloudLoggingTransportConfig[\"rootLevelData\"];\n private rootLevelMetadataFields: Array<string>;\n private onError?: (error: Error) => void;\n\n constructor(config: GoogleCloudLoggingTransportConfig) {\n super(config);\n this.rootLevelData = config.rootLevelData || {};\n this.rootLevelMetadataFields = config.rootLevelMetadataFields ?? [];\n this.onError = config.onError;\n }\n\n private mapLogLevel(level: LogLevelType): string {\n switch (level) {\n case LogLevel.fatal:\n return \"CRITICAL\";\n case LogLevel.error:\n return \"ERROR\";\n case LogLevel.warn:\n return \"WARNING\";\n case LogLevel.info:\n return \"INFO\";\n case LogLevel.debug:\n return \"DEBUG\";\n case LogLevel.trace:\n return \"DEBUG\";\n default:\n return \"DEFAULT\";\n }\n }\n\n private extractLogEntryFields(data: Record<string, unknown>) {\n const keys = Object.keys(data);\n const metadata: Record<string, unknown> = {};\n\n for (const key of keys) {\n if (this.rootLevelMetadataFields.includes(key)) {\n metadata[key] = data[key];\n delete data[key];\n }\n }\n\n return metadata;\n }\n\n private handleError(error: unknown) {\n if (!this.onError) {\n return;\n }\n\n try {\n this.onError(error instanceof Error ? error : new Error(String(error)));\n } catch {\n // A throwing onError callback must never escape the transport\n }\n }\n\n shipToLogger({ data, hasData, logLevel, messages }: LogLayerTransportParams): any[] {\n const safeData = data && hasData ? data : {};\n\n try {\n const metadata = this.extractLogEntryFields(safeData);\n\n const entry = this.logger.entry(\n {\n ...this.rootLevelData,\n ...metadata,\n severity: this.mapLogLevel(logLevel),\n timestamp: new Date(),\n },\n {\n ...safeData,\n message: messages.join(\" \"),\n },\n );\n\n // `Log.write()` returns a Promise that can reject for failures that happen before the\n // SDK's `defaultWriteDeleteCallback` is invoked (eg, project/resource detection).\n // `LogSync.write()` returns void. Handle both shapes so logging failures never surface\n // as unhandled rejections.\n const writeResult = this.logger.write(entry) as PromiseLike<unknown> | undefined;\n\n if (writeResult && typeof writeResult.then === \"function\") {\n writeResult.then(undefined, (error: unknown) => {\n this.handleError(error);\n });\n }\n } catch (error) {\n this.handleError(error);\n }\n\n if (data && hasData) {\n return [data, messages];\n }\n\n return [messages];\n }\n}\n"],"mappings":";;AAqCA,IAAa,8BAAb,cAAiD,cAA6B;CAC5E;CACA;CACA;CAEA,YAAY,QAA2C;EACrD,MAAM,MAAM;EACZ,KAAK,gBAAgB,OAAO,iBAAiB,CAAC;EAC9C,KAAK,0BAA0B,OAAO,2BAA2B,CAAC;EAClE,KAAK,UAAU,OAAO;CACxB;CAEA,YAAoB,OAA6B;EAC/C,QAAQ,OAAR;GACE,KAAK,SAAS,OACZ,OAAO;GACT,KAAK,SAAS,OACZ,OAAO;GACT,KAAK,SAAS,MACZ,OAAO;GACT,KAAK,SAAS,MACZ,OAAO;GACT,KAAK,SAAS,OACZ,OAAO;GACT,KAAK,SAAS,OACZ,OAAO;GACT,SACE,OAAO;EACX;CACF;CAEA,sBAA8B,MAA+B;EAC3D,MAAM,OAAO,OAAO,KAAK,IAAI;EAC7B,MAAM,WAAoC,CAAC;EAE3C,KAAK,MAAM,OAAO,MAChB,IAAI,KAAK,wBAAwB,SAAS,GAAG,GAAG;GAC9C,SAAS,OAAO,KAAK;GACrB,OAAO,KAAK;EACd;EAGF,OAAO;CACT;CAEA,YAAoB,OAAgB;EAClC,IAAI,CAAC,KAAK,SACR;EAGF,IAAI;GACF,KAAK,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;EACxE,QAAQ,CAER;CACF;CAEA,aAAa,EAAE,MAAM,SAAS,UAAU,YAA4C;EAClF,MAAM,WAAW,QAAQ,UAAU,OAAO,CAAC;EAE3C,IAAI;GACF,MAAM,WAAW,KAAK,sBAAsB,QAAQ;GAEpD,MAAM,QAAQ,KAAK,OAAO,MACxB;IACE,GAAG,KAAK;IACR,GAAG;IACH,UAAU,KAAK,YAAY,QAAQ;IACnC,2BAAW,IAAI,KAAK;GACtB,GACA;IACE,GAAG;IACH,SAAS,SAAS,KAAK,GAAG;GAC5B,CACF;GAMA,MAAM,cAAc,KAAK,OAAO,MAAM,KAAK;GAE3C,IAAI,eAAe,OAAO,YAAY,SAAS,YAC7C,YAAY,KAAK,KAAA,IAAY,UAAmB;IAC9C,KAAK,YAAY,KAAK;GACxB,CAAC;EAEL,SAAS,OAAO;GACd,KAAK,YAAY,KAAK;EACxB;EAEA,IAAI,QAAQ,SACV,OAAO,CAAC,MAAM,QAAQ;EAGxB,OAAO,CAAC,QAAQ;CAClB;AACF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@loglayer/transport-google-cloud-logging",
3
3
  "description": "Google Cloud Logging (Stackdriver) transport for the LogLayer logging library.",
4
- "version": "3.2.0",
4
+ "version": "3.4.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
7
7
  "module": "./dist/index.mjs",
@@ -38,7 +38,7 @@
38
38
  "transport"
39
39
  ],
40
40
  "dependencies": {
41
- "@loglayer/transport": "3.2.0"
41
+ "@loglayer/transport": "3.3.0"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/node": "25.9.1",
@@ -47,8 +47,8 @@
47
47
  "tsx": "4.22.3",
48
48
  "typescript": "6.0.3",
49
49
  "vitest": "4.1.7",
50
- "@internal/tsconfig": "2.1.0",
51
- "loglayer": "9.3.0"
50
+ "loglayer": "9.4.0",
51
+ "@internal/tsconfig": "2.1.0"
52
52
  },
53
53
  "peerDependencies": {
54
54
  "@google-cloud/logging": "*"