@logtape/windows-eventlog 1.1.0-dev.321 → 1.1.0-dev.323

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/ffi.bun.cjs CHANGED
@@ -2,7 +2,7 @@ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
2
  const __logtape_logtape = require_rolldown_runtime.__toESM(require("@logtape/logtape"));
3
3
  const bun_ffi = require_rolldown_runtime.__toESM(require("bun:ffi"));
4
4
 
5
- //#region ffi.bun.ts
5
+ //#region src/ffi.bun.ts
6
6
  /**
7
7
  * Bun FFI implementation for Windows Event Log API
8
8
  */
package/dist/ffi.bun.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { getLogger } from "@logtape/logtape";
2
2
  import { FFIType, dlopen, ptr } from "bun:ffi";
3
3
 
4
- //#region ffi.bun.ts
4
+ //#region src/ffi.bun.ts
5
5
  /**
6
6
  * Bun FFI implementation for Windows Event Log API
7
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ffi.bun.js","names":["sourceName: string","eventType: EventType","eventId: number","message: string"],"sources":["../ffi.bun.ts"],"sourcesContent":["import { getLogger } from \"@logtape/logtape\";\n// @ts-types=\"npm:@types/bun@^1.2.16\"\nimport { dlopen, FFIType, ptr } from \"bun:ffi\";\nimport type { EventType } from \"./types.ts\";\n\n/**\n * Bun FFI implementation for Windows Event Log API\n */\nexport class WindowsEventLogFFI {\n private eventSource: number | null = null;\n // deno-lint-ignore no-explicit-any\n private lib: any = null;\n private sourceName: string;\n private initialized = false;\n private metaLogger = getLogger([\"logtape\", \"meta\", \"windows-eventlog\"]);\n\n constructor(sourceName: string) {\n this.sourceName = sourceName;\n }\n\n /**\n * Initialize the FFI bindings and register event source\n */\n initialize(): void {\n if (this.initialized) return;\n\n try {\n // Load advapi32.dll using Bun FFI\n this.lib = dlopen(\"advapi32.dll\", {\n RegisterEventSourceA: {\n args: [FFIType.ptr, FFIType.cstring],\n returns: FFIType.ptr,\n },\n ReportEventA: {\n args: [\n FFIType.ptr, // hEventLog\n FFIType.u16, // wType\n FFIType.u16, // wCategory\n FFIType.u32, // dwEventID\n FFIType.ptr, // lpUserSid\n FFIType.u16, // wNumStrings\n FFIType.u32, // dwDataSize\n FFIType.ptr, // lpStrings - pointer to array of string pointers\n FFIType.ptr, // lpRawData\n ],\n returns: FFIType.bool,\n },\n DeregisterEventSource: {\n args: [FFIType.ptr],\n returns: FFIType.bool,\n },\n });\n\n // Register event source using cstring\n // Create a buffer for the source name\n const encoder = new TextEncoder();\n const sourceNameBuffer = encoder.encode(this.sourceName + \"\\0\");\n\n const result = this.lib.symbols.RegisterEventSourceA(\n null,\n sourceNameBuffer,\n );\n this.eventSource = typeof result === \"number\" ? result : null;\n\n if (!this.eventSource || this.eventSource === 0) {\n throw new Error(\n `Failed to register event source: ${this.sourceName}`,\n );\n }\n\n this.initialized = true;\n } catch (error) {\n throw new Error(\n `Failed to initialize Windows Event Log FFI: ${error}`,\n );\n }\n }\n\n /**\n * Write an event to Windows Event Log\n */\n writeEvent(eventType: EventType, eventId: number, message: string): void {\n if (!this.initialized || !this.eventSource || !this.lib) {\n return;\n }\n\n try {\n // Use string array approach which works with Bun FFI\n const encoder = new TextEncoder();\n const messageBuffer = encoder.encode(message + \"\\0\");\n\n // Create pointer array for strings\n const ptrArray = new BigUint64Array(2);\n ptrArray[0] = BigInt(ptr(messageBuffer));\n ptrArray[1] = 0n; // null terminator\n\n const success = this.lib.symbols.ReportEventA(\n this.eventSource,\n eventType,\n 0, // category\n eventId,\n null, // user SID (null)\n 1, // number of strings\n 0, // data size\n ptrArray, // pointer to array of string pointers\n null, // raw data (null)\n );\n\n if (!success) {\n throw new Error(`ReportEventA returned false`);\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n if (this.initialized && this.eventSource && this.lib) {\n try {\n this.lib.symbols.DeregisterEventSource(this.eventSource);\n } catch (error) {\n this.metaLogger.error(\n \"Failed to deregister event source during cleanup: {error}\",\n { error },\n );\n }\n this.eventSource = null;\n this.initialized = false;\n\n try {\n this.lib.close();\n } catch (error) {\n this.metaLogger.error(\n \"Failed to close FFI library during cleanup: {error}\",\n { error },\n );\n }\n this.lib = null;\n }\n }\n}\n\n// cSpell: ignore cstring\n"],"mappings":";;;;;;;AAQA,IAAa,qBAAb,MAAgC;CAC9B,AAAQ,cAA6B;CAErC,AAAQ,MAAW;CACnB,AAAQ;CACR,AAAQ,cAAc;CACtB,AAAQ,aAAa,UAAU;EAAC;EAAW;EAAQ;CAAmB,EAAC;CAEvE,YAAYA,YAAoB;AAC9B,OAAK,aAAa;CACnB;;;;CAKD,aAAmB;AACjB,MAAI,KAAK,YAAa;AAEtB,MAAI;AAEF,QAAK,MAAM,OAAO,gBAAgB;IAChC,sBAAsB;KACpB,MAAM,CAAC,QAAQ,KAAK,QAAQ,OAAQ;KACpC,SAAS,QAAQ;IAClB;IACD,cAAc;KACZ,MAAM;MACJ,QAAQ;MACR,QAAQ;MACR,QAAQ;MACR,QAAQ;MACR,QAAQ;MACR,QAAQ;MACR,QAAQ;MACR,QAAQ;MACR,QAAQ;KACT;KACD,SAAS,QAAQ;IAClB;IACD,uBAAuB;KACrB,MAAM,CAAC,QAAQ,GAAI;KACnB,SAAS,QAAQ;IAClB;GACF,EAAC;GAIF,MAAM,UAAU,IAAI;GACpB,MAAM,mBAAmB,QAAQ,OAAO,KAAK,aAAa,KAAK;GAE/D,MAAM,SAAS,KAAK,IAAI,QAAQ,qBAC9B,MACA,iBACD;AACD,QAAK,qBAAqB,WAAW,WAAW,SAAS;AAEzD,QAAK,KAAK,eAAe,KAAK,gBAAgB,EAC5C,OAAM,IAAI,OACP,mCAAmC,KAAK,WAAW;AAIxD,QAAK,cAAc;EACpB,SAAQ,OAAO;AACd,SAAM,IAAI,OACP,8CAA8C,MAAM;EAExD;CACF;;;;CAKD,WAAWC,WAAsBC,SAAiBC,SAAuB;AACvE,OAAK,KAAK,gBAAgB,KAAK,gBAAgB,KAAK,IAClD;AAGF,MAAI;GAEF,MAAM,UAAU,IAAI;GACpB,MAAM,gBAAgB,QAAQ,OAAO,UAAU,KAAK;GAGpD,MAAM,WAAW,IAAI,eAAe;AACpC,YAAS,KAAK,OAAO,IAAI,cAAc,CAAC;AACxC,YAAS,KAAK;GAEd,MAAM,UAAU,KAAK,IAAI,QAAQ,aAC/B,KAAK,aACL,WACA,GACA,SACA,MACA,GACA,GACA,UACA,KACD;AAED,QAAK,QACH,OAAM,IAAI,OAAO;EAEpB,SAAQ,OAAO;AACd,SAAM;EACP;CACF;;;;CAKD,UAAgB;AACd,MAAI,KAAK,eAAe,KAAK,eAAe,KAAK,KAAK;AACpD,OAAI;AACF,SAAK,IAAI,QAAQ,sBAAsB,KAAK,YAAY;GACzD,SAAQ,OAAO;AACd,SAAK,WAAW,MACd,6DACA,EAAE,MAAO,EACV;GACF;AACD,QAAK,cAAc;AACnB,QAAK,cAAc;AAEnB,OAAI;AACF,SAAK,IAAI,OAAO;GACjB,SAAQ,OAAO;AACd,SAAK,WAAW,MACd,uDACA,EAAE,MAAO,EACV;GACF;AACD,QAAK,MAAM;EACZ;CACF;AACF"}
1
+ {"version":3,"file":"ffi.bun.js","names":["sourceName: string","eventType: EventType","eventId: number","message: string"],"sources":["../src/ffi.bun.ts"],"sourcesContent":["import { getLogger } from \"@logtape/logtape\";\n// @ts-types=\"npm:@types/bun@^1.2.16\"\nimport { dlopen, FFIType, ptr } from \"bun:ffi\";\nimport type { EventType } from \"./types.ts\";\n\n/**\n * Bun FFI implementation for Windows Event Log API\n */\nexport class WindowsEventLogFFI {\n private eventSource: number | null = null;\n // deno-lint-ignore no-explicit-any\n private lib: any = null;\n private sourceName: string;\n private initialized = false;\n private metaLogger = getLogger([\"logtape\", \"meta\", \"windows-eventlog\"]);\n\n constructor(sourceName: string) {\n this.sourceName = sourceName;\n }\n\n /**\n * Initialize the FFI bindings and register event source\n */\n initialize(): void {\n if (this.initialized) return;\n\n try {\n // Load advapi32.dll using Bun FFI\n this.lib = dlopen(\"advapi32.dll\", {\n RegisterEventSourceA: {\n args: [FFIType.ptr, FFIType.cstring],\n returns: FFIType.ptr,\n },\n ReportEventA: {\n args: [\n FFIType.ptr, // hEventLog\n FFIType.u16, // wType\n FFIType.u16, // wCategory\n FFIType.u32, // dwEventID\n FFIType.ptr, // lpUserSid\n FFIType.u16, // wNumStrings\n FFIType.u32, // dwDataSize\n FFIType.ptr, // lpStrings - pointer to array of string pointers\n FFIType.ptr, // lpRawData\n ],\n returns: FFIType.bool,\n },\n DeregisterEventSource: {\n args: [FFIType.ptr],\n returns: FFIType.bool,\n },\n });\n\n // Register event source using cstring\n // Create a buffer for the source name\n const encoder = new TextEncoder();\n const sourceNameBuffer = encoder.encode(this.sourceName + \"\\0\");\n\n const result = this.lib.symbols.RegisterEventSourceA(\n null,\n sourceNameBuffer,\n );\n this.eventSource = typeof result === \"number\" ? result : null;\n\n if (!this.eventSource || this.eventSource === 0) {\n throw new Error(\n `Failed to register event source: ${this.sourceName}`,\n );\n }\n\n this.initialized = true;\n } catch (error) {\n throw new Error(\n `Failed to initialize Windows Event Log FFI: ${error}`,\n );\n }\n }\n\n /**\n * Write an event to Windows Event Log\n */\n writeEvent(eventType: EventType, eventId: number, message: string): void {\n if (!this.initialized || !this.eventSource || !this.lib) {\n return;\n }\n\n try {\n // Use string array approach which works with Bun FFI\n const encoder = new TextEncoder();\n const messageBuffer = encoder.encode(message + \"\\0\");\n\n // Create pointer array for strings\n const ptrArray = new BigUint64Array(2);\n ptrArray[0] = BigInt(ptr(messageBuffer));\n ptrArray[1] = 0n; // null terminator\n\n const success = this.lib.symbols.ReportEventA(\n this.eventSource,\n eventType,\n 0, // category\n eventId,\n null, // user SID (null)\n 1, // number of strings\n 0, // data size\n ptrArray, // pointer to array of string pointers\n null, // raw data (null)\n );\n\n if (!success) {\n throw new Error(`ReportEventA returned false`);\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n if (this.initialized && this.eventSource && this.lib) {\n try {\n this.lib.symbols.DeregisterEventSource(this.eventSource);\n } catch (error) {\n this.metaLogger.error(\n \"Failed to deregister event source during cleanup: {error}\",\n { error },\n );\n }\n this.eventSource = null;\n this.initialized = false;\n\n try {\n this.lib.close();\n } catch (error) {\n this.metaLogger.error(\n \"Failed to close FFI library during cleanup: {error}\",\n { error },\n );\n }\n this.lib = null;\n }\n }\n}\n\n// cSpell: ignore cstring\n"],"mappings":";;;;;;;AAQA,IAAa,qBAAb,MAAgC;CAC9B,AAAQ,cAA6B;CAErC,AAAQ,MAAW;CACnB,AAAQ;CACR,AAAQ,cAAc;CACtB,AAAQ,aAAa,UAAU;EAAC;EAAW;EAAQ;CAAmB,EAAC;CAEvE,YAAYA,YAAoB;AAC9B,OAAK,aAAa;CACnB;;;;CAKD,aAAmB;AACjB,MAAI,KAAK,YAAa;AAEtB,MAAI;AAEF,QAAK,MAAM,OAAO,gBAAgB;IAChC,sBAAsB;KACpB,MAAM,CAAC,QAAQ,KAAK,QAAQ,OAAQ;KACpC,SAAS,QAAQ;IAClB;IACD,cAAc;KACZ,MAAM;MACJ,QAAQ;MACR,QAAQ;MACR,QAAQ;MACR,QAAQ;MACR,QAAQ;MACR,QAAQ;MACR,QAAQ;MACR,QAAQ;MACR,QAAQ;KACT;KACD,SAAS,QAAQ;IAClB;IACD,uBAAuB;KACrB,MAAM,CAAC,QAAQ,GAAI;KACnB,SAAS,QAAQ;IAClB;GACF,EAAC;GAIF,MAAM,UAAU,IAAI;GACpB,MAAM,mBAAmB,QAAQ,OAAO,KAAK,aAAa,KAAK;GAE/D,MAAM,SAAS,KAAK,IAAI,QAAQ,qBAC9B,MACA,iBACD;AACD,QAAK,qBAAqB,WAAW,WAAW,SAAS;AAEzD,QAAK,KAAK,eAAe,KAAK,gBAAgB,EAC5C,OAAM,IAAI,OACP,mCAAmC,KAAK,WAAW;AAIxD,QAAK,cAAc;EACpB,SAAQ,OAAO;AACd,SAAM,IAAI,OACP,8CAA8C,MAAM;EAExD;CACF;;;;CAKD,WAAWC,WAAsBC,SAAiBC,SAAuB;AACvE,OAAK,KAAK,gBAAgB,KAAK,gBAAgB,KAAK,IAClD;AAGF,MAAI;GAEF,MAAM,UAAU,IAAI;GACpB,MAAM,gBAAgB,QAAQ,OAAO,UAAU,KAAK;GAGpD,MAAM,WAAW,IAAI,eAAe;AACpC,YAAS,KAAK,OAAO,IAAI,cAAc,CAAC;AACxC,YAAS,KAAK;GAEd,MAAM,UAAU,KAAK,IAAI,QAAQ,aAC/B,KAAK,aACL,WACA,GACA,SACA,MACA,GACA,GACA,UACA,KACD;AAED,QAAK,QACH,OAAM,IAAI,OAAO;EAEpB,SAAQ,OAAO;AACd,SAAM;EACP;CACF;;;;CAKD,UAAgB;AACd,MAAI,KAAK,eAAe,KAAK,eAAe,KAAK,KAAK;AACpD,OAAI;AACF,SAAK,IAAI,QAAQ,sBAAsB,KAAK,YAAY;GACzD,SAAQ,OAAO;AACd,SAAK,WAAW,MACd,6DACA,EAAE,MAAO,EACV;GACF;AACD,QAAK,cAAc;AACnB,QAAK,cAAc;AAEnB,OAAI;AACF,SAAK,IAAI,OAAO;GACjB,SAAQ,OAAO;AACd,SAAK,WAAW,MACd,uDACA,EAAE,MAAO,EACV;GACF;AACD,QAAK,MAAM;EACZ;CACF;AACF"}
package/dist/ffi.deno.cjs CHANGED
@@ -2,7 +2,7 @@ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
2
  const require_types = require('./types.cjs');
3
3
  const __logtape_logtape = require_rolldown_runtime.__toESM(require("@logtape/logtape"));
4
4
 
5
- //#region ffi.deno.ts
5
+ //#region src/ffi.deno.ts
6
6
  const EVENTLOG_ERROR_TYPE = 1;
7
7
  const EVENTLOG_WARNING_TYPE = 2;
8
8
  const EVENTLOG_INFORMATION_TYPE = 4;
package/dist/ffi.deno.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { WindowsEventLogError } from "./types.js";
2
2
  import { getLogger } from "@logtape/logtape";
3
3
 
4
- //#region ffi.deno.ts
4
+ //#region src/ffi.deno.ts
5
5
  const EVENTLOG_ERROR_TYPE = 1;
6
6
  const EVENTLOG_WARNING_TYPE = 2;
7
7
  const EVENTLOG_INFORMATION_TYPE = 4;
@@ -1 +1 @@
1
- {"version":3,"file":"ffi.deno.js","names":["sourceName: string","eventType: number","eventId: number","message: string"],"sources":["../ffi.deno.ts"],"sourcesContent":["import { getLogger } from \"@logtape/logtape\";\nimport { WindowsEventLogError } from \"./types.ts\";\n\n/**\n * Windows Event Log API constants and types for FFI.\n * @since 1.0.0\n */\n\n// Event Log types\nexport const EVENTLOG_SUCCESS = 0x0000;\nexport const EVENTLOG_ERROR_TYPE = 0x0001;\nexport const EVENTLOG_WARNING_TYPE = 0x0002;\nexport const EVENTLOG_INFORMATION_TYPE = 0x0004;\n\n// FFI symbol definitions for Windows Event Log APIs\nconst FFI_SYMBOLS = {\n RegisterEventSourceA: {\n parameters: [\"pointer\", \"pointer\"] as const,\n result: \"pointer\" as const,\n },\n DeregisterEventSource: {\n parameters: [\"pointer\"] as const,\n result: \"u32\" as const,\n },\n ReportEventA: {\n parameters: [\n \"pointer\", // hEventLog\n \"u16\", // wType\n \"u16\", // wCategory\n \"u32\", // dwEventID\n \"pointer\", // lpUserSid\n \"u16\", // wNumStrings\n \"u32\", // dwDataSize\n \"pointer\", // lpStrings\n \"pointer\", // lpRawData\n ] as const,\n result: \"u32\" as const,\n },\n} as const;\n\n/**\n * Windows Event Log FFI wrapper class for Deno.\n * Provides direct access to Windows Event Log APIs through Deno's FFI.\n *\n * @since 1.0.0\n */\nexport class WindowsEventLogFFI {\n private lib: Deno.DynamicLibrary<typeof FFI_SYMBOLS> | null = null;\n private eventSource: Deno.PointerValue | null = null;\n private encoder = new TextEncoder();\n private metaLogger = getLogger([\"logtape\", \"meta\", \"windows-eventlog\"]);\n\n constructor(private sourceName: string) {}\n\n /**\n * Initializes the FFI library and registers the event source.\n * @throws {WindowsEventLogError} If initialization fails\n */\n initialize(): void {\n try {\n // Load advapi32.dll\n this.lib = Deno.dlopen(\"advapi32.dll\", FFI_SYMBOLS);\n\n // Register event source\n const sourceNamePtr = Deno.UnsafePointer.of(\n this.encoder.encode(this.sourceName + \"\\0\"),\n );\n this.eventSource = this.lib.symbols.RegisterEventSourceA(\n null,\n sourceNamePtr,\n );\n\n if (!this.eventSource) {\n throw new WindowsEventLogError(\n `Failed to register event source '${this.sourceName}'.`,\n );\n }\n } catch (error) {\n if (error instanceof WindowsEventLogError) {\n throw error;\n }\n throw new WindowsEventLogError(\n `Failed to initialize Windows Event Log FFI: ${\n error instanceof Error ? error.message : String(error)\n }`,\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Writes a message to the Windows Event Log.\n *\n * @param eventType Event type (error, warning, info)\n * @param eventId Event ID number\n * @param message Message string to log\n * @throws {WindowsEventLogError} If the write operation fails\n */\n writeEvent(eventType: number, eventId: number, message: string): void {\n if (!this.lib || !this.eventSource) {\n throw new WindowsEventLogError(\n \"FFI not initialized. Call initialize() first.\",\n );\n }\n\n try {\n // Prepare message string\n const messageBuffer = this.encoder.encode(message + \"\\0\");\n const messagePtr = Deno.UnsafePointer.of(messageBuffer);\n const messagePtrValue = messagePtr\n ? Deno.UnsafePointer.value(messagePtr)\n : 0n;\n const stringsArray = new BigUint64Array([messagePtrValue]);\n const stringsPtr = Deno.UnsafePointer.of(stringsArray);\n\n // Call ReportEventA\n const result = this.lib.symbols.ReportEventA(\n this.eventSource, // hEventLog\n eventType, // wType\n 0, // wCategory (0 = no category)\n eventId, // dwEventID\n null, // lpUserSid (null = current user)\n 1, // wNumStrings (1 string)\n 0, // dwDataSize (no additional data)\n stringsPtr, // lpStrings\n null, // lpRawData (no additional data)\n );\n\n if (result === 0) {\n throw new WindowsEventLogError(\n `Failed to write event to Event Log.`,\n );\n }\n } catch (error) {\n if (error instanceof WindowsEventLogError) {\n throw error;\n }\n throw new WindowsEventLogError(\n `Error writing to Event Log: ${\n error instanceof Error ? error.message : String(error)\n }`,\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Cleans up resources and deregisters the event source.\n */\n dispose(): void {\n if (this.lib && this.eventSource) {\n try {\n this.lib.symbols.DeregisterEventSource(this.eventSource);\n } catch (error) {\n this.metaLogger.error(\n \"Failed to deregister event source during cleanup: {error}\",\n { error },\n );\n }\n this.eventSource = null;\n }\n\n if (this.lib) {\n try {\n this.lib.close();\n } catch (error) {\n this.metaLogger.error(\n \"Failed to close FFI library during cleanup: {error}\",\n { error },\n );\n }\n this.lib = null;\n }\n }\n}\n"],"mappings":";;;;AAUA,MAAa,sBAAsB;AACnC,MAAa,wBAAwB;AACrC,MAAa,4BAA4B;AAGzC,MAAM,cAAc;CAClB,sBAAsB;EACpB,YAAY,CAAC,WAAW,SAAU;EAClC,QAAQ;CACT;CACD,uBAAuB;EACrB,YAAY,CAAC,SAAU;EACvB,QAAQ;CACT;CACD,cAAc;EACZ,YAAY;GACV;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACD;EACD,QAAQ;CACT;AACF;;;;;;;AAQD,IAAa,qBAAb,MAAgC;CAC9B,AAAQ,MAAsD;CAC9D,AAAQ,cAAwC;CAChD,AAAQ,UAAU,IAAI;CACtB,AAAQ,aAAa,UAAU;EAAC;EAAW;EAAQ;CAAmB,EAAC;CAEvE,YAAoBA,YAAoB;EAApB;CAAsB;;;;;CAM1C,aAAmB;AACjB,MAAI;AAEF,QAAK,MAAM,KAAK,OAAO,gBAAgB,YAAY;GAGnD,MAAM,gBAAgB,KAAK,cAAc,GACvC,KAAK,QAAQ,OAAO,KAAK,aAAa,KAAK,CAC5C;AACD,QAAK,cAAc,KAAK,IAAI,QAAQ,qBAClC,MACA,cACD;AAED,QAAK,KAAK,YACR,OAAM,IAAI,sBACP,mCAAmC,KAAK,WAAW;EAGzD,SAAQ,OAAO;AACd,OAAI,iBAAiB,qBACnB,OAAM;AAER,SAAM,IAAI,sBACP,8CACC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CACvD,GACD,iBAAiB,QAAQ;EAE5B;CACF;;;;;;;;;CAUD,WAAWC,WAAmBC,SAAiBC,SAAuB;AACpE,OAAK,KAAK,QAAQ,KAAK,YACrB,OAAM,IAAI,qBACR;AAIJ,MAAI;GAEF,MAAM,gBAAgB,KAAK,QAAQ,OAAO,UAAU,KAAK;GACzD,MAAM,aAAa,KAAK,cAAc,GAAG,cAAc;GACvD,MAAM,kBAAkB,aACpB,KAAK,cAAc,MAAM,WAAW,GACpC;GACJ,MAAM,eAAe,IAAI,eAAe,CAAC,eAAgB;GACzD,MAAM,aAAa,KAAK,cAAc,GAAG,aAAa;GAGtD,MAAM,SAAS,KAAK,IAAI,QAAQ,aAC9B,KAAK,aACL,WACA,GACA,SACA,MACA,GACA,GACA,YACA,KACD;AAED,OAAI,WAAW,EACb,OAAM,IAAI,sBACP;EAGN,SAAQ,OAAO;AACd,OAAI,iBAAiB,qBACnB,OAAM;AAER,SAAM,IAAI,sBACP,8BACC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CACvD,GACD,iBAAiB,QAAQ;EAE5B;CACF;;;;CAKD,UAAgB;AACd,MAAI,KAAK,OAAO,KAAK,aAAa;AAChC,OAAI;AACF,SAAK,IAAI,QAAQ,sBAAsB,KAAK,YAAY;GACzD,SAAQ,OAAO;AACd,SAAK,WAAW,MACd,6DACA,EAAE,MAAO,EACV;GACF;AACD,QAAK,cAAc;EACpB;AAED,MAAI,KAAK,KAAK;AACZ,OAAI;AACF,SAAK,IAAI,OAAO;GACjB,SAAQ,OAAO;AACd,SAAK,WAAW,MACd,uDACA,EAAE,MAAO,EACV;GACF;AACD,QAAK,MAAM;EACZ;CACF;AACF"}
1
+ {"version":3,"file":"ffi.deno.js","names":["sourceName: string","eventType: number","eventId: number","message: string"],"sources":["../src/ffi.deno.ts"],"sourcesContent":["import { getLogger } from \"@logtape/logtape\";\nimport { WindowsEventLogError } from \"./types.ts\";\n\n/**\n * Windows Event Log API constants and types for FFI.\n * @since 1.0.0\n */\n\n// Event Log types\nexport const EVENTLOG_SUCCESS = 0x0000;\nexport const EVENTLOG_ERROR_TYPE = 0x0001;\nexport const EVENTLOG_WARNING_TYPE = 0x0002;\nexport const EVENTLOG_INFORMATION_TYPE = 0x0004;\n\n// FFI symbol definitions for Windows Event Log APIs\nconst FFI_SYMBOLS = {\n RegisterEventSourceA: {\n parameters: [\"pointer\", \"pointer\"] as const,\n result: \"pointer\" as const,\n },\n DeregisterEventSource: {\n parameters: [\"pointer\"] as const,\n result: \"u32\" as const,\n },\n ReportEventA: {\n parameters: [\n \"pointer\", // hEventLog\n \"u16\", // wType\n \"u16\", // wCategory\n \"u32\", // dwEventID\n \"pointer\", // lpUserSid\n \"u16\", // wNumStrings\n \"u32\", // dwDataSize\n \"pointer\", // lpStrings\n \"pointer\", // lpRawData\n ] as const,\n result: \"u32\" as const,\n },\n} as const;\n\n/**\n * Windows Event Log FFI wrapper class for Deno.\n * Provides direct access to Windows Event Log APIs through Deno's FFI.\n *\n * @since 1.0.0\n */\nexport class WindowsEventLogFFI {\n private lib: Deno.DynamicLibrary<typeof FFI_SYMBOLS> | null = null;\n private eventSource: Deno.PointerValue | null = null;\n private encoder = new TextEncoder();\n private metaLogger = getLogger([\"logtape\", \"meta\", \"windows-eventlog\"]);\n\n constructor(private sourceName: string) {}\n\n /**\n * Initializes the FFI library and registers the event source.\n * @throws {WindowsEventLogError} If initialization fails\n */\n initialize(): void {\n try {\n // Load advapi32.dll\n this.lib = Deno.dlopen(\"advapi32.dll\", FFI_SYMBOLS);\n\n // Register event source\n const sourceNamePtr = Deno.UnsafePointer.of(\n this.encoder.encode(this.sourceName + \"\\0\"),\n );\n this.eventSource = this.lib.symbols.RegisterEventSourceA(\n null,\n sourceNamePtr,\n );\n\n if (!this.eventSource) {\n throw new WindowsEventLogError(\n `Failed to register event source '${this.sourceName}'.`,\n );\n }\n } catch (error) {\n if (error instanceof WindowsEventLogError) {\n throw error;\n }\n throw new WindowsEventLogError(\n `Failed to initialize Windows Event Log FFI: ${\n error instanceof Error ? error.message : String(error)\n }`,\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Writes a message to the Windows Event Log.\n *\n * @param eventType Event type (error, warning, info)\n * @param eventId Event ID number\n * @param message Message string to log\n * @throws {WindowsEventLogError} If the write operation fails\n */\n writeEvent(eventType: number, eventId: number, message: string): void {\n if (!this.lib || !this.eventSource) {\n throw new WindowsEventLogError(\n \"FFI not initialized. Call initialize() first.\",\n );\n }\n\n try {\n // Prepare message string\n const messageBuffer = this.encoder.encode(message + \"\\0\");\n const messagePtr = Deno.UnsafePointer.of(messageBuffer);\n const messagePtrValue = messagePtr\n ? Deno.UnsafePointer.value(messagePtr)\n : 0n;\n const stringsArray = new BigUint64Array([messagePtrValue]);\n const stringsPtr = Deno.UnsafePointer.of(stringsArray);\n\n // Call ReportEventA\n const result = this.lib.symbols.ReportEventA(\n this.eventSource, // hEventLog\n eventType, // wType\n 0, // wCategory (0 = no category)\n eventId, // dwEventID\n null, // lpUserSid (null = current user)\n 1, // wNumStrings (1 string)\n 0, // dwDataSize (no additional data)\n stringsPtr, // lpStrings\n null, // lpRawData (no additional data)\n );\n\n if (result === 0) {\n throw new WindowsEventLogError(\n `Failed to write event to Event Log.`,\n );\n }\n } catch (error) {\n if (error instanceof WindowsEventLogError) {\n throw error;\n }\n throw new WindowsEventLogError(\n `Error writing to Event Log: ${\n error instanceof Error ? error.message : String(error)\n }`,\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n /**\n * Cleans up resources and deregisters the event source.\n */\n dispose(): void {\n if (this.lib && this.eventSource) {\n try {\n this.lib.symbols.DeregisterEventSource(this.eventSource);\n } catch (error) {\n this.metaLogger.error(\n \"Failed to deregister event source during cleanup: {error}\",\n { error },\n );\n }\n this.eventSource = null;\n }\n\n if (this.lib) {\n try {\n this.lib.close();\n } catch (error) {\n this.metaLogger.error(\n \"Failed to close FFI library during cleanup: {error}\",\n { error },\n );\n }\n this.lib = null;\n }\n }\n}\n"],"mappings":";;;;AAUA,MAAa,sBAAsB;AACnC,MAAa,wBAAwB;AACrC,MAAa,4BAA4B;AAGzC,MAAM,cAAc;CAClB,sBAAsB;EACpB,YAAY,CAAC,WAAW,SAAU;EAClC,QAAQ;CACT;CACD,uBAAuB;EACrB,YAAY,CAAC,SAAU;EACvB,QAAQ;CACT;CACD,cAAc;EACZ,YAAY;GACV;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACD;EACD,QAAQ;CACT;AACF;;;;;;;AAQD,IAAa,qBAAb,MAAgC;CAC9B,AAAQ,MAAsD;CAC9D,AAAQ,cAAwC;CAChD,AAAQ,UAAU,IAAI;CACtB,AAAQ,aAAa,UAAU;EAAC;EAAW;EAAQ;CAAmB,EAAC;CAEvE,YAAoBA,YAAoB;EAApB;CAAsB;;;;;CAM1C,aAAmB;AACjB,MAAI;AAEF,QAAK,MAAM,KAAK,OAAO,gBAAgB,YAAY;GAGnD,MAAM,gBAAgB,KAAK,cAAc,GACvC,KAAK,QAAQ,OAAO,KAAK,aAAa,KAAK,CAC5C;AACD,QAAK,cAAc,KAAK,IAAI,QAAQ,qBAClC,MACA,cACD;AAED,QAAK,KAAK,YACR,OAAM,IAAI,sBACP,mCAAmC,KAAK,WAAW;EAGzD,SAAQ,OAAO;AACd,OAAI,iBAAiB,qBACnB,OAAM;AAER,SAAM,IAAI,sBACP,8CACC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CACvD,GACD,iBAAiB,QAAQ;EAE5B;CACF;;;;;;;;;CAUD,WAAWC,WAAmBC,SAAiBC,SAAuB;AACpE,OAAK,KAAK,QAAQ,KAAK,YACrB,OAAM,IAAI,qBACR;AAIJ,MAAI;GAEF,MAAM,gBAAgB,KAAK,QAAQ,OAAO,UAAU,KAAK;GACzD,MAAM,aAAa,KAAK,cAAc,GAAG,cAAc;GACvD,MAAM,kBAAkB,aACpB,KAAK,cAAc,MAAM,WAAW,GACpC;GACJ,MAAM,eAAe,IAAI,eAAe,CAAC,eAAgB;GACzD,MAAM,aAAa,KAAK,cAAc,GAAG,aAAa;GAGtD,MAAM,SAAS,KAAK,IAAI,QAAQ,aAC9B,KAAK,aACL,WACA,GACA,SACA,MACA,GACA,GACA,YACA,KACD;AAED,OAAI,WAAW,EACb,OAAM,IAAI,sBACP;EAGN,SAAQ,OAAO;AACd,OAAI,iBAAiB,qBACnB,OAAM;AAER,SAAM,IAAI,sBACP,8BACC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CACvD,GACD,iBAAiB,QAAQ;EAE5B;CACF;;;;CAKD,UAAgB;AACd,MAAI,KAAK,OAAO,KAAK,aAAa;AAChC,OAAI;AACF,SAAK,IAAI,QAAQ,sBAAsB,KAAK,YAAY;GACzD,SAAQ,OAAO;AACd,SAAK,WAAW,MACd,6DACA,EAAE,MAAO,EACV;GACF;AACD,QAAK,cAAc;EACpB;AAED,MAAI,KAAK,KAAK;AACZ,OAAI;AACF,SAAK,IAAI,OAAO;GACjB,SAAQ,OAAO;AACd,SAAK,WAAW,MACd,uDACA,EAAE,MAAO,EACV;GACF;AACD,QAAK,MAAM;EACZ;CACF;AACF"}
package/dist/ffi.node.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
2
  const __logtape_logtape = require_rolldown_runtime.__toESM(require("@logtape/logtape"));
3
3
 
4
- //#region ffi.node.ts
4
+ //#region src/ffi.node.ts
5
5
  /**
6
6
  * Node.js FFI implementation for Windows Event Log API using koffi
7
7
  */
package/dist/ffi.node.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { getLogger } from "@logtape/logtape";
2
2
 
3
- //#region ffi.node.ts
3
+ //#region src/ffi.node.ts
4
4
  /**
5
5
  * Node.js FFI implementation for Windows Event Log API using koffi
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ffi.node.js","names":["sourceName: string","eventType: EventType","eventId: number","message: string"],"sources":["../ffi.node.ts"],"sourcesContent":["import { getLogger } from \"@logtape/logtape\";\nimport type { EventType } from \"./types.ts\";\n\n/**\n * Node.js FFI implementation for Windows Event Log API using koffi\n */\nexport class WindowsEventLogFFI {\n private eventSource: unknown = null;\n private koffi: unknown = null;\n private sourceName: string;\n private initialized = false;\n private lib: unknown = null;\n private metaLogger = getLogger([\"logtape\", \"meta\", \"windows-eventlog\"]);\n\n constructor(sourceName: string) {\n this.sourceName = sourceName;\n }\n\n /**\n * Initialize the FFI bindings and register event source\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Dynamic import for koffi\n const koffiModule = await import(\"koffi\");\n this.koffi = koffiModule.default || koffiModule;\n\n // Load advapi32.dll\n this.lib = (this.koffi as unknown as { load: (lib: string) => unknown })\n .load(\"advapi32.dll\");\n\n // Define Windows API functions with correct koffi types using __stdcall convention\n const RegisterEventSourceA =\n (this.lib as unknown as { func: (sig: string) => unknown }).func(\n \"uintptr __stdcall RegisterEventSourceA(uintptr lpUNCServerName, str lpSourceName)\",\n );\n // ReportEventA expects LPCSTR* (array of string pointers) for lpStrings\n // Use char** for null-terminated array of strings\n const ReportEventA =\n (this.lib as unknown as { func: (sig: string) => unknown }).func(\n \"bool __stdcall ReportEventA(uintptr hEventLog, uint16 wType, uint16 wCategory, uint32 dwEventID, uintptr lpUserSid, uint16 wNumStrings, uint32 dwDataSize, char** lpStrings, uint8* lpRawData)\",\n );\n const DeregisterEventSource =\n (this.lib as unknown as { func: (sig: string) => unknown }).func(\n \"bool __stdcall DeregisterEventSource(uintptr hEventLog)\",\n );\n\n // Store functions\n this.RegisterEventSourceA = RegisterEventSourceA;\n this.ReportEventA = ReportEventA;\n this.DeregisterEventSource = DeregisterEventSource;\n\n // Register event source\n this.eventSource = (this.RegisterEventSourceA as unknown as (\n ...args: unknown[]\n ) => unknown)(0, this.sourceName);\n\n if (!this.eventSource || this.eventSource === 0) {\n throw new Error(\n `Failed to register event source: ${this.sourceName}`,\n );\n }\n\n this.initialized = true;\n } catch (error) {\n throw new Error(\n `Failed to initialize Windows Event Log FFI: ${error}`,\n );\n }\n }\n\n private RegisterEventSourceA: unknown = null;\n private ReportEventA: unknown = null;\n private DeregisterEventSource: unknown = null;\n\n /**\n * Write an event to Windows Event Log\n */\n writeEvent(eventType: EventType, eventId: number, message: string): void {\n if (!this.initialized || !this.eventSource || !this.ReportEventA) {\n return;\n }\n\n try {\n // Create null-terminated string\n const messageWithNull = message + \"\\0\";\n\n // Create an array with a single string pointer\n // In koffi, we pass an array of strings for char**\n const messages = [messageWithNull];\n\n // Report the event using strings array approach\n const success =\n (this.ReportEventA as unknown as (...args: unknown[]) => unknown)(\n this.eventSource,\n eventType,\n 0, // category\n eventId,\n 0, // user SID (null)\n 1, // number of strings (1 - we have one message)\n 0, // data size (0 - not using raw data)\n messages, // strings array with our message\n null, // raw data (null - not using)\n );\n\n if (!success) {\n throw new Error(\"ReportEventA() returned false.\");\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n if (this.initialized && this.eventSource && this.DeregisterEventSource) {\n try {\n (this.DeregisterEventSource as unknown as (\n ...args: unknown[]\n ) => unknown)(this.eventSource);\n } catch (error) {\n this.metaLogger.error(\n \"Failed to deregister event source during cleanup: {error}\",\n { error },\n );\n }\n this.eventSource = null;\n this.initialized = false;\n }\n }\n}\n"],"mappings":";;;;;;AAMA,IAAa,qBAAb,MAAgC;CAC9B,AAAQ,cAAuB;CAC/B,AAAQ,QAAiB;CACzB,AAAQ;CACR,AAAQ,cAAc;CACtB,AAAQ,MAAe;CACvB,AAAQ,aAAa,UAAU;EAAC;EAAW;EAAQ;CAAmB,EAAC;CAEvE,YAAYA,YAAoB;AAC9B,OAAK,aAAa;CACnB;;;;CAKD,MAAM,aAA4B;AAChC,MAAI,KAAK,YAAa;AAEtB,MAAI;GAEF,MAAM,cAAc,MAAM,OAAO;AACjC,QAAK,QAAQ,YAAY,WAAW;AAGpC,QAAK,MAAM,AAAC,KAAK,MACd,KAAK,eAAe;GAGvB,MAAM,uBACJ,AAAC,KAAK,IAAsD,KAC1D,oFACD;GAGH,MAAM,eACJ,AAAC,KAAK,IAAsD,KAC1D,iMACD;GACH,MAAM,wBACJ,AAAC,KAAK,IAAsD,KAC1D,0DACD;AAGH,QAAK,uBAAuB;AAC5B,QAAK,eAAe;AACpB,QAAK,wBAAwB;AAG7B,QAAK,cAAc,AAAC,KAAK,qBAEX,GAAG,KAAK,WAAW;AAEjC,QAAK,KAAK,eAAe,KAAK,gBAAgB,EAC5C,OAAM,IAAI,OACP,mCAAmC,KAAK,WAAW;AAIxD,QAAK,cAAc;EACpB,SAAQ,OAAO;AACd,SAAM,IAAI,OACP,8CAA8C,MAAM;EAExD;CACF;CAED,AAAQ,uBAAgC;CACxC,AAAQ,eAAwB;CAChC,AAAQ,wBAAiC;;;;CAKzC,WAAWC,WAAsBC,SAAiBC,SAAuB;AACvE,OAAK,KAAK,gBAAgB,KAAK,gBAAgB,KAAK,aAClD;AAGF,MAAI;GAEF,MAAM,kBAAkB,UAAU;GAIlC,MAAM,WAAW,CAAC,eAAgB;GAGlC,MAAM,UACJ,AAAC,KAAK,aACJ,KAAK,aACL,WACA,GACA,SACA,GACA,GACA,GACA,UACA,KACD;AAEH,QAAK,QACH,OAAM,IAAI,MAAM;EAEnB,SAAQ,OAAO;AACd,SAAM;EACP;CACF;;;;CAKD,UAAgB;AACd,MAAI,KAAK,eAAe,KAAK,eAAe,KAAK,uBAAuB;AACtE,OAAI;AACF,IAAC,KAAK,sBAEQ,KAAK,YAAY;GAChC,SAAQ,OAAO;AACd,SAAK,WAAW,MACd,6DACA,EAAE,MAAO,EACV;GACF;AACD,QAAK,cAAc;AACnB,QAAK,cAAc;EACpB;CACF;AACF"}
1
+ {"version":3,"file":"ffi.node.js","names":["sourceName: string","eventType: EventType","eventId: number","message: string"],"sources":["../src/ffi.node.ts"],"sourcesContent":["import { getLogger } from \"@logtape/logtape\";\nimport type { EventType } from \"./types.ts\";\n\n/**\n * Node.js FFI implementation for Windows Event Log API using koffi\n */\nexport class WindowsEventLogFFI {\n private eventSource: unknown = null;\n private koffi: unknown = null;\n private sourceName: string;\n private initialized = false;\n private lib: unknown = null;\n private metaLogger = getLogger([\"logtape\", \"meta\", \"windows-eventlog\"]);\n\n constructor(sourceName: string) {\n this.sourceName = sourceName;\n }\n\n /**\n * Initialize the FFI bindings and register event source\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Dynamic import for koffi\n const koffiModule = await import(\"koffi\");\n this.koffi = koffiModule.default || koffiModule;\n\n // Load advapi32.dll\n this.lib = (this.koffi as unknown as { load: (lib: string) => unknown })\n .load(\"advapi32.dll\");\n\n // Define Windows API functions with correct koffi types using __stdcall convention\n const RegisterEventSourceA =\n (this.lib as unknown as { func: (sig: string) => unknown }).func(\n \"uintptr __stdcall RegisterEventSourceA(uintptr lpUNCServerName, str lpSourceName)\",\n );\n // ReportEventA expects LPCSTR* (array of string pointers) for lpStrings\n // Use char** for null-terminated array of strings\n const ReportEventA =\n (this.lib as unknown as { func: (sig: string) => unknown }).func(\n \"bool __stdcall ReportEventA(uintptr hEventLog, uint16 wType, uint16 wCategory, uint32 dwEventID, uintptr lpUserSid, uint16 wNumStrings, uint32 dwDataSize, char** lpStrings, uint8* lpRawData)\",\n );\n const DeregisterEventSource =\n (this.lib as unknown as { func: (sig: string) => unknown }).func(\n \"bool __stdcall DeregisterEventSource(uintptr hEventLog)\",\n );\n\n // Store functions\n this.RegisterEventSourceA = RegisterEventSourceA;\n this.ReportEventA = ReportEventA;\n this.DeregisterEventSource = DeregisterEventSource;\n\n // Register event source\n this.eventSource = (this.RegisterEventSourceA as unknown as (\n ...args: unknown[]\n ) => unknown)(0, this.sourceName);\n\n if (!this.eventSource || this.eventSource === 0) {\n throw new Error(\n `Failed to register event source: ${this.sourceName}`,\n );\n }\n\n this.initialized = true;\n } catch (error) {\n throw new Error(\n `Failed to initialize Windows Event Log FFI: ${error}`,\n );\n }\n }\n\n private RegisterEventSourceA: unknown = null;\n private ReportEventA: unknown = null;\n private DeregisterEventSource: unknown = null;\n\n /**\n * Write an event to Windows Event Log\n */\n writeEvent(eventType: EventType, eventId: number, message: string): void {\n if (!this.initialized || !this.eventSource || !this.ReportEventA) {\n return;\n }\n\n try {\n // Create null-terminated string\n const messageWithNull = message + \"\\0\";\n\n // Create an array with a single string pointer\n // In koffi, we pass an array of strings for char**\n const messages = [messageWithNull];\n\n // Report the event using strings array approach\n const success =\n (this.ReportEventA as unknown as (...args: unknown[]) => unknown)(\n this.eventSource,\n eventType,\n 0, // category\n eventId,\n 0, // user SID (null)\n 1, // number of strings (1 - we have one message)\n 0, // data size (0 - not using raw data)\n messages, // strings array with our message\n null, // raw data (null - not using)\n );\n\n if (!success) {\n throw new Error(\"ReportEventA() returned false.\");\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n if (this.initialized && this.eventSource && this.DeregisterEventSource) {\n try {\n (this.DeregisterEventSource as unknown as (\n ...args: unknown[]\n ) => unknown)(this.eventSource);\n } catch (error) {\n this.metaLogger.error(\n \"Failed to deregister event source during cleanup: {error}\",\n { error },\n );\n }\n this.eventSource = null;\n this.initialized = false;\n }\n }\n}\n"],"mappings":";;;;;;AAMA,IAAa,qBAAb,MAAgC;CAC9B,AAAQ,cAAuB;CAC/B,AAAQ,QAAiB;CACzB,AAAQ;CACR,AAAQ,cAAc;CACtB,AAAQ,MAAe;CACvB,AAAQ,aAAa,UAAU;EAAC;EAAW;EAAQ;CAAmB,EAAC;CAEvE,YAAYA,YAAoB;AAC9B,OAAK,aAAa;CACnB;;;;CAKD,MAAM,aAA4B;AAChC,MAAI,KAAK,YAAa;AAEtB,MAAI;GAEF,MAAM,cAAc,MAAM,OAAO;AACjC,QAAK,QAAQ,YAAY,WAAW;AAGpC,QAAK,MAAM,AAAC,KAAK,MACd,KAAK,eAAe;GAGvB,MAAM,uBACJ,AAAC,KAAK,IAAsD,KAC1D,oFACD;GAGH,MAAM,eACJ,AAAC,KAAK,IAAsD,KAC1D,iMACD;GACH,MAAM,wBACJ,AAAC,KAAK,IAAsD,KAC1D,0DACD;AAGH,QAAK,uBAAuB;AAC5B,QAAK,eAAe;AACpB,QAAK,wBAAwB;AAG7B,QAAK,cAAc,AAAC,KAAK,qBAEX,GAAG,KAAK,WAAW;AAEjC,QAAK,KAAK,eAAe,KAAK,gBAAgB,EAC5C,OAAM,IAAI,OACP,mCAAmC,KAAK,WAAW;AAIxD,QAAK,cAAc;EACpB,SAAQ,OAAO;AACd,SAAM,IAAI,OACP,8CAA8C,MAAM;EAExD;CACF;CAED,AAAQ,uBAAgC;CACxC,AAAQ,eAAwB;CAChC,AAAQ,wBAAiC;;;;CAKzC,WAAWC,WAAsBC,SAAiBC,SAAuB;AACvE,OAAK,KAAK,gBAAgB,KAAK,gBAAgB,KAAK,aAClD;AAGF,MAAI;GAEF,MAAM,kBAAkB,UAAU;GAIlC,MAAM,WAAW,CAAC,eAAgB;GAGlC,MAAM,UACJ,AAAC,KAAK,aACJ,KAAK,aACL,WACA,GACA,SACA,GACA,GACA,GACA,UACA,KACD;AAEH,QAAK,QACH,OAAM,IAAI,MAAM;EAEnB,SAAQ,OAAO;AACd,SAAM;EACP;CACF;;;;CAKD,UAAgB;AACd,MAAI,KAAK,eAAe,KAAK,eAAe,KAAK,uBAAuB;AACtE,OAAI;AACF,IAAC,KAAK,sBAEQ,KAAK,YAAY;GAChC,SAAQ,OAAO;AACd,SAAK,WAAW,MACd,6DACA,EAAE,MAAO,EACV;GACF;AACD,QAAK,cAAc;AACnB,QAAK,cAAc;EACpB;CACF;AACF"}
package/dist/platform.cjs CHANGED
@@ -2,7 +2,7 @@ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
2
  const require_types = require('./types.cjs');
3
3
  const node_process = require_rolldown_runtime.__toESM(require("node:process"));
4
4
 
5
- //#region platform.ts
5
+ //#region src/platform.ts
6
6
  /**
7
7
  * Validates that the current platform is Windows.
8
8
  * Throws a WindowsPlatformError if running on a non-Windows platform.
package/dist/platform.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { WindowsPlatformError } from "./types.js";
2
2
  import process from "node:process";
3
3
 
4
- //#region platform.ts
4
+ //#region src/platform.ts
5
5
  /**
6
6
  * Validates that the current platform is Windows.
7
7
  * Throws a WindowsPlatformError if running on a non-Windows platform.
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","names":[],"sources":["../platform.ts"],"sourcesContent":["import process from \"node:process\";\nimport { WindowsPlatformError } from \"./types.ts\";\n\n/**\n * Validates that the current platform is Windows.\n * Throws a WindowsPlatformError if running on a non-Windows platform.\n *\n * @throws {WindowsPlatformError} When running on non-Windows platforms\n * @since 1.0.0\n */\nexport function validateWindowsPlatform(): void {\n const platform = getPlatform();\n\n if (platform !== \"windows\" && platform !== \"win32\") {\n throw new WindowsPlatformError(platform);\n }\n}\n\n/**\n * Gets the current platform in a cross-runtime compatible way.\n *\n * @returns The platform identifier\n * @since 1.0.0\n */\nexport function getPlatform(): string {\n // Deno\n if (typeof Deno !== \"undefined\" && Deno.build?.os) {\n return Deno.build.os;\n }\n\n // Node.js/Bun\n if (typeof process !== \"undefined\" && process.platform) {\n return process.platform;\n }\n\n // Fallback - assume non-Windows\n return \"unknown\";\n}\n\n/**\n * Checks if the current platform is Windows without throwing.\n *\n * @returns true if running on Windows, false otherwise\n * @since 1.0.0\n */\nexport function isWindows(): boolean {\n try {\n validateWindowsPlatform();\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Gets the current JavaScript runtime.\n *\n * @returns The runtime identifier (\"deno\", \"node\", \"bun\", or \"unknown\")\n * @since 1.0.0\n */\nexport function getRuntime(): \"deno\" | \"node\" | \"bun\" | \"unknown\" {\n // Deno\n if (typeof Deno !== \"undefined\") {\n return \"deno\";\n }\n\n // Bun\n if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n return \"bun\";\n }\n\n // Node.js (check process exists and is not Deno/Bun)\n if (typeof process !== \"undefined\" && process.versions?.node) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n"],"mappings":";;;;;;;;;;;AAUA,SAAgB,0BAAgC;CAC9C,MAAM,WAAW,aAAa;AAE9B,KAAI,aAAa,aAAa,aAAa,QACzC,OAAM,IAAI,qBAAqB;AAElC;;;;;;;AAQD,SAAgB,cAAsB;AAEpC,YAAW,SAAS,eAAe,KAAK,OAAO,GAC7C,QAAO,KAAK,MAAM;AAIpB,YAAW,YAAY,eAAe,QAAQ,SAC5C,QAAO,QAAQ;AAIjB,QAAO;AACR"}
1
+ {"version":3,"file":"platform.js","names":[],"sources":["../src/platform.ts"],"sourcesContent":["import process from \"node:process\";\nimport { WindowsPlatformError } from \"./types.ts\";\n\n/**\n * Validates that the current platform is Windows.\n * Throws a WindowsPlatformError if running on a non-Windows platform.\n *\n * @throws {WindowsPlatformError} When running on non-Windows platforms\n * @since 1.0.0\n */\nexport function validateWindowsPlatform(): void {\n const platform = getPlatform();\n\n if (platform !== \"windows\" && platform !== \"win32\") {\n throw new WindowsPlatformError(platform);\n }\n}\n\n/**\n * Gets the current platform in a cross-runtime compatible way.\n *\n * @returns The platform identifier\n * @since 1.0.0\n */\nexport function getPlatform(): string {\n // Deno\n if (typeof Deno !== \"undefined\" && Deno.build?.os) {\n return Deno.build.os;\n }\n\n // Node.js/Bun\n if (typeof process !== \"undefined\" && process.platform) {\n return process.platform;\n }\n\n // Fallback - assume non-Windows\n return \"unknown\";\n}\n\n/**\n * Checks if the current platform is Windows without throwing.\n *\n * @returns true if running on Windows, false otherwise\n * @since 1.0.0\n */\nexport function isWindows(): boolean {\n try {\n validateWindowsPlatform();\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Gets the current JavaScript runtime.\n *\n * @returns The runtime identifier (\"deno\", \"node\", \"bun\", or \"unknown\")\n * @since 1.0.0\n */\nexport function getRuntime(): \"deno\" | \"node\" | \"bun\" | \"unknown\" {\n // Deno\n if (typeof Deno !== \"undefined\") {\n return \"deno\";\n }\n\n // Bun\n if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n return \"bun\";\n }\n\n // Node.js (check process exists and is not Deno/Bun)\n if (typeof process !== \"undefined\" && process.versions?.node) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n"],"mappings":";;;;;;;;;;;AAUA,SAAgB,0BAAgC;CAC9C,MAAM,WAAW,aAAa;AAE9B,KAAI,aAAa,aAAa,aAAa,QACzC,OAAM,IAAI,qBAAqB;AAElC;;;;;;;AAQD,SAAgB,cAAsB;AAEpC,YAAW,SAAS,eAAe,KAAK,OAAO,GAC7C,QAAO,KAAK,MAAM;AAIpB,YAAW,YAAY,eAAe,QAAQ,SAC5C,QAAO,QAAQ;AAIjB,QAAO;AACR"}
package/dist/sink.bun.cjs CHANGED
@@ -4,7 +4,7 @@ const require_platform = require('./platform.cjs');
4
4
  const require_ffi_bun = require('./ffi.bun.cjs');
5
5
  const __logtape_logtape = require_rolldown_runtime.__toESM(require("@logtape/logtape"));
6
6
 
7
- //#region sink.bun.ts
7
+ //#region src/sink.bun.ts
8
8
  /**
9
9
  * Formats a log record message into a string suitable for Windows Event Log.
10
10
  * Combines the template and arguments into a readable message.
@@ -1,7 +1,7 @@
1
1
  import { WindowsEventLogSinkOptions } from "./types.cjs";
2
2
  import { Sink } from "@logtape/logtape";
3
3
 
4
- //#region sink.bun.d.ts
4
+ //#region src/sink.bun.d.ts
5
5
 
6
6
  /**
7
7
  * Creates a Windows Event Log sink for Bun environments using FFI.
@@ -1 +1 @@
1
- {"version":3,"file":"sink.bun.d.cts","names":[],"sources":["../sink.bun.ts"],"sourcesContent":[],"mappings":";;;;;;;AA+EA;;;;;AAEoB;;;;;;;;;;;;;;;;iBAFJ,sBAAA,UACL,6BACR,OAAO"}
1
+ {"version":3,"file":"sink.bun.d.cts","names":[],"sources":["../src/sink.bun.ts"],"sourcesContent":[],"mappings":";;;;;;;AA+EA;;;;;AAEoB;;;;;;;;;;;;;;;;iBAFJ,sBAAA,UACL,6BACR,OAAO"}
@@ -1,7 +1,7 @@
1
1
  import { WindowsEventLogSinkOptions } from "./types.js";
2
2
  import { Sink } from "@logtape/logtape";
3
3
 
4
- //#region sink.bun.d.ts
4
+ //#region src/sink.bun.d.ts
5
5
 
6
6
  /**
7
7
  * Creates a Windows Event Log sink for Bun environments using FFI.
@@ -1 +1 @@
1
- {"version":3,"file":"sink.bun.d.ts","names":[],"sources":["../sink.bun.ts"],"sourcesContent":[],"mappings":";;;;;;;AA+EA;;;;;AAEoB;;;;;;;;;;;;;;;;iBAFJ,sBAAA,UACL,6BACR,OAAO"}
1
+ {"version":3,"file":"sink.bun.d.ts","names":[],"sources":["../src/sink.bun.ts"],"sourcesContent":[],"mappings":";;;;;;;AA+EA;;;;;AAEoB;;;;;;;;;;;;;;;;iBAFJ,sBAAA,UACL,6BACR,OAAO"}
package/dist/sink.bun.js CHANGED
@@ -3,7 +3,7 @@ import { validateWindowsPlatform } from "./platform.js";
3
3
  import { WindowsEventLogFFI } from "./ffi.bun.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
 
6
- //#region sink.bun.ts
6
+ //#region src/sink.bun.ts
7
7
  /**
8
8
  * Formats a log record message into a string suitable for Windows Event Log.
9
9
  * Combines the template and arguments into a readable message.
@@ -1 +1 @@
1
- {"version":3,"file":"sink.bun.js","names":["record: LogRecord","context: string[]","options: WindowsEventLogSinkOptions","ffi: WindowsEventLogFFI | null","sink: Sink & Disposable"],"sources":["../sink.bun.ts"],"sourcesContent":["import type { LogRecord, Sink } from \"@logtape/logtape\";\nimport { getLogger } from \"@logtape/logtape\";\nimport type { WindowsEventLogSinkOptions } from \"./types.ts\";\nimport { DEFAULT_EVENT_ID_MAPPING, mapLogLevelToEventType } from \"./types.ts\";\nimport { validateWindowsPlatform } from \"./platform.ts\";\nimport { WindowsEventLogFFI } from \"./ffi.bun.ts\";\n\n/**\n * Formats a log record message into a string suitable for Windows Event Log.\n * Combines the template and arguments into a readable message.\n */\nfunction formatMessage(record: LogRecord): string {\n let message = \"\";\n\n // Combine template parts with arguments\n for (let i = 0; i < record.message.length; i++) {\n if (i % 2 === 0) {\n // Template part\n message += record.message[i];\n } else {\n // Argument - serialize it\n const arg = record.message[i];\n if (typeof arg === \"string\") {\n message += arg;\n } else {\n message += JSON.stringify(arg);\n }\n }\n }\n\n return message;\n}\n\n/**\n * Formats additional context information for the log entry.\n * Includes category, properties, and other metadata.\n */\nfunction formatContext(record: LogRecord): string {\n const context: string[] = [];\n\n // Add category if present\n if (record.category && record.category.length > 0) {\n context.push(`Category: ${record.category.join(\".\")}`);\n }\n\n // Add properties if present\n if (record.properties && Object.keys(record.properties).length > 0) {\n context.push(`Properties: ${JSON.stringify(record.properties)}`);\n }\n\n // Add timestamp\n context.push(`Timestamp: ${new Date(record.timestamp).toISOString()}`);\n\n return context.length > 0 ? `\\n\\n${context.join(\"\\n\")}` : \"\";\n}\n\n/**\n * Creates a Windows Event Log sink for Bun environments using FFI.\n *\n * This implementation uses Bun's native Foreign Function Interface to directly\n * call Windows Event Log APIs, providing high performance logging optimized\n * for the Bun runtime.\n *\n * @param options Configuration options for the sink\n * @returns A LogTape sink that writes to Windows Event Log\n * @throws {WindowsPlatformError} If not running on Windows\n * @throws {WindowsEventLogError} If Event Log operations fail\n *\n * @example\n * ```typescript\n * import { getWindowsEventLogSink } from \"@logtape/windows-eventlog\";\n *\n * const sink = getWindowsEventLogSink({\n * sourceName: \"MyApp\"\n * });\n * ```\n *\n * @since 1.0.0\n */\nexport function getWindowsEventLogSink(\n options: WindowsEventLogSinkOptions,\n): Sink & Disposable {\n // Validate platform early\n validateWindowsPlatform();\n\n const {\n sourceName,\n eventIdMapping = {},\n } = options;\n\n // Merge with default event ID mapping\n const eventIds = { ...DEFAULT_EVENT_ID_MAPPING, ...eventIdMapping };\n\n let ffi: WindowsEventLogFFI | null = null;\n const metaLogger = getLogger([\"logtape\", \"meta\", \"windows-eventlog\"]);\n\n const sink: Sink & Disposable = (record: LogRecord) => {\n if (!ffi) {\n ffi = new WindowsEventLogFFI(sourceName);\n try {\n ffi.initialize();\n } catch (error) {\n metaLogger.error(\n \"Failed to initialize Windows Event Log FFI: {error}\",\n { error },\n );\n ffi = null; // Reset FFI on error\n return;\n }\n }\n\n // Format the complete message\n const message = formatMessage(record);\n const context = formatContext(record);\n const fullMessage = message + context;\n\n // Get event type and ID for this log level\n const eventType = mapLogLevelToEventType(record.level);\n const eventId = eventIds[record.level];\n\n // Write to Event Log using FFI (synchronously since Bun FFI initializes synchronously)\n if (ffi) {\n try {\n ffi.writeEvent(eventType, eventId, fullMessage);\n } catch (error) {\n metaLogger.error(\n \"Failed to write to Windows Event Log: {error}\",\n { error },\n );\n }\n }\n };\n\n // Implement Disposable for cleanup\n sink[Symbol.dispose] = () => {\n if (ffi) {\n ffi.dispose();\n ffi = null;\n }\n };\n\n return sink;\n}\n"],"mappings":";;;;;;;;;;AAWA,SAAS,cAAcA,QAA2B;CAChD,IAAI,UAAU;AAGd,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,IACzC,KAAI,IAAI,MAAM,EAEZ,YAAW,OAAO,QAAQ;MACrB;EAEL,MAAM,MAAM,OAAO,QAAQ;AAC3B,aAAW,QAAQ,SACjB,YAAW;MAEX,YAAW,KAAK,UAAU,IAAI;CAEjC;AAGH,QAAO;AACR;;;;;AAMD,SAAS,cAAcA,QAA2B;CAChD,MAAMC,UAAoB,CAAE;AAG5B,KAAI,OAAO,YAAY,OAAO,SAAS,SAAS,EAC9C,SAAQ,MAAM,YAAY,OAAO,SAAS,KAAK,IAAI,CAAC,EAAE;AAIxD,KAAI,OAAO,cAAc,OAAO,KAAK,OAAO,WAAW,CAAC,SAAS,EAC/D,SAAQ,MAAM,cAAc,KAAK,UAAU,OAAO,WAAW,CAAC,EAAE;AAIlE,SAAQ,MAAM,aAAa,IAAI,KAAK,OAAO,WAAW,aAAa,CAAC,EAAE;AAEtE,QAAO,QAAQ,SAAS,KAAK,MAAM,QAAQ,KAAK,KAAK,CAAC,IAAI;AAC3D;;;;;;;;;;;;;;;;;;;;;;;;AAyBD,SAAgB,uBACdC,SACmB;AAEnB,0BAAyB;CAEzB,MAAM,EACJ,YACA,iBAAiB,CAAE,GACpB,GAAG;CAGJ,MAAM,WAAW;EAAE,GAAG;EAA0B,GAAG;CAAgB;CAEnE,IAAIC,MAAiC;CACrC,MAAM,aAAa,UAAU;EAAC;EAAW;EAAQ;CAAmB,EAAC;CAErE,MAAMC,OAA0B,CAACJ,WAAsB;AACrD,OAAK,KAAK;AACR,SAAM,IAAI,mBAAmB;AAC7B,OAAI;AACF,QAAI,YAAY;GACjB,SAAQ,OAAO;AACd,eAAW,MACT,uDACA,EAAE,MAAO,EACV;AACD,UAAM;AACN;GACD;EACF;EAGD,MAAM,UAAU,cAAc,OAAO;EACrC,MAAM,UAAU,cAAc,OAAO;EACrC,MAAM,cAAc,UAAU;EAG9B,MAAM,YAAY,uBAAuB,OAAO,MAAM;EACtD,MAAM,UAAU,SAAS,OAAO;AAGhC,MAAI,IACF,KAAI;AACF,OAAI,WAAW,WAAW,SAAS,YAAY;EAChD,SAAQ,OAAO;AACd,cAAW,MACT,iDACA,EAAE,MAAO,EACV;EACF;CAEJ;AAGD,MAAK,OAAO,WAAW,MAAM;AAC3B,MAAI,KAAK;AACP,OAAI,SAAS;AACb,SAAM;EACP;CACF;AAED,QAAO;AACR"}
1
+ {"version":3,"file":"sink.bun.js","names":["record: LogRecord","context: string[]","options: WindowsEventLogSinkOptions","ffi: WindowsEventLogFFI | null","sink: Sink & Disposable"],"sources":["../src/sink.bun.ts"],"sourcesContent":["import type { LogRecord, Sink } from \"@logtape/logtape\";\nimport { getLogger } from \"@logtape/logtape\";\nimport type { WindowsEventLogSinkOptions } from \"./types.ts\";\nimport { DEFAULT_EVENT_ID_MAPPING, mapLogLevelToEventType } from \"./types.ts\";\nimport { validateWindowsPlatform } from \"./platform.ts\";\nimport { WindowsEventLogFFI } from \"./ffi.bun.ts\";\n\n/**\n * Formats a log record message into a string suitable for Windows Event Log.\n * Combines the template and arguments into a readable message.\n */\nfunction formatMessage(record: LogRecord): string {\n let message = \"\";\n\n // Combine template parts with arguments\n for (let i = 0; i < record.message.length; i++) {\n if (i % 2 === 0) {\n // Template part\n message += record.message[i];\n } else {\n // Argument - serialize it\n const arg = record.message[i];\n if (typeof arg === \"string\") {\n message += arg;\n } else {\n message += JSON.stringify(arg);\n }\n }\n }\n\n return message;\n}\n\n/**\n * Formats additional context information for the log entry.\n * Includes category, properties, and other metadata.\n */\nfunction formatContext(record: LogRecord): string {\n const context: string[] = [];\n\n // Add category if present\n if (record.category && record.category.length > 0) {\n context.push(`Category: ${record.category.join(\".\")}`);\n }\n\n // Add properties if present\n if (record.properties && Object.keys(record.properties).length > 0) {\n context.push(`Properties: ${JSON.stringify(record.properties)}`);\n }\n\n // Add timestamp\n context.push(`Timestamp: ${new Date(record.timestamp).toISOString()}`);\n\n return context.length > 0 ? `\\n\\n${context.join(\"\\n\")}` : \"\";\n}\n\n/**\n * Creates a Windows Event Log sink for Bun environments using FFI.\n *\n * This implementation uses Bun's native Foreign Function Interface to directly\n * call Windows Event Log APIs, providing high performance logging optimized\n * for the Bun runtime.\n *\n * @param options Configuration options for the sink\n * @returns A LogTape sink that writes to Windows Event Log\n * @throws {WindowsPlatformError} If not running on Windows\n * @throws {WindowsEventLogError} If Event Log operations fail\n *\n * @example\n * ```typescript\n * import { getWindowsEventLogSink } from \"@logtape/windows-eventlog\";\n *\n * const sink = getWindowsEventLogSink({\n * sourceName: \"MyApp\"\n * });\n * ```\n *\n * @since 1.0.0\n */\nexport function getWindowsEventLogSink(\n options: WindowsEventLogSinkOptions,\n): Sink & Disposable {\n // Validate platform early\n validateWindowsPlatform();\n\n const {\n sourceName,\n eventIdMapping = {},\n } = options;\n\n // Merge with default event ID mapping\n const eventIds = { ...DEFAULT_EVENT_ID_MAPPING, ...eventIdMapping };\n\n let ffi: WindowsEventLogFFI | null = null;\n const metaLogger = getLogger([\"logtape\", \"meta\", \"windows-eventlog\"]);\n\n const sink: Sink & Disposable = (record: LogRecord) => {\n if (!ffi) {\n ffi = new WindowsEventLogFFI(sourceName);\n try {\n ffi.initialize();\n } catch (error) {\n metaLogger.error(\n \"Failed to initialize Windows Event Log FFI: {error}\",\n { error },\n );\n ffi = null; // Reset FFI on error\n return;\n }\n }\n\n // Format the complete message\n const message = formatMessage(record);\n const context = formatContext(record);\n const fullMessage = message + context;\n\n // Get event type and ID for this log level\n const eventType = mapLogLevelToEventType(record.level);\n const eventId = eventIds[record.level];\n\n // Write to Event Log using FFI (synchronously since Bun FFI initializes synchronously)\n if (ffi) {\n try {\n ffi.writeEvent(eventType, eventId, fullMessage);\n } catch (error) {\n metaLogger.error(\n \"Failed to write to Windows Event Log: {error}\",\n { error },\n );\n }\n }\n };\n\n // Implement Disposable for cleanup\n sink[Symbol.dispose] = () => {\n if (ffi) {\n ffi.dispose();\n ffi = null;\n }\n };\n\n return sink;\n}\n"],"mappings":";;;;;;;;;;AAWA,SAAS,cAAcA,QAA2B;CAChD,IAAI,UAAU;AAGd,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,IACzC,KAAI,IAAI,MAAM,EAEZ,YAAW,OAAO,QAAQ;MACrB;EAEL,MAAM,MAAM,OAAO,QAAQ;AAC3B,aAAW,QAAQ,SACjB,YAAW;MAEX,YAAW,KAAK,UAAU,IAAI;CAEjC;AAGH,QAAO;AACR;;;;;AAMD,SAAS,cAAcA,QAA2B;CAChD,MAAMC,UAAoB,CAAE;AAG5B,KAAI,OAAO,YAAY,OAAO,SAAS,SAAS,EAC9C,SAAQ,MAAM,YAAY,OAAO,SAAS,KAAK,IAAI,CAAC,EAAE;AAIxD,KAAI,OAAO,cAAc,OAAO,KAAK,OAAO,WAAW,CAAC,SAAS,EAC/D,SAAQ,MAAM,cAAc,KAAK,UAAU,OAAO,WAAW,CAAC,EAAE;AAIlE,SAAQ,MAAM,aAAa,IAAI,KAAK,OAAO,WAAW,aAAa,CAAC,EAAE;AAEtE,QAAO,QAAQ,SAAS,KAAK,MAAM,QAAQ,KAAK,KAAK,CAAC,IAAI;AAC3D;;;;;;;;;;;;;;;;;;;;;;;;AAyBD,SAAgB,uBACdC,SACmB;AAEnB,0BAAyB;CAEzB,MAAM,EACJ,YACA,iBAAiB,CAAE,GACpB,GAAG;CAGJ,MAAM,WAAW;EAAE,GAAG;EAA0B,GAAG;CAAgB;CAEnE,IAAIC,MAAiC;CACrC,MAAM,aAAa,UAAU;EAAC;EAAW;EAAQ;CAAmB,EAAC;CAErE,MAAMC,OAA0B,CAACJ,WAAsB;AACrD,OAAK,KAAK;AACR,SAAM,IAAI,mBAAmB;AAC7B,OAAI;AACF,QAAI,YAAY;GACjB,SAAQ,OAAO;AACd,eAAW,MACT,uDACA,EAAE,MAAO,EACV;AACD,UAAM;AACN;GACD;EACF;EAGD,MAAM,UAAU,cAAc,OAAO;EACrC,MAAM,UAAU,cAAc,OAAO;EACrC,MAAM,cAAc,UAAU;EAG9B,MAAM,YAAY,uBAAuB,OAAO,MAAM;EACtD,MAAM,UAAU,SAAS,OAAO;AAGhC,MAAI,IACF,KAAI;AACF,OAAI,WAAW,WAAW,SAAS,YAAY;EAChD,SAAQ,OAAO;AACd,cAAW,MACT,iDACA,EAAE,MAAO,EACV;EACF;CAEJ;AAGD,MAAK,OAAO,WAAW,MAAM;AAC3B,MAAI,KAAK;AACP,OAAI,SAAS;AACb,SAAM;EACP;CACF;AAED,QAAO;AACR"}
@@ -4,7 +4,7 @@ const require_platform = require('./platform.cjs');
4
4
  const require_ffi_deno = require('./ffi.deno.cjs');
5
5
  const __logtape_logtape = require_rolldown_runtime.__toESM(require("@logtape/logtape"));
6
6
 
7
- //#region sink.deno.ts
7
+ //#region src/sink.deno.ts
8
8
  /**
9
9
  * Formats a log record message into a string suitable for Windows Event Log.
10
10
  * Combines the template and arguments into a readable message.
@@ -1,7 +1,7 @@
1
1
  import { WindowsEventLogSinkOptions } from "./types.cjs";
2
2
  import { Sink } from "@logtape/logtape";
3
3
 
4
- //#region sink.deno.d.ts
4
+ //#region src/sink.deno.d.ts
5
5
 
6
6
  /**
7
7
  * Creates a Windows Event Log sink for Deno environments using FFI.
@@ -1 +1 @@
1
- {"version":3,"file":"sink.deno.d.cts","names":[],"sources":["../sink.deno.ts"],"sourcesContent":[],"mappings":";;;;;;;AAsGA;;;;;AAEoB;;;;;;;;;;;;;;;;iBAFJ,sBAAA,UACL,6BACR,OAAO"}
1
+ {"version":3,"file":"sink.deno.d.cts","names":[],"sources":["../src/sink.deno.ts"],"sourcesContent":[],"mappings":";;;;;;;AAsGA;;;;;AAEoB;;;;;;;;;;;;;;;;iBAFJ,sBAAA,UACL,6BACR,OAAO"}
@@ -1,7 +1,7 @@
1
1
  import { WindowsEventLogSinkOptions } from "./types.js";
2
2
  import { Sink } from "@logtape/logtape";
3
3
 
4
- //#region sink.deno.d.ts
4
+ //#region src/sink.deno.d.ts
5
5
 
6
6
  /**
7
7
  * Creates a Windows Event Log sink for Deno environments using FFI.
@@ -1 +1 @@
1
- {"version":3,"file":"sink.deno.d.ts","names":[],"sources":["../sink.deno.ts"],"sourcesContent":[],"mappings":";;;;;;;AAsGA;;;;;AAEoB;;;;;;;;;;;;;;;;iBAFJ,sBAAA,UACL,6BACR,OAAO"}
1
+ {"version":3,"file":"sink.deno.d.ts","names":[],"sources":["../src/sink.deno.ts"],"sourcesContent":[],"mappings":";;;;;;;AAsGA;;;;;AAEoB;;;;;;;;;;;;;;;;iBAFJ,sBAAA,UACL,6BACR,OAAO"}
package/dist/sink.deno.js CHANGED
@@ -3,7 +3,7 @@ import { validateWindowsPlatform } from "./platform.js";
3
3
  import { EVENTLOG_ERROR_TYPE, EVENTLOG_INFORMATION_TYPE, EVENTLOG_WARNING_TYPE, WindowsEventLogFFI } from "./ffi.deno.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
 
6
- //#region sink.deno.ts
6
+ //#region src/sink.deno.ts
7
7
  /**
8
8
  * Formats a log record message into a string suitable for Windows Event Log.
9
9
  * Combines the template and arguments into a readable message.
@@ -1 +1 @@
1
- {"version":3,"file":"sink.deno.js","names":["record: LogRecord","context: string[]","level: string","options: WindowsEventLogSinkOptions","ffi: WindowsEventLogFFI | null","sink: Sink & Disposable"],"sources":["../sink.deno.ts"],"sourcesContent":["import type { LogRecord, Sink } from \"@logtape/logtape\";\nimport { getLogger } from \"@logtape/logtape\";\nimport {\n EVENTLOG_ERROR_TYPE,\n EVENTLOG_INFORMATION_TYPE,\n EVENTLOG_WARNING_TYPE,\n WindowsEventLogFFI,\n} from \"./ffi.deno.ts\";\nimport { validateWindowsPlatform } from \"./platform.ts\";\nimport type { WindowsEventLogSinkOptions } from \"./types.ts\";\nimport { DEFAULT_EVENT_ID_MAPPING } from \"./types.ts\";\n\n/**\n * Formats a log record message into a string suitable for Windows Event Log.\n * Combines the template and arguments into a readable message.\n */\nfunction formatMessage(record: LogRecord): string {\n let message = \"\";\n\n // Combine template parts with arguments\n for (let i = 0; i < record.message.length; i++) {\n if (i % 2 === 0) {\n // Template part\n message += record.message[i];\n } else {\n // Argument - serialize it\n const arg = record.message[i];\n if (typeof arg === \"string\") {\n message += arg;\n } else {\n message += JSON.stringify(arg);\n }\n }\n }\n\n return message;\n}\n\n/**\n * Formats additional context information for the log entry.\n * Includes category, properties, and other metadata.\n */\nfunction formatContext(record: LogRecord): string {\n const context: string[] = [];\n\n // Add category if present\n if (record.category && record.category.length > 0) {\n context.push(`Category: ${record.category.join(\".\")}`);\n }\n\n // Add properties if present\n if (record.properties && Object.keys(record.properties).length > 0) {\n context.push(`Properties: ${JSON.stringify(record.properties)}`);\n }\n\n // Add timestamp\n context.push(`Timestamp: ${new Date(record.timestamp).toISOString()}`);\n\n return context.length > 0 ? `\\n\\n${context.join(\"\\n\")}` : \"\";\n}\n\n/**\n * Maps LogTape log levels to Windows Event Log types.\n */\nfunction getEventType(level: string): number {\n switch (level) {\n case \"fatal\":\n case \"error\":\n return EVENTLOG_ERROR_TYPE;\n case \"warning\":\n return EVENTLOG_WARNING_TYPE;\n case \"info\":\n case \"debug\":\n case \"trace\":\n default:\n return EVENTLOG_INFORMATION_TYPE;\n }\n}\n\n/**\n * Creates a Windows Event Log sink for Deno environments using FFI.\n *\n * This implementation uses Deno's Foreign Function Interface to directly\n * call Windows Event Log APIs, providing reliable Event Log integration\n * without depending on external packages.\n *\n * @param options Configuration options for the sink\n * @returns A LogTape sink that writes to Windows Event Log\n * @throws {WindowsPlatformError} If not running on Windows\n * @throws {WindowsEventLogError} If Event Log operations fail\n *\n * @example\n * ```typescript\n * import { getWindowsEventLogSink } from \"@logtape/windows-eventlog\";\n *\n * const sink = getWindowsEventLogSink({\n * sourceName: \"MyApp\"\n * });\n * ```\n *\n * @since 1.0.0\n */\nexport function getWindowsEventLogSink(\n options: WindowsEventLogSinkOptions,\n): Sink & Disposable {\n // Validate platform early\n validateWindowsPlatform();\n\n const {\n sourceName,\n eventIdMapping = {},\n } = options;\n\n // Merge with default event ID mapping\n const eventIds = { ...DEFAULT_EVENT_ID_MAPPING, ...eventIdMapping };\n\n let ffi: WindowsEventLogFFI | null = null;\n const metaLogger = getLogger([\"logtape\", \"meta\", \"windows-eventlog\"]);\n\n const sink: Sink & Disposable = (record: LogRecord) => {\n // Initialize FFI if needed\n if (!ffi) {\n try {\n ffi = new WindowsEventLogFFI(sourceName);\n ffi.initialize();\n } catch (error) {\n metaLogger.error(\n \"Failed to initialize Windows Event Log FFI: {error}\",\n { error },\n );\n return; // Skip this log record\n }\n }\n\n // Format the complete message\n const message = formatMessage(record);\n const context = formatContext(record);\n const fullMessage = message + context;\n\n // Get event type and ID for this log level\n const eventType = getEventType(record.level);\n const eventId = eventIds[record.level];\n\n // Write to Event Log\n try {\n ffi.writeEvent(eventType, eventId, fullMessage);\n } catch (error) {\n metaLogger.error(\n \"Failed to write {level} message to Windows Event Log: {error}\",\n { level: record.level, error },\n );\n }\n };\n\n // Implement Disposable for cleanup\n sink[Symbol.dispose] = () => {\n // Clean up FFI resources\n if (ffi) {\n ffi.dispose();\n ffi = null;\n }\n };\n\n return sink;\n}\n"],"mappings":";;;;;;;;;;AAgBA,SAAS,cAAcA,QAA2B;CAChD,IAAI,UAAU;AAGd,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,IACzC,KAAI,IAAI,MAAM,EAEZ,YAAW,OAAO,QAAQ;MACrB;EAEL,MAAM,MAAM,OAAO,QAAQ;AAC3B,aAAW,QAAQ,SACjB,YAAW;MAEX,YAAW,KAAK,UAAU,IAAI;CAEjC;AAGH,QAAO;AACR;;;;;AAMD,SAAS,cAAcA,QAA2B;CAChD,MAAMC,UAAoB,CAAE;AAG5B,KAAI,OAAO,YAAY,OAAO,SAAS,SAAS,EAC9C,SAAQ,MAAM,YAAY,OAAO,SAAS,KAAK,IAAI,CAAC,EAAE;AAIxD,KAAI,OAAO,cAAc,OAAO,KAAK,OAAO,WAAW,CAAC,SAAS,EAC/D,SAAQ,MAAM,cAAc,KAAK,UAAU,OAAO,WAAW,CAAC,EAAE;AAIlE,SAAQ,MAAM,aAAa,IAAI,KAAK,OAAO,WAAW,aAAa,CAAC,EAAE;AAEtE,QAAO,QAAQ,SAAS,KAAK,MAAM,QAAQ,KAAK,KAAK,CAAC,IAAI;AAC3D;;;;AAKD,SAAS,aAAaC,OAAuB;AAC3C,SAAQ,OAAR;EACE,KAAK;EACL,KAAK,QACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,QACE,QAAO;CACV;AACF;;;;;;;;;;;;;;;;;;;;;;;;AAyBD,SAAgB,uBACdC,SACmB;AAEnB,0BAAyB;CAEzB,MAAM,EACJ,YACA,iBAAiB,CAAE,GACpB,GAAG;CAGJ,MAAM,WAAW;EAAE,GAAG;EAA0B,GAAG;CAAgB;CAEnE,IAAIC,MAAiC;CACrC,MAAM,aAAa,UAAU;EAAC;EAAW;EAAQ;CAAmB,EAAC;CAErE,MAAMC,OAA0B,CAACL,WAAsB;AAErD,OAAK,IACH,KAAI;AACF,SAAM,IAAI,mBAAmB;AAC7B,OAAI,YAAY;EACjB,SAAQ,OAAO;AACd,cAAW,MACT,uDACA,EAAE,MAAO,EACV;AACD;EACD;EAIH,MAAM,UAAU,cAAc,OAAO;EACrC,MAAM,UAAU,cAAc,OAAO;EACrC,MAAM,cAAc,UAAU;EAG9B,MAAM,YAAY,aAAa,OAAO,MAAM;EAC5C,MAAM,UAAU,SAAS,OAAO;AAGhC,MAAI;AACF,OAAI,WAAW,WAAW,SAAS,YAAY;EAChD,SAAQ,OAAO;AACd,cAAW,MACT,iEACA;IAAE,OAAO,OAAO;IAAO;GAAO,EAC/B;EACF;CACF;AAGD,MAAK,OAAO,WAAW,MAAM;AAE3B,MAAI,KAAK;AACP,OAAI,SAAS;AACb,SAAM;EACP;CACF;AAED,QAAO;AACR"}
1
+ {"version":3,"file":"sink.deno.js","names":["record: LogRecord","context: string[]","level: string","options: WindowsEventLogSinkOptions","ffi: WindowsEventLogFFI | null","sink: Sink & Disposable"],"sources":["../src/sink.deno.ts"],"sourcesContent":["import type { LogRecord, Sink } from \"@logtape/logtape\";\nimport { getLogger } from \"@logtape/logtape\";\nimport {\n EVENTLOG_ERROR_TYPE,\n EVENTLOG_INFORMATION_TYPE,\n EVENTLOG_WARNING_TYPE,\n WindowsEventLogFFI,\n} from \"./ffi.deno.ts\";\nimport { validateWindowsPlatform } from \"./platform.ts\";\nimport type { WindowsEventLogSinkOptions } from \"./types.ts\";\nimport { DEFAULT_EVENT_ID_MAPPING } from \"./types.ts\";\n\n/**\n * Formats a log record message into a string suitable for Windows Event Log.\n * Combines the template and arguments into a readable message.\n */\nfunction formatMessage(record: LogRecord): string {\n let message = \"\";\n\n // Combine template parts with arguments\n for (let i = 0; i < record.message.length; i++) {\n if (i % 2 === 0) {\n // Template part\n message += record.message[i];\n } else {\n // Argument - serialize it\n const arg = record.message[i];\n if (typeof arg === \"string\") {\n message += arg;\n } else {\n message += JSON.stringify(arg);\n }\n }\n }\n\n return message;\n}\n\n/**\n * Formats additional context information for the log entry.\n * Includes category, properties, and other metadata.\n */\nfunction formatContext(record: LogRecord): string {\n const context: string[] = [];\n\n // Add category if present\n if (record.category && record.category.length > 0) {\n context.push(`Category: ${record.category.join(\".\")}`);\n }\n\n // Add properties if present\n if (record.properties && Object.keys(record.properties).length > 0) {\n context.push(`Properties: ${JSON.stringify(record.properties)}`);\n }\n\n // Add timestamp\n context.push(`Timestamp: ${new Date(record.timestamp).toISOString()}`);\n\n return context.length > 0 ? `\\n\\n${context.join(\"\\n\")}` : \"\";\n}\n\n/**\n * Maps LogTape log levels to Windows Event Log types.\n */\nfunction getEventType(level: string): number {\n switch (level) {\n case \"fatal\":\n case \"error\":\n return EVENTLOG_ERROR_TYPE;\n case \"warning\":\n return EVENTLOG_WARNING_TYPE;\n case \"info\":\n case \"debug\":\n case \"trace\":\n default:\n return EVENTLOG_INFORMATION_TYPE;\n }\n}\n\n/**\n * Creates a Windows Event Log sink for Deno environments using FFI.\n *\n * This implementation uses Deno's Foreign Function Interface to directly\n * call Windows Event Log APIs, providing reliable Event Log integration\n * without depending on external packages.\n *\n * @param options Configuration options for the sink\n * @returns A LogTape sink that writes to Windows Event Log\n * @throws {WindowsPlatformError} If not running on Windows\n * @throws {WindowsEventLogError} If Event Log operations fail\n *\n * @example\n * ```typescript\n * import { getWindowsEventLogSink } from \"@logtape/windows-eventlog\";\n *\n * const sink = getWindowsEventLogSink({\n * sourceName: \"MyApp\"\n * });\n * ```\n *\n * @since 1.0.0\n */\nexport function getWindowsEventLogSink(\n options: WindowsEventLogSinkOptions,\n): Sink & Disposable {\n // Validate platform early\n validateWindowsPlatform();\n\n const {\n sourceName,\n eventIdMapping = {},\n } = options;\n\n // Merge with default event ID mapping\n const eventIds = { ...DEFAULT_EVENT_ID_MAPPING, ...eventIdMapping };\n\n let ffi: WindowsEventLogFFI | null = null;\n const metaLogger = getLogger([\"logtape\", \"meta\", \"windows-eventlog\"]);\n\n const sink: Sink & Disposable = (record: LogRecord) => {\n // Initialize FFI if needed\n if (!ffi) {\n try {\n ffi = new WindowsEventLogFFI(sourceName);\n ffi.initialize();\n } catch (error) {\n metaLogger.error(\n \"Failed to initialize Windows Event Log FFI: {error}\",\n { error },\n );\n return; // Skip this log record\n }\n }\n\n // Format the complete message\n const message = formatMessage(record);\n const context = formatContext(record);\n const fullMessage = message + context;\n\n // Get event type and ID for this log level\n const eventType = getEventType(record.level);\n const eventId = eventIds[record.level];\n\n // Write to Event Log\n try {\n ffi.writeEvent(eventType, eventId, fullMessage);\n } catch (error) {\n metaLogger.error(\n \"Failed to write {level} message to Windows Event Log: {error}\",\n { level: record.level, error },\n );\n }\n };\n\n // Implement Disposable for cleanup\n sink[Symbol.dispose] = () => {\n // Clean up FFI resources\n if (ffi) {\n ffi.dispose();\n ffi = null;\n }\n };\n\n return sink;\n}\n"],"mappings":";;;;;;;;;;AAgBA,SAAS,cAAcA,QAA2B;CAChD,IAAI,UAAU;AAGd,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,IACzC,KAAI,IAAI,MAAM,EAEZ,YAAW,OAAO,QAAQ;MACrB;EAEL,MAAM,MAAM,OAAO,QAAQ;AAC3B,aAAW,QAAQ,SACjB,YAAW;MAEX,YAAW,KAAK,UAAU,IAAI;CAEjC;AAGH,QAAO;AACR;;;;;AAMD,SAAS,cAAcA,QAA2B;CAChD,MAAMC,UAAoB,CAAE;AAG5B,KAAI,OAAO,YAAY,OAAO,SAAS,SAAS,EAC9C,SAAQ,MAAM,YAAY,OAAO,SAAS,KAAK,IAAI,CAAC,EAAE;AAIxD,KAAI,OAAO,cAAc,OAAO,KAAK,OAAO,WAAW,CAAC,SAAS,EAC/D,SAAQ,MAAM,cAAc,KAAK,UAAU,OAAO,WAAW,CAAC,EAAE;AAIlE,SAAQ,MAAM,aAAa,IAAI,KAAK,OAAO,WAAW,aAAa,CAAC,EAAE;AAEtE,QAAO,QAAQ,SAAS,KAAK,MAAM,QAAQ,KAAK,KAAK,CAAC,IAAI;AAC3D;;;;AAKD,SAAS,aAAaC,OAAuB;AAC3C,SAAQ,OAAR;EACE,KAAK;EACL,KAAK,QACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,QACE,QAAO;CACV;AACF;;;;;;;;;;;;;;;;;;;;;;;;AAyBD,SAAgB,uBACdC,SACmB;AAEnB,0BAAyB;CAEzB,MAAM,EACJ,YACA,iBAAiB,CAAE,GACpB,GAAG;CAGJ,MAAM,WAAW;EAAE,GAAG;EAA0B,GAAG;CAAgB;CAEnE,IAAIC,MAAiC;CACrC,MAAM,aAAa,UAAU;EAAC;EAAW;EAAQ;CAAmB,EAAC;CAErE,MAAMC,OAA0B,CAACL,WAAsB;AAErD,OAAK,IACH,KAAI;AACF,SAAM,IAAI,mBAAmB;AAC7B,OAAI,YAAY;EACjB,SAAQ,OAAO;AACd,cAAW,MACT,uDACA,EAAE,MAAO,EACV;AACD;EACD;EAIH,MAAM,UAAU,cAAc,OAAO;EACrC,MAAM,UAAU,cAAc,OAAO;EACrC,MAAM,cAAc,UAAU;EAG9B,MAAM,YAAY,aAAa,OAAO,MAAM;EAC5C,MAAM,UAAU,SAAS,OAAO;AAGhC,MAAI;AACF,OAAI,WAAW,WAAW,SAAS,YAAY;EAChD,SAAQ,OAAO;AACd,cAAW,MACT,iEACA;IAAE,OAAO,OAAO;IAAO;GAAO,EAC/B;EACF;CACF;AAGD,MAAK,OAAO,WAAW,MAAM;AAE3B,MAAI,KAAK;AACP,OAAI,SAAS;AACb,SAAM;EACP;CACF;AAED,QAAO;AACR"}
@@ -4,7 +4,7 @@ const require_platform = require('./platform.cjs');
4
4
  const require_ffi_node = require('./ffi.node.cjs');
5
5
  const __logtape_logtape = require_rolldown_runtime.__toESM(require("@logtape/logtape"));
6
6
 
7
- //#region sink.node.ts
7
+ //#region src/sink.node.ts
8
8
  /**
9
9
  * Formats a log record message into a string suitable for Windows Event Log.
10
10
  * Combines the template and arguments into a readable message.
@@ -1,7 +1,7 @@
1
1
  import { WindowsEventLogSinkOptions } from "./types.cjs";
2
2
  import { Sink } from "@logtape/logtape";
3
3
 
4
- //#region sink.node.d.ts
4
+ //#region src/sink.node.d.ts
5
5
 
6
6
  /**
7
7
  * Creates a Windows Event Log sink for Node.js environments using FFI.
@@ -1 +1 @@
1
- {"version":3,"file":"sink.node.d.cts","names":[],"sources":["../sink.node.ts"],"sourcesContent":[],"mappings":";;;;;;;AAkFA;;;;;AAEoB;;;;;;;;;;;;;;;iBAFJ,sBAAA,UACL,6BACR,OAAO"}
1
+ {"version":3,"file":"sink.node.d.cts","names":[],"sources":["../src/sink.node.ts"],"sourcesContent":[],"mappings":";;;;;;;AAkFA;;;;;AAEoB;;;;;;;;;;;;;;;iBAFJ,sBAAA,UACL,6BACR,OAAO"}
@@ -1,7 +1,7 @@
1
1
  import { WindowsEventLogSinkOptions } from "./types.js";
2
2
  import { Sink } from "@logtape/logtape";
3
3
 
4
- //#region sink.node.d.ts
4
+ //#region src/sink.node.d.ts
5
5
 
6
6
  /**
7
7
  * Creates a Windows Event Log sink for Node.js environments using FFI.
@@ -1 +1 @@
1
- {"version":3,"file":"sink.node.d.ts","names":[],"sources":["../sink.node.ts"],"sourcesContent":[],"mappings":";;;;;;;AAkFA;;;;;AAEoB;;;;;;;;;;;;;;;iBAFJ,sBAAA,UACL,6BACR,OAAO"}
1
+ {"version":3,"file":"sink.node.d.ts","names":[],"sources":["../src/sink.node.ts"],"sourcesContent":[],"mappings":";;;;;;;AAkFA;;;;;AAEoB;;;;;;;;;;;;;;;iBAFJ,sBAAA,UACL,6BACR,OAAO"}
package/dist/sink.node.js CHANGED
@@ -3,7 +3,7 @@ import { validateWindowsPlatform } from "./platform.js";
3
3
  import { WindowsEventLogFFI } from "./ffi.node.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
 
6
- //#region sink.node.ts
6
+ //#region src/sink.node.ts
7
7
  /**
8
8
  * Formats a log record message into a string suitable for Windows Event Log.
9
9
  * Combines the template and arguments into a readable message.
@@ -1 +1 @@
1
- {"version":3,"file":"sink.node.js","names":["record: LogRecord","context: string[]","options: WindowsEventLogSinkOptions","ffi: WindowsEventLogFFI | null","initPromise: Promise<void> | null","sink: Sink & Disposable"],"sources":["../sink.node.ts"],"sourcesContent":["import type { LogRecord, Sink } from \"@logtape/logtape\";\nimport { getLogger } from \"@logtape/logtape\";\nimport type { WindowsEventLogSinkOptions } from \"./types.ts\";\nimport {\n DEFAULT_EVENT_ID_MAPPING,\n mapLogLevelToEventType,\n type WindowsEventLogError as _WindowsEventLogError,\n} from \"./types.ts\";\nimport { validateWindowsPlatform } from \"./platform.ts\";\nimport { WindowsEventLogFFI } from \"./ffi.node.ts\";\n\n/**\n * Formats a log record message into a string suitable for Windows Event Log.\n * Combines the template and arguments into a readable message.\n */\nfunction formatMessage(record: LogRecord): string {\n let message = \"\";\n\n // Combine template parts with arguments\n for (let i = 0; i < record.message.length; i++) {\n if (i % 2 === 0) {\n // Template part\n message += record.message[i];\n } else {\n // Argument - serialize it\n const arg = record.message[i];\n if (typeof arg === \"string\") {\n message += arg;\n } else {\n message += JSON.stringify(arg);\n }\n }\n }\n\n return message;\n}\n\n/**\n * Formats additional context information for the log entry.\n * Includes category, properties, and other metadata.\n */\nfunction formatContext(record: LogRecord): string {\n const context: string[] = [];\n\n // Add category if present\n if (record.category && record.category.length > 0) {\n context.push(`Category: ${record.category.join(\".\")}`);\n }\n\n // Add properties if present\n if (record.properties && Object.keys(record.properties).length > 0) {\n context.push(`Properties: ${JSON.stringify(record.properties)}`);\n }\n\n // Add timestamp\n context.push(`Timestamp: ${new Date(record.timestamp).toISOString()}`);\n\n return context.length > 0 ? `\\n\\n${context.join(\"\\n\")}` : \"\";\n}\n\n/**\n * Creates a Windows Event Log sink for Node.js environments using FFI.\n *\n * This implementation uses koffi to call Windows Event Log API directly,\n * providing high performance logging without external dependencies.\n *\n * @param options Configuration options for the sink\n * @returns A LogTape sink that writes to Windows Event Log\n * @throws {WindowsPlatformError} If not running on Windows\n * @throws {WindowsEventLogError} If Event Log operations fail\n *\n * @example\n * ```typescript\n * import { getWindowsEventLogSink } from \"@logtape/windows-eventlog\";\n *\n * const sink = getWindowsEventLogSink({\n * sourceName: \"MyApp\"\n * });\n * ```\n *\n * @since 1.0.0\n */\nexport function getWindowsEventLogSink(\n options: WindowsEventLogSinkOptions,\n): Sink & Disposable {\n // Validate platform early\n validateWindowsPlatform();\n\n const {\n sourceName,\n eventIdMapping = {},\n } = options;\n\n // Merge with default event ID mapping\n const eventIds = { ...DEFAULT_EVENT_ID_MAPPING, ...eventIdMapping };\n\n let ffi: WindowsEventLogFFI | null = null;\n let initPromise: Promise<void> | null = null;\n const metaLogger = getLogger([\"logtape\", \"meta\", \"windows-eventlog\"]);\n\n const sink: Sink & Disposable = (record: LogRecord) => {\n // Format the complete message\n const message = formatMessage(record);\n const context = formatContext(record);\n const fullMessage = message + context;\n\n // Get event type and ID for this log level\n const eventType = mapLogLevelToEventType(record.level);\n const eventId = eventIds[record.level];\n\n // Initialize FFI on first use\n if (!ffi) {\n ffi = new WindowsEventLogFFI(sourceName);\n initPromise = ffi.initialize()\n .then(() => {\n // Write the first event after initialization\n if (ffi) {\n try {\n ffi.writeEvent(eventType, eventId, fullMessage);\n } catch (error) {\n metaLogger.error(\n \"Failed to write to Windows Event Log: {error}\",\n { error },\n );\n }\n }\n })\n .catch((error) => {\n metaLogger.error(\n \"Failed to initialize Windows Event Log FFI: {error}\",\n { error },\n );\n ffi = null; // Reset FFI on error\n initPromise = null;\n });\n } else if (initPromise) {\n // Still initializing - queue the write operation\n initPromise = initPromise.then(() => {\n if (ffi) {\n try {\n ffi.writeEvent(eventType, eventId, fullMessage);\n } catch (error) {\n metaLogger.error(\n \"Failed to write to Windows Event Log: {error}\",\n { error },\n );\n }\n }\n });\n } else {\n // Already initialized\n try {\n ffi.writeEvent(eventType, eventId, fullMessage);\n } catch (error) {\n metaLogger.error(\n \"Failed to write to Windows Event Log: {error}\",\n { error },\n );\n }\n }\n };\n\n // Implement Disposable for cleanup\n sink[Symbol.dispose] = () => {\n if (ffi) {\n ffi.dispose();\n ffi = null;\n }\n };\n\n return sink;\n}\n"],"mappings":";;;;;;;;;;AAeA,SAAS,cAAcA,QAA2B;CAChD,IAAI,UAAU;AAGd,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,IACzC,KAAI,IAAI,MAAM,EAEZ,YAAW,OAAO,QAAQ;MACrB;EAEL,MAAM,MAAM,OAAO,QAAQ;AAC3B,aAAW,QAAQ,SACjB,YAAW;MAEX,YAAW,KAAK,UAAU,IAAI;CAEjC;AAGH,QAAO;AACR;;;;;AAMD,SAAS,cAAcA,QAA2B;CAChD,MAAMC,UAAoB,CAAE;AAG5B,KAAI,OAAO,YAAY,OAAO,SAAS,SAAS,EAC9C,SAAQ,MAAM,YAAY,OAAO,SAAS,KAAK,IAAI,CAAC,EAAE;AAIxD,KAAI,OAAO,cAAc,OAAO,KAAK,OAAO,WAAW,CAAC,SAAS,EAC/D,SAAQ,MAAM,cAAc,KAAK,UAAU,OAAO,WAAW,CAAC,EAAE;AAIlE,SAAQ,MAAM,aAAa,IAAI,KAAK,OAAO,WAAW,aAAa,CAAC,EAAE;AAEtE,QAAO,QAAQ,SAAS,KAAK,MAAM,QAAQ,KAAK,KAAK,CAAC,IAAI;AAC3D;;;;;;;;;;;;;;;;;;;;;;;AAwBD,SAAgB,uBACdC,SACmB;AAEnB,0BAAyB;CAEzB,MAAM,EACJ,YACA,iBAAiB,CAAE,GACpB,GAAG;CAGJ,MAAM,WAAW;EAAE,GAAG;EAA0B,GAAG;CAAgB;CAEnE,IAAIC,MAAiC;CACrC,IAAIC,cAAoC;CACxC,MAAM,aAAa,UAAU;EAAC;EAAW;EAAQ;CAAmB,EAAC;CAErE,MAAMC,OAA0B,CAACL,WAAsB;EAErD,MAAM,UAAU,cAAc,OAAO;EACrC,MAAM,UAAU,cAAc,OAAO;EACrC,MAAM,cAAc,UAAU;EAG9B,MAAM,YAAY,uBAAuB,OAAO,MAAM;EACtD,MAAM,UAAU,SAAS,OAAO;AAGhC,OAAK,KAAK;AACR,SAAM,IAAI,mBAAmB;AAC7B,iBAAc,IAAI,YAAY,CAC3B,KAAK,MAAM;AAEV,QAAI,IACF,KAAI;AACF,SAAI,WAAW,WAAW,SAAS,YAAY;IAChD,SAAQ,OAAO;AACd,gBAAW,MACT,iDACA,EAAE,MAAO,EACV;IACF;GAEJ,EAAC,CACD,MAAM,CAAC,UAAU;AAChB,eAAW,MACT,uDACA,EAAE,MAAO,EACV;AACD,UAAM;AACN,kBAAc;GACf,EAAC;EACL,WAAU,YAET,eAAc,YAAY,KAAK,MAAM;AACnC,OAAI,IACF,KAAI;AACF,QAAI,WAAW,WAAW,SAAS,YAAY;GAChD,SAAQ,OAAO;AACd,eAAW,MACT,iDACA,EAAE,MAAO,EACV;GACF;EAEJ,EAAC;MAGF,KAAI;AACF,OAAI,WAAW,WAAW,SAAS,YAAY;EAChD,SAAQ,OAAO;AACd,cAAW,MACT,iDACA,EAAE,MAAO,EACV;EACF;CAEJ;AAGD,MAAK,OAAO,WAAW,MAAM;AAC3B,MAAI,KAAK;AACP,OAAI,SAAS;AACb,SAAM;EACP;CACF;AAED,QAAO;AACR"}
1
+ {"version":3,"file":"sink.node.js","names":["record: LogRecord","context: string[]","options: WindowsEventLogSinkOptions","ffi: WindowsEventLogFFI | null","initPromise: Promise<void> | null","sink: Sink & Disposable"],"sources":["../src/sink.node.ts"],"sourcesContent":["import type { LogRecord, Sink } from \"@logtape/logtape\";\nimport { getLogger } from \"@logtape/logtape\";\nimport type { WindowsEventLogSinkOptions } from \"./types.ts\";\nimport {\n DEFAULT_EVENT_ID_MAPPING,\n mapLogLevelToEventType,\n type WindowsEventLogError as _WindowsEventLogError,\n} from \"./types.ts\";\nimport { validateWindowsPlatform } from \"./platform.ts\";\nimport { WindowsEventLogFFI } from \"./ffi.node.ts\";\n\n/**\n * Formats a log record message into a string suitable for Windows Event Log.\n * Combines the template and arguments into a readable message.\n */\nfunction formatMessage(record: LogRecord): string {\n let message = \"\";\n\n // Combine template parts with arguments\n for (let i = 0; i < record.message.length; i++) {\n if (i % 2 === 0) {\n // Template part\n message += record.message[i];\n } else {\n // Argument - serialize it\n const arg = record.message[i];\n if (typeof arg === \"string\") {\n message += arg;\n } else {\n message += JSON.stringify(arg);\n }\n }\n }\n\n return message;\n}\n\n/**\n * Formats additional context information for the log entry.\n * Includes category, properties, and other metadata.\n */\nfunction formatContext(record: LogRecord): string {\n const context: string[] = [];\n\n // Add category if present\n if (record.category && record.category.length > 0) {\n context.push(`Category: ${record.category.join(\".\")}`);\n }\n\n // Add properties if present\n if (record.properties && Object.keys(record.properties).length > 0) {\n context.push(`Properties: ${JSON.stringify(record.properties)}`);\n }\n\n // Add timestamp\n context.push(`Timestamp: ${new Date(record.timestamp).toISOString()}`);\n\n return context.length > 0 ? `\\n\\n${context.join(\"\\n\")}` : \"\";\n}\n\n/**\n * Creates a Windows Event Log sink for Node.js environments using FFI.\n *\n * This implementation uses koffi to call Windows Event Log API directly,\n * providing high performance logging without external dependencies.\n *\n * @param options Configuration options for the sink\n * @returns A LogTape sink that writes to Windows Event Log\n * @throws {WindowsPlatformError} If not running on Windows\n * @throws {WindowsEventLogError} If Event Log operations fail\n *\n * @example\n * ```typescript\n * import { getWindowsEventLogSink } from \"@logtape/windows-eventlog\";\n *\n * const sink = getWindowsEventLogSink({\n * sourceName: \"MyApp\"\n * });\n * ```\n *\n * @since 1.0.0\n */\nexport function getWindowsEventLogSink(\n options: WindowsEventLogSinkOptions,\n): Sink & Disposable {\n // Validate platform early\n validateWindowsPlatform();\n\n const {\n sourceName,\n eventIdMapping = {},\n } = options;\n\n // Merge with default event ID mapping\n const eventIds = { ...DEFAULT_EVENT_ID_MAPPING, ...eventIdMapping };\n\n let ffi: WindowsEventLogFFI | null = null;\n let initPromise: Promise<void> | null = null;\n const metaLogger = getLogger([\"logtape\", \"meta\", \"windows-eventlog\"]);\n\n const sink: Sink & Disposable = (record: LogRecord) => {\n // Format the complete message\n const message = formatMessage(record);\n const context = formatContext(record);\n const fullMessage = message + context;\n\n // Get event type and ID for this log level\n const eventType = mapLogLevelToEventType(record.level);\n const eventId = eventIds[record.level];\n\n // Initialize FFI on first use\n if (!ffi) {\n ffi = new WindowsEventLogFFI(sourceName);\n initPromise = ffi.initialize()\n .then(() => {\n // Write the first event after initialization\n if (ffi) {\n try {\n ffi.writeEvent(eventType, eventId, fullMessage);\n } catch (error) {\n metaLogger.error(\n \"Failed to write to Windows Event Log: {error}\",\n { error },\n );\n }\n }\n })\n .catch((error) => {\n metaLogger.error(\n \"Failed to initialize Windows Event Log FFI: {error}\",\n { error },\n );\n ffi = null; // Reset FFI on error\n initPromise = null;\n });\n } else if (initPromise) {\n // Still initializing - queue the write operation\n initPromise = initPromise.then(() => {\n if (ffi) {\n try {\n ffi.writeEvent(eventType, eventId, fullMessage);\n } catch (error) {\n metaLogger.error(\n \"Failed to write to Windows Event Log: {error}\",\n { error },\n );\n }\n }\n });\n } else {\n // Already initialized\n try {\n ffi.writeEvent(eventType, eventId, fullMessage);\n } catch (error) {\n metaLogger.error(\n \"Failed to write to Windows Event Log: {error}\",\n { error },\n );\n }\n }\n };\n\n // Implement Disposable for cleanup\n sink[Symbol.dispose] = () => {\n if (ffi) {\n ffi.dispose();\n ffi = null;\n }\n };\n\n return sink;\n}\n"],"mappings":";;;;;;;;;;AAeA,SAAS,cAAcA,QAA2B;CAChD,IAAI,UAAU;AAGd,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,IACzC,KAAI,IAAI,MAAM,EAEZ,YAAW,OAAO,QAAQ;MACrB;EAEL,MAAM,MAAM,OAAO,QAAQ;AAC3B,aAAW,QAAQ,SACjB,YAAW;MAEX,YAAW,KAAK,UAAU,IAAI;CAEjC;AAGH,QAAO;AACR;;;;;AAMD,SAAS,cAAcA,QAA2B;CAChD,MAAMC,UAAoB,CAAE;AAG5B,KAAI,OAAO,YAAY,OAAO,SAAS,SAAS,EAC9C,SAAQ,MAAM,YAAY,OAAO,SAAS,KAAK,IAAI,CAAC,EAAE;AAIxD,KAAI,OAAO,cAAc,OAAO,KAAK,OAAO,WAAW,CAAC,SAAS,EAC/D,SAAQ,MAAM,cAAc,KAAK,UAAU,OAAO,WAAW,CAAC,EAAE;AAIlE,SAAQ,MAAM,aAAa,IAAI,KAAK,OAAO,WAAW,aAAa,CAAC,EAAE;AAEtE,QAAO,QAAQ,SAAS,KAAK,MAAM,QAAQ,KAAK,KAAK,CAAC,IAAI;AAC3D;;;;;;;;;;;;;;;;;;;;;;;AAwBD,SAAgB,uBACdC,SACmB;AAEnB,0BAAyB;CAEzB,MAAM,EACJ,YACA,iBAAiB,CAAE,GACpB,GAAG;CAGJ,MAAM,WAAW;EAAE,GAAG;EAA0B,GAAG;CAAgB;CAEnE,IAAIC,MAAiC;CACrC,IAAIC,cAAoC;CACxC,MAAM,aAAa,UAAU;EAAC;EAAW;EAAQ;CAAmB,EAAC;CAErE,MAAMC,OAA0B,CAACL,WAAsB;EAErD,MAAM,UAAU,cAAc,OAAO;EACrC,MAAM,UAAU,cAAc,OAAO;EACrC,MAAM,cAAc,UAAU;EAG9B,MAAM,YAAY,uBAAuB,OAAO,MAAM;EACtD,MAAM,UAAU,SAAS,OAAO;AAGhC,OAAK,KAAK;AACR,SAAM,IAAI,mBAAmB;AAC7B,iBAAc,IAAI,YAAY,CAC3B,KAAK,MAAM;AAEV,QAAI,IACF,KAAI;AACF,SAAI,WAAW,WAAW,SAAS,YAAY;IAChD,SAAQ,OAAO;AACd,gBAAW,MACT,iDACA,EAAE,MAAO,EACV;IACF;GAEJ,EAAC,CACD,MAAM,CAAC,UAAU;AAChB,eAAW,MACT,uDACA,EAAE,MAAO,EACV;AACD,UAAM;AACN,kBAAc;GACf,EAAC;EACL,WAAU,YAET,eAAc,YAAY,KAAK,MAAM;AACnC,OAAI,IACF,KAAI;AACF,QAAI,WAAW,WAAW,SAAS,YAAY;GAChD,SAAQ,OAAO;AACd,eAAW,MACT,iDACA,EAAE,MAAO,EACV;GACF;EAEJ,EAAC;MAGF,KAAI;AACF,OAAI,WAAW,WAAW,SAAS,YAAY;EAChD,SAAQ,OAAO;AACd,cAAW,MACT,iDACA,EAAE,MAAO,EACV;EACF;CAEJ;AAGD,MAAK,OAAO,WAAW,MAAM;AAC3B,MAAI,KAAK;AACP,OAAI,SAAS;AACb,SAAM;EACP;CACF;AAED,QAAO;AACR"}
package/dist/types.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- //#region types.ts
2
+ //#region src/types.ts
3
3
  /**
4
4
  * Default Event ID mapping for LogTape levels.
5
5
  * @since 1.0.0
package/dist/types.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { LogLevel } from "@logtape/logtape";
2
2
 
3
- //#region types.d.ts
3
+ //#region src/types.d.ts
4
4
 
5
5
  /**
6
6
  * Configuration options for the Windows Event Log sink.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.cts","names":[],"sources":["../types.ts"],"sourcesContent":[],"mappings":";;;;;;AAMA;;AAiC2C,UAjC1B,0BAAA,CAiC0B;EAAQ;;AAAhB;AAyDnC;AAeA;;EAAkC,SACK,UAAA,EAAA,MAAA;EAAK;AADG;;;;;;;;;;;;;;;;;;;;;;4BAxEnB,QAAQ,OAAO;;;;;;;;;;;;cAyD9B,oBAAA,SAA6B,KAAK;;;;;;;cAelC,oBAAA,SAA6B,KAAA;uCACH"}
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;;;AAMA;;AAiC2C,UAjC1B,0BAAA,CAiC0B;EAAQ;;AAAhB;AAyDnC;AAeA;;EAAkC,SACK,UAAA,EAAA,MAAA;EAAK;AADG;;;;;;;;;;;;;;;;;;;;;;4BAxEnB,QAAQ,OAAO;;;;;;;;;;;;cAyD9B,oBAAA,SAA6B,KAAK;;;;;;;cAelC,oBAAA,SAA6B,KAAA;uCACH"}
package/dist/types.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { LogLevel } from "@logtape/logtape";
2
2
 
3
- //#region types.d.ts
3
+ //#region src/types.d.ts
4
4
 
5
5
  /**
6
6
  * Configuration options for the Windows Event Log sink.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../types.ts"],"sourcesContent":[],"mappings":";;;;;;AAMA;;AAiC2C,UAjC1B,0BAAA,CAiC0B;EAAQ;;AAAhB;AAyDnC;AAeA;;EAAkC,SACK,UAAA,EAAA,MAAA;EAAK;AADG;;;;;;;;;;;;;;;;;;;;;;4BAxEnB,QAAQ,OAAO;;;;;;;;;;;;cAyD9B,oBAAA,SAA6B,KAAK;;;;;;;cAelC,oBAAA,SAA6B,KAAA;uCACH"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;;;AAMA;;AAiC2C,UAjC1B,0BAAA,CAiC0B;EAAQ;;AAAhB;AAyDnC;AAeA;;EAAkC,SACK,UAAA,EAAA,MAAA;EAAK;AADG;;;;;;;;;;;;;;;;;;;;;;4BAxEnB,QAAQ,OAAO;;;;;;;;;;;;cAyD9B,oBAAA,SAA6B,KAAK;;;;;;;cAelC,oBAAA,SAA6B,KAAA;uCACH"}
package/dist/types.js CHANGED
@@ -1,4 +1,4 @@
1
- //#region types.ts
1
+ //#region src/types.ts
2
2
  /**
3
3
  * Default Event ID mapping for LogTape levels.
4
4
  * @since 1.0.0
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":["DEFAULT_EVENT_ID_MAPPING: Record<LogLevel, number>","level: LogLevel","platform: string","message: string","cause?: Error"],"sources":["../types.ts"],"sourcesContent":["import type { LogLevel } from \"@logtape/logtape\";\n\n/**\n * Configuration options for the Windows Event Log sink.\n * @since 1.0.0\n */\nexport interface WindowsEventLogSinkOptions {\n /**\n * The name of the event source. This is typically your application name\n * and will appear as the \"Source\" in Windows Event Viewer.\n *\n * @example \"MyApplication\"\n */\n readonly sourceName: string;\n\n /**\n * The server name to write logs to. Use this for remote logging.\n *\n * @default undefined (local machine)\n */\n readonly serverName?: string;\n\n /**\n * Custom mapping of LogTape log levels to Windows Event IDs.\n * Event IDs are numeric identifiers that can be used for filtering\n * and automation in Windows Event Log.\n *\n * @default\n * ```typescript\n * {\n * fatal: 1,\n * error: 2,\n * warning: 3,\n * info: 4,\n * debug: 5,\n * trace: 6\n * }\n * ```\n */\n readonly eventIdMapping?: Partial<Record<LogLevel, number>>;\n}\n\n/**\n * Windows Event Log entry types mapped to LogTape levels.\n * These correspond to the event types visible in Windows Event Viewer.\n * @since 1.0.0\n */\nexport const WINDOWS_EVENT_TYPES: Record<LogLevel, number> = {\n fatal: 1, // Error\n error: 1, // Error\n warning: 2, // Warning\n info: 4, // Information\n debug: 4, // Information\n trace: 4, // Information\n} as const;\n\n/**\n * Default Event ID mapping for LogTape levels.\n * @since 1.0.0\n */\nexport const DEFAULT_EVENT_ID_MAPPING: Record<LogLevel, number> = {\n fatal: 1,\n error: 2,\n warning: 3,\n info: 4,\n debug: 5,\n trace: 6,\n} as const;\n\n/**\n * Windows Event Log event type constants\n */\nexport type EventType = 1 | 2 | 4; // Error, Warning, Information\n\n/**\n * Maps LogTape log levels to Windows Event Log event types\n */\nexport function mapLogLevelToEventType(level: LogLevel): EventType {\n switch (level) {\n case \"fatal\":\n case \"error\":\n return 1; // EVENTLOG_ERROR_TYPE\n case \"warning\":\n return 2; // EVENTLOG_WARNING_TYPE\n case \"info\":\n case \"debug\":\n case \"trace\":\n default:\n return 4; // EVENTLOG_INFORMATION_TYPE\n }\n}\n\n/**\n * Platform validation error thrown when trying to use the sink on non-Windows platforms.\n * @since 1.0.0\n */\nexport class WindowsPlatformError extends Error {\n constructor(platform: string) {\n super(\n `Windows Event Log sink can only be used on Windows platforms. ` +\n `Current platform: ${platform}. ` +\n `This package is designed specifically for Windows Event Log integration.`,\n );\n this.name = \"WindowsPlatformError\";\n }\n}\n\n/**\n * Error thrown when Windows Event Log operations fail.\n * @since 1.0.0\n */\nexport class WindowsEventLogError extends Error {\n constructor(message: string, cause?: Error) {\n super(`Windows Event Log error: ${message}`);\n this.name = \"WindowsEventLogError\";\n if (cause) {\n this.cause = cause;\n }\n }\n}\n"],"mappings":";;;;;AA4DA,MAAaA,2BAAqD;CAChE,OAAO;CACP,OAAO;CACP,SAAS;CACT,MAAM;CACN,OAAO;CACP,OAAO;AACR;;;;AAUD,SAAgB,uBAAuBC,OAA4B;AACjE,SAAQ,OAAR;EACE,KAAK;EACL,KAAK,QACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,QACE,QAAO;CACV;AACF;;;;;AAMD,IAAa,uBAAb,cAA0C,MAAM;CAC9C,YAAYC,UAAkB;AAC5B,SACG,kFACsB,SAAS,4EAEjC;AACD,OAAK,OAAO;CACb;AACF;;;;;AAMD,IAAa,uBAAb,cAA0C,MAAM;CAC9C,YAAYC,SAAiBC,OAAe;AAC1C,SAAO,2BAA2B,QAAQ,EAAE;AAC5C,OAAK,OAAO;AACZ,MAAI,MACF,MAAK,QAAQ;CAEhB;AACF"}
1
+ {"version":3,"file":"types.js","names":["DEFAULT_EVENT_ID_MAPPING: Record<LogLevel, number>","level: LogLevel","platform: string","message: string","cause?: Error"],"sources":["../src/types.ts"],"sourcesContent":["import type { LogLevel } from \"@logtape/logtape\";\n\n/**\n * Configuration options for the Windows Event Log sink.\n * @since 1.0.0\n */\nexport interface WindowsEventLogSinkOptions {\n /**\n * The name of the event source. This is typically your application name\n * and will appear as the \"Source\" in Windows Event Viewer.\n *\n * @example \"MyApplication\"\n */\n readonly sourceName: string;\n\n /**\n * The server name to write logs to. Use this for remote logging.\n *\n * @default undefined (local machine)\n */\n readonly serverName?: string;\n\n /**\n * Custom mapping of LogTape log levels to Windows Event IDs.\n * Event IDs are numeric identifiers that can be used for filtering\n * and automation in Windows Event Log.\n *\n * @default\n * ```typescript\n * {\n * fatal: 1,\n * error: 2,\n * warning: 3,\n * info: 4,\n * debug: 5,\n * trace: 6\n * }\n * ```\n */\n readonly eventIdMapping?: Partial<Record<LogLevel, number>>;\n}\n\n/**\n * Windows Event Log entry types mapped to LogTape levels.\n * These correspond to the event types visible in Windows Event Viewer.\n * @since 1.0.0\n */\nexport const WINDOWS_EVENT_TYPES: Record<LogLevel, number> = {\n fatal: 1, // Error\n error: 1, // Error\n warning: 2, // Warning\n info: 4, // Information\n debug: 4, // Information\n trace: 4, // Information\n} as const;\n\n/**\n * Default Event ID mapping for LogTape levels.\n * @since 1.0.0\n */\nexport const DEFAULT_EVENT_ID_MAPPING: Record<LogLevel, number> = {\n fatal: 1,\n error: 2,\n warning: 3,\n info: 4,\n debug: 5,\n trace: 6,\n} as const;\n\n/**\n * Windows Event Log event type constants\n */\nexport type EventType = 1 | 2 | 4; // Error, Warning, Information\n\n/**\n * Maps LogTape log levels to Windows Event Log event types\n */\nexport function mapLogLevelToEventType(level: LogLevel): EventType {\n switch (level) {\n case \"fatal\":\n case \"error\":\n return 1; // EVENTLOG_ERROR_TYPE\n case \"warning\":\n return 2; // EVENTLOG_WARNING_TYPE\n case \"info\":\n case \"debug\":\n case \"trace\":\n default:\n return 4; // EVENTLOG_INFORMATION_TYPE\n }\n}\n\n/**\n * Platform validation error thrown when trying to use the sink on non-Windows platforms.\n * @since 1.0.0\n */\nexport class WindowsPlatformError extends Error {\n constructor(platform: string) {\n super(\n `Windows Event Log sink can only be used on Windows platforms. ` +\n `Current platform: ${platform}. ` +\n `This package is designed specifically for Windows Event Log integration.`,\n );\n this.name = \"WindowsPlatformError\";\n }\n}\n\n/**\n * Error thrown when Windows Event Log operations fail.\n * @since 1.0.0\n */\nexport class WindowsEventLogError extends Error {\n constructor(message: string, cause?: Error) {\n super(`Windows Event Log error: ${message}`);\n this.name = \"WindowsEventLogError\";\n if (cause) {\n this.cause = cause;\n }\n }\n}\n"],"mappings":";;;;;AA4DA,MAAaA,2BAAqD;CAChE,OAAO;CACP,OAAO;CACP,SAAS;CACT,MAAM;CACN,OAAO;CACP,OAAO;AACR;;;;AAUD,SAAgB,uBAAuBC,OAA4B;AACjE,SAAQ,OAAR;EACE,KAAK;EACL,KAAK,QACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,QACE,QAAO;CACV;AACF;;;;;AAMD,IAAa,uBAAb,cAA0C,MAAM;CAC9C,YAAYC,UAAkB;AAC5B,SACG,kFACsB,SAAS,4EAEjC;AACD,OAAK,OAAO;CACb;AACF;;;;;AAMD,IAAa,uBAAb,cAA0C,MAAM;CAC9C,YAAYC,SAAiBC,OAAe;AAC1C,SAAO,2BAA2B,QAAQ,EAAE;AAC5C,OAAK,OAAO;AACZ,MAAI,MACF,MAAK,QAAQ;CAEhB;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logtape/windows-eventlog",
3
- "version": "1.1.0-dev.321+fda84317",
3
+ "version": "1.1.0-dev.323+146f8194",
4
4
  "description": "Windows Event Log sink for LogTape",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -14,7 +14,7 @@
14
14
  "repository": {
15
15
  "type": "git",
16
16
  "url": "https://github.com/dahlia/logtape.git",
17
- "directory": "windows-eventlog"
17
+ "directory": "packages/windows-eventlog"
18
18
  },
19
19
  "bugs": "https://github.com/dahlia/logtape/issues",
20
20
  "author": {
@@ -57,7 +57,7 @@
57
57
  "dist/"
58
58
  ],
59
59
  "peerDependencies": {
60
- "@logtape/logtape": "1.1.0-dev.321+fda84317"
60
+ "@logtape/logtape": "1.1.0-dev.323+146f8194"
61
61
  },
62
62
  "dependencies": {
63
63
  "koffi": "^2.10.0"