@shivaedev/server 0.2.0 → 0.3.1
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 +105 -87
- package/dist/AppHostFactory.d.ts +9 -8
- package/dist/AppHostFactory.d.ts.map +1 -1
- package/dist/AppHostInput.d.ts +4 -3
- package/dist/AppHostInput.d.ts.map +1 -1
- package/dist/appHost.d.ts +30 -5
- package/dist/appHost.d.ts.map +1 -1
- package/dist/appHost.js +4 -3
- package/dist/appHost.js.map +1 -1
- package/dist/appHostHttp.d.ts +45 -47
- package/dist/appHostHttp.d.ts.map +1 -1
- package/dist/appHostHttp.js +13 -42
- package/dist/appHostHttp.js.map +1 -1
- package/dist/development.d.ts.map +1 -1
- package/dist/development.js +2 -1
- package/dist/development.js.map +1 -1
- package/dist/healthRoute.d.ts.map +1 -1
- package/dist/healthRoute.js +3 -2
- package/dist/healthRoute.js.map +1 -1
- package/dist/hostApplicationRoutes.d.ts +3 -0
- package/dist/hostApplicationRoutes.d.ts.map +1 -0
- package/dist/hostApplicationRoutes.js +6 -0
- package/dist/hostApplicationRoutes.js.map +1 -0
- package/dist/hostChanges.js +1 -1
- package/dist/hostChanges.js.map +1 -1
- package/dist/hostOptions.d.ts +6 -2
- package/dist/hostOptions.d.ts.map +1 -1
- package/dist/hostRpc.d.ts +11 -0
- package/dist/hostRpc.d.ts.map +1 -0
- package/dist/hostRpc.js +20 -0
- package/dist/hostRpc.js.map +1 -0
- package/dist/hostRpcRoutes.d.ts +23 -0
- package/dist/hostRpcRoutes.d.ts.map +1 -0
- package/dist/hostRpcRoutes.js +29 -0
- package/dist/hostRpcRoutes.js.map +1 -0
- package/dist/nativeClientOrigins.d.ts +2 -1
- package/dist/nativeClientOrigins.d.ts.map +1 -1
- package/dist/nativeClientOrigins.js +11 -5
- package/dist/nativeClientOrigins.js.map +1 -1
- package/dist/nodeHttpServer.d.ts +7 -0
- package/dist/nodeHttpServer.d.ts.map +1 -0
- package/dist/nodeHttpServer.js +15 -0
- package/dist/nodeHttpServer.js.map +1 -0
- package/dist/otlpHttpClient.d.ts.map +1 -1
- package/dist/otlpHttpClient.js +2 -1
- package/dist/otlpHttpClient.js.map +1 -1
- package/package.json +12 -11
- package/src/AppHostFactory.ts +47 -44
- package/src/AppHostInput.ts +27 -4
- package/src/appHost.ts +25 -7
- package/src/appHostHttp.ts +68 -72
- package/src/development.ts +2 -1
- package/src/healthRoute.ts +3 -2
- package/src/hostApplicationRoutes.ts +8 -0
- package/src/hostChanges.ts +2 -2
- package/src/hostOptions.ts +20 -2
- package/src/hostRpc.ts +26 -0
- package/src/hostRpcRoutes.ts +57 -0
- package/src/nativeClientOrigins.ts +16 -5
- package/src/nodeHttpServer.ts +24 -0
- package/src/otlpHttpClient.ts +2 -1
package/dist/healthRoute.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { Effect, Fiber, Option } from "effect";
|
|
2
2
|
import { HttpRouter, HttpServerResponse } from "effect/http";
|
|
3
|
+
import * as HttpStatus from "effect/http/HttpStatus";
|
|
3
4
|
import { SqlClient } from "effect/sql";
|
|
4
5
|
export const healthRoute = HttpRouter.use((router) => Effect.gen(function* () {
|
|
5
6
|
const database = yield* Effect.serviceOption(SqlClient.SqlClient);
|
|
6
7
|
const scope = yield* Effect.scope;
|
|
7
8
|
const probe = Effect.gen(function* () {
|
|
8
9
|
if (Option.isNone(database)) {
|
|
9
|
-
return
|
|
10
|
+
return HttpStatus.fromLiteral("ServiceUnavailable");
|
|
10
11
|
}
|
|
11
12
|
const query = yield* database.value `select 1`.pipe(Effect.forkIn(scope));
|
|
12
13
|
return yield* Fiber.join(query).pipe(Effect.timeout("2 seconds"),
|
|
13
14
|
// Driver cancellation may need network I/O; keep cleanup in the host scope without delaying the response.
|
|
14
|
-
Effect.ensuring(Fiber.interrupt(query).pipe(Effect.forkIn(scope), Effect.asVoid)), Effect.match({ onFailure: () =>
|
|
15
|
+
Effect.ensuring(Fiber.interrupt(query).pipe(Effect.forkIn(scope), Effect.asVoid)), Effect.match({ onFailure: () => HttpStatus.fromLiteral("ServiceUnavailable"), onSuccess: () => HttpStatus.fromLiteral("OK") }));
|
|
15
16
|
});
|
|
16
17
|
yield* router.add("GET", "/health", Effect.map(probe, (status) => HttpServerResponse.empty({ headers: { "cache-control": "no-store" }, status })));
|
|
17
18
|
}));
|
package/dist/healthRoute.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"healthRoute.js","sourceRoot":"","sources":["../src/healthRoute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACpD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACjC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"healthRoute.js","sourceRoot":"","sources":["../src/healthRoute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACpD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACjC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,UAAU,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAA,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACzE,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CACnC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC3B,0GAA0G;QAC1G,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EACjF,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,oBAAoB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAC9H,CAAC;IACH,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAChB,KAAK,EACL,SAAS,EACT,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAC7G,CAAC;AACH,CAAC,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { Layer } from "effect";
|
|
2
|
+
export declare function hostApplicationRoutes<TError, TRequirements>(routes: Layer.Layer<never, TError, TRequirements> | undefined, bodySize: number): Layer.Layer<never, TError, Exclude<TRequirements, never>>;
|
|
3
|
+
//# sourceMappingURL=hostApplicationRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostApplicationRoutes.d.ts","sourceRoot":"","sources":["../src/hostApplicationRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAGjD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,6DAI3I"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ByteSize, Effect, Layer } from "effect";
|
|
2
|
+
import { HttpIncomingMessage, HttpRouter } from "effect/http";
|
|
3
|
+
export function hostApplicationRoutes(routes, bodySize) {
|
|
4
|
+
return (routes ?? Layer.empty).pipe(Layer.provide(HttpRouter.middleware((effect) => Effect.provideService(effect, HttpIncomingMessage.MaxBodySize, ByteSize.bytes(bodySize))).layer));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=hostApplicationRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostApplicationRoutes.js","sourceRoot":"","sources":["../src/hostApplicationRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,UAAU,qBAAqB,CAAwB,MAA6D,EAAE,QAAgB;IAC3I,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAClC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,mBAAmB,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAChJ,CAAC;AACH,CAAC"}
|
package/dist/hostChanges.js
CHANGED
|
@@ -15,7 +15,7 @@ export function hostChanges(group, changesService) {
|
|
|
15
15
|
continue;
|
|
16
16
|
}
|
|
17
17
|
function handler({ queries }) {
|
|
18
|
-
return Stream.unwrap(Effect.map(resolveChanges(rpc, queries), ({
|
|
18
|
+
return Stream.unwrap(Effect.map(resolveChanges(rpc, queries), ({ subscription, context }) => Option.isSome(changes) ? changes.value.subscribe(subscription, context) : Stream.never));
|
|
19
19
|
}
|
|
20
20
|
handlers.set(rpc.key, { context: services, handler, tag: rpc._tag });
|
|
21
21
|
}
|
package/dist/hostChanges.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hostChanges.js","sourceRoot":"","sources":["../src/hostChanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAG3E,MAAM,UAAU,WAAW,CAAoB,KAA2B,EAAE,cAAiC;IAC5G,OAAO,KAAK,CAAC,aAAa,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAS,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrC,SAAS;YACV,CAAC;YACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjD,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACtD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAChC,SAAS;YACV,CAAC;YACD,SAAS,OAAO,CAAC,EAAE,OAAO,EAAmD;gBAC5E,OAAO,MAAM,CAAC,MAAM,CACnB,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"hostChanges.js","sourceRoot":"","sources":["../src/hostChanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhE,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAG3E,MAAM,UAAU,WAAW,CAAoB,KAA2B,EAAE,cAAiC;IAC5G,OAAO,KAAK,CAAC,aAAa,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAS,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrC,SAAS;YACV,CAAC;YACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjD,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACtD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAChC,SAAS;YACV,CAAC;YACD,SAAS,OAAO,CAAC,EAAE,OAAO,EAAmD;gBAC5E,OAAO,MAAM,CAAC,MAAM,CACnB,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,CACtE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACtF,CACD,CAAC;YACH,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,OAAO,CAAC,UAAU,CAAqE,QAAQ,CAAC,CAAC;IACzG,CAAC,CAAC,CACF,CAAC;AACH,CAAC"}
|
package/dist/hostOptions.d.ts
CHANGED
|
@@ -3,7 +3,8 @@ import type { HttpRouter, HttpStaticServer } from "effect/http";
|
|
|
3
3
|
import type { Rpc, RpcGroup } from "effect/rpc";
|
|
4
4
|
import type { SessionPolicy, SessionShape } from "@shivaedev/identity/server/session.ts";
|
|
5
5
|
import type { AppDatabaseOptions } from "./appHost.ts";
|
|
6
|
-
export type
|
|
6
|
+
export type HostRouteRequirements = HttpRouter.HttpRouter | HttpRouter.Request<"Error", unknown>;
|
|
7
|
+
export type HostCoreOptions<TRpcs extends Rpc.Any, THandlers, THandlerError, THandlerRequirements, TServices, TServiceError, TServiceRequirements> = {
|
|
7
8
|
readonly assets?: string | Parameters<typeof HttpStaticServer.layer>[0];
|
|
8
9
|
readonly config?: AppDatabaseOptions["config"] & {
|
|
9
10
|
readonly port?: number;
|
|
@@ -17,13 +18,16 @@ export type HostOptions<TRpcs extends Rpc.Any, THandlers, THandlerError, THandle
|
|
|
17
18
|
readonly group: RpcGroup.RpcGroup<TRpcs>;
|
|
18
19
|
readonly handlers: Layer.Layer<THandlers, THandlerError, THandlerRequirements>;
|
|
19
20
|
readonly nativeOrigins?: readonly string[];
|
|
20
|
-
readonly routes?: Layer.Layer<never, never, HttpRouter.HttpRouter | HttpRouter.Request<"Error", unknown>>;
|
|
21
21
|
readonly rpcPath?: HttpRouter.PathInput;
|
|
22
22
|
} & ({
|
|
23
23
|
readonly services: Layer.Layer<TServices, TServiceError, TServiceRequirements>;
|
|
24
24
|
} | ([TServices | TServiceError | TServiceRequirements] extends [never] ? {
|
|
25
25
|
readonly services?: never;
|
|
26
26
|
} : never));
|
|
27
|
+
export interface HostRoutes<TRouteError = never, TRouteRequirements = HostRouteRequirements> {
|
|
28
|
+
readonly routes?: Layer.Layer<never, TRouteError, TRouteRequirements>;
|
|
29
|
+
}
|
|
30
|
+
export type HostOptions<TRpcs extends Rpc.Any, THandlers, THandlerError, THandlerRequirements, TServices, TServiceError, TServiceRequirements, TRouteError = never, TRouteRequirements = HostRouteRequirements> = HostCoreOptions<TRpcs, THandlers, THandlerError, THandlerRequirements, TServices, TServiceError, TServiceRequirements> & HostRoutes<TRouteError, TRouteRequirements>;
|
|
27
31
|
export type HostPolicy<TSession extends SessionShape> = {
|
|
28
32
|
readonly policy?: undefined;
|
|
29
33
|
readonly sessions: SessionPolicy<TSession>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hostOptions.d.ts","sourceRoot":"","sources":["../src/hostOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"hostOptions.d.ts","sourceRoot":"","sources":["../src/hostOptions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import { type HttpEffect, HttpServerResponse } from "effect/http";
|
|
3
|
+
import { type Rpc, type RpcGroup, RpcMiddleware } from "effect/rpc";
|
|
4
|
+
import { MissingReadPolicy, QueryReadDenied } from "@shivaedev/contract/readPolicyErrors.ts";
|
|
5
|
+
declare const HostedReadPolicy_base: RpcMiddleware.ServiceClass<HostedReadPolicy, "@shivaedev/server/HostedReadPolicy", never, Schema.Union<readonly [typeof MissingReadPolicy, typeof QueryReadDenied]>, never, never, false>;
|
|
6
|
+
declare class HostedReadPolicy extends HostedReadPolicy_base {
|
|
7
|
+
}
|
|
8
|
+
export type { HostedReadPolicy };
|
|
9
|
+
export declare const rpcCacheControl: HttpEffect.PreResponseHandler;
|
|
10
|
+
export declare const hostRpc: <R extends Rpc.Any>(group: RpcGroup.RpcGroup<R>) => Effect.Effect<Effect.Effect<HttpServerResponse.HttpServerResponse, never, import("effect/http/HttpServerRequest").HttpServerRequest | import("effect/Scope").Scope>, never, import("effect/rpc/RpcSerialization").RpcSerialization | import("effect/Scope").Scope | Exclude<Rpc.Middleware<Rpc.AddMiddleware<Rpc.AddMiddleware<R, typeof HostedReadPolicy>, typeof import("@shivaedev/identity/middleware.ts").RequestTracing>>, HostedReadPolicy> | Exclude<Rpc.ServicesServer<Rpc.AddMiddleware<Rpc.AddMiddleware<R, typeof HostedReadPolicy>, typeof import("@shivaedev/identity/middleware.ts").RequestTracing>>, HostedReadPolicy> | Exclude<Rpc.ToHandler<Rpc.AddMiddleware<Rpc.AddMiddleware<R, typeof HostedReadPolicy>, typeof import("@shivaedev/identity/middleware.ts").RequestTracing>>, HostedReadPolicy>>;
|
|
11
|
+
//# sourceMappingURL=hostRpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostRpc.d.ts","sourceRoot":"","sources":["../src/hostRpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,KAAK,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,aAAa,EAAa,MAAM,YAAY,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;;AAG7F,cAAM,gBAAiB,SAAQ,qBAE7B;CAAG;AAEL,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC,eAAO,MAAM,eAAe,EAAE,UAAU,CAAC,kBACoD,CAAC;AAE9F,eAAO,MAAM,OAAO,GAAgC,CAAC,SAAS,GAAG,CAAC,GAAG,0zBASnE,CAAC"}
|
package/dist/hostRpc.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import { HttpServerResponse } from "effect/http";
|
|
3
|
+
import { RpcMiddleware, RpcServer } from "effect/rpc";
|
|
4
|
+
import { authorizeReads, CurrentViewer } from "@shivaedev/contract/readPolicy.ts";
|
|
5
|
+
import { MissingReadPolicy, QueryReadDenied } from "@shivaedev/contract/readPolicyErrors.ts";
|
|
6
|
+
import { tracedGroup } from "#tracedGroup.ts";
|
|
7
|
+
class HostedReadPolicy extends RpcMiddleware.Service()("@shivaedev/server/HostedReadPolicy", {
|
|
8
|
+
error: Schema.Union([MissingReadPolicy, QueryReadDenied]),
|
|
9
|
+
}) {
|
|
10
|
+
}
|
|
11
|
+
export const rpcCacheControl = (_, response) => Effect.succeed(HttpServerResponse.setHeader(response, "cache-control", "private, no-store"));
|
|
12
|
+
export const hostRpc = Effect.fnUntraced(function* (group) {
|
|
13
|
+
const guarded = group.middleware(HostedReadPolicy);
|
|
14
|
+
// Keep the policy inside identity middleware so it sees the request's viewer.
|
|
15
|
+
for (const rpc of guarded.requests.values()) {
|
|
16
|
+
Object.assign(rpc, { middlewares: new Set([HostedReadPolicy, ...rpc.middlewares]) });
|
|
17
|
+
}
|
|
18
|
+
return yield* RpcServer.toHttpEffect(tracedGroup(guarded)).pipe(Effect.provideService(HostedReadPolicy, (effect, request) => Effect.flatMap(CurrentViewer, (viewer) => authorizeReads(effect, request, viewer))));
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=hostRpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostRpc.js","sourceRoot":"","sources":["../src/hostRpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAmB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAA2B,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,gBAAiB,SAAQ,aAAa,CAAC,OAAO,EAAoB,CAAC,oCAAoC,EAAE;IAC9G,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;CACzD,CAAC;CAAG;AAIL,MAAM,CAAC,MAAM,eAAe,GAAkC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAC7E,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAE9F,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAqB,KAA2B;IACjG,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IACnD,8EAA8E;IAC9E,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAC9D,MAAM,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAChJ,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Effect, Layer } from "effect";
|
|
2
|
+
import { HttpRouter } from "effect/http";
|
|
3
|
+
import { type Rpc, type RpcGroup, RpcSerialization } from "effect/rpc";
|
|
4
|
+
import type { RequestTracing } from "@shivaedev/identity/middleware.ts";
|
|
5
|
+
import { type SessionShape } from "@shivaedev/identity/server/session.ts";
|
|
6
|
+
import type { AppChanges } from "#appHost.ts";
|
|
7
|
+
import type { HostPolicy } from "#hostOptions.ts";
|
|
8
|
+
import type { hostTransport } from "#hostTransport.ts";
|
|
9
|
+
import type { schemaSensitiveKeys } from "#schemaSensitiveKeys.ts";
|
|
10
|
+
export declare function hostRpcRoutes<TRpcs extends Rpc.Any, THandlers, TError, TRequirements, TSession extends SessionShape>(options: {
|
|
11
|
+
readonly group: RpcGroup.RpcGroup<TRpcs>;
|
|
12
|
+
readonly handlers: Layer.Layer<THandlers, TError, TRequirements>;
|
|
13
|
+
readonly rpcPath?: HttpRouter.PathInput;
|
|
14
|
+
} & HostPolicy<TSession>, changesService: typeof AppChanges, { bodySize, trustedProxy, nativeOrigins }: Effect.Success<ReturnType<typeof hostTransport>>, sensitive: ReturnType<typeof schemaSensitiveKeys>): Layer.Layer<never, TError, Exclude<TRequirements, RpcSerialization.RpcSerialization> | Exclude<Exclude<HttpRouter.HttpRouter, THandlers | RequestTracing | Rpc.ToHandler<Extract<TRpcs, {
|
|
15
|
+
readonly _tag: `${string}.$changes`;
|
|
16
|
+
}>>>, RpcSerialization.RpcSerialization> | Exclude<Exclude<RpcSerialization.RpcSerialization, THandlers | RequestTracing | Rpc.ToHandler<Extract<TRpcs, {
|
|
17
|
+
readonly _tag: `${string}.$changes`;
|
|
18
|
+
}>>>, RpcSerialization.RpcSerialization> | Exclude<Exclude<Exclude<Exclude<Exclude<Rpc.ServicesServer<Rpc.AddMiddleware<Rpc.AddMiddleware<TRpcs, typeof import("#hostRpc.ts").HostedReadPolicy>, typeof RequestTracing>>, import("#hostRpc.ts").HostedReadPolicy>, RpcSerialization.RpcSerialization>, import("effect/Scope").Scope>, THandlers | RequestTracing | Rpc.ToHandler<Extract<TRpcs, {
|
|
19
|
+
readonly _tag: `${string}.$changes`;
|
|
20
|
+
}>>>, RpcSerialization.RpcSerialization> | Exclude<Exclude<Exclude<Exclude<Exclude<Rpc.ToHandler<Rpc.AddMiddleware<Rpc.AddMiddleware<TRpcs, typeof import("#hostRpc.ts").HostedReadPolicy>, typeof RequestTracing>>, import("#hostRpc.ts").HostedReadPolicy>, RpcSerialization.RpcSerialization>, import("effect/Scope").Scope>, THandlers | RequestTracing | Rpc.ToHandler<Extract<TRpcs, {
|
|
21
|
+
readonly _tag: `${string}.$changes`;
|
|
22
|
+
}>>>, RpcSerialization.RpcSerialization>>;
|
|
23
|
+
//# sourceMappingURL=hostRpcRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostRpcRoutes.d.ts","sourceRoot":"","sources":["../src/hostRpcRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAmC,UAAU,EAAyC,MAAM,aAAa,CAAC;AAEjH,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,KAAK,EAAqC,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAE3G,OAAO,EAA+C,KAAK,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAEvH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,wBAAgB,aAAa,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,SAAS,YAAY,EACnH,OAAO,EAAE;IACR,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IACjE,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC;CACxC,GAAG,UAAU,CAAC,QAAQ,CAAC,EACxB,cAAc,EAAE,OAAO,UAAU,EACjC,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,EAC3F,SAAS,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC;;;;;;;;0CA+BjD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ByteSize, Effect, Layer } from "effect";
|
|
2
|
+
import { HttpEffect, HttpIncomingMessage, HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/http";
|
|
3
|
+
import * as HttpStatus from "effect/http/HttpStatus";
|
|
4
|
+
import { RpcSerialization } from "effect/rpc";
|
|
5
|
+
import { localRpcGuard } from "@shivaedev/identity/server/local.ts";
|
|
6
|
+
import { authenticatedLayer, maybeAuthenticatedLayer } from "@shivaedev/identity/server/session.ts";
|
|
7
|
+
import { requestTracingLayer } from "@shivaedev/identity/server/tracing.ts";
|
|
8
|
+
import { boundedRpcRequest } from "#boundedRpcRequest.ts";
|
|
9
|
+
import { hostChanges } from "#hostChanges.ts";
|
|
10
|
+
import { hostRpc, rpcCacheControl } from "#hostRpc.ts";
|
|
11
|
+
import { redactingRpcSerialization } from "#redactingRpcSerialization.ts";
|
|
12
|
+
export function hostRpcRoutes(options, changesService, { bodySize, trustedProxy, nativeOrigins }, sensitive) {
|
|
13
|
+
const middleware = options.policy === "loopback"
|
|
14
|
+
? requestTracingLayer({ sensitive })
|
|
15
|
+
: Layer.mergeAll(authenticatedLayer(options.sessions), maybeAuthenticatedLayer(options.sessions), requestTracingLayer({ sensitive }));
|
|
16
|
+
return HttpRouter.use((router) => Effect.gen(function* () {
|
|
17
|
+
const wire = redactingRpcSerialization(yield* RpcSerialization.RpcSerialization, sensitive, sensitive.maskFailure);
|
|
18
|
+
const handler = yield* hostRpc(options.group).pipe(Effect.provideService(RpcSerialization.RpcSerialization, wire));
|
|
19
|
+
const guarded = localRpcGuard(handler, trustedProxy, nativeOrigins);
|
|
20
|
+
yield* router.add("OPTIONS", options.rpcPath ?? "/rpc", HttpServerResponse.text("Local same-origin requests only", {
|
|
21
|
+
status: HttpStatus.fromLiteral("Forbidden"),
|
|
22
|
+
}));
|
|
23
|
+
yield* router.add("POST", options.rpcPath ?? "/rpc", (request) => {
|
|
24
|
+
HttpEffect.appendPreResponseHandlerUnsafe(request, rpcCacheControl);
|
|
25
|
+
return guarded.pipe(Effect.provideService(HttpIncomingMessage.MaxBodySize, ByteSize.bytes(bodySize)), Effect.provideService(HttpServerRequest.HttpServerRequest, boundedRpcRequest(request)), Effect.provideService(RpcSerialization.RpcSerialization, wire));
|
|
26
|
+
});
|
|
27
|
+
})).pipe(Layer.provide(Layer.merge(middleware, hostChanges(options.group, changesService).pipe(Layer.provideMerge(options.handlers)))), Layer.provide(RpcSerialization.layerNdjson));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=hostRpcRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostRpcRoutes.js","sourceRoot":"","sources":["../src/hostRpcRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
|
+
import { HttpRouter } from "effect/http";
|
|
2
3
|
export declare const NativeOrigins: Schema.$Array<Schema.String>;
|
|
3
|
-
export declare function nativeClientOrigins(origins: readonly string[], trustedProxy: string | undefined, auth?: boolean): import("effect/Layer").Layer<never, never, never>;
|
|
4
|
+
export declare function nativeClientOrigins(origins: readonly string[], trustedProxy: string | undefined, auth?: boolean | "preflight", rpcPath?: HttpRouter.PathInput): import("effect/Layer").Layer<never, never, never>;
|
|
4
5
|
//# sourceMappingURL=nativeClientOrigins.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeClientOrigins.d.ts","sourceRoot":"","sources":["../src/nativeClientOrigins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"nativeClientOrigins.d.ts","sourceRoot":"","sources":["../src/nativeClientOrigins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAA2B,UAAU,EAAyC,MAAM,aAAa,CAAC;AAIzG,eAAO,MAAM,aAAa,8BAYzB,CAAC;AAEF,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,IAAI,GAAE,OAAO,GAAG,WAAmB,EACnC,OAAO,GAAE,UAAU,CAAC,SAAkB,qDA+BtC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Effect, Schema } from "effect";
|
|
2
2
|
import { Headers, HttpMiddleware, HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/http";
|
|
3
|
+
import * as HttpStatus from "effect/http/HttpStatus";
|
|
3
4
|
import { localTransport } from "@shivaedev/identity/server/local.ts";
|
|
4
5
|
export const NativeOrigins = Schema.Array(Schema.String.check(Schema.makeFilter((origin) => {
|
|
5
6
|
try {
|
|
@@ -11,7 +12,8 @@ export const NativeOrigins = Schema.Array(Schema.String.check(Schema.makeFilter(
|
|
|
11
12
|
return false;
|
|
12
13
|
}
|
|
13
14
|
})));
|
|
14
|
-
export function nativeClientOrigins(origins, trustedProxy, auth = false) {
|
|
15
|
+
export function nativeClientOrigins(origins, trustedProxy, auth = false, rpcPath = "/rpc") {
|
|
16
|
+
const matchesPath = auth ? (path) => path === "/api/auth" || path.startsWith("/api/auth/") : (path) => path === rpcPath;
|
|
15
17
|
const allowed = localTransport(trustedProxy, origins);
|
|
16
18
|
const cors = HttpMiddleware.cors({
|
|
17
19
|
allowedHeaders: ["Authorization", "Content-Type"],
|
|
@@ -22,16 +24,20 @@ export function nativeClientOrigins(origins, trustedProxy, auth = false) {
|
|
|
22
24
|
});
|
|
23
25
|
return HttpRouter.middleware((effect) => Effect.gen(function* () {
|
|
24
26
|
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
25
|
-
if (
|
|
27
|
+
if (!matchesPath(request.url.split("?")[0] ?? "")) {
|
|
26
28
|
return yield* effect;
|
|
27
29
|
}
|
|
28
|
-
if ((auth || request.method === "OPTIONS") && !allowed(request)) {
|
|
29
|
-
return HttpServerResponse.text("Local same-origin requests only", {
|
|
30
|
+
if ((auth === true || request.method === "OPTIONS") && !allowed(request)) {
|
|
31
|
+
return HttpServerResponse.text("Local same-origin requests only", {
|
|
32
|
+
status: HttpStatus.fromLiteral("Forbidden"),
|
|
33
|
+
});
|
|
30
34
|
}
|
|
31
35
|
if (!origins.includes(request.headers.origin ?? "")) {
|
|
32
36
|
return yield* effect;
|
|
33
37
|
}
|
|
34
|
-
const native = request.modify({
|
|
38
|
+
const native = request.modify({
|
|
39
|
+
headers: Headers.remove(request.headers, "cookie"),
|
|
40
|
+
});
|
|
35
41
|
return yield* cors(effect).pipe(Effect.provideService(HttpServerRequest.HttpServerRequest, native));
|
|
36
42
|
})).layer;
|
|
37
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeClientOrigins.js","sourceRoot":"","sources":["../src/nativeClientOrigins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACzG,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CACxC,MAAM,CAAC,MAAM,CAAC,KAAK,CAClB,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,EAAE;IAC5B,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QACtF,OAAO,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,KAAK,MAAM,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC,CAAC,CACF,CACD,CAAC;AAEF,MAAM,UAAU,mBAAmB,
|
|
1
|
+
{"version":3,"file":"nativeClientOrigins.js","sourceRoot":"","sources":["../src/nativeClientOrigins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Config, type Duration, Layer } from "effect";
|
|
2
|
+
export declare function nodeHttpServer(host: string, config?: {
|
|
3
|
+
readonly port?: number;
|
|
4
|
+
readonly gracefulShutdownTimeout?: Duration.Input;
|
|
5
|
+
readonly disablePreemptiveShutdown?: boolean;
|
|
6
|
+
}): Layer.Layer<import("effect/http/Etag").Generator | import("effect/http/HttpPlatform").HttpPlatform | import("effect/http/HttpServer").HttpServer | import("@effect/platform-node/NodeServices").NodeServices, Config.ConfigError | import("effect/http/HttpServerError").ServeError, never>;
|
|
7
|
+
//# sourceMappingURL=nodeHttpServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeHttpServer.d.ts","sourceRoot":"","sources":["../src/nodeHttpServer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,KAAK,QAAQ,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE9D,wBAAgB,cAAc,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE;IACR,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,uBAAuB,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;IAClD,QAAQ,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CAC7C,+RAaD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import * as NodeHttpServer from "@effect/platform-node/NodeHttpServer";
|
|
3
|
+
import { Config, Effect, Layer } from "effect";
|
|
4
|
+
export function nodeHttpServer(host, config) {
|
|
5
|
+
return Layer.unwrap(Effect.gen(function* () {
|
|
6
|
+
const port = config?.port ?? (yield* Config.Int("PORT").pipe(Config.withDefault(3000)));
|
|
7
|
+
return NodeHttpServer.layer(createServer, {
|
|
8
|
+
gracefulShutdownTimeout: config?.gracefulShutdownTimeout,
|
|
9
|
+
host,
|
|
10
|
+
port,
|
|
11
|
+
...(config?.disablePreemptiveShutdown === undefined ? {} : { disablePreemptiveShutdown: config.disablePreemptiveShutdown }),
|
|
12
|
+
});
|
|
13
|
+
}));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=nodeHttpServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeHttpServer.js","sourceRoot":"","sources":["../src/nodeHttpServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,cAAc,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,MAAM,EAAiB,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE9D,MAAM,UAAU,cAAc,CAC7B,IAAY,EACZ,MAIC;IAED,OAAO,KAAK,CAAC,MAAM,CAClB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnB,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxF,OAAO,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE;YACzC,uBAAuB,EAAE,MAAM,EAAE,uBAAuB;YACxD,IAAI;YACJ,IAAI;YACJ,GAAG,CAAC,MAAM,EAAE,yBAAyB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,yBAAyB,EAAE,MAAM,CAAC,yBAAyB,EAAE,CAAC;SAC3H,CAAC,CAAC;IACJ,CAAC,CAAC,CACF,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otlpHttpClient.d.ts","sourceRoot":"","sources":["../src/otlpHttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAmB,UAAU,EAA2C,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"otlpHttpClient.d.ts","sourceRoot":"","sources":["../src/otlpHttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAmB,UAAU,EAA2C,MAAM,aAAa,CAAC;AAWnG,wBAAgB,cAAc,CAAC,OAAO,SAAS,oDA0C9C"}
|
package/dist/otlpHttpClient.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Effect, Layer } from "effect";
|
|
2
2
|
import { FetchHttpClient, HttpClient, HttpClientError } from "effect/http";
|
|
3
|
+
import * as HttpStatus from "effect/http/HttpStatus";
|
|
3
4
|
import { RedactionPolicy } from "#RedactionPolicy.ts";
|
|
4
5
|
import { redactOtlpText } from "#safeOtlpSerialization.ts";
|
|
5
6
|
function timeoutError(request) {
|
|
@@ -25,7 +26,7 @@ export function otlpHttpClient(timeout = 10_000) {
|
|
|
25
26
|
duration: timeout,
|
|
26
27
|
orElse: () => Effect.fail(timeoutError(request)),
|
|
27
28
|
}))), HttpClient.tap((response) => {
|
|
28
|
-
if (response.status >=
|
|
29
|
+
if (response.status >= HttpStatus.fromLiteral("OK") && response.status < HttpStatus.fromLiteral("MultipleChoices")) {
|
|
29
30
|
warned = false;
|
|
30
31
|
return Effect.void;
|
|
31
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otlpHttpClient.js","sourceRoot":"","sources":["../src/otlpHttpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAA0B,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,SAAS,YAAY,CAAC,OAA4C;IACjE,OAAO,IAAI,eAAe,CAAC,eAAe,CAAC;QAC1C,MAAM,EAAE,IAAI,eAAe,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,+BAA+B,EAAE,OAAO,EAAE,CAAC;KACrG,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAO,GAAG,MAAM;IAC9C,OAAO,KAAK,CAAC,MAAM,CAClB,UAAU,CAAC,UAAU,EACrB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;QAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC;QACzC,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,SAAS,QAAQ,CAAC,UAAkD;YACnE,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC1B,IAAI,MAAM,EAAE,CAAC;oBACZ,OAAO,MAAM,CAAC,IAAI,CAAC;gBACpB,CAAC;gBACD,MAAM,GAAG,IAAI,CAAC;gBACd,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAC1I,CAAC,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CACjB,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAClD,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,CAC/C,aAAa,CAAC,IAAI,CACjB,MAAM,CAAC,aAAa,CAAC;YACpB,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SAChD,CAAC,CACF,CACD,EACD,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC3B,IAAI,QAAQ,CAAC,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"otlpHttpClient.js","sourceRoot":"","sources":["../src/otlpHttpClient.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "The Effect application host: HTTP and RPC serving, health, OTLP export, database and migrations, and development mode",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"effect"
|
|
@@ -44,25 +44,26 @@
|
|
|
44
44
|
"README.md"
|
|
45
45
|
],
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@shivaedev/
|
|
47
|
+
"@shivaedev/changes": "0.5.0",
|
|
48
|
+
"@shivaedev/contract": "0.19.1",
|
|
48
49
|
"@shivaedev/errors": "0.1.0",
|
|
49
|
-
"@shivaedev/http": "0.1.
|
|
50
|
-
"@shivaedev/identity": "0.
|
|
50
|
+
"@shivaedev/http": "0.1.1",
|
|
51
|
+
"@shivaedev/identity": "0.3.1",
|
|
51
52
|
"@shivaedev/local-postgres": "0.7.0",
|
|
52
|
-
"@shivaedev/sql": "0.
|
|
53
|
+
"@shivaedev/sql": "0.24.0"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|
|
55
56
|
"@effect/platform-node": "4.0.5",
|
|
56
57
|
"@effect/sql-pg": "4.0.5",
|
|
57
58
|
"@effect/vitest": "4.0.5",
|
|
58
|
-
"@shivaedev/jobs": "0.
|
|
59
|
-
"@shivaedev/quality": "0.
|
|
59
|
+
"@shivaedev/jobs": "0.22.0",
|
|
60
|
+
"@shivaedev/quality": "0.44.0",
|
|
60
61
|
"@shivaedev/test": "0.10.0",
|
|
61
|
-
"@shivaedev/test-sql": "0.10.
|
|
62
|
-
"@shivaedev/test-story": "0.
|
|
62
|
+
"@shivaedev/test-sql": "0.10.2",
|
|
63
|
+
"@shivaedev/test-story": "0.22.0",
|
|
63
64
|
"@types/node": "24.19.2",
|
|
64
65
|
"@types/pg": "8.20.0",
|
|
65
|
-
"better-auth": "1.7.
|
|
66
|
+
"better-auth": "1.7.12",
|
|
66
67
|
"effect": "4.0.5",
|
|
67
68
|
"pg": "8.23.0",
|
|
68
69
|
"pg-boss": "12.38.0",
|
|
@@ -73,7 +74,7 @@
|
|
|
73
74
|
"@effect/platform-node": "4.0.5",
|
|
74
75
|
"@effect/sql-pg": "4.0.5",
|
|
75
76
|
"@effect/vitest": "4.0.5",
|
|
76
|
-
"better-auth": "1.7.
|
|
77
|
+
"better-auth": "1.7.12",
|
|
77
78
|
"effect": "4.0.5",
|
|
78
79
|
"pg": "8.23.0"
|
|
79
80
|
},
|
package/src/AppHostFactory.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Crypto, Layer } from "effect";
|
|
2
2
|
import type { Rpc } from "effect/rpc";
|
|
3
3
|
import type { SessionShape } from "@shivaedev/identity/server/session.ts";
|
|
4
|
-
import type {
|
|
5
|
-
import type { AppDatabaseOptions,
|
|
4
|
+
import type { AppHostInput } from "#AppHostInput.ts";
|
|
5
|
+
import type { AppDatabaseOptions, AppHttpHostOptions } from "#appHost.ts";
|
|
6
6
|
import type { appHostHttp, deferredHost } from "#appHostHttp.ts";
|
|
7
|
+
import type { HostRouteRequirements } from "#hostOptions.ts";
|
|
7
8
|
|
|
8
9
|
type PreflightHost<THost extends Layer.Any, TServices, TError, TRequirements> = Layer.Layer<
|
|
9
10
|
Layer.Success<THost> | TServices,
|
|
10
11
|
Layer.Error<THost> | TError,
|
|
11
|
-
Exclude<Layer.Services<THost>, TServices> | TRequirements
|
|
12
|
+
Exclude<Layer.Services<THost>, TServices | Crypto.Crypto> | Exclude<TRequirements, Crypto.Crypto>
|
|
12
13
|
>;
|
|
13
14
|
|
|
14
15
|
export interface AppHostFactory {
|
|
@@ -27,44 +28,27 @@ export interface AppHostFactory {
|
|
|
27
28
|
TPreflight = never,
|
|
28
29
|
TPreflightError = never,
|
|
29
30
|
TPreflightRequirements = never,
|
|
31
|
+
TRouteError = never,
|
|
32
|
+
TRouteRequirements = HostRouteRequirements,
|
|
30
33
|
>(
|
|
31
|
-
options:
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
TSession,
|
|
50
|
-
TPreflight,
|
|
51
|
-
TPreflightError,
|
|
52
|
-
TPreflightRequirements
|
|
53
|
-
>
|
|
54
|
-
| AppLocalHostOptions<
|
|
55
|
-
TRpcs,
|
|
56
|
-
THandlers,
|
|
57
|
-
THandlerError,
|
|
58
|
-
THandlerRequirements,
|
|
59
|
-
TServices,
|
|
60
|
-
TServiceError,
|
|
61
|
-
TServiceRequirements,
|
|
62
|
-
TMigrations,
|
|
63
|
-
TPreflight,
|
|
64
|
-
TPreflightError,
|
|
65
|
-
TPreflightRequirements
|
|
66
|
-
>
|
|
67
|
-
),
|
|
34
|
+
options: AppHostInput<
|
|
35
|
+
TRpcs,
|
|
36
|
+
THandlers,
|
|
37
|
+
THandlerError,
|
|
38
|
+
THandlerRequirements,
|
|
39
|
+
TServices,
|
|
40
|
+
TServiceError,
|
|
41
|
+
TServiceRequirements,
|
|
42
|
+
TMigrations,
|
|
43
|
+
TSession,
|
|
44
|
+
TApplicationError,
|
|
45
|
+
TApplicationRequirements,
|
|
46
|
+
TPreflight,
|
|
47
|
+
TPreflightError,
|
|
48
|
+
TPreflightRequirements,
|
|
49
|
+
TRouteError,
|
|
50
|
+
TRouteRequirements
|
|
51
|
+
> & { readonly migrations: AppDatabaseOptions<TMigrations>["migrations"] },
|
|
68
52
|
): PreflightHost<
|
|
69
53
|
ReturnType<
|
|
70
54
|
typeof deferredHost<
|
|
@@ -78,7 +62,9 @@ export interface AppHostFactory {
|
|
|
78
62
|
TMigrations,
|
|
79
63
|
TSession,
|
|
80
64
|
TApplicationError,
|
|
81
|
-
TApplicationRequirements
|
|
65
|
+
TApplicationRequirements,
|
|
66
|
+
TRouteError,
|
|
67
|
+
TRouteRequirements
|
|
82
68
|
>
|
|
83
69
|
>,
|
|
84
70
|
NoInfer<TPreflight>,
|
|
@@ -98,6 +84,8 @@ export interface AppHostFactory {
|
|
|
98
84
|
TPreflight = never,
|
|
99
85
|
TPreflightError = never,
|
|
100
86
|
TPreflightRequirements = never,
|
|
87
|
+
TRouteError = never,
|
|
88
|
+
TRouteRequirements = HostRouteRequirements,
|
|
101
89
|
>(
|
|
102
90
|
options: AppHttpHostOptions<
|
|
103
91
|
TRpcs,
|
|
@@ -110,10 +98,25 @@ export interface AppHostFactory {
|
|
|
110
98
|
TSession,
|
|
111
99
|
TPreflight,
|
|
112
100
|
TPreflightError,
|
|
113
|
-
TPreflightRequirements
|
|
101
|
+
TPreflightRequirements,
|
|
102
|
+
TRouteError,
|
|
103
|
+
TRouteRequirements
|
|
114
104
|
>,
|
|
115
105
|
): PreflightHost<
|
|
116
|
-
ReturnType<
|
|
106
|
+
ReturnType<
|
|
107
|
+
typeof appHostHttp<
|
|
108
|
+
TRpcs,
|
|
109
|
+
THandlers,
|
|
110
|
+
THandlerError,
|
|
111
|
+
THandlerRequirements,
|
|
112
|
+
TServices,
|
|
113
|
+
TServiceError,
|
|
114
|
+
TServiceRequirements,
|
|
115
|
+
TSession,
|
|
116
|
+
TRouteError,
|
|
117
|
+
TRouteRequirements
|
|
118
|
+
>
|
|
119
|
+
>,
|
|
117
120
|
NoInfer<TPreflight>,
|
|
118
121
|
NoInfer<TPreflightError>,
|
|
119
122
|
NoInfer<TPreflightRequirements>
|