{"_id":"@astraive/loza","_rev":"6-33ef44d81ebe96460d8a2988cbefd477","name":"@astraive/loza","dist-tags":{"latest":"0.4.1"},"versions":{"0.2.6":{"name":"@astraive/loza","version":"0.2.6","keywords":["loza","wide-event","observability","structured-logging"],"license":"MIT","_id":"@astraive/loza@0.2.6","maintainers":[{"name":"neerajcodz","email":"neerajcodz@gmail.com"}],"dist":{"shasum":"fe049679cfb03bbbe55fed5d5bfe0cfb279bf2a4","tarball":"https://registry.npmjs.org/@astraive/loza/-/loza-0.2.6.tgz","fileCount":146,"integrity":"sha512-jLtA4UGq1iVD4QImRD/QpTELqLDC4sGCKHt2IS1BO0zAzpUTekwEIu2GYRLnzYK/5YOL0SYGu2lXvOTgyRLmsA==","signatures":[{"sig":"MEUCIC+c61PEHRUNP9PWVQv6yCeuB99ZqpfKihY5QIo5saRzAiEA/KkfWjTtJFPdItiB/g6n2dIjvNNovUgxnnBHzpon79Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":551423},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":"./dist/index.js","./middleware/koa":"./dist/middleware/koa.js","./middleware/hono":"./dist/middleware/hono.js","./middleware/http":"./dist/middleware/http.js","./middleware/next":"./dist/middleware/next.js","./middleware/express":"./dist/middleware/express.js","./middleware/fastify":"./dist/middleware/fastify.js"},"gitHead":"232ebfa97af26cc9e1c6a76cc5c13faa5f69be05","scripts":{"lint":"tsc --noEmit","test":"node scripts/run-node-tests.mjs","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neerajcodz","email":"neerajcodz@gmail.com"},"_npmVersion":"11.17.0","description":"LOZA wide-event SDK for JavaScript/TypeScript — lightweight bridge connector to loza-collector","directories":{},"_nodeVersion":"26.5.1","_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.7","typescript":"^6.0.3","@types/node":"^25.9.1"},"_npmOperationalInternal":{"tmp":"tmp/loza_0.2.6_1786373190550_0.6942063932673856","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@astraive/loza","version":"0.3.2","keywords":["loza","wide-event","observability","structured-logging"],"license":"MIT","_id":"@astraive/loza@0.3.2","maintainers":[{"name":"neerajcodz","email":"neerajcodz@gmail.com"}],"dist":{"shasum":"9194c758a4bad04ae2fd0caa40697fbb4e012bb1","tarball":"https://registry.npmjs.org/@astraive/loza/-/loza-0.3.2.tgz","fileCount":142,"integrity":"sha512-rRlfl2C4YlWD9uiBPhm4pveZGu1VMdep8IdsT7usnVKRPy9XNUGfKpT4Ux8ZycUdMKOCI83kS5HJNrIjH/A0iQ==","signatures":[{"sig":"MEUCIQD/boBLXG947UOHXWf0PF4T3va9845N1zomBWGuwrWlfgIgd7iTBp/fXhjbls/TrvhgKFGa5GNRCcml3q9YhK6yzww=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHjy4196xs7aDB3JO71P5LoA/Bk/bNDwoFyfdSqGHOkIAiBG2Uu2ft4CXjiyKDg5o56BOBAwNLvd5ytQd/IGIiFn0Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":550480},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":"./dist/index.js","./middleware/koa":"./dist/middleware/koa.js","./middleware/hono":"./dist/middleware/hono.js","./middleware/http":"./dist/middleware/http.js","./middleware/next":"./dist/middleware/next.js","./middleware/express":"./dist/middleware/express.js","./middleware/fastify":"./dist/middleware/fastify.js"},"gitHead":"f059015a2e0cd309489ddca03a58dc1897e0e36a","scripts":{"lint":"tsc --noEmit","test":"bun test tests","build":"tsc","coverage":"vitest run --coverage","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neerajcodz","email":"neerajcodz@gmail.com"},"_npmVersion":"12.0.2","description":"LOZA wide-event SDK for JavaScript/TypeScript — lightweight bridge connector to loza-collector","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"packageManager":"bun@1.3.14","devDependencies":{"vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@vitest/coverage-v8":"4.1.10"},"_npmOperationalInternal":{"tmp":"tmp/loza_0.3.2_1787642313733_0.03019641657589478","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@astraive/loza","version":"0.3.3","keywords":["loza","wide-event","observability","structured-logging"],"license":"MIT","_id":"@astraive/loza@0.3.3","maintainers":[{"name":"neerajcodz","email":"neerajcodz@gmail.com"}],"dist":{"shasum":"0b002ac4003dc415d6e8b2c47d067806cf4695b6","tarball":"https://registry.npmjs.org/@astraive/loza/-/loza-0.3.3.tgz","fileCount":142,"integrity":"sha512-PfE1Oh7h5ZOCuNwUuIgnn9r1xKnUXQm5O0q/xMXRTvzMxI0kcmQYyt/vpxb4AJKpZzSnncJN67T6qXVHHv6V7g==","signatures":[{"sig":"MEYCIQCrdPP4lqyUDqat/9rJKEyqTFBuyMKBsIL29JGWEPNQmAIhAIqXZR7/R8WZNxNEmJ3rTJYhGAHllqYGy1PnL5Qp3Iia","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCW6Zz7ZwvZ2q+V8K/LjN67gmTtiU+EJybWsNQqS9X4CQIgfCbG9f+dBbuOnYyUXpVSgJft+qLGDRG3q4qEMvTOaVc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":550480},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":"./dist/index.js","./middleware/koa":"./dist/middleware/koa.js","./middleware/hono":"./dist/middleware/hono.js","./middleware/http":"./dist/middleware/http.js","./middleware/next":"./dist/middleware/next.js","./middleware/express":"./dist/middleware/express.js","./middleware/fastify":"./dist/middleware/fastify.js"},"gitHead":"300b54671b42b1341251ca0b470f2ae9949f89f8","scripts":{"lint":"tsc --noEmit","test":"bun test tests","build":"tsc","coverage":"vitest run --coverage","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neerajcodz","email":"neerajcodz@gmail.com"},"_npmVersion":"12.0.2","description":"LOZA wide-event SDK for JavaScript/TypeScript — lightweight bridge connector to loza-collector","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"packageManager":"bun@1.3.14","devDependencies":{"vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@vitest/coverage-v8":"4.1.10"},"_npmOperationalInternal":{"tmp":"tmp/loza_0.3.3_1787689781849_0.7785831147786864","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@astraive/loza","version":"0.3.4","keywords":["loza","wide-event","observability","structured-logging"],"license":"MIT","_id":"@astraive/loza@0.3.4","maintainers":[{"name":"neerajcodz","email":"neerajcodz@gmail.com"}],"dist":{"shasum":"6a03f48cfd445cec878befe38cfd6efd6eed88c9","tarball":"https://registry.npmjs.org/@astraive/loza/-/loza-0.3.4.tgz","fileCount":142,"integrity":"sha512-NQ7r02PkOUDa2WLH303lu/K/ZHKbxYndlWc6/eAnGG6VJ4sNT1NB7AnyrsPjB/P6dvHHhXA86CiF78Z4vYEGOQ==","signatures":[{"sig":"MEUCIQCBPnUCALpJ913ykhOj5easV2kZsELMlX8zys6STLrhEgIgHo7Mk9G3rQLNcGVHd4GC/Xb25d2ihmVq8pud/tbfSRE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCVfYp3elWHA2FqTOHsFyc+vNeDkUEpYL4QXwYgLBgg9QIgTEO/zgymr0ZiVnD7HRFEG9JVctrHwHKUs2JiGWtYQzs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":550480},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":"./dist/index.js","./middleware/koa":"./dist/middleware/koa.js","./middleware/hono":"./dist/middleware/hono.js","./middleware/http":"./dist/middleware/http.js","./middleware/next":"./dist/middleware/next.js","./middleware/express":"./dist/middleware/express.js","./middleware/fastify":"./dist/middleware/fastify.js"},"gitHead":"c56d0d0562b0da4c1360629b9e69d690370f4bf6","scripts":{"lint":"tsc --noEmit","test":"bun test tests","build":"tsc","coverage":"vitest run --coverage","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neerajcodz","email":"neerajcodz@gmail.com"},"_npmVersion":"12.0.2","description":"LOZA wide-event SDK for JavaScript/TypeScript — lightweight bridge connector to loza-collector","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"packageManager":"bun@1.3.14","devDependencies":{"vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@vitest/coverage-v8":"4.1.10"},"_npmOperationalInternal":{"tmp":"tmp/loza_0.3.4_1787756195139_0.14444795083771722","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@astraive/loza","version":"0.4.0","keywords":["loza","wide-event","observability","structured-logging"],"license":"MIT","_id":"@astraive/loza@0.4.0","maintainers":[{"name":"neerajcodz","email":"neerajcodz@gmail.com"}],"dist":{"shasum":"4f06da8996e313163dda637e85dfcceba95db152","tarball":"https://registry.npmjs.org/@astraive/loza/-/loza-0.4.0.tgz","fileCount":142,"integrity":"sha512-quEG6/34veUmvz3pBwIpLnSpnCHulEb2HEbBJe3rA7HrKcc6wL0l0zmmXBMBJd8B/0rxujeeyl4Xg9aIvaOxWA==","signatures":[{"sig":"MEUCIQCGbOsWqFgNcjS3xjn+xhSoog0Gx96AlcAzUIkW3puLXAIgVJFsaXmXSdUqZflGDdPb8KzqmtRDqLdZaO2xaRfdpKs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC9ID6N5u4NQWqazaUhDNakkasafjSuH5XF72QE75NwjgIgagQxCshFS0OUcSMln3pjga7GhZsQmTW8g9OmVNplPBs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":550480},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":"./dist/index.js","./middleware/koa":"./dist/middleware/koa.js","./middleware/hono":"./dist/middleware/hono.js","./middleware/http":"./dist/middleware/http.js","./middleware/next":"./dist/middleware/next.js","./middleware/express":"./dist/middleware/express.js","./middleware/fastify":"./dist/middleware/fastify.js"},"gitHead":"467f41d5ec0eef517e8246dd3b91068d066ed740","scripts":{"lint":"tsc --noEmit","test":"bun test tests","build":"tsc","coverage":"vitest run --coverage","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neerajcodz","email":"neerajcodz@gmail.com"},"_npmVersion":"12.0.2","description":"LOZA wide-event SDK for JavaScript/TypeScript — lightweight bridge connector to loza-collector","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"packageManager":"bun@1.3.14","devDependencies":{"vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@vitest/coverage-v8":"4.1.10"},"_npmOperationalInternal":{"tmp":"tmp/loza_0.4.0_1787813082914_0.9329371708498386","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"_id":"@astraive/loza@0.4.1","dist":{"shasum":"864aadd15d3d1c44e3ebc5478cf22a6efeb40948","tarball":"https://registry.npmjs.org/@astraive/loza/-/loza-0.4.1.tgz","fileCount":142,"integrity":"sha512-oTLbrGpgPoEzLC7y/HNhtq33xqYa49JfWxFDpCqC5mWgWFWrDv9IuBM1Qpf/TpQ6E+bSGWaLetJvOk3guYX0Mg==","signatures":[{"sig":"MEUCIBcD5lVrMLFvmtP4du/mh+XNXVp5VqfDUks1FRM9quTqAiEA6MQWhlTryO6FEPq0TC5JgxoXKri+K0KrT9jFZYUw2Jk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFU1UyP/x+aZzvqz/bODEEEL2eZ+GD1JCC7Rs2X7gMfdAiBRZti/zG42VDlzjWdQckoeqjk5jPJBFN/3h4DdIjp28g=="}],"unpackedSize":550480},"main":"dist/index.js","name":"@astraive/loza","type":"module","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":"./dist/index.js","./middleware/koa":"./dist/middleware/koa.js","./middleware/hono":"./dist/middleware/hono.js","./middleware/http":"./dist/middleware/http.js","./middleware/next":"./dist/middleware/next.js","./middleware/express":"./dist/middleware/express.js","./middleware/fastify":"./dist/middleware/fastify.js"},"gitHead":"ee5583cbaa451209260233fd867691dc7ca52e53","license":"MIT","scripts":{"lint":"tsc --noEmit","test":"bun test tests","build":"tsc","coverage":"vitest run --coverage","typecheck":"tsc --noEmit"},"version":"0.4.1","_npmUser":{"name":"neerajcodz","email":"neerajcodz@gmail.com"},"keywords":["loza","wide-event","observability","structured-logging"],"_npmVersion":"12.0.2","description":"LOZA wide-event SDK for JavaScript/TypeScript — lightweight bridge connector to loza-collector","directories":{},"maintainers":[{"name":"neerajcodz","email":"neerajcodz@gmail.com"}],"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"packageManager":"bun@1.3.14","devDependencies":{"vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@vitest/coverage-v8":"4.1.10"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/loza_0.4.1_1787820061821_0.6778515288544784"}}},"time":{"created":"2026-08-10T14:46:30.154Z","modified":"2026-08-27T08:41:02.218Z","0.2.6":"2026-08-10T14:46:30.758Z","0.3.2":"2026-08-25T07:18:33.823Z","0.3.3":"2026-08-25T20:29:41.957Z","0.3.4":"2026-08-26T14:56:35.234Z","0.4.0":"2026-08-27T06:44:43.017Z","0.4.1":"2026-08-27T08:41:01.928Z"},"license":"MIT","keywords":["loza","wide-event","observability","structured-logging"],"description":"LOZA wide-event SDK for JavaScript/TypeScript — lightweight bridge connector to loza-collector","maintainers":[{"name":"neerajcodz","email":"neerajcodz@gmail.com"}],"readme":"# loza\n\nLOZA wide-event SDK for JavaScript/TypeScript — lightweight bridge connector to loza-collector.\n\n**Status**: STABLE (v0.4.0) - Production-ready, full feature conformance\n\n## Installation\n\n```bash\nnpm install @astraive/loza\n```\n\n## Quick Start\n\n```typescript\nimport { loza } from '@astraive/loza';\n\n// Configure\nloza.configure(\n  loza.production('checkout')\n    .withCollectorEndpoint('http://localhost:9308')\n);\n\n// Lifecycle\nconst ctx = loza.startEvent({\n  event: 'checkout.request',\n  kind: 'http',\n  method: 'POST',\n  path: '/checkout',\n});\n\nloza.append(ctx,\n  loza.userId('u_123'),\n  loza.cartId('cart_456'),\n  loza.featureFlag('checkout_v2', 'on'),\n);\n\nloza.checkpoint(ctx, 'payment_started');\n\ntry {\n  loza.finish(ctx, 'success', loza.int('status_code', 200));\n} catch (err) {\n  loza.finishError(ctx, err, loza.retryable(true));\n} finally {\n  await loza.emit(ctx);\n}\n\nawait loza.shutdown();\n```\n\n## Core Lifecycle API\n\nThe main flow: `startEvent` -> `enrich` -> `checkpoint` -> `finish`/`finishError` -> `emit`\n\n```typescript\nimport {\n  startEvent, startHttpEvent, startJobEvent, startQueueEvent,\n  startCliEvent, startCronEvent,\n  append, enrich, set, merge, del, get, getGroup,\n  checkpoint, finish, finishError, emit, flush, shutdown,\n} from '@astraive/loza';\n\n// Start an event\nconst ctx = startEvent({\n  event: 'checkout.request',\n  kind: 'http',\n  method: 'POST',\n  path: '/checkout',\n  service: 'checkout',\n});\n\n// Typed starters\nconst httpCtx = startHttpEvent({ event: 'http.request', method: 'GET', path: '/health' });\nconst jobCtx = startJobEvent({ event: 'job.send_email' });\nconst queueCtx = startQueueEvent({ event: 'queue.process' });\nconst cliCtx = startCliEvent({ event: 'cli.run' });\nconst cronCtx = startCronEvent({ event: 'cron.tick' });\n\n// Enrich (add attributes)\nenrich(ctx, string('user.id', 'u_123'), int('cart.items', 3));\n\n// Append (alias for enrich)\nappend(ctx, string('key', 'value'));\n\n// Set (override)\nset(ctx, 'status', 'processing');\n\n// Merge into group\nmerge(ctx, { payment: { provider: 'stripe', attempt: 1 } });\n\n// Delete\ndel(ctx, 'temp_field');\n\n// Get\nconst val = get(ctx, 'user.id');\nconst group = getGroup(ctx, 'payment');\n\n// Checkpoint\ncheckpoint(ctx, 'payment_started');\ncheckpoint(ctx, 'payment_finished', { provider: 'stripe' });\n\n// Finish\nfinish(ctx, 'success', int('status_code', 200));\n\n// Finish with error\ntry {\n  processPayment();\n} catch (err) {\n  finishError(ctx, err, int('status_code', 500));\n}\n\n// Emit\nawait emit(ctx);\n\n// Flush\nawait flush();\n\n// Shutdown\nawait shutdown();\n```\n\n## Attribute Constructors\n\n```typescript\nimport {\n  string, int, int64, uint64, float64, bool, time, duration, any, group, nullAttr,\n  String, Int, Int64, Uint64, Float64, Bool, Time, Duration, Any, Group, Null,\n} from '@astraive/loza';\n\nenrich(ctx,\n  string('user.id', 'u_123'),\n  int('cart.items', 3),\n  int64('big_number', 9999999999),\n  float64('price', 49.99),\n  bool('premium', true),\n  duration('timeout', 30000),\n  any('metadata', { key: 'value' }),\n  nullAttr('optional_field'),\n);\n\n// Groups (nested objects)\nenrich(ctx,\n  group('user',\n    string('id', 'u_123'),\n    string('email', 'user@example.com'),\n  ),\n  group('payment',\n    string('provider', 'stripe'),\n    int('attempt', 1),\n  ),\n);\n```\n\nBoth camelCase and PascalCase are exported. Use whichever fits your style.\n\n## Canonical Helpers\n\n```typescript\nimport {\n  userId, tenantId, workspaceId, organizationId, sessionId,\n  requestId, traceId, spanId,\n  featureFlag, featureFlagBool, experiment,\n  // PascalCase aliases:\n  UserID, TenantID, RequestID, TraceID, FeatureFlag, Experiment,\n} from '@astraive/loza';\n\nenrich(ctx,\n  userId('u_123'),\n  tenantId('t_456'),\n  workspaceId('w_789'),\n  organizationId('org_abc'),\n  sessionId('sess_xyz'),\n  requestId('req_123'),\n  traceId('trace_abc'),\n  spanId('span_def'),\n  featureFlag('checkout_v2', 'enabled'),\n  featureFlagBool('new_ui', true),\n  experiment('pricing_test', 'variant_b'),\n);\n```\n\n## Business/Domain Helpers\n\n```typescript\nimport {\n  orderId, cartId, productId, customerId,\n  plan, currency, amount, country, device, platform, appVersion,\n} from '@astraive/loza';\n\nenrich(ctx,\n  orderId('ord_123'),\n  cartId('cart_456'),\n  productId('prod_789'),\n  customerId('cust_abc'),\n  plan('pro'),\n  currency('INR'),\n  amount(4999),\n  country('IN'),\n  device('mobile'),\n  platform('ios'),\n  appVersion('2.1.0'),\n);\n```\n\n## Error Helpers\n\n```typescript\nimport {\n  errorType, errorCode, errorMessage, errorStack, retryable,\n} from '@astraive/loza';\n\ntry {\n  process();\n} catch (err) {\n  finishError(ctx, err,\n    errorType('ValidationError'),\n    errorCode('INVALID_INPUT'),\n    retryable(false),\n  );\n}\n```\n\n## Immediate Logs\n\nOne-shot events without requiring `startEvent`:\n\n```typescript\nimport { loza } from '@astraive/loza';\n\nawait loza.info('worker started', loza.string('queue', 'emails'));\nawait loza.error('payment failed', loza.string('provider', 'stripe'));\n```\n\n## Logger Instances\n\n```typescript\nimport { loza, createLoza } from '@astraive/loza';\n\n// Default API — configure once, use everywhere\nloza.configure(loza.production('checkout').withCollectorEndpoint('http://127.0.0.1:9308'));\nloza.info('server started');\n\n// Custom instance\nconst logger = createLoza({ service: 'checkout-api', collectorUrl: 'http://127.0.0.1:9308' });\nlogger.info('custom instance ready');\n\n// Alias -- same config, loza.alias metadata\nconst audit = loza.alias('audit-service');\naudit.info('audit trail started');\n\n// Presets\nconst cfg = loza.dev('checkout');       // pretty JSON, stdout, sync, debug level\nconst cfg2 = loza.production('checkout'); // compact JSON, stdout, async, info level\nconst cfg3 = loza.test('checkout');       // sync, no sinks, debug level\n\n// Instance methods\nconst ctx = logger.startEvent({ event: 'checkout.request' });\nlogger.enrich(ctx, loza.string('key', 'value'));\nlogger.finish(ctx, 'success');\nawait logger.emit(ctx);\nawait logger.flush();\nawait logger.shutdown();\n\n// Immediate logs\nawait logger.info('started');\nawait logger.error('failed');\n```\n\n## Config API\n\n```typescript\nimport {\n  production, dev, test,\n  stdoutSink, fileSink, memorySink, httpBatchSink,\n  sampleAll, sampleErrors, sampleRandom, sampleSlowRequests,\n  defaultRedactor, redactKeys, hashKeys, dropKeys,\n} from '@astraive/loza';\n\nconst cfg = production('checkout')\n  .withVersion('0.0.2')\n  .withEnvironment('prod')\n  .withSink(stdoutSink())\n  .withSampler(sampleErrors())\n  .withRedactor(defaultRedactor())\n  .withAsync(true);\n```\n\n## Levels\n\n```typescript\nimport { LevelDebug, LevelInfo, LevelWarn, LevelError, LevelFatal, parseLevel } from '@astraive/loza';\n\nconst level = parseLevel('info'); // LevelInfo\n```\n\n## Sinks\n\n```typescript\nimport {\n  stdoutSink, stderrSink, fileSink, memorySink, noopSink, httpBatchSink,\n} from '@astraive/loza';\n\nconst cfg = production('checkout').withSink(stdoutSink());\nconst cfg2 = production('checkout').withSink(fileSink('/var/log/app.log'));\nconst cfg3 = production('checkout').withSink(httpBatchSink({\n  endpoint: 'http://collector:9308/events',\n}));\n\n// For testing\nconst sink = memorySink();\nconst logger = createLoza({ service: 'checkout', sink });\n// ... use logger ...\nconst events = sink.getEvents();\n```\n\n## Sampling\n\n```typescript\nimport {\n  sampleAll, sampleNone, sampleRandom, sampleErrors,\n  sampleSlowRequests, sampleStatusCodes, sampleRoutes,\n  sampleUsers, sampleTenants, sampleFeatureFlag,\n  sampleRateLimited, sampleByHeader,\n  anySampler, allSampler, notSampler,\n} from '@astraive/loza';\n\nconst cfg = production('checkout').withSampler(sampleAll());\nconst cfg2 = production('checkout').withSampler(sampleRandom(0.01));\nconst cfg3 = production('checkout').withSampler(sampleErrors());\nconst cfg4 = production('checkout').withSampler(sampleSlowRequests(500));\nconst cfg5 = production('checkout').withSampler(sampleStatusCodes(500, 502, 503));\nconst cfg6 = production('checkout').withSampler(sampleRateLimited(100, 1000));\n\n// Combinators\nconst cfg7 = production('checkout').withSampler(\n  anySampler(\n    sampleErrors(),\n    sampleSlowRequests(500),\n    sampleRandom(0.01),\n  )\n);\n```\n\n## Redaction\n\n```typescript\nimport {\n  defaultRedactor, redactKeys, redactPatterns, hashKeys, maskKeys, dropKeys,\n  composeRedactors, sensitiveString, markSensitive, hashString,\n} from '@astraive/loza';\n\nconst cfg = production('checkout').withRedactor(defaultRedactor());\nconst cfg2 = production('checkout').withRedactor(redactKeys('password', 'token'));\nconst cfg3 = production('checkout').withRedactor(hashKeys('user.email'));\n\n// Compose\nconst cfg4 = production('checkout').withRedactor(\n  composeRedactors(\n    defaultRedactor(),\n    redactKeys('password', 'token'),\n    hashKeys('user.email'),\n  )\n);\n\n// Mark fields\nenrich(ctx,\n  sensitiveString('user.email', email),\n  markSensitive('credit_card', cardNo),\n  hashString('user.ssn', ssn),\n);\n```\n\n## Schema\n\n```typescript\nimport {\n  defaultSchema, flatSchema, nestedSchema, otelLogSchema, ecSchema,\n  datadogSchema, customSchema,\n} from '@astraive/loza';\n\nconst cfg = production('checkout').withSchema(defaultSchema());\nconst cfg2 = production('checkout').withSchema(flatSchema());\nconst cfg3 = production('checkout').withSchema(otelLogSchema());\n\n// Custom schema\nconst cfg4 = production('checkout').withSchema(\n  customSchema((ev) => ({\n    ts: ev.timestamp(),\n    service: ev.service(),\n    requestId: ev.requestId(),\n    took: ev.durationMs(),\n    fields: ev.attrs(),\n  }))\n);\n```\n\n## Duplicate Policy\n\n```typescript\nimport {\n  CanonicalWins, UserWins, FirstWins, LastWins, KeepBoth, ErrorOnDuplicate,\n} from '@astraive/loza';\n\nconst cfg = production('checkout').withDuplicatePolicy(CanonicalWins);\nconst cfg2 = production('checkout').withDuplicatePolicy(LastWins);\n```\n\n## Context Mutation\n\n```typescript\nimport { append, enrich, set, merge, del, get, getGroup } from '@astraive/loza';\n\nappend(ctx, string('user.id', 'u_123'), string('cart.id', 'cart_456'));\nenrich(ctx, int('payment.attempt', 1));\nset(ctx, 'status', 'processing');\nmerge(ctx, { payment: { provider: 'stripe' } });\ndel(ctx, 'temp_field');\nconst val = get(ctx, 'user.id');\nconst group = getGroup(ctx, 'payment');\n```\n\n## Middleware\n\n```typescript\n// Express\nimport { lozaMiddleware } from '@astraive/loza/middleware/express';\n\napp.use(lozaMiddleware({ service: 'checkout' }));\n```\n\n## Feature Flags\n\n```typescript\n} from '@astraive/loza';\n\nenrich(ctx,\n  featureFlag('checkout_v2', 'enabled'),\n  featureFlagBool('new_ui', true),\n  experiment('pricing_test', 'variant_b'),\n);\n```\n\n## Security\n\n```typescript\nimport { sensitiveString, markSensitive, hashString } from '@astraive/loza';\n\nenrich(ctx,\n  sensitiveString('user.email', email),\n  markSensitive('credit_card', cardNo),\n  hashString('user.ssn', ssn),\n);\n```\n\n## Context Helpers\n\n```typescript\nimport { getEvent, hasEvent, eventId } from '@astraive/loza';\n\nconst ev = getEvent(ctx);\nif (hasEvent(ctx)) {\n  const id = eventId(ctx);\n}\n```\n\n## Testing\n\n```typescript\nimport { testLogger, capture, assertEvent, assertRedacted, assertHasCheckpoint } from '@astraive/loza/testkit';\n\n// Test logger with memory sink\nconst { logger, sink } = testLogger();\n\n// Capture events\nconst events = capture(async (logger) => {\n  const ctx = logger.startEvent({ event: 'test' });\n  logger.finish(ctx, 'success');\n  await logger.emit(ctx);\n});\n\n// Assert\nassertEvent(events[0], 'user.id', 'u_123');\nassertRedacted(events[0], 'password');\nassertHasCheckpoint(events[0], 'payment_started');\n```\n\n## HTTP Client Instrumentation\n\n```typescript\nimport { wrapHttpClient, newRoundTripper } from '@astraive/loza';\n\n// Wrap fetch or http client\nconst client = wrapHttpClient(originalClient);\n```\n\n## Run Tests\n\n```bash\nbun run test\nbun run build\npython ../../spec/conformance/runner.py --sdk javascript --group all\n```\n\n## Documentation\n\n- [Instrumentation Guide](docs/business-instrumentation.md) — instrumenting checkout, payments, auth, jobs, queues, cron\n- [docs/public-api.md](docs/public-api.md)\n- [docs/middleware.md](docs/middleware.md)\n- [docs/integrations.md](docs/integrations.md)\n\n## Architecture\n\n```\nSDK (`loza`) -> HTTP -> Collector -> gRPC -> Cortex\n```\n\nSDKs are lightweight bridge connectors. Heavy processing (dedup, schema validation, PII redaction, sampling) happens in the collector.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}