glasswork 1.0.1 → 1.2.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/CHANGELOG.md +48 -1
- package/README.md +37 -2
- package/dist/audit/audit-logger.d.ts +22 -0
- package/dist/audit/audit-logger.d.ts.map +1 -0
- package/dist/audit/audit-logger.js +44 -0
- package/dist/audit/audit-logger.js.map +1 -0
- package/dist/audit/context.d.ts +13 -0
- package/dist/audit/context.d.ts.map +1 -0
- package/dist/audit/context.js +66 -0
- package/dist/audit/context.js.map +1 -0
- package/dist/audit/index.d.ts +8 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +7 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/types.d.ts +74 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +2 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/auth/abilities.d.ts +1 -1
- package/dist/auth/abilities.d.ts.map +1 -1
- package/dist/auth/abilities.js.map +1 -1
- package/dist/auth/better-auth-provider.d.ts +17 -6
- package/dist/auth/better-auth-provider.d.ts.map +1 -1
- package/dist/auth/better-auth-provider.js +16 -9
- package/dist/auth/better-auth-provider.js.map +1 -1
- package/dist/auth/index.d.ts +2 -2
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/middleware.d.ts +10 -8
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +27 -11
- package/dist/auth/middleware.js.map +1 -1
- package/dist/auth/types.d.ts +13 -2
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/config/config-service.d.ts.map +1 -1
- package/dist/config/config-service.js.map +1 -1
- package/dist/config/providers.js.map +1 -1
- package/dist/core/bootstrap.d.ts.map +1 -1
- package/dist/core/bootstrap.js +16 -7
- package/dist/core/bootstrap.js.map +1 -1
- package/dist/core/module-graph.js +3 -0
- package/dist/core/module-graph.js.map +1 -1
- package/dist/core/request-scope.d.ts +12 -0
- package/dist/core/request-scope.d.ts.map +1 -0
- package/dist/core/request-scope.js +86 -0
- package/dist/core/request-scope.js.map +1 -0
- package/dist/core/route-factory.d.ts +1 -0
- package/dist/core/route-factory.d.ts.map +1 -1
- package/dist/core/types.d.ts +6 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/email/compiler/compiler.d.ts.map +1 -1
- package/dist/email/compiler/compiler.js +72 -20
- package/dist/email/compiler/compiler.js.map +1 -1
- package/dist/email/compiler/tokenizer.js +4 -2
- package/dist/email/compiler/tokenizer.js.map +1 -1
- package/dist/email/compiler/types.d.ts +2 -0
- package/dist/email/compiler/types.d.ts.map +1 -1
- package/dist/email/email-service.d.ts.map +1 -1
- package/dist/email/template-registry.d.ts.map +1 -1
- package/dist/email/templated-email-service.d.ts.map +1 -1
- package/dist/email/transports/mock-transport.d.ts.map +1 -1
- package/dist/email/transports/ses-transport.d.ts +8 -0
- package/dist/email/transports/ses-transport.d.ts.map +1 -1
- package/dist/email/transports/ses-transport.js +132 -25
- package/dist/email/transports/ses-transport.js.map +1 -1
- package/dist/email/webhooks/handler-factory.d.ts +1 -0
- package/dist/email/webhooks/handler-factory.d.ts.map +1 -1
- package/dist/email/webhooks/handler-factory.js +40 -38
- package/dist/email/webhooks/handler-factory.js.map +1 -1
- package/dist/email/webhooks/notification-parser.d.ts +1 -1
- package/dist/email/webhooks/notification-parser.js +1 -1
- package/dist/email/webhooks/signature-verification.d.ts +4 -2
- package/dist/email/webhooks/signature-verification.d.ts.map +1 -1
- package/dist/email/webhooks/signature-verification.js +63 -8
- package/dist/email/webhooks/signature-verification.js.map +1 -1
- package/dist/email/webhooks/subscription-handler.d.ts +4 -2
- package/dist/email/webhooks/subscription-handler.d.ts.map +1 -1
- package/dist/email/webhooks/subscription-handler.js +42 -6
- package/dist/email/webhooks/subscription-handler.js.map +1 -1
- package/dist/email/webhooks/types.d.ts +17 -2
- package/dist/email/webhooks/types.d.ts.map +1 -1
- package/dist/hono-context.d.ts +1 -1
- package/dist/hono-context.d.ts.map +1 -1
- package/dist/http/error-handler.js.map +1 -1
- package/dist/http/errors.d.ts.map +1 -1
- package/dist/http/errors.js.map +1 -1
- package/dist/http/route-authorization.d.ts +1 -2
- package/dist/http/route-authorization.d.ts.map +1 -1
- package/dist/http/route-authorization.js.map +1 -1
- package/dist/http/route-context.d.ts +4 -2
- package/dist/http/route-context.d.ts.map +1 -1
- package/dist/http/route-context.js +7 -2
- package/dist/http/route-context.js.map +1 -1
- package/dist/http/route-helpers.d.ts +3 -3
- package/dist/http/route-helpers.d.ts.map +1 -1
- package/dist/http/route-helpers.js.map +1 -1
- package/dist/http/route-openapi.d.ts +1 -1
- package/dist/http/route-openapi.d.ts.map +1 -1
- package/dist/http/route-openapi.js.map +1 -1
- package/dist/http/route-types.d.ts +26 -23
- package/dist/http/route-types.d.ts.map +1 -1
- package/dist/jobs/drivers/eventbridge-scheduler-driver.d.ts.map +1 -1
- package/dist/jobs/drivers/eventbridge-scheduler-driver.js.map +1 -1
- package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
- package/dist/jobs/drivers/mock-driver.js.map +1 -1
- package/dist/jobs/drivers/sqs-driver.d.ts.map +1 -1
- package/dist/jobs/drivers/sqs-driver.js.map +1 -1
- package/dist/jobs/errors.d.ts.map +1 -1
- package/dist/jobs/job-registry.d.ts.map +1 -1
- package/dist/jobs/job-registry.js.map +1 -1
- package/dist/jobs/job-service.d.ts.map +1 -1
- package/dist/jobs/job-service.js.map +1 -1
- package/dist/jobs/observability/client.d.ts +26 -0
- package/dist/jobs/observability/client.d.ts.map +1 -0
- package/dist/jobs/observability/client.js +286 -0
- package/dist/jobs/observability/client.js.map +1 -0
- package/dist/jobs/observability/dashboard.d.ts +19 -0
- package/dist/jobs/observability/dashboard.d.ts.map +1 -0
- package/dist/jobs/observability/dashboard.js +144 -0
- package/dist/jobs/observability/dashboard.js.map +1 -0
- package/dist/jobs/observability/emf.d.ts +24 -0
- package/dist/jobs/observability/emf.d.ts.map +1 -0
- package/dist/jobs/observability/emf.js +100 -0
- package/dist/jobs/observability/emf.js.map +1 -0
- package/dist/jobs/observability/index.d.ts +5 -0
- package/dist/jobs/observability/index.d.ts.map +1 -0
- package/dist/jobs/observability/index.js +4 -0
- package/dist/jobs/observability/index.js.map +1 -0
- package/dist/jobs/observability/types.d.ts +234 -0
- package/dist/jobs/observability/types.d.ts.map +1 -0
- package/dist/jobs/observability/types.js +2 -0
- package/dist/jobs/observability/types.js.map +1 -0
- package/dist/jobs/worker.d.ts +3 -1
- package/dist/jobs/worker.d.ts.map +1 -1
- package/dist/jobs/worker.js +2 -0
- package/dist/jobs/worker.js.map +1 -1
- package/dist/list-query/builder.d.ts +13 -3
- package/dist/list-query/builder.d.ts.map +1 -1
- package/dist/list-query/builder.js +45 -17
- package/dist/list-query/builder.js.map +1 -1
- package/dist/list-query/filter-mapping.d.ts +89 -0
- package/dist/list-query/filter-mapping.d.ts.map +1 -0
- package/dist/list-query/filter-mapping.js +254 -0
- package/dist/list-query/filter-mapping.js.map +1 -0
- package/dist/list-query/filter-value-schemas.d.ts +3 -3
- package/dist/list-query/filter-value-schemas.d.ts.map +1 -1
- package/dist/list-query/filter-value-schemas.js +13 -3
- package/dist/list-query/filter-value-schemas.js.map +1 -1
- package/dist/list-query/index.d.ts +4 -2
- package/dist/list-query/index.d.ts.map +1 -1
- package/dist/list-query/index.js +3 -1
- package/dist/list-query/index.js.map +1 -1
- package/dist/list-query/parse-filter-values.d.ts.map +1 -1
- package/dist/list-query/parse-filter-values.js +2 -2
- package/dist/list-query/parse-filter-values.js.map +1 -1
- package/dist/list-query/parser.d.ts +3 -2
- package/dist/list-query/parser.d.ts.map +1 -1
- package/dist/list-query/parser.js.map +1 -1
- package/dist/list-query/prisma-executor.d.ts +44 -29
- package/dist/list-query/prisma-executor.d.ts.map +1 -1
- package/dist/list-query/prisma-executor.js +48 -33
- package/dist/list-query/prisma-executor.js.map +1 -1
- package/dist/list-query/query-schema.d.ts +8 -13
- package/dist/list-query/query-schema.d.ts.map +1 -1
- package/dist/list-query/query-schema.js +11 -12
- package/dist/list-query/query-schema.js.map +1 -1
- package/dist/list-query/schema-helpers.d.ts +17 -17
- package/dist/list-query/schema-helpers.d.ts.map +1 -1
- package/dist/list-query/schema-helpers.js +11 -11
- package/dist/list-query/schema-helpers.js.map +1 -1
- package/dist/list-query/sort-mapping.d.ts +37 -0
- package/dist/list-query/sort-mapping.d.ts.map +1 -0
- package/dist/list-query/sort-mapping.js +88 -0
- package/dist/list-query/sort-mapping.js.map +1 -0
- package/dist/list-query/types.d.ts +3 -10
- package/dist/list-query/types.d.ts.map +1 -1
- package/dist/list-query/validator.d.ts.map +1 -1
- package/dist/list-query/validator.js +28 -10
- package/dist/list-query/validator.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +60 -92
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/observability/exception-tracking.d.ts.map +1 -1
- package/dist/observability/exception-tracking.js.map +1 -1
- package/dist/observability/index.d.ts +1 -1
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +1 -1
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/pino-logger.d.ts +0 -28
- package/dist/observability/pino-logger.d.ts.map +1 -1
- package/dist/observability/pino-logger.js +21 -12
- package/dist/observability/pino-logger.js.map +1 -1
- package/dist/observability/request-context.d.ts +36 -1
- package/dist/observability/request-context.d.ts.map +1 -1
- package/dist/observability/request-context.js +43 -0
- package/dist/observability/request-context.js.map +1 -1
- package/dist/openapi/openapi.d.ts +1 -4
- package/dist/openapi/openapi.d.ts.map +1 -1
- package/dist/openapi/openapi.js +15 -35
- package/dist/openapi/openapi.js.map +1 -1
- package/dist/rls/configuration.d.ts +3 -0
- package/dist/rls/configuration.d.ts.map +1 -0
- package/dist/rls/configuration.js +13 -0
- package/dist/rls/configuration.js.map +1 -0
- package/dist/rls/context.d.ts +37 -0
- package/dist/rls/context.d.ts.map +1 -0
- package/dist/rls/context.js +56 -0
- package/dist/rls/context.js.map +1 -0
- package/dist/rls/extension.d.ts +7 -0
- package/dist/rls/extension.d.ts.map +1 -0
- package/dist/rls/extension.js +91 -0
- package/dist/rls/extension.js.map +1 -0
- package/dist/rls/generator.d.ts +17 -0
- package/dist/rls/generator.d.ts.map +1 -0
- package/dist/rls/generator.js +47 -0
- package/dist/rls/generator.js.map +1 -0
- package/dist/rls/index.d.ts +7 -0
- package/dist/rls/index.d.ts.map +1 -0
- package/dist/rls/index.js +7 -0
- package/dist/rls/index.js.map +1 -0
- package/dist/rls/middleware.d.ts +17 -0
- package/dist/rls/middleware.d.ts.map +1 -0
- package/dist/rls/middleware.js +51 -0
- package/dist/rls/middleware.js.map +1 -0
- package/dist/rls/testing.d.ts +24 -0
- package/dist/rls/testing.d.ts.map +1 -0
- package/dist/rls/testing.js +31 -0
- package/dist/rls/testing.js.map +1 -0
- package/dist/rls/types.d.ts +51 -0
- package/dist/rls/types.d.ts.map +1 -0
- package/dist/rls/types.js +16 -0
- package/dist/rls/types.js.map +1 -0
- package/dist/sse/index.d.ts +6 -0
- package/dist/sse/index.d.ts.map +1 -0
- package/dist/sse/index.js +18 -0
- package/dist/sse/index.js.map +1 -0
- package/dist/sse/sse-broadcaster.d.ts +38 -0
- package/dist/sse/sse-broadcaster.d.ts.map +1 -0
- package/dist/sse/sse-broadcaster.js +118 -0
- package/dist/sse/sse-broadcaster.js.map +1 -0
- package/dist/uploads/uploads.service.d.ts.map +1 -1
- package/dist/uploads/validators.d.ts.map +1 -1
- package/dist/utils/get-client-ip.d.ts.map +1 -1
- package/dist/utils/get-client-ip.js +22 -13
- package/dist/utils/get-client-ip.js.map +1 -1
- package/dist/utils/serialize-prisma-types.js.map +1 -1
- package/package.json +56 -35
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MiddlewareHandler } from 'hono';
|
|
2
|
+
import { type RLSMiddlewareOptions } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Create Hono middleware that resolves the active TenantContext and binds it to AsyncLocalStorage.
|
|
5
|
+
*
|
|
6
|
+
* @param options - Configuration options for tenant extraction and unauthenticated behavior.
|
|
7
|
+
* @returns Hono middleware handler.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* app.use('*', createRLSMiddleware({
|
|
12
|
+
* allowUnauthenticated: true,
|
|
13
|
+
* }));
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function createRLSMiddleware(options?: RLSMiddlewareOptions): MiddlewareHandler;
|
|
17
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/rls/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAEvD,OAAO,EAEL,KAAK,oBAAoB,EAE1B,MAAM,YAAY,CAAC;AA2BpB;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,iBAAiB,CAezF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { runWithTenant } from './context.js';
|
|
2
|
+
import { MissingTenantContextException, } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Default tenant extractor that checks for `tenantId` in `c.get('user')` or `c.get('auth')`.
|
|
5
|
+
*/
|
|
6
|
+
function defaultTenantExtractor(c) {
|
|
7
|
+
const user = c.get('user');
|
|
8
|
+
if (user && typeof user.tenantId === 'string' && user.tenantId.length > 0) {
|
|
9
|
+
return {
|
|
10
|
+
tenantId: user.tenantId,
|
|
11
|
+
userId: typeof user.id === 'string' ? user.id : undefined,
|
|
12
|
+
role: typeof user.role === 'string' ? user.role : undefined,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const auth = c.get('auth');
|
|
16
|
+
if (auth && typeof auth.tenantId === 'string' && auth.tenantId.length > 0) {
|
|
17
|
+
return {
|
|
18
|
+
tenantId: auth.tenantId,
|
|
19
|
+
userId: typeof auth.userId === 'string' ? auth.userId : undefined,
|
|
20
|
+
role: typeof auth.role === 'string' ? auth.role : undefined,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create Hono middleware that resolves the active TenantContext and binds it to AsyncLocalStorage.
|
|
27
|
+
*
|
|
28
|
+
* @param options - Configuration options for tenant extraction and unauthenticated behavior.
|
|
29
|
+
* @returns Hono middleware handler.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* app.use('*', createRLSMiddleware({
|
|
34
|
+
* allowUnauthenticated: true,
|
|
35
|
+
* }));
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export function createRLSMiddleware(options = {}) {
|
|
39
|
+
const { extractTenant = defaultTenantExtractor, allowUnauthenticated = true } = options;
|
|
40
|
+
return async (c, next) => {
|
|
41
|
+
const context = await Promise.resolve(extractTenant(c));
|
|
42
|
+
if (!context?.tenantId) {
|
|
43
|
+
if (allowUnauthenticated) {
|
|
44
|
+
return runWithTenant(undefined, () => next());
|
|
45
|
+
}
|
|
46
|
+
throw new MissingTenantContextException();
|
|
47
|
+
}
|
|
48
|
+
return runWithTenant(context, () => next());
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/rls/middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EACL,6BAA6B,GAG9B,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,SAAS,sBAAsB,CAAC,CAAU;IACxC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAwC,CAAC;IAClE,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1E,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YACzD,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAwC,CAAC;IAClE,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1E,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACjE,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAO,GAAyB,EAAE;IACpE,MAAM,EAAE,aAAa,GAAG,sBAAsB,EAAE,oBAAoB,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAExF,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAExD,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YACvB,IAAI,oBAAoB,EAAE,CAAC;gBACzB,OAAO,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,MAAM,IAAI,6BAA6B,EAAE,CAAC;QAC5C,CAAC;QAED,OAAO,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { TenantContext } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Run a test or seed function within a specific tenant context.
|
|
4
|
+
*
|
|
5
|
+
* @param tenantId - The tenant identifier.
|
|
6
|
+
* @param fn - The test function.
|
|
7
|
+
* @returns The resolved return value of `fn`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* await withTenant('tenant_cwz', async () => {
|
|
12
|
+
* const polls = await pollService.list();
|
|
13
|
+
* expect(polls).toHaveLength(1);
|
|
14
|
+
* });
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function withTenant<T>(tenantId: string, fn: () => T | PromiseLike<T>, options?: Omit<TenantContext, 'tenantId'>): Promise<T>;
|
|
18
|
+
/**
|
|
19
|
+
* Run a test with explicit bypass context.
|
|
20
|
+
*
|
|
21
|
+
* @param fn - The test function.
|
|
22
|
+
*/
|
|
23
|
+
export declare function withBypass<T>(fn: () => T | PromiseLike<T>): Promise<T>;
|
|
24
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/rls/testing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAC5B,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAQZ;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEtE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { runWithBypass, runWithTenant } from './context.js';
|
|
2
|
+
/**
|
|
3
|
+
* Run a test or seed function within a specific tenant context.
|
|
4
|
+
*
|
|
5
|
+
* @param tenantId - The tenant identifier.
|
|
6
|
+
* @param fn - The test function.
|
|
7
|
+
* @returns The resolved return value of `fn`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* await withTenant('tenant_cwz', async () => {
|
|
12
|
+
* const polls = await pollService.list();
|
|
13
|
+
* expect(polls).toHaveLength(1);
|
|
14
|
+
* });
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export function withTenant(tenantId, fn, options) {
|
|
18
|
+
return runWithTenant({
|
|
19
|
+
tenantId,
|
|
20
|
+
...options,
|
|
21
|
+
}, fn);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Run a test with explicit bypass context.
|
|
25
|
+
*
|
|
26
|
+
* @param fn - The test function.
|
|
27
|
+
*/
|
|
28
|
+
export function withBypass(fn) {
|
|
29
|
+
return runWithBypass(fn);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/rls/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG5D;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,UAAU,CACxB,QAAgB,EAChB,EAA4B,EAC5B,OAAyC;IAEzC,OAAO,aAAa,CAClB;QACE,QAAQ;QACR,GAAG,OAAO;KACX,EACD,EAAE,CACH,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAI,EAA4B;IACxD,OAAO,aAAa,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Context } from 'hono';
|
|
2
|
+
import { type DomainExceptionOptions, ForbiddenException } from '../http/errors.js';
|
|
3
|
+
/** Trusted server context; bypass is an explicit permission, not a secret. */
|
|
4
|
+
export interface TenantContext {
|
|
5
|
+
tenantId?: string;
|
|
6
|
+
userId?: string;
|
|
7
|
+
role?: string;
|
|
8
|
+
bypass?: boolean;
|
|
9
|
+
metadata?: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export interface RLSExtensionOptions {
|
|
12
|
+
/** PostgreSQL tenant setting. Default: app.current_tenant_id. */
|
|
13
|
+
sessionVariable?: string;
|
|
14
|
+
/** Optional bypass setting. Only the value 'true' activates matching policies. */
|
|
15
|
+
bypassVariable?: string;
|
|
16
|
+
/** Prisma model names that require context. Default: all models. */
|
|
17
|
+
models?: readonly string[];
|
|
18
|
+
/** Defaults to 'throw'. With 'ignore', PostgreSQL remains responsible for denying access. */
|
|
19
|
+
missingContextBehavior?: 'throw' | 'ignore';
|
|
20
|
+
}
|
|
21
|
+
/** Public Prisma transaction options. */
|
|
22
|
+
export interface RLSTransactionOptions {
|
|
23
|
+
maxWait?: number;
|
|
24
|
+
timeout?: number;
|
|
25
|
+
isolationLevel?: 'ReadUncommitted' | 'ReadCommitted' | 'RepeatableRead' | 'Serializable';
|
|
26
|
+
}
|
|
27
|
+
export type RLSTransactionClient<TClient> = Omit<TClient, '$connect' | '$disconnect' | '$on' | '$transaction' | '$extends' | '$withTenant'>;
|
|
28
|
+
export type TenantContextExtractor = (context: Context) => TenantContext | undefined | Promise<TenantContext | undefined>;
|
|
29
|
+
export interface RLSMiddlewareOptions {
|
|
30
|
+
extractTenant?: TenantContextExtractor;
|
|
31
|
+
/** Allow public requests without a tenant. Default: true. */
|
|
32
|
+
allowUnauthenticated?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface GenerateRLSPoliciesOptions {
|
|
35
|
+
/** SQL table names, respecting Prisma @@map. */
|
|
36
|
+
models: readonly string[];
|
|
37
|
+
/** SQL column name, respecting Prisma @map. Default: tenantId. */
|
|
38
|
+
tenantField?: string;
|
|
39
|
+
sessionVariable?: string;
|
|
40
|
+
/** Only specify for tables that explicitly allow bypass. */
|
|
41
|
+
bypassVariable?: string;
|
|
42
|
+
/** Enforce RLS for the table owner as well. Default: true. */
|
|
43
|
+
forceRLS?: boolean;
|
|
44
|
+
}
|
|
45
|
+
export declare class MissingTenantContextException extends ForbiddenException {
|
|
46
|
+
constructor(modelName?: string, options?: DomainExceptionOptions);
|
|
47
|
+
}
|
|
48
|
+
export declare class RLSConfigurationException extends Error {
|
|
49
|
+
constructor(message: string);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rls/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,KAAK,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEpF,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,6FAA6F;IAC7F,sBAAsB,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7C;AAED,yCAAyC;AACzC,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,iBAAiB,GAAG,eAAe,GAAG,gBAAgB,GAAG,cAAc,CAAC;CAC1F;AAED,MAAM,MAAM,oBAAoB,CAAC,OAAO,IAAI,IAAI,CAC9C,OAAO,EACP,UAAU,GAAG,aAAa,GAAG,KAAK,GAAG,cAAc,GAAG,UAAU,GAAG,aAAa,CACjF,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,CACnC,OAAO,EAAE,OAAO,KACb,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,6DAA6D;IAC7D,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,0BAA0B;IACzC,gDAAgD;IAChD,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,6BAA8B,SAAQ,kBAAkB;IACnE,YAAY,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,EAQ/D;CACF;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ForbiddenException } from '../http/errors.js';
|
|
2
|
+
export class MissingTenantContextException extends ForbiddenException {
|
|
3
|
+
constructor(modelName, options) {
|
|
4
|
+
super(modelName
|
|
5
|
+
? `Missing tenant context for tenant-scoped model "${modelName}". Operation rejected by RLS guard.`
|
|
6
|
+
: 'Missing tenant context. Operation rejected by RLS guard.', options);
|
|
7
|
+
this.name = 'MissingTenantContextException';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class RLSConfigurationException extends Error {
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'RLSConfigurationException';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rls/types.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAwDpF,MAAM,OAAO,6BAA8B,SAAQ,kBAAkB;IACnE,YAAY,SAAkB,EAAE,OAAgC;QAC9D,KAAK,CACH,SAAS;YACP,CAAC,CAAC,mDAAmD,SAAS,qCAAqC;YACnG,CAAC,CAAC,0DAA0D,EAC9D,OAAO,CACR,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ModuleConfig } from '../core/types.js';
|
|
2
|
+
import { type SseBroadcasterOptions } from './sse-broadcaster.js';
|
|
3
|
+
export { SseBroadcaster, type SseBroadcasterOptions } from './sse-broadcaster.js';
|
|
4
|
+
/** Register one broadcaster per application container, without exposing a public route. */
|
|
5
|
+
export declare function createSseModule(options?: SseBroadcasterOptions): ModuleConfig;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sse/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElF,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElF,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,OAAO,GAAE,qBAA0B,GAAG,YAAY,CAYjF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { defineModule } from '../core/module.js';
|
|
2
|
+
import { SseBroadcaster } from './sse-broadcaster.js';
|
|
3
|
+
export { SseBroadcaster } from './sse-broadcaster.js';
|
|
4
|
+
/** Register one broadcaster per application container, without exposing a public route. */
|
|
5
|
+
export function createSseModule(options = {}) {
|
|
6
|
+
return defineModule({
|
|
7
|
+
name: 'sse',
|
|
8
|
+
providers: [
|
|
9
|
+
{
|
|
10
|
+
provide: 'sseBroadcaster',
|
|
11
|
+
useFactory: () => new SseBroadcaster(options),
|
|
12
|
+
scope: 'SINGLETON',
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
exports: ['sseBroadcaster'],
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sse/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAA8B,MAAM,sBAAsB,CAAC;AAElF,OAAO,EAAE,cAAc,EAA8B,MAAM,sBAAsB,CAAC;AAElF,2FAA2F;AAC3F,MAAM,UAAU,eAAe,CAAC,OAAO,GAA0B,EAAE;IACjE,OAAO,YAAY,CAAC;QAClB,IAAI,EAAE,KAAK;QACX,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,gBAAgB;gBACzB,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC;gBAC7C,KAAK,EAAE,WAAW;aACnB;SACF;QACD,OAAO,EAAE,CAAC,gBAAgB,CAAC;KAC5B,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { OnModuleDestroy } from '../core/types.js';
|
|
2
|
+
interface StreamContext {
|
|
3
|
+
readonly req: {
|
|
4
|
+
readonly raw: Request;
|
|
5
|
+
};
|
|
6
|
+
header(name: string, value: string): void;
|
|
7
|
+
newResponse(body: ReadableStream<Uint8Array>): Response;
|
|
8
|
+
body(body: null, status: 503): Response;
|
|
9
|
+
}
|
|
10
|
+
export interface SseBroadcasterOptions {
|
|
11
|
+
/** Heartbeat interval; 0 disables heartbeats. Defaults to 15 seconds. */
|
|
12
|
+
readonly heartbeatIntervalMs?: number;
|
|
13
|
+
/** Maximum queued bytes per connection. Slow clients are disconnected. Defaults to 64 KiB. */
|
|
14
|
+
readonly maxBufferedBytes?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* In-process, best-effort notifications for a single authorized audience.
|
|
18
|
+
* Mount stream() behind application middleware. Clients must refresh state on
|
|
19
|
+
* every connection: events are not persisted or replayed across reconnects.
|
|
20
|
+
*/
|
|
21
|
+
export declare class SseBroadcaster<Events extends object = Record<string, unknown>> implements OnModuleDestroy {
|
|
22
|
+
private readonly connections;
|
|
23
|
+
private readonly encoder;
|
|
24
|
+
private readonly heartbeatIntervalMs;
|
|
25
|
+
private readonly maxBufferedBytes;
|
|
26
|
+
private isStopped;
|
|
27
|
+
constructor(options?: SseBroadcasterOptions);
|
|
28
|
+
get clientCount(): number;
|
|
29
|
+
/** Open an ordinary HTTP response; authentication/authorization belongs to the route. */
|
|
30
|
+
stream(context: StreamContext): Response;
|
|
31
|
+
/** Serialize once and deliver without letting slow consumers block the publisher. */
|
|
32
|
+
broadcast<Event extends keyof Events & string>(event: Event, payload: Events[Event]): void;
|
|
33
|
+
/** Synchronous cleanup also works when a consumer never reads its response. */
|
|
34
|
+
onModuleDestroy(): void;
|
|
35
|
+
private createConnection;
|
|
36
|
+
}
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=sse-broadcaster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-broadcaster.d.ts","sourceRoot":"","sources":["../../src/sse/sse-broadcaster.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAQxD,UAAU,aAAa;IACrB,QAAQ,CAAC,GAAG,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;IACxC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;IACxD,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,QAAQ,CAAC;CACzC;AAED,MAAM,WAAW,qBAAqB;IACpC,yEAAyE;IACzE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,8FAA8F;IAC9F,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAQD;;;;GAIG;AACH,qBAAa,cAAc,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACzE,YAAW,eAAe;IAE1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,SAAS,CAAS;IAE1B,YAAY,OAAO,GAAE,qBAA0B,EAW9C;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,yFAAyF;IACzF,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,QAAQ,CAsBvC;IAED,qFAAqF;IACrF,SAAS,CAAC,KAAK,SAAS,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAkBzF;IAED,+EAA+E;IAC/E,eAAe,IAAI,IAAI,CAMtB;IAED,OAAO,CAAC,gBAAgB;CA+DzB"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
const DEFAULT_HEARTBEAT_INTERVAL_MS = 15_000;
|
|
2
|
+
const DEFAULT_MAX_BUFFERED_BYTES = 65_536;
|
|
3
|
+
const CONNECTED_FRAME = 'retry: 3000\n: connected\n\n';
|
|
4
|
+
const HEARTBEAT_FRAME = ': heartbeat\n\n';
|
|
5
|
+
/**
|
|
6
|
+
* In-process, best-effort notifications for a single authorized audience.
|
|
7
|
+
* Mount stream() behind application middleware. Clients must refresh state on
|
|
8
|
+
* every connection: events are not persisted or replayed across reconnects.
|
|
9
|
+
*/
|
|
10
|
+
export class SseBroadcaster {
|
|
11
|
+
connections = new Set();
|
|
12
|
+
encoder = new TextEncoder();
|
|
13
|
+
heartbeatIntervalMs;
|
|
14
|
+
maxBufferedBytes;
|
|
15
|
+
isStopped = false;
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
this.heartbeatIntervalMs = options.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS;
|
|
18
|
+
this.maxBufferedBytes = options.maxBufferedBytes ?? DEFAULT_MAX_BUFFERED_BYTES;
|
|
19
|
+
if (!Number.isFinite(this.heartbeatIntervalMs) || this.heartbeatIntervalMs < 0) {
|
|
20
|
+
throw new RangeError('heartbeatIntervalMs must be a finite non-negative number');
|
|
21
|
+
}
|
|
22
|
+
if (!Number.isSafeInteger(this.maxBufferedBytes) || this.maxBufferedBytes < 64) {
|
|
23
|
+
throw new RangeError('maxBufferedBytes must be an integer of at least 64');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
get clientCount() {
|
|
27
|
+
return this.connections.size;
|
|
28
|
+
}
|
|
29
|
+
/** Open an ordinary HTTP response; authentication/authorization belongs to the route. */
|
|
30
|
+
stream(context) {
|
|
31
|
+
if (this.isStopped) {
|
|
32
|
+
return context.body(null, 503);
|
|
33
|
+
}
|
|
34
|
+
let connection;
|
|
35
|
+
const body = new ReadableStream({
|
|
36
|
+
start: (controller) => {
|
|
37
|
+
connection = this.createConnection(controller, context.req.raw.signal);
|
|
38
|
+
},
|
|
39
|
+
cancel: () => connection?.cancel(),
|
|
40
|
+
}, { highWaterMark: this.maxBufferedBytes, size: (chunk) => chunk.byteLength });
|
|
41
|
+
context.header('Content-Type', 'text/event-stream; charset=utf-8');
|
|
42
|
+
context.header('Cache-Control', 'no-cache, no-transform');
|
|
43
|
+
context.header('X-Accel-Buffering', 'no');
|
|
44
|
+
return context.newResponse(body);
|
|
45
|
+
}
|
|
46
|
+
/** Serialize once and deliver without letting slow consumers block the publisher. */
|
|
47
|
+
broadcast(event, payload) {
|
|
48
|
+
if (!event || /[\r\n\0]/.test(event)) {
|
|
49
|
+
throw new TypeError('SSE event names must be non-empty and contain no CR, LF or NUL');
|
|
50
|
+
}
|
|
51
|
+
const data = JSON.stringify(payload);
|
|
52
|
+
if (data === undefined) {
|
|
53
|
+
throw new TypeError('SSE payload must be JSON serializable');
|
|
54
|
+
}
|
|
55
|
+
const frame = this.encoder.encode(`event: ${event}\ndata: ${data}\n\n`);
|
|
56
|
+
if (frame.byteLength > this.maxBufferedBytes) {
|
|
57
|
+
throw new RangeError('SSE event exceeds maxBufferedBytes');
|
|
58
|
+
}
|
|
59
|
+
for (const connection of this.connections) {
|
|
60
|
+
connection.send(frame);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Synchronous cleanup also works when a consumer never reads its response. */
|
|
64
|
+
onModuleDestroy() {
|
|
65
|
+
this.isStopped = true;
|
|
66
|
+
for (const connection of this.connections) {
|
|
67
|
+
connection.close();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
createConnection(controller, signal) {
|
|
71
|
+
let isClosed = false;
|
|
72
|
+
let heartbeat;
|
|
73
|
+
const connection = {
|
|
74
|
+
cancel: () => {
|
|
75
|
+
if (isClosed) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
isClosed = true;
|
|
79
|
+
clearInterval(heartbeat);
|
|
80
|
+
signal.removeEventListener('abort', connection.close);
|
|
81
|
+
this.connections.delete(connection);
|
|
82
|
+
},
|
|
83
|
+
close: () => {
|
|
84
|
+
if (isClosed) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
connection.cancel();
|
|
88
|
+
// Close synchronously without waiting for the bounded queue to drain.
|
|
89
|
+
controller.close();
|
|
90
|
+
},
|
|
91
|
+
send: (frame) => {
|
|
92
|
+
if (isClosed) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if ((controller.desiredSize ?? 0) < frame.byteLength) {
|
|
96
|
+
connection.cancel();
|
|
97
|
+
controller.error(new Error('SSE client exceeded its buffer limit'));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
controller.enqueue(frame);
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
this.connections.add(connection);
|
|
104
|
+
signal.addEventListener('abort', connection.close, { once: true });
|
|
105
|
+
if (signal.aborted) {
|
|
106
|
+
connection.close();
|
|
107
|
+
return connection;
|
|
108
|
+
}
|
|
109
|
+
// Flush response headers and tell native EventSource how long to wait before retrying.
|
|
110
|
+
connection.send(this.encoder.encode(CONNECTED_FRAME));
|
|
111
|
+
if (this.heartbeatIntervalMs > 0) {
|
|
112
|
+
const frame = this.encoder.encode(HEARTBEAT_FRAME);
|
|
113
|
+
heartbeat = setInterval(() => connection.send(frame), this.heartbeatIntervalMs);
|
|
114
|
+
}
|
|
115
|
+
return connection;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=sse-broadcaster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-broadcaster.js","sourceRoot":"","sources":["../../src/sse/sse-broadcaster.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploads.service.d.ts","sourceRoot":"","sources":["../../src/uploads/uploads.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAe5C,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,4BAA4B;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,gCAAgC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qBAAqB;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAaD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;
|
|
1
|
+
{"version":3,"file":"uploads.service.d.ts","sourceRoot":"","sources":["../../src/uploads/uploads.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAe5C,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,4BAA4B;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,gCAAgC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qBAAqB;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAaD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,YAAY,MAAM,EAAE,oBAAoB,EAIvC;IAED;;;OAGG;IACG,kBAAkB,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAcjF;IAED;;;;;;OAMG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoB5D;IAED;;;;;;OAMG;IACG,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,yBAAyB,CAAC,CAcpC;IAED;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhD;IAED;;OAEG;IACH,OAAO,CAAC,YAAY;CAGrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/uploads/validators.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/uploads/validators.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,iBAAiB,sBAAuB,SAAS,MAAM,EAAE,iBAAiB,MAAM,6LAwC1F,CAAC;AAEJ;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,qBAAqB,sBACb,SAAS,MAAM,EAAE,iBACrB,MAAM,0IAoBpB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-client-ip.d.ts","sourceRoot":"","sources":["../../src/utils/get-client-ip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"get-client-ip.d.ts","sourceRoot":"","sources":["../../src/utils/get-client-ip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAyB9C"}
|
|
@@ -20,6 +20,9 @@
|
|
|
20
20
|
* ```
|
|
21
21
|
*/
|
|
22
22
|
export function getClientIp(c) {
|
|
23
|
+
const lambdaIp = getLambdaClientIp(c.env);
|
|
24
|
+
if (lambdaIp)
|
|
25
|
+
return lambdaIp;
|
|
23
26
|
const trustProxy = c.get('trustProxy') === true;
|
|
24
27
|
// Only honor proxy headers when explicitly trusted
|
|
25
28
|
if (trustProxy) {
|
|
@@ -36,19 +39,25 @@ export function getClientIp(c) {
|
|
|
36
39
|
return trimmed;
|
|
37
40
|
}
|
|
38
41
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
// This will throw in non-Node environments
|
|
43
|
-
const { getConnInfo } = require('@hono/node-server/conninfo');
|
|
44
|
-
const info = getConnInfo(c);
|
|
45
|
-
if (info?.remote?.address) {
|
|
46
|
-
return info.remote.address;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
// Not in Node.js environment or module not available
|
|
51
|
-
}
|
|
42
|
+
const nodeIp = getNodeClientIp(c.env);
|
|
43
|
+
if (nodeIp)
|
|
44
|
+
return nodeIp;
|
|
52
45
|
return 'unknown';
|
|
53
46
|
}
|
|
47
|
+
function getLambdaClientIp(environment) {
|
|
48
|
+
if (!environment || typeof environment !== 'object')
|
|
49
|
+
return undefined;
|
|
50
|
+
const env = environment;
|
|
51
|
+
const sourceIp = env.requestContext?.http?.sourceIp ?? env.requestContext?.identity?.sourceIp;
|
|
52
|
+
return typeof sourceIp === 'string' && sourceIp.trim() ? sourceIp.trim() : undefined;
|
|
53
|
+
}
|
|
54
|
+
function getNodeClientIp(environment) {
|
|
55
|
+
if (!environment || typeof environment !== 'object')
|
|
56
|
+
return undefined;
|
|
57
|
+
const remoteAddress = environment
|
|
58
|
+
.incoming?.socket?.remoteAddress;
|
|
59
|
+
return typeof remoteAddress === 'string' && remoteAddress.trim()
|
|
60
|
+
? remoteAddress.trim()
|
|
61
|
+
: undefined;
|
|
62
|
+
}
|
|
54
63
|
//# sourceMappingURL=get-client-ip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-client-ip.js","sourceRoot":"","sources":["../../src/utils/get-client-ip.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,WAAW,CAAC,CAAU;IACpC,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IAEhD,mDAAmD;IACnD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACtD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAC/C,IAAI,EAAE;gBAAE,OAAO,EAAE,CAAC;QACpB,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"get-client-ip.js","sourceRoot":"","sources":["../../src/utils/get-client-ip.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,WAAW,CAAC,CAAU;IACpC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IAEhD,mDAAmD;IACnD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACtD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAC/C,IAAI,EAAE;gBAAE,OAAO,EAAE,CAAC;QACpB,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAoB;IAC7C,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEtE,MAAM,GAAG,GAAG,WAKX,CAAC;IACF,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,QAAQ,IAAI,GAAG,CAAC,cAAc,EAAE,QAAQ,EAAE,QAAQ,CAAC;IAC9F,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACvF,CAAC;AAED,SAAS,eAAe,CAAC,WAAoB;IAC3C,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEtE,MAAM,aAAa,GAAI,WAAuE;SAC3F,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC;IACnC,OAAO,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,EAAE;QAC9D,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE;QACtB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialize-prisma-types.js","sourceRoot":"","sources":["../../src/utils/serialize-prisma-types.ts"],"names":[],"mappings":"AA+CA;;;GAGG;AACH,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC;;;;;;;;;GASG;AACH,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,OAAQ,KAAgC,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC/F,OAAO,KAAK,CAAC;IACf,CAAC;IAED,oEAAoE;IACpE,MAAM,mBAAmB,GACvB,GAAG,IAAI,KAAK;QACZ,GAAG,IAAI,KAAK;QACZ,GAAG,IAAI,KAAK;QACZ,OAAQ,KAAyB,CAAC,CAAC,KAAK,QAAQ;QAChD,OAAQ,KAAyB,CAAC,CAAC,KAAK,QAAQ;QAChD,KAAK,CAAC,OAAO,CAAE,KAAyB,CAAC,CAAC,CAAC,CAAC;IAE9C,qCAAqC;IACrC,MAAM,qBAAqB,GACzB,aAAa,IAAI,KAAK;QACtB,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QACrC,KAAK,CAAC,WAAW,KAAK,IAAI;QAC1B,MAAM,IAAI,KAAK,CAAC,WAAW;QAC1B,KAAK,CAAC,WAAkC,CAAC,IAAI,KAAK,SAAS,CAAC;IAE/D,iEAAiE;IACjE,OAAO,mBAAmB,IAAI,qBAAqB,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,kBAAkB,GAAoB,CAAC,KAAc,EAAE,EAAE;IAC7D,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC,CAAC,kCAAkC;AACtD,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAwB;IAChD,YAAY,EAAE,CAAC,kBAAkB,CAAC;CACnC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAO,EACP,
|
|
1
|
+
{"version":3,"file":"serialize-prisma-types.js","sourceRoot":"","sources":["../../src/utils/serialize-prisma-types.ts"],"names":[],"mappings":"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"}
|