@heavybit/shared-lib 1.3.2 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +261 -0
- package/dist/cjs/access/index.js +9 -1
- package/dist/cjs/access/index.js.map +1 -1
- package/dist/cjs/approvals/index.js +137 -0
- package/dist/cjs/approvals/index.js.map +1 -0
- package/dist/cjs/audit/index.js +74 -0
- package/dist/cjs/audit/index.js.map +1 -0
- package/dist/cjs/cache/index.js +90 -16
- package/dist/cjs/cache/index.js.map +1 -1
- package/dist/cjs/cache/keyspace.js +101 -0
- package/dist/cjs/cache/keyspace.js.map +1 -0
- package/dist/cjs/common/circuit-breaker.js +74 -0
- package/dist/cjs/common/circuit-breaker.js.map +1 -0
- package/dist/cjs/common/errors.js +44 -5
- package/dist/cjs/common/errors.js.map +1 -1
- package/dist/cjs/common/index.js +4 -0
- package/dist/cjs/common/index.js.map +1 -1
- package/dist/cjs/common/internal-client.js +177 -0
- package/dist/cjs/common/internal-client.js.map +1 -0
- package/dist/cjs/common/internal-constants.js +12 -0
- package/dist/cjs/common/internal-constants.js.map +1 -0
- package/dist/cjs/common/internal-service-auth.js +160 -0
- package/dist/cjs/common/internal-service-auth.js.map +1 -0
- package/dist/cjs/common/money.js +215 -0
- package/dist/cjs/common/money.js.map +1 -0
- package/dist/cjs/common/phone.js +63 -11
- package/dist/cjs/common/phone.js.map +1 -1
- package/dist/cjs/common/response.js +78 -5
- package/dist/cjs/common/response.js.map +1 -1
- package/dist/cjs/common/time.js +28 -2
- package/dist/cjs/common/time.js.map +1 -1
- package/dist/cjs/config/index.js +140 -20
- package/dist/cjs/config/index.js.map +1 -1
- package/dist/cjs/context/index.js +49 -0
- package/dist/cjs/context/index.js.map +1 -0
- package/dist/cjs/contracts/index.js +0 -2
- package/dist/cjs/contracts/index.js.map +1 -1
- package/dist/cjs/contracts/notification-dispatch.js +87 -63
- package/dist/cjs/contracts/notification-dispatch.js.map +1 -1
- package/dist/cjs/database/db.js +37 -0
- package/dist/cjs/database/db.js.map +1 -0
- package/dist/cjs/database/index.js +22 -51
- package/dist/cjs/database/index.js.map +1 -1
- package/dist/cjs/database/pagination.js +88 -0
- package/dist/cjs/database/pagination.js.map +1 -0
- package/dist/cjs/database/pool.js +60 -0
- package/dist/cjs/database/pool.js.map +1 -0
- package/dist/cjs/database/scoped-repository.js +132 -0
- package/dist/cjs/database/scoped-repository.js.map +1 -0
- package/dist/cjs/database/scopes.js +166 -0
- package/dist/cjs/database/scopes.js.map +1 -0
- package/dist/cjs/database/table-names.js +14 -0
- package/dist/cjs/database/table-names.js.map +1 -0
- package/dist/cjs/database/tables.js +71 -0
- package/dist/cjs/database/tables.js.map +1 -0
- package/dist/cjs/express/auth.js +88 -41
- package/dist/cjs/express/auth.js.map +1 -1
- package/dist/cjs/express/index.js +3 -0
- package/dist/cjs/express/index.js.map +1 -1
- package/dist/cjs/express/internal-caller.js +52 -0
- package/dist/cjs/express/internal-caller.js.map +1 -0
- package/dist/cjs/express/middleware.js +154 -34
- package/dist/cjs/express/middleware.js.map +1 -1
- package/dist/cjs/express/respond.js +47 -0
- package/dist/cjs/express/respond.js.map +1 -0
- package/dist/cjs/express/step-up.js +41 -0
- package/dist/cjs/express/step-up.js.map +1 -0
- package/dist/cjs/http/index.js +3 -71
- package/dist/cjs/http/index.js.map +1 -1
- package/dist/cjs/identity/index.js +269 -67
- package/dist/cjs/identity/index.js.map +1 -1
- package/dist/cjs/identity/step-up.js +52 -0
- package/dist/cjs/identity/step-up.js.map +1 -0
- package/dist/cjs/index.js +7 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/knex/columns.js +36 -0
- package/dist/cjs/knex/columns.js.map +1 -0
- package/dist/cjs/knex/index.js +26 -43
- package/dist/cjs/knex/index.js.map +1 -1
- package/dist/cjs/knex/migration-helpers.js +57 -0
- package/dist/cjs/knex/migration-helpers.js.map +1 -0
- package/dist/cjs/logging/index.js +76 -40
- package/dist/cjs/logging/index.js.map +1 -1
- package/dist/cjs/logging/redact.js +112 -0
- package/dist/cjs/logging/redact.js.map +1 -0
- package/dist/cjs/messaging/base-consumer.js +36 -0
- package/dist/cjs/messaging/base-consumer.js.map +1 -0
- package/dist/cjs/messaging/consumer.js +142 -73
- package/dist/cjs/messaging/consumer.js.map +1 -1
- package/dist/cjs/messaging/envelope.js +53 -10
- package/dist/cjs/messaging/envelope.js.map +1 -1
- package/dist/cjs/messaging/idempotency.js +95 -8
- package/dist/cjs/messaging/idempotency.js.map +1 -1
- package/dist/cjs/messaging/index.js +3 -1
- package/dist/cjs/messaging/index.js.map +1 -1
- package/dist/cjs/messaging/outbox.js +97 -55
- package/dist/cjs/messaging/outbox.js.map +1 -1
- package/dist/cjs/messaging/publisher.js +86 -38
- package/dist/cjs/messaging/publisher.js.map +1 -1
- package/dist/cjs/messaging/staff-notifier.js +36 -44
- package/dist/cjs/messaging/staff-notifier.js.map +1 -1
- package/dist/cjs/messaging/staff-recipients.js +57 -0
- package/dist/cjs/messaging/staff-recipients.js.map +1 -0
- package/dist/cjs/messaging/topology.js +41 -5
- package/dist/cjs/messaging/topology.js.map +1 -1
- package/dist/cjs/rate-limit/index.js +57 -6
- package/dist/cjs/rate-limit/index.js.map +1 -1
- package/dist/cjs/rate-limit/keys.js +47 -0
- package/dist/cjs/rate-limit/keys.js.map +1 -0
- package/dist/cjs/socket/index.js +127 -16
- package/dist/cjs/socket/index.js.map +1 -1
- package/dist/cjs/socket/ticket.js +124 -0
- package/dist/cjs/socket/ticket.js.map +1 -0
- package/dist/cjs/testing/index.js +23 -14
- package/dist/cjs/testing/index.js.map +1 -1
- package/dist/cjs/validation/index.js +27 -3
- package/dist/cjs/validation/index.js.map +1 -1
- package/dist/esm/access/index.js +9 -1
- package/dist/esm/access/index.js.map +1 -1
- package/dist/esm/approvals/index.js +127 -0
- package/dist/esm/approvals/index.js.map +1 -0
- package/dist/esm/audit/index.js +70 -0
- package/dist/esm/audit/index.js.map +1 -0
- package/dist/esm/cache/index.js +70 -13
- package/dist/esm/cache/index.js.map +1 -1
- package/dist/esm/cache/keyspace.js +95 -0
- package/dist/esm/cache/keyspace.js.map +1 -0
- package/dist/esm/common/circuit-breaker.js +70 -0
- package/dist/esm/common/circuit-breaker.js.map +1 -0
- package/dist/esm/common/errors.js +42 -4
- package/dist/esm/common/errors.js.map +1 -1
- package/dist/esm/common/index.js +4 -0
- package/dist/esm/common/index.js.map +1 -1
- package/dist/esm/common/internal-client.js +173 -0
- package/dist/esm/common/internal-client.js.map +1 -0
- package/dist/esm/common/internal-constants.js +9 -0
- package/dist/esm/common/internal-constants.js.map +1 -0
- package/dist/esm/common/internal-service-auth.js +150 -0
- package/dist/esm/common/internal-service-auth.js.map +1 -0
- package/dist/esm/common/money.js +207 -0
- package/dist/esm/common/money.js.map +1 -0
- package/dist/esm/common/phone.js +63 -11
- package/dist/esm/common/phone.js.map +1 -1
- package/dist/esm/common/response.js +75 -5
- package/dist/esm/common/response.js.map +1 -1
- package/dist/esm/common/time.js +27 -2
- package/dist/esm/common/time.js.map +1 -1
- package/dist/esm/config/index.js +136 -19
- package/dist/esm/config/index.js.map +1 -1
- package/dist/esm/context/index.js +44 -0
- package/dist/esm/context/index.js.map +1 -0
- package/dist/esm/contracts/index.js +0 -2
- package/dist/esm/contracts/index.js.map +1 -1
- package/dist/esm/contracts/notification-dispatch.js +85 -62
- package/dist/esm/contracts/notification-dispatch.js.map +1 -1
- package/dist/esm/database/db.js +32 -0
- package/dist/esm/database/db.js.map +1 -0
- package/dist/esm/database/index.js +9 -45
- package/dist/esm/database/index.js.map +1 -1
- package/dist/esm/database/pagination.js +81 -0
- package/dist/esm/database/pagination.js.map +1 -0
- package/dist/esm/database/pool.js +51 -0
- package/dist/esm/database/pool.js.map +1 -0
- package/dist/esm/database/scoped-repository.js +128 -0
- package/dist/esm/database/scoped-repository.js.map +1 -0
- package/dist/esm/database/scopes.js +157 -0
- package/dist/esm/database/scopes.js.map +1 -0
- package/dist/esm/database/table-names.js +11 -0
- package/dist/esm/database/table-names.js.map +1 -0
- package/dist/esm/database/tables.js +61 -0
- package/dist/esm/database/tables.js.map +1 -0
- package/dist/esm/express/auth.js +87 -40
- package/dist/esm/express/auth.js.map +1 -1
- package/dist/esm/express/index.js +3 -0
- package/dist/esm/express/index.js.map +1 -1
- package/dist/esm/express/internal-caller.js +49 -0
- package/dist/esm/express/internal-caller.js.map +1 -0
- package/dist/esm/express/middleware.js +146 -27
- package/dist/esm/express/middleware.js.map +1 -1
- package/dist/esm/express/respond.js +42 -0
- package/dist/esm/express/respond.js.map +1 -0
- package/dist/esm/express/step-up.js +38 -0
- package/dist/esm/express/step-up.js.map +1 -0
- package/dist/esm/http/index.js +3 -70
- package/dist/esm/http/index.js.map +1 -1
- package/dist/esm/identity/index.js +246 -64
- package/dist/esm/identity/index.js.map +1 -1
- package/dist/esm/identity/step-up.js +47 -0
- package/dist/esm/identity/step-up.js.map +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/knex/columns.js +28 -0
- package/dist/esm/knex/columns.js.map +1 -0
- package/dist/esm/knex/index.js +8 -34
- package/dist/esm/knex/index.js.map +1 -1
- package/dist/esm/knex/migration-helpers.js +51 -0
- package/dist/esm/knex/migration-helpers.js.map +1 -0
- package/dist/esm/logging/index.js +68 -39
- package/dist/esm/logging/index.js.map +1 -1
- package/dist/esm/logging/redact.js +106 -0
- package/dist/esm/logging/redact.js.map +1 -0
- package/dist/esm/messaging/base-consumer.js +32 -0
- package/dist/esm/messaging/base-consumer.js.map +1 -0
- package/dist/esm/messaging/consumer.js +139 -71
- package/dist/esm/messaging/consumer.js.map +1 -1
- package/dist/esm/messaging/envelope.js +50 -10
- package/dist/esm/messaging/envelope.js.map +1 -1
- package/dist/esm/messaging/idempotency.js +91 -7
- package/dist/esm/messaging/idempotency.js.map +1 -1
- package/dist/esm/messaging/index.js +3 -1
- package/dist/esm/messaging/index.js.map +1 -1
- package/dist/esm/messaging/outbox.js +97 -54
- package/dist/esm/messaging/outbox.js.map +1 -1
- package/dist/esm/messaging/publisher.js +86 -38
- package/dist/esm/messaging/publisher.js.map +1 -1
- package/dist/esm/messaging/staff-notifier.js +36 -43
- package/dist/esm/messaging/staff-notifier.js.map +1 -1
- package/dist/esm/messaging/staff-recipients.js +53 -0
- package/dist/esm/messaging/staff-recipients.js.map +1 -0
- package/dist/esm/messaging/topology.js +39 -4
- package/dist/esm/messaging/topology.js.map +1 -1
- package/dist/esm/rate-limit/index.js +41 -6
- package/dist/esm/rate-limit/index.js.map +1 -1
- package/dist/esm/rate-limit/keys.js +43 -0
- package/dist/esm/rate-limit/keys.js.map +1 -0
- package/dist/esm/socket/index.js +112 -17
- package/dist/esm/socket/index.js.map +1 -1
- package/dist/esm/socket/ticket.js +117 -0
- package/dist/esm/socket/ticket.js.map +1 -0
- package/dist/esm/testing/index.js +24 -15
- package/dist/esm/testing/index.js.map +1 -1
- package/dist/esm/validation/index.js +27 -2
- package/dist/esm/validation/index.js.map +1 -1
- package/dist/types/access/index.d.ts +9 -3
- package/dist/types/access/index.d.ts.map +1 -1
- package/dist/types/alerting/index.d.ts +1 -1
- package/dist/types/alerting/index.d.ts.map +1 -1
- package/dist/types/approvals/index.d.ts +99 -0
- package/dist/types/approvals/index.d.ts.map +1 -0
- package/dist/types/audit/index.d.ts +82 -0
- package/dist/types/audit/index.d.ts.map +1 -0
- package/dist/types/cache/index.d.ts +64 -14
- package/dist/types/cache/index.d.ts.map +1 -1
- package/dist/types/cache/keyspace.d.ts +84 -0
- package/dist/types/cache/keyspace.d.ts.map +1 -0
- package/dist/types/common/circuit-breaker.d.ts +51 -0
- package/dist/types/common/circuit-breaker.d.ts.map +1 -0
- package/dist/types/common/errors.d.ts +48 -7
- package/dist/types/common/errors.d.ts.map +1 -1
- package/dist/types/common/index.d.ts +4 -0
- package/dist/types/common/index.d.ts.map +1 -1
- package/dist/types/common/internal-client.d.ts +116 -0
- package/dist/types/common/internal-client.d.ts.map +1 -0
- package/dist/types/common/internal-constants.d.ts +9 -0
- package/dist/types/common/internal-constants.d.ts.map +1 -0
- package/dist/types/common/internal-service-auth.d.ts +102 -0
- package/dist/types/common/internal-service-auth.d.ts.map +1 -0
- package/dist/types/common/money.d.ts +104 -0
- package/dist/types/common/money.d.ts.map +1 -0
- package/dist/types/common/phone.d.ts +45 -6
- package/dist/types/common/phone.d.ts.map +1 -1
- package/dist/types/common/response.d.ts +66 -5
- package/dist/types/common/response.d.ts.map +1 -1
- package/dist/types/common/time.d.ts +20 -2
- package/dist/types/common/time.d.ts.map +1 -1
- package/dist/types/config/index.d.ts +252 -28
- package/dist/types/config/index.d.ts.map +1 -1
- package/dist/types/context/index.d.ts +39 -0
- package/dist/types/context/index.d.ts.map +1 -0
- package/dist/types/contracts/index.d.ts +0 -2
- package/dist/types/contracts/index.d.ts.map +1 -1
- package/dist/types/contracts/notification-dispatch.d.ts +204 -86
- package/dist/types/contracts/notification-dispatch.d.ts.map +1 -1
- package/dist/types/database/db.d.ts +46 -0
- package/dist/types/database/db.d.ts.map +1 -0
- package/dist/types/database/index.d.ts +9 -22
- package/dist/types/database/index.d.ts.map +1 -1
- package/dist/types/database/pagination.d.ts +68 -0
- package/dist/types/database/pagination.d.ts.map +1 -0
- package/dist/types/database/pool.d.ts +39 -0
- package/dist/types/database/pool.d.ts.map +1 -0
- package/dist/types/database/scoped-repository.d.ts +92 -0
- package/dist/types/database/scoped-repository.d.ts.map +1 -0
- package/dist/types/database/scopes.d.ts +159 -0
- package/dist/types/database/scopes.d.ts.map +1 -0
- package/dist/types/database/table-names.d.ts +13 -0
- package/dist/types/database/table-names.d.ts.map +1 -0
- package/dist/types/database/tables.d.ts +748 -0
- package/dist/types/database/tables.d.ts.map +1 -0
- package/dist/types/express/auth.d.ts +63 -11
- package/dist/types/express/auth.d.ts.map +1 -1
- package/dist/types/express/index.d.ts +3 -0
- package/dist/types/express/index.d.ts.map +1 -1
- package/dist/types/express/internal-caller.d.ts +53 -0
- package/dist/types/express/internal-caller.d.ts.map +1 -0
- package/dist/types/express/middleware.d.ts +86 -7
- package/dist/types/express/middleware.d.ts.map +1 -1
- package/dist/types/express/respond.d.ts +41 -0
- package/dist/types/express/respond.d.ts.map +1 -0
- package/dist/types/express/step-up.d.ts +38 -0
- package/dist/types/express/step-up.d.ts.map +1 -0
- package/dist/types/http/index.d.ts +3 -31
- package/dist/types/http/index.d.ts.map +1 -1
- package/dist/types/identity/index.d.ts +159 -21
- package/dist/types/identity/index.d.ts.map +1 -1
- package/dist/types/identity/step-up.d.ts +41 -0
- package/dist/types/identity/step-up.d.ts.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/knex/columns.d.ts +15 -0
- package/dist/types/knex/columns.d.ts.map +1 -0
- package/dist/types/knex/index.d.ts +3 -11
- package/dist/types/knex/index.d.ts.map +1 -1
- package/dist/types/knex/migration-helpers.d.ts +28 -0
- package/dist/types/knex/migration-helpers.d.ts.map +1 -0
- package/dist/types/logging/index.d.ts +30 -4
- package/dist/types/logging/index.d.ts.map +1 -1
- package/dist/types/logging/redact.d.ts +54 -0
- package/dist/types/logging/redact.d.ts.map +1 -0
- package/dist/types/messaging/base-consumer.d.ts +33 -0
- package/dist/types/messaging/base-consumer.d.ts.map +1 -0
- package/dist/types/messaging/consumer.d.ts +59 -21
- package/dist/types/messaging/consumer.d.ts.map +1 -1
- package/dist/types/messaging/envelope.d.ts +50 -11
- package/dist/types/messaging/envelope.d.ts.map +1 -1
- package/dist/types/messaging/idempotency.d.ts +60 -3
- package/dist/types/messaging/idempotency.d.ts.map +1 -1
- package/dist/types/messaging/index.d.ts +8 -0
- package/dist/types/messaging/index.d.ts.map +1 -1
- package/dist/types/messaging/outbox.d.ts +62 -22
- package/dist/types/messaging/outbox.d.ts.map +1 -1
- package/dist/types/messaging/publisher.d.ts +54 -21
- package/dist/types/messaging/publisher.d.ts.map +1 -1
- package/dist/types/messaging/staff-notifier.d.ts +69 -38
- package/dist/types/messaging/staff-notifier.d.ts.map +1 -1
- package/dist/types/messaging/staff-recipients.d.ts +50 -0
- package/dist/types/messaging/staff-recipients.d.ts.map +1 -0
- package/dist/types/messaging/topology.d.ts +40 -8
- package/dist/types/messaging/topology.d.ts.map +1 -1
- package/dist/types/rate-limit/index.d.ts +40 -4
- package/dist/types/rate-limit/index.d.ts.map +1 -1
- package/dist/types/rate-limit/keys.d.ts +52 -0
- package/dist/types/rate-limit/keys.d.ts.map +1 -0
- package/dist/types/socket/index.d.ts +86 -2
- package/dist/types/socket/index.d.ts.map +1 -1
- package/dist/types/socket/ticket.d.ts +90 -0
- package/dist/types/socket/ticket.d.ts.map +1 -0
- package/dist/types/testing/index.d.ts +31 -10
- package/dist/types/testing/index.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +62 -15
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/validation/index.d.ts +33 -2
- package/dist/types/validation/index.d.ts.map +1 -1
- package/package.json +3 -1
- package/dist/cjs/contracts/editorial-draft.js +0 -120
- package/dist/cjs/contracts/editorial-draft.js.map +0 -1
- package/dist/cjs/contracts/upload-import.js +0 -54
- package/dist/cjs/contracts/upload-import.js.map +0 -1
- package/dist/esm/contracts/editorial-draft.js +0 -117
- package/dist/esm/contracts/editorial-draft.js.map +0 -1
- package/dist/esm/contracts/upload-import.js +0 -51
- package/dist/esm/contracts/upload-import.js.map +0 -1
- package/dist/types/contracts/editorial-draft.d.ts +0 -610
- package/dist/types/contracts/editorial-draft.d.ts.map +0 -1
- package/dist/types/contracts/upload-import.d.ts +0 -96
- package/dist/types/contracts/upload-import.d.ts.map +0 -1
|
@@ -1,51 +1,189 @@
|
|
|
1
1
|
import type { AuthUser } from '../types/index.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Gateway identity protocol, version 2.
|
|
4
4
|
*
|
|
5
|
-
* The gateway strips
|
|
6
|
-
* `x-gateway-
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* The gateway strips every client-supplied identity header, writes the headers below for the
|
|
6
|
+
* authenticated caller and signs them with `x-gateway-signature: v2=<hex>`. The signature is an
|
|
7
|
+
* HMAC-SHA256 over an app-chosen domain separator, the HTTP method, the canonical path (no query),
|
|
8
|
+
* the gateway timestamp and every identity header in a fixed order. A request that bypasses the
|
|
9
|
+
* gateway, is replayed later, or is replayed against another route cannot carry a forged identity.
|
|
10
|
+
*
|
|
11
|
+
* App-specific identity fields (for example a tenant id) travel in their own headers through an
|
|
12
|
+
* {@link IdentityProtocol} mapping, so this module never names an app concept.
|
|
9
13
|
*/
|
|
10
14
|
export declare const IDENTITY_HEADERS: {
|
|
11
15
|
readonly USER_ID: "x-user-id";
|
|
12
16
|
readonly USER_EMAIL: "x-user-email";
|
|
13
17
|
readonly USER_ROLES: "x-user-roles";
|
|
14
18
|
readonly USER_PERMISSIONS: "x-user-permissions";
|
|
19
|
+
readonly SUPER_ADMIN: "x-is-superadmin";
|
|
20
|
+
readonly OTP_VERIFIED: "x-otp-verified";
|
|
21
|
+
readonly STEP_UP_AT: "x-step-up-at";
|
|
22
|
+
readonly SESSION_ID: "x-session-id";
|
|
15
23
|
readonly USER_SCOPES: "x-user-scopes";
|
|
16
24
|
readonly USER_ATTRS: "x-user-attrs";
|
|
17
|
-
readonly SESSION_ID: "x-session-id";
|
|
18
25
|
readonly TIMESTAMP: "x-gateway-ts";
|
|
19
|
-
readonly SIGNATURE: "x-gateway-
|
|
26
|
+
readonly SIGNATURE: "x-gateway-signature";
|
|
20
27
|
};
|
|
28
|
+
/** Non-identity request headers shared by the gateway and services (correlation, client hints, internal auth). */
|
|
21
29
|
export declare const CONTEXT_HEADERS: {
|
|
22
30
|
readonly CORRELATION_ID: "x-correlation-id";
|
|
23
31
|
readonly ANON_ID: "x-anon-id";
|
|
24
32
|
readonly TIMEZONE: "x-timezone";
|
|
25
33
|
readonly CLIENT_IP: "x-client-ip";
|
|
26
34
|
readonly INTERNAL_SECRET: "x-internal-service-secret";
|
|
27
|
-
readonly
|
|
35
|
+
readonly INTERNAL_SERVICE_NAME: "x-internal-service-name";
|
|
36
|
+
readonly IDEMPOTENCY_KEY: "idempotency-key";
|
|
28
37
|
};
|
|
29
|
-
/**
|
|
30
|
-
export declare const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
38
|
+
/** Signature version prefix: `x-gateway-signature: v2=<hex>`. */
|
|
39
|
+
export declare const GATEWAY_SIGNATURE_VERSION = "v2";
|
|
40
|
+
/** Default maximum age of a gateway timestamp (replay window). */
|
|
41
|
+
export declare const DEFAULT_IDENTITY_MAX_AGE_MS = 30000;
|
|
42
|
+
/** Default allowance for a gateway clock that runs ahead of the service clock. */
|
|
43
|
+
export declare const DEFAULT_IDENTITY_MAX_FUTURE_MS = 5000;
|
|
44
|
+
/** Minimum length of the shared gateway signing secret. */
|
|
45
|
+
export declare const MIN_GATEWAY_SECRET_LENGTH = 32;
|
|
46
|
+
/** App binding of the identity protocol: domain separator plus app-specific identity headers. */
|
|
47
|
+
export interface IdentityProtocolInput {
|
|
48
|
+
/** Domain separator mixed into every signature, e.g. `"<app>-gateway-identity:v2"`. Two apps never verify each other. */
|
|
49
|
+
domain: string;
|
|
50
|
+
/** Scope key → header carrying that scope's ids (comma-separated). Signed after the email header, in declaration order. */
|
|
51
|
+
scopeHeaders?: Readonly<Record<string, string>>;
|
|
52
|
+
/** Attr key → header carrying that string attribute. Signed after the scope headers, in declaration order. */
|
|
53
|
+
attrHeaders?: Readonly<Record<string, string>>;
|
|
54
|
+
}
|
|
55
|
+
/** A validated identity protocol. Build it once with {@link defineIdentityProtocol}. */
|
|
56
|
+
export interface IdentityProtocol {
|
|
57
|
+
readonly domain: string;
|
|
58
|
+
readonly scopeHeaders: Readonly<Record<string, string>>;
|
|
59
|
+
readonly attrHeaders: Readonly<Record<string, string>>;
|
|
60
|
+
/** Every identity header in signing order (excludes the timestamp and signature headers). */
|
|
61
|
+
readonly headerOrder: readonly string[];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validates and freezes an app's identity protocol. Throws at startup on a bad binding so a
|
|
65
|
+
* misconfiguration can never weaken verification at runtime.
|
|
66
|
+
*
|
|
67
|
+
* @param input Domain separator and optional scope/attr header mappings.
|
|
68
|
+
* @returns The frozen protocol, including the signing order.
|
|
69
|
+
* @example const protocol = defineIdentityProtocol({ domain: 'shop-gateway-identity:v2', scopeHeaders: { tenant: 'x-tenant-id' } });
|
|
70
|
+
*/
|
|
71
|
+
export declare function defineIdentityProtocol(input: IdentityProtocolInput): IdentityProtocol;
|
|
72
|
+
/**
|
|
73
|
+
* Every header a client must never be allowed to set, for a given protocol: identity headers, the gateway
|
|
74
|
+
* timestamp and signature, both internal-service headers and the client IP.
|
|
75
|
+
*
|
|
76
|
+
* @param protocol The app's identity protocol.
|
|
77
|
+
* @returns Lower-case header names.
|
|
78
|
+
* @example const blocked = new Set(protectedHeaders(protocol));
|
|
79
|
+
*/
|
|
80
|
+
export declare function protectedHeaders(protocol: IdentityProtocol): string[];
|
|
81
|
+
/**
|
|
82
|
+
* Removes every protected header in place (gateway ingress), so clients can't forge identity or internal auth.
|
|
83
|
+
*
|
|
84
|
+
* @param headers Incoming request headers (mutated).
|
|
85
|
+
* @param protocol The app's identity protocol.
|
|
86
|
+
* @example stripProtectedHeaders(req.headers, protocol);
|
|
87
|
+
*/
|
|
88
|
+
export declare function stripProtectedHeaders(headers: HeaderBag, protocol: IdentityProtocol): void;
|
|
89
|
+
/** Node-style request headers (lower-case names; repeated headers as arrays). */
|
|
90
|
+
export type HeaderBag = Record<string, string | string[] | undefined>;
|
|
91
|
+
/**
|
|
92
|
+
* Canonical request path for signing: the path only (query and fragment dropped), always starting with `/`.
|
|
93
|
+
*
|
|
94
|
+
* @param path A path or path-plus-query such as `req.originalUrl`.
|
|
95
|
+
* @returns The path to sign or verify.
|
|
96
|
+
* @example canonicalPath('/v1/items?page=2') // '/v1/items'
|
|
97
|
+
*/
|
|
98
|
+
export declare function canonicalPath(path: string): string;
|
|
99
|
+
/**
|
|
100
|
+
* Gateway side: the identity header values (unsigned) that represent `user` under `protocol`.
|
|
101
|
+
* Mapped scopes and string attrs travel in their own headers; the rest go in the JSON headers.
|
|
102
|
+
*
|
|
103
|
+
* @param user The authenticated caller.
|
|
104
|
+
* @param protocol The app's identity protocol.
|
|
105
|
+
* @returns Header name → value for every header in `protocol.headerOrder`.
|
|
106
|
+
* @example const identity = buildIdentityHeaders(user, protocol);
|
|
107
|
+
*/
|
|
108
|
+
export declare function buildIdentityHeaders(user: AuthUser, protocol: IdentityProtocol): Record<string, string>;
|
|
109
|
+
/** Inputs to {@link signGatewayIdentity}. */
|
|
110
|
+
export interface SignGatewayIdentityInput {
|
|
111
|
+
method: string;
|
|
112
|
+
/** Path the downstream service will see; any query string is ignored. */
|
|
113
|
+
path: string;
|
|
114
|
+
/** Identity header values, e.g. from {@link buildIdentityHeaders}. Missing headers sign as empty. */
|
|
115
|
+
identity: Record<string, string>;
|
|
116
|
+
/** Gateway timestamp, epoch milliseconds (sent as `x-gateway-ts`). */
|
|
117
|
+
ts: number;
|
|
118
|
+
secret: string;
|
|
119
|
+
protocol: IdentityProtocol;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Signs an identity for one request.
|
|
123
|
+
*
|
|
124
|
+
* @param input Method, path, identity headers, timestamp, secret and protocol.
|
|
125
|
+
* @returns The `x-gateway-signature` value, `v2=<hex>`.
|
|
126
|
+
* @example headers['x-gateway-signature'] = signGatewayIdentity({ method, path, identity, ts, secret, protocol });
|
|
127
|
+
*/
|
|
128
|
+
export declare function signGatewayIdentity(input: SignGatewayIdentityInput): string;
|
|
129
|
+
/** Inputs to {@link signedIdentityHeaders}. */
|
|
130
|
+
export interface SignedIdentityHeadersInput {
|
|
131
|
+
user: AuthUser;
|
|
132
|
+
method: string;
|
|
133
|
+
path: string;
|
|
134
|
+
secret: string;
|
|
135
|
+
protocol: IdentityProtocol;
|
|
136
|
+
/** Epoch milliseconds; defaults to now. */
|
|
137
|
+
now?: number;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Gateway side convenience: every identity header plus `x-gateway-ts` and `x-gateway-signature`. Also used by a
|
|
141
|
+
* service acting for a user to re-sign the identity for one internal call (signatures bind method and path).
|
|
142
|
+
*
|
|
143
|
+
* @param input User, method, path, secret, protocol and optional time.
|
|
144
|
+
* @returns Headers to add to the outgoing request.
|
|
145
|
+
*
|
|
146
|
+
* @example Object.assign(proxyHeaders, signedIdentityHeaders({ user, method: req.method, path: upstreamPath, secret, protocol }));
|
|
147
|
+
*/
|
|
148
|
+
export declare function signedIdentityHeaders(input: SignedIdentityHeadersInput): Record<string, string>;
|
|
149
|
+
/** Why {@link verifyGatewayIdentity} rejected an identity (logged and passed to `onRejected`; never header values). */
|
|
150
|
+
export type IdentityRejection = 'missing-signature' | 'bad-version' | 'bad-timestamp' | 'stale' | 'future' | 'bad-signature' | 'bad-payload';
|
|
34
151
|
export type IdentityResult = {
|
|
35
152
|
status: 'anonymous';
|
|
36
153
|
} | {
|
|
37
154
|
status: 'invalid';
|
|
38
|
-
reason:
|
|
155
|
+
reason: IdentityRejection;
|
|
39
156
|
} | {
|
|
40
157
|
status: 'authenticated';
|
|
41
158
|
user: AuthUser;
|
|
42
159
|
};
|
|
43
|
-
/**
|
|
44
|
-
export
|
|
45
|
-
|
|
160
|
+
/** Inputs to {@link verifyGatewayIdentity}. */
|
|
161
|
+
export interface VerifyGatewayIdentityInput {
|
|
162
|
+
headers: HeaderBag;
|
|
163
|
+
method: string;
|
|
164
|
+
/** The path as received, e.g. `req.originalUrl`; the query is ignored. */
|
|
165
|
+
path: string;
|
|
166
|
+
secret: string;
|
|
167
|
+
protocol: IdentityProtocol;
|
|
46
168
|
now?: number;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
169
|
+
maxAgeMs?: number;
|
|
170
|
+
maxFutureMs?: number;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Service side: verifies and decodes the gateway identity. No `x-user-id` → anonymous. Otherwise the
|
|
174
|
+
* request is rejected unless the signature is present, version `v2`, made for this method, path and
|
|
175
|
+
* protocol, and the timestamp is at most `maxAgeMs` old (default 30 s) and at most `maxFutureMs` ahead
|
|
176
|
+
* (default 5 s). The comparison is constant-time.
|
|
177
|
+
*
|
|
178
|
+
* @example const result = verifyGatewayIdentity({ headers: req.headers, method: req.method, path: req.originalUrl, secret, protocol });
|
|
179
|
+
*/
|
|
180
|
+
export declare function verifyGatewayIdentity(input: VerifyGatewayIdentityInput): IdentityResult;
|
|
181
|
+
/**
|
|
182
|
+
* Throws unless `secret` is long enough to sign identities. Call at startup.
|
|
183
|
+
*
|
|
184
|
+
* @param secret The shared gateway signing secret (env `GATEWAY_SIGNING_SECRET`).
|
|
185
|
+
* @returns The secret, unchanged.
|
|
186
|
+
*/
|
|
187
|
+
export declare function assertGatewaySecret(secret: string | undefined): string;
|
|
188
|
+
export * from './step-up.js';
|
|
51
189
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/identity/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/identity/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Step-up (re-authentication) scopes. The gateway checks the client's step-up proof for the route's
|
|
3
|
+
* scope and forwards the verified time as the signed `x-step-up-at` header; services only check that
|
|
4
|
+
* the time is fresh. Scope names and their rules are app values, declared once with
|
|
5
|
+
* {@link defineStepUpScopes}.
|
|
6
|
+
*/
|
|
7
|
+
/** Rules for one step-up scope. */
|
|
8
|
+
export interface StepUpScopeDefinition {
|
|
9
|
+
/** The step-up proof may be used for one request only (the gateway consumes it). */
|
|
10
|
+
singleUse?: boolean;
|
|
11
|
+
/** Short note for docs and the route registry. */
|
|
12
|
+
description?: string;
|
|
13
|
+
}
|
|
14
|
+
/** A frozen scope catalogue, keyed by scope name. */
|
|
15
|
+
export type StepUpCatalogue<S extends string = string> = Readonly<Record<S, Readonly<StepUpScopeDefinition>>>;
|
|
16
|
+
/** Default freshness window for a step-up verification. */
|
|
17
|
+
export declare const DEFAULT_STEP_UP_WINDOW_MS: number;
|
|
18
|
+
/** A step-up time this far ahead of the service clock is still accepted (clock skew). */
|
|
19
|
+
export declare const STEP_UP_MAX_FUTURE_MS = 5000;
|
|
20
|
+
/** Error code of the 403 a service returns when a fresh step-up is required. */
|
|
21
|
+
export declare const STEP_UP_REQUIRED_CODE = "STEP_UP_REQUIRED";
|
|
22
|
+
/**
|
|
23
|
+
* Validates and freezes an app's step-up scope catalogue (kebab-case names). Throws at startup on a bad name.
|
|
24
|
+
*
|
|
25
|
+
* @param catalogue Scope name → rules.
|
|
26
|
+
* @returns The frozen catalogue; its keys type `requireStepUp`'s scope argument.
|
|
27
|
+
* @example export const stepUpScopes = defineStepUpScopes({ 'refund-large': {}, 'payout-destination': { singleUse: true } });
|
|
28
|
+
*/
|
|
29
|
+
export declare function defineStepUpScopes<S extends string>(catalogue: Record<S, StepUpScopeDefinition>): StepUpCatalogue<S>;
|
|
30
|
+
export type StepUpStatus = 'fresh' | 'missing' | 'stale' | 'future';
|
|
31
|
+
/**
|
|
32
|
+
* Whether a gateway-verified step-up time is usable now.
|
|
33
|
+
*
|
|
34
|
+
* @param stepUpAt Epoch milliseconds of the step-up, or undefined when none was made.
|
|
35
|
+
* @param windowMs How old the step-up may be.
|
|
36
|
+
* @param now Current epoch milliseconds.
|
|
37
|
+
* @returns `fresh` when usable; otherwise why not.
|
|
38
|
+
* @example stepUpStatus(req.user?.stepUpAt, DEFAULT_STEP_UP_WINDOW_MS) === 'fresh'
|
|
39
|
+
*/
|
|
40
|
+
export declare function stepUpStatus(stepUpAt: number | undefined, windowMs: number, now?: number): StepUpStatus;
|
|
41
|
+
//# sourceMappingURL=step-up.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-up.d.ts","sourceRoot":"","sources":["../../../src/identity/step-up.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,mCAAmC;AACnC,MAAM,WAAW,qBAAqB;IACpC,oFAAoF;IACpF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qDAAqD;AACrD,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;AAE9G,2DAA2D;AAC3D,eAAO,MAAM,yBAAyB,QAAa,CAAC;AACpD,yFAAyF;AACzF,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAC3C,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAIxD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,qBAAqB,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAOpH;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEpE;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,YAAY,CAInH"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
export * from './types/index.js';
|
|
2
2
|
export * from './common/index.js';
|
|
3
|
+
export * from './context/index.js';
|
|
3
4
|
export * from './identity/index.js';
|
|
4
5
|
export * from './access/index.js';
|
|
5
6
|
export * from './validation/index.js';
|
|
6
7
|
export * from './logging/index.js';
|
|
7
8
|
export * from './config/index.js';
|
|
9
|
+
export * from './cache/keyspace.js';
|
|
10
|
+
export * from './rate-limit/keys.js';
|
|
8
11
|
export * from './contracts/index.js';
|
|
9
12
|
export * from './alerting/index.js';
|
|
13
|
+
export * from './database/pagination.js';
|
|
14
|
+
export * from './audit/index.js';
|
|
15
|
+
export * from './approvals/index.js';
|
|
16
|
+
export * from './socket/ticket.js';
|
|
10
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/** Column primitives shared by every migration helper (one definition of ULID and DATETIME(3) columns). */
|
|
3
|
+
/** `id CHAR(26)` primary key for ULIDs. */
|
|
4
|
+
export declare function ulidPrimary(table: Knex.CreateTableBuilder, name?: string): void;
|
|
5
|
+
/** `CHAR(26)` column referencing another ULID (FK constraints only within the same database). */
|
|
6
|
+
export declare function ulidColumn(table: Knex.CreateTableBuilder | Knex.AlterTableBuilder, name: string): Knex.ColumnBuilder;
|
|
7
|
+
/** `created_at` / `updated_at` as `DATETIME(3)` in UTC, maintained by MySQL. */
|
|
8
|
+
export declare function timestamps(table: Knex.CreateTableBuilder, knex: Knex): void;
|
|
9
|
+
/** `created_by` / `updated_by` actor columns (null for system operations). */
|
|
10
|
+
export declare function actorColumns(table: Knex.CreateTableBuilder): void;
|
|
11
|
+
/** Nullable `DATETIME(3)` column. */
|
|
12
|
+
export declare function datetime(table: Knex.CreateTableBuilder | Knex.AlterTableBuilder, name: string): Knex.ColumnBuilder;
|
|
13
|
+
/** `DATETIME(3)` column defaulting to `CURRENT_TIMESTAMP(3)` (insert time, UTC). */
|
|
14
|
+
export declare function createdAtColumn(table: Knex.CreateTableBuilder, knex: Knex, name?: string): Knex.ColumnBuilder;
|
|
15
|
+
//# sourceMappingURL=columns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns.d.ts","sourceRoot":"","sources":["../../../src/knex/columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,2GAA2G;AAE3G,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,SAAO,GAAG,IAAI,CAE7E;AAED,iGAAiG;AACjG,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,aAAa,CAEpH;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAG3E;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAGjE;AAED,qCAAqC;AACrC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,aAAa,CAElH;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,SAAe,GAAG,IAAI,CAAC,aAAa,CAEnH"}
|
|
@@ -1,24 +1,16 @@
|
|
|
1
1
|
import type { Knex } from 'knex';
|
|
2
|
+
export * from './columns.js';
|
|
3
|
+
export * from './migration-helpers.js';
|
|
2
4
|
/**
|
|
3
5
|
* Migration helpers (usable from CommonJS `.cjs` migrations via `require('@heavybit/shared-lib/knex')`).
|
|
4
6
|
* They keep ID, timestamp and audit column definitions identical across services.
|
|
5
7
|
*/
|
|
6
|
-
/** `id CHAR(26)` primary key for ULIDs. */
|
|
7
|
-
export declare function ulidPrimary(table: Knex.CreateTableBuilder, name?: string): void;
|
|
8
|
-
/** `CHAR(26)` column referencing another ULID (FK constraints only within the same database). */
|
|
9
|
-
export declare function ulidColumn(table: Knex.CreateTableBuilder | Knex.AlterTableBuilder, name: string): Knex.ColumnBuilder;
|
|
10
|
-
/** `created_at` / `updated_at` as `DATETIME(3)` in UTC, maintained by MySQL. */
|
|
11
|
-
export declare function timestamps(table: Knex.CreateTableBuilder, knex: Knex): void;
|
|
12
|
-
/** `created_by` / `updated_by` actor columns (null for system operations). */
|
|
13
|
-
export declare function actorColumns(table: Knex.CreateTableBuilder): void;
|
|
14
|
-
/** Nullable `DATETIME(3)` column. */
|
|
15
|
-
export declare function datetime(table: Knex.CreateTableBuilder | Knex.AlterTableBuilder, name: string): Knex.ColumnBuilder;
|
|
16
8
|
/**
|
|
17
9
|
* Creates `<parent>_audits`: every parent column (defined again by `columns`) plus `parent_id`
|
|
18
10
|
* and `action`. Audit rows are append-only history, so no unique constraints are copied.
|
|
19
11
|
*/
|
|
20
12
|
export declare function createAuditTable(knex: Knex, parentTable: string, columns: (table: Knex.CreateTableBuilder) => void): Promise<void>;
|
|
21
|
-
/** Transactional outbox table used by `OutboxRelay
|
|
13
|
+
/** Transactional outbox table used by `OutboxRelay` (columns from {@link outboxColumns}). */
|
|
22
14
|
export declare function createOutboxTable(knex: Knex, name?: string): Promise<void>;
|
|
23
15
|
/** Standard table options: InnoDB, utf8mb4. Call inside `createTable`. */
|
|
24
16
|
export declare function utf8mb4(table: Knex.CreateTableBuilder): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/knex/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/knex/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AAEvC;;;GAGG;AAEH;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAYxI;AAED,6FAA6F;AAC7F,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,SAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9F;AAED,0EAA0E;AAC1E,wBAAgB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAI5D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Column sets for infrastructure tables, for `.cjs` migrations. Each matches the Drizzle table of
|
|
4
|
+
* the same purpose in `@heavybit/shared-lib/database` (`outboxTable`, `processedEventsTable`,
|
|
5
|
+
* `schedulerRunsTable`); a test keeps the two in step.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* await knex.schema.createTable('processed_events', (t) => processedEventsColumns(t, knex));
|
|
9
|
+
*/
|
|
10
|
+
type Builder = Knex.CreateTableBuilder;
|
|
11
|
+
/**
|
|
12
|
+
* Outbox columns: id, routing_key, exchange, payload, correlation_id, attempts, last_error, created_at,
|
|
13
|
+
* published_at (+ relay index).
|
|
14
|
+
*/
|
|
15
|
+
export declare function outboxColumns(t: Builder, knex: Knex): void;
|
|
16
|
+
/** Consumer idempotency columns: id, consumer, event_id (unique together), processed_at. */
|
|
17
|
+
export declare function processedEventsColumns(t: Builder, knex: Knex): void;
|
|
18
|
+
/** Scheduler run columns: id, job, run_key (unique together), status, error, started_at, finished_at. */
|
|
19
|
+
export declare function schedulerRunsColumns(t: Builder, knex: Knex): void;
|
|
20
|
+
/**
|
|
21
|
+
* Index that always leads with the scope column (TEN-4); `columns` follow in order, duplicates of
|
|
22
|
+
* the scope column are dropped.
|
|
23
|
+
*
|
|
24
|
+
* @example scopedIndex(t, 'workspace_id', ['status', 'created_at'])
|
|
25
|
+
*/
|
|
26
|
+
export declare function scopedIndex(t: Builder | Knex.AlterTableBuilder, scopeColumn: string, columns?: string[], indexName?: string): void;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=migration-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-helpers.d.ts","sourceRoot":"","sources":["../../../src/knex/migration-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC;;;;;;;GAOG;AAEH,KAAK,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC;AAGvC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAW1D;AAED,4FAA4F;AAC5F,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAOnE;AAED,yGAAyG;AACzG,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAUjE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,EAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAGtI"}
|
|
@@ -1,14 +1,35 @@
|
|
|
1
|
+
import type { Writable } from 'node:stream';
|
|
1
2
|
import winston from 'winston';
|
|
2
3
|
import type { Logger } from '../types/index.js';
|
|
3
|
-
|
|
4
|
-
export
|
|
4
|
+
export { DEFAULT_ALLOW_KEYS, DEFAULT_REDACT_KEYS, REDACTED, createKeyClassifier, maskPhoneForLog, maskPhonesInText, redactValue } from './redact.js';
|
|
5
|
+
export type { KeyClassifier } from './redact.js';
|
|
6
|
+
/** Options for {@link createLogger}. */
|
|
5
7
|
export interface LoggerOptions {
|
|
8
|
+
/** Minimum level; defaults to `LOG_LEVEL`, else `info` in production and `debug` elsewhere. */
|
|
6
9
|
level?: string;
|
|
7
|
-
/** `json` for machines (default in production), `pretty` for humans. */
|
|
10
|
+
/** `json` for machines (default in production), `pretty` for humans. Files and streams are always JSON. */
|
|
8
11
|
format?: 'json' | 'pretty';
|
|
12
|
+
/** Extra sensitive words, matched like {@link DEFAULT_REDACT_KEYS} (e.g. `nationalId`). */
|
|
9
13
|
redactKeys?: string[];
|
|
14
|
+
/** Exact keys never redacted; replaces {@link DEFAULT_ALLOW_KEYS}. */
|
|
15
|
+
allowKeys?: string[];
|
|
16
|
+
/** Also append JSON lines to this file (e.g. `logs/api.log`). */
|
|
17
|
+
filePath?: string;
|
|
18
|
+
/** Also write JSON lines to this stream (log shippers, tests). */
|
|
19
|
+
stream?: Writable;
|
|
10
20
|
}
|
|
11
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Structured logger. Every line carries `service` and, inside a request or {@link runWithContext}, the
|
|
23
|
+
* context's `correlationId`, `userId` and `scopes`. Secrets are redacted by key word (see
|
|
24
|
+
* {@link DEFAULT_REDACT_KEYS}) and phone numbers are masked to their last 4 digits, in the message and
|
|
25
|
+
* at any depth of the metadata. Writes to stdout (JSON in production, pretty otherwise; silent under
|
|
26
|
+
* `NODE_ENV=test` unless `LOG_IN_TESTS` is set) plus an optional file and stream.
|
|
27
|
+
*
|
|
28
|
+
* @param service Service name on every line.
|
|
29
|
+
* @param options Level, format, extra redact/allow keys, file path, stream.
|
|
30
|
+
* @returns A winston logger that satisfies {@link Logger}.
|
|
31
|
+
* @example const logger = createLogger('api', { filePath: 'logs/api.log' });
|
|
32
|
+
*/
|
|
12
33
|
export declare function createLogger(service: string, options?: LoggerOptions): winston.Logger & Logger;
|
|
13
34
|
/** Logger that discards everything — handy default for libraries and tests. */
|
|
14
35
|
export declare const silentLogger: Logger;
|
|
@@ -17,6 +38,11 @@ export declare const silentLogger: Logger;
|
|
|
17
38
|
* meta wins on a key clash. `undefined` context values are dropped so lines never carry empty keys.
|
|
18
39
|
* Works over any {@link Logger} (winston, a test spy, or another child), so handlers can create one
|
|
19
40
|
* per message and pass it down.
|
|
41
|
+
*
|
|
42
|
+
* @param logger The logger to write through.
|
|
43
|
+
* @param context Values added to every line.
|
|
44
|
+
* @returns A {@link Logger}.
|
|
45
|
+
* @example const log = childLogger(logger, { jobId });
|
|
20
46
|
*/
|
|
21
47
|
export declare function childLogger(logger: Logger, context: Record<string, unknown>): Logger;
|
|
22
48
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/logging/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/logging/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrJ,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA2CjD,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,+FAA+F;IAC/F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2GAA2G;IAC3G,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC3B,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAqBlG;AAED,+EAA+E;AAC/E,eAAO,MAAM,YAAY,EAAE,MAA6E,CAAC;AAEzG;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAKpF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secret redaction and phone masking for log lines. Matching is by key *word*, not substring: a key is
|
|
3
|
+
* split on camelCase and separators (`refresh_token` → `refresh`, `token`; `OTPCode` → `otp`, `code`),
|
|
4
|
+
* and it is sensitive when a word (or two adjacent words joined, e.g. `api`+`key`) equals a listed term
|
|
5
|
+
* or its plural. So `accessToken` and `Set-Cookie` are redacted while `pinned` or `spinner` are not.
|
|
6
|
+
*/
|
|
7
|
+
/** Words whose values are always replaced with `[REDACTED]`. Apps add their own via `redactKeys`. */
|
|
8
|
+
export declare const DEFAULT_REDACT_KEYS: readonly string[];
|
|
9
|
+
/** Keys that are never redacted although they contain a listed word (error, status and reference codes). */
|
|
10
|
+
export declare const DEFAULT_ALLOW_KEYS: readonly string[];
|
|
11
|
+
/** The marker that replaces a secret value. */
|
|
12
|
+
export declare const REDACTED = "[REDACTED]";
|
|
13
|
+
/**
|
|
14
|
+
* Masks every digit except the last four; the same rule as `maskPhone` in common (one rule for logs and UI).
|
|
15
|
+
*
|
|
16
|
+
* @param value A phone number in any format.
|
|
17
|
+
* @returns e.g. `********5678`; values with fewer than 5 digits are fully masked.
|
|
18
|
+
* @example maskPhoneForLog('15551234567') // '*******4567'
|
|
19
|
+
*/
|
|
20
|
+
export declare const maskPhoneForLog: (value: string) => string;
|
|
21
|
+
/**
|
|
22
|
+
* Masks phone-number-looking runs inside free text.
|
|
23
|
+
*
|
|
24
|
+
* @param text Any string (a log message or value).
|
|
25
|
+
* @returns The text with each 9–15 digit run masked to its last 4 digits.
|
|
26
|
+
* @example maskPhonesInText('OTP sent to 15551234567') // 'OTP sent to *******4567'
|
|
27
|
+
*/
|
|
28
|
+
export declare function maskPhonesInText(text: string): string;
|
|
29
|
+
/** Decides, per key, whether a value is a secret, a phone number or neither. */
|
|
30
|
+
export interface KeyClassifier {
|
|
31
|
+
isSecret(key: string): boolean;
|
|
32
|
+
isPhone(key: string): boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Builds a key classifier from the default terms plus app-specific ones.
|
|
36
|
+
*
|
|
37
|
+
* @param extraKeys Extra words (matched like the defaults, case-insensitive).
|
|
38
|
+
* @param allowKeys Exact keys never treated as secret (defaults to {@link DEFAULT_ALLOW_KEYS}).
|
|
39
|
+
* @returns The classifier.
|
|
40
|
+
* @example createKeyClassifier(['nationalId']).isSecret('nationalId') // true
|
|
41
|
+
*/
|
|
42
|
+
export declare function createKeyClassifier(extraKeys?: readonly string[], allowKeys?: readonly string[]): KeyClassifier;
|
|
43
|
+
/**
|
|
44
|
+
* Returns a copy of `value` with secrets replaced by `[REDACTED]` and phone numbers masked, at any depth
|
|
45
|
+
* (up to 8 levels; deeper values are dropped as `[TRUNCATED]`). Errors are kept as-is.
|
|
46
|
+
*
|
|
47
|
+
* @param value Log metadata (object, array or scalar).
|
|
48
|
+
* @param classifier From {@link createKeyClassifier}.
|
|
49
|
+
* @param depth Internal recursion depth; callers omit it.
|
|
50
|
+
* @returns The redacted copy; the input is not modified.
|
|
51
|
+
* @example redactValue({ user: { otp: '1234', phone: '15551234567' } }, createKeyClassifier())
|
|
52
|
+
*/
|
|
53
|
+
export declare function redactValue(value: unknown, classifier: KeyClassifier, depth?: number): unknown;
|
|
54
|
+
//# sourceMappingURL=redact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../../src/logging/redact.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,qGAAqG;AACrG,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAGhD,CAAC;AAEF,4GAA4G;AAC5G,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAAwF,CAAC;AAQzI,+CAA+C;AAC/C,eAAO,MAAM,QAAQ,eAAe,CAAC;AAGrC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAkB,CAAC;AAEpE;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAWD,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,GAAE,SAAS,MAAM,EAAO,EAAE,SAAS,GAAE,SAAS,MAAM,EAAuB,GAAG,aAAa,CAgBvI;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,SAAI,GAAG,OAAO,CAYzF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { InboundMessage, MessageConsumer, SubscriptionOptions } from './consumer.js';
|
|
2
|
+
/** Everything a subscription needs except the handler, which a {@link BaseConsumer} subclass supplies. */
|
|
3
|
+
export type ConsumerDefinition<T, TTx> = Omit<SubscriptionOptions<T, TTx>, 'handler'>;
|
|
4
|
+
/**
|
|
5
|
+
* Base for a service's queue consumers (one class per queue in `src/consumers/`). The subclass declares
|
|
6
|
+
* its queue, bindings, payload schema, retry policy, dedupe and scope in the constructor and implements
|
|
7
|
+
* {@link BaseConsumer.handle}; `worker.ts` registers it. Validation, dedupe, retries, dead-lettering and
|
|
8
|
+
* context restore are done by {@link MessageConsumer}.
|
|
9
|
+
*
|
|
10
|
+
* @typeParam T Validated payload type.
|
|
11
|
+
* @typeParam TTx Dedupe transaction type (`DbExecutor` with `ProcessedEventsDeduper`).
|
|
12
|
+
* @example
|
|
13
|
+
* class ThingCreatedConsumer extends BaseConsumer<ThingCreated, DbExecutor> {
|
|
14
|
+
* constructor(private readonly things: ThingService, dedupe: ProcessedEventsDeduper) {
|
|
15
|
+
* super({ queue: 'thing-created', bindings: [{ exchange: 'events', routingKey: 'thing.created' }],
|
|
16
|
+
* schema: thingCreatedSchema, dedupe, scopeFrom: (d) => ({ tenantId: d.tenantId }) });
|
|
17
|
+
* }
|
|
18
|
+
* protected handle({ data, tx, scope }: InboundMessage<ThingCreated, DbExecutor>) { return this.things.onCreated(scope!, data, tx!); }
|
|
19
|
+
* }
|
|
20
|
+
*/
|
|
21
|
+
export declare abstract class BaseConsumer<T, TTx = undefined> {
|
|
22
|
+
protected readonly definition: ConsumerDefinition<T, TTx>;
|
|
23
|
+
protected constructor(definition: ConsumerDefinition<T, TTx>);
|
|
24
|
+
/** Handles one validated, de-duplicated message. Throw to retry (or a non-retryable error to dead-letter). */
|
|
25
|
+
protected abstract handle(message: InboundMessage<T, TTx>): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Subscribes this consumer.
|
|
28
|
+
*
|
|
29
|
+
* @param consumer The service's {@link MessageConsumer}.
|
|
30
|
+
*/
|
|
31
|
+
register(consumer: MessageConsumer): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=base-consumer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-consumer.d.ts","sourceRoot":"","sources":["../../../src/messaging/base-consumer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAE1F,0GAA0G;AAC1G,MAAM,MAAM,kBAAkB,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;AAEtF;;;;;;;;;;;;;;;;GAgBG;AACH,8BAAsB,YAAY,CAAC,CAAC,EAAE,GAAG,GAAG,SAAS;IAC7B,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC,EAAE,GAAG,CAAC;IAA/E,SAAS,aAAgC,UAAU,EAAE,kBAAkB,CAAC,CAAC,EAAE,GAAG,CAAC;IAE/E,8GAA8G;IAC9G,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAEzE;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAGnD"}
|