@grest-ts/http 0.0.48 → 0.0.49
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 +243 -175
- package/dist/src/_dedupCheck.js +1 -1
- package/dist/src/client/GGContextKeySynchronizer.d.ts +11 -0
- package/dist/src/client/GGContextKeySynchronizer.d.ts.map +1 -0
- package/dist/src/client/GGContextKeySynchronizer.js +26 -0
- package/dist/src/client/GGContextKeySynchronizer.js.map +1 -0
- package/dist/src/index-browser.d.ts +4 -2
- package/dist/src/index-browser.d.ts.map +1 -1
- package/dist/src/index-browser.js +4 -2
- package/dist/src/index-browser.js.map +1 -1
- package/dist/src/index-node.d.ts +8 -3
- package/dist/src/index-node.d.ts.map +1 -1
- package/dist/src/index-node.js +16 -7
- package/dist/src/index-node.js.map +1 -1
- package/dist/src/rpc/RpcRequest/GGRpcRequestBuilder.d.ts +4 -3
- package/dist/src/rpc/RpcRequest/GGRpcRequestBuilder.d.ts.map +1 -1
- package/dist/src/rpc/RpcRequest/GGRpcRequestBuilder.js +9 -2
- package/dist/src/rpc/RpcRequest/GGRpcRequestBuilder.js.map +1 -1
- package/dist/src/rpc/RpcRequest/GGRpcRequestParser.d.ts +3 -3
- package/dist/src/rpc/RpcRequest/GGRpcRequestParser.d.ts.map +1 -1
- package/dist/src/rpc/RpcRequest/GGRpcRequestParser.js +13 -16
- package/dist/src/rpc/RpcRequest/GGRpcRequestParser.js.map +1 -1
- package/dist/src/rpc/RpcResponse/GGRpcResponseBuilder.d.ts +1 -1
- package/dist/src/rpc/RpcResponse/GGRpcResponseBuilder.d.ts.map +1 -1
- package/dist/src/rpc/RpcResponse/GGRpcResponseBuilder.js +3 -3
- package/dist/src/rpc/RpcResponse/GGRpcResponseBuilder.js.map +1 -1
- package/dist/src/schema/GGCookie.d.ts +50 -0
- package/dist/src/schema/GGCookie.d.ts.map +1 -0
- package/dist/src/schema/GGCookie.js +130 -0
- package/dist/src/schema/GGCookie.js.map +1 -0
- package/dist/src/schema/GGHeader.d.ts +23 -0
- package/dist/src/schema/GGHeader.d.ts.map +1 -0
- package/dist/src/schema/GGHeader.js +41 -0
- package/dist/src/schema/GGHeader.js.map +1 -0
- package/dist/src/schema/GGHttpPermissionsChecker.d.ts +9 -0
- package/dist/src/schema/GGHttpPermissionsChecker.d.ts.map +1 -0
- package/dist/src/schema/GGHttpPermissionsChecker.js +29 -0
- package/dist/src/schema/GGHttpPermissionsChecker.js.map +1 -0
- package/dist/src/schema/GGHttpSchema.d.ts +8 -59
- package/dist/src/schema/GGHttpSchema.d.ts.map +1 -1
- package/dist/src/schema/GGHttpSchema.js.map +1 -1
- package/dist/src/schema/GGWireContextKey.d.ts +30 -0
- package/dist/src/schema/GGWireContextKey.d.ts.map +1 -0
- package/dist/src/schema/GGWireContextKey.js +36 -0
- package/dist/src/schema/GGWireContextKey.js.map +1 -0
- package/dist/src/schema/GGWireContextKey.node.d.ts +36 -0
- package/dist/src/schema/GGWireContextKey.node.d.ts.map +1 -0
- package/dist/src/schema/GGWireContextKey.node.js +83 -0
- package/dist/src/schema/GGWireContextKey.node.js.map +1 -0
- package/dist/src/schema/httpSchema.d.ts +2 -2
- package/dist/src/schema/httpSchema.d.ts.map +1 -1
- package/dist/src/schema/httpSchema.js.map +1 -1
- package/dist/src/server/GGHttp.d.ts +2 -26
- package/dist/src/server/GGHttp.d.ts.map +1 -1
- package/dist/src/server/GGHttp.js +0 -15
- package/dist/src/server/GGHttp.js.map +1 -1
- package/dist/src/server/GGHttpSchema.startServer.d.ts +2 -11
- package/dist/src/server/GGHttpSchema.startServer.d.ts.map +1 -1
- package/dist/src/server/GGHttpSchema.startServer.js +11 -28
- package/dist/src/server/GGHttpSchema.startServer.js.map +1 -1
- package/dist/src/server/GGHttpServer.d.ts +16 -14
- package/dist/src/server/GGHttpServer.d.ts.map +1 -1
- package/dist/src/server/GGHttpServer.js +26 -79
- package/dist/src/server/GGHttpServer.js.map +1 -1
- package/dist/src/server/applyRequestMiddleware.d.ts +11 -0
- package/dist/src/server/applyRequestMiddleware.d.ts.map +1 -0
- package/dist/src/server/applyRequestMiddleware.js +38 -0
- package/dist/src/server/applyRequestMiddleware.js.map +1 -0
- package/dist/src/server/applyResponseMiddleware.d.ts +2 -2
- package/dist/src/server/applyResponseMiddleware.d.ts.map +1 -1
- package/dist/src/server/applyResponseMiddleware.js +2 -2
- package/dist/src/server/applyResponseMiddleware.js.map +1 -1
- package/dist/src/server/checkers/checkPermissionsAtStart.d.ts +39 -0
- package/dist/src/server/checkers/checkPermissionsAtStart.d.ts.map +1 -0
- package/dist/src/server/checkers/checkPermissionsAtStart.js +82 -0
- package/dist/src/server/checkers/checkPermissionsAtStart.js.map +1 -0
- package/dist/src/server/checkers/checkWireConflicts.d.ts +18 -0
- package/dist/src/server/checkers/checkWireConflicts.d.ts.map +1 -0
- package/dist/src/server/checkers/checkWireConflicts.js +43 -0
- package/dist/src/server/checkers/checkWireConflicts.js.map +1 -0
- package/dist/src/server/checkers/checkWiresImplemented.d.ts +11 -0
- package/dist/src/server/checkers/checkWiresImplemented.d.ts.map +1 -0
- package/dist/src/server/checkers/checkWiresImplemented.js +27 -0
- package/dist/src/server/checkers/checkWiresImplemented.js.map +1 -0
- package/dist/src/tsconfig.json +2 -1
- package/dist/tsconfig.publish.tsbuildinfo +1 -1
- package/package.json +14 -11
- package/src/_dedupCheck.ts +1 -1
- package/src/client/GGContextKeySynchronizer.test.ts +106 -0
- package/src/client/GGContextKeySynchronizer.ts +42 -0
- package/src/index-browser.ts +4 -2
- package/src/index-node.ts +17 -7
- package/src/rpc/RpcRequest/GGRpcRequestBuilder.ts +11 -4
- package/src/rpc/RpcRequest/GGRpcRequestParser.ts +16 -17
- package/src/rpc/RpcResponse/GGRpcResponseBuilder.ts +5 -4
- package/src/schema/GGCookie.ts +151 -0
- package/src/schema/GGHeader.ts +48 -0
- package/src/schema/GGHttpPermissionsChecker.test.ts +125 -0
- package/src/schema/GGHttpPermissionsChecker.ts +35 -0
- package/src/schema/GGHttpSchema.ts +8 -71
- package/src/schema/GGWireContextKey.node.ts +119 -0
- package/src/schema/GGWireContextKey.ts +46 -0
- package/src/schema/httpSchema.ts +3 -3
- package/src/server/GGHttp.ts +3 -34
- package/src/server/GGHttpSchema.startServer.ts +13 -38
- package/src/server/GGHttpServer.ts +33 -89
- package/src/server/applyRequestMiddleware.ts +40 -0
- package/src/server/applyResponseMiddleware.ts +5 -5
- package/src/server/checkers/checkPermissionsAtStart.ts +112 -0
- package/src/server/checkers/checkWireConflicts.ts +65 -0
- package/src/server/checkers/checkWiresImplemented.ts +42 -0
- package/src/tsconfig.json +2 -1
- package/dist/src/schema/cookieMiddleware.d.ts +0 -71
- package/dist/src/schema/cookieMiddleware.d.ts.map +0 -1
- package/dist/src/schema/cookieMiddleware.js +0 -126
- package/dist/src/schema/cookieMiddleware.js.map +0 -1
- package/dist/src/schema/headerBinding.d.ts +0 -35
- package/dist/src/schema/headerBinding.d.ts.map +0 -1
- package/dist/src/schema/headerBinding.js +0 -49
- package/dist/src/schema/headerBinding.js.map +0 -1
- package/dist/src/server/GG_PERMISSIONS.d.ts +0 -15
- package/dist/src/server/GG_PERMISSIONS.d.ts.map +0 -1
- package/dist/src/server/GG_PERMISSIONS.js +0 -15
- package/dist/src/server/GG_PERMISSIONS.js.map +0 -1
- package/src/schema/cookieMiddleware.ts +0 -164
- package/src/schema/headerBinding.ts +0 -65
- package/src/server/GG_PERMISSIONS.ts +0 -15
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { GGContextKey } from "@grest-ts/context";
|
|
2
|
+
import { IsAny } from "@grest-ts/schema";
|
|
3
|
+
const GG_SYNC_CONTROLLERS = new GGContextKey("sync:controllers", IsAny);
|
|
4
|
+
export class GGContextKeySynchronizer {
|
|
5
|
+
static provide(key, controller) {
|
|
6
|
+
let registry = GG_SYNC_CONTROLLERS.get();
|
|
7
|
+
if (registry === undefined) {
|
|
8
|
+
registry = new Map();
|
|
9
|
+
GG_SYNC_CONTROLLERS.set(registry);
|
|
10
|
+
}
|
|
11
|
+
registry.set(key.name, { controller, inflight: undefined });
|
|
12
|
+
}
|
|
13
|
+
static async waitFor(key) {
|
|
14
|
+
const entry = GG_SYNC_CONTROLLERS.get()?.get(key.name);
|
|
15
|
+
if (entry === undefined || !entry.controller.isStale())
|
|
16
|
+
return;
|
|
17
|
+
entry.inflight ??= entry.controller.recover().finally(() => {
|
|
18
|
+
entry.inflight = undefined;
|
|
19
|
+
});
|
|
20
|
+
await entry.inflight;
|
|
21
|
+
}
|
|
22
|
+
static clear(key) {
|
|
23
|
+
GG_SYNC_CONTROLLERS.get()?.delete(key.name);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=GGContextKeySynchronizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGContextKeySynchronizer.js","sourceRoot":"","sources":["../../../src/client/GGContextKeySynchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAC,KAAK,EAAgB,MAAM,kBAAkB,CAAA;AAYrD,MAAM,mBAAmB,GAAG,IAAI,YAAY,CACxC,kBAAkB,EAClB,KAA0D,CAC7D,CAAA;AAED,MAAM,OAAO,wBAAwB;IAEjC,MAAM,CAAC,OAAO,CAAC,GAAsB,EAAE,UAA2B;QAC9D,IAAI,QAAQ,GAAG,mBAAmB,CAAC,GAAG,EAAE,CAAA;QACxC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAA;YACpB,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACrC,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAC,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAsB;QACvC,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACtD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE;YAAE,OAAM;QAC9D,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YACvD,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAA;QAC9B,CAAC,CAAC,CAAA;QACF,MAAM,KAAK,CAAC,QAAQ,CAAA;IACxB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAsB;QAC/B,mBAAmB,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC/C,CAAC;CACJ"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import "./_dedupCheck";
|
|
2
2
|
export * from "./schema/GGHttpSchema";
|
|
3
3
|
export * from "./schema/httpSchema";
|
|
4
|
-
export * from "./schema/
|
|
5
|
-
export * from "./schema/
|
|
4
|
+
export * from "./schema/GGCookie";
|
|
5
|
+
export * from "./schema/GGWireContextKey";
|
|
6
|
+
export * from "./schema/GGHeader";
|
|
6
7
|
export * from "./rpc/GGHttpRouteRPC";
|
|
7
8
|
export * from "./rpc/RpcRequest/GGRpcRequestBuilder";
|
|
8
9
|
export * from "./rpc/RpcResponse/GGRpcResponseParser";
|
|
10
|
+
export * from "./client/GGContextKeySynchronizer";
|
|
9
11
|
export * from "./client/GGHttpSchema.createClient";
|
|
10
12
|
import "./client/GGHttpSchema.createClient";
|
|
11
13
|
//# sourceMappingURL=index-browser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-browser.d.ts","sourceRoot":"","sources":["../../src/index-browser.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,
|
|
1
|
+
{"version":3,"file":"index-browser.d.ts","sourceRoot":"","sources":["../../src/index-browser.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AAGtD,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AAGnD,OAAO,oCAAoC,CAAC"}
|
|
@@ -2,12 +2,14 @@ import "./_dedupCheck.js";
|
|
|
2
2
|
// API Schema
|
|
3
3
|
export * from "./schema/GGHttpSchema.js";
|
|
4
4
|
export * from "./schema/httpSchema.js";
|
|
5
|
-
export * from "./schema/
|
|
6
|
-
export * from "./schema/
|
|
5
|
+
export * from "./schema/GGCookie.js";
|
|
6
|
+
export * from "./schema/GGWireContextKey.js";
|
|
7
|
+
export * from "./schema/GGHeader.js";
|
|
7
8
|
export * from "./rpc/GGHttpRouteRPC.js";
|
|
8
9
|
export * from "./rpc/RpcRequest/GGRpcRequestBuilder.js";
|
|
9
10
|
export * from "./rpc/RpcResponse/GGRpcResponseParser.js";
|
|
10
11
|
// Client
|
|
12
|
+
export * from "./client/GGContextKeySynchronizer.js";
|
|
11
13
|
export * from "./client/GGHttpSchema.createClient.js";
|
|
12
14
|
// Extensions
|
|
13
15
|
import "./client/GGHttpSchema.createClient.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-browser.js","sourceRoot":"","sources":["../../src/index-browser.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,aAAa;AACb,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,
|
|
1
|
+
{"version":3,"file":"index-browser.js","sourceRoot":"","sources":["../../src/index-browser.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,aAAa;AACb,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AAEtD,SAAS;AACT,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AAEnD,aAAa;AACb,OAAO,oCAAoC,CAAC"}
|
package/dist/src/index-node.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import "./_dedupCheck";
|
|
2
2
|
export * from "./server/GGHttpMetrics";
|
|
3
3
|
export * from "./server/GG_HTTP_REQUEST";
|
|
4
|
-
export * from "./server/GG_PERMISSIONS";
|
|
5
4
|
export * from "./schema/GGHttpSchema";
|
|
6
5
|
export * from "./schema/httpSchema";
|
|
7
|
-
export * from "./schema/
|
|
8
|
-
export * from "./schema/
|
|
6
|
+
export * from "./schema/GGCookie";
|
|
7
|
+
export * from "./schema/GGWireContextKey";
|
|
8
|
+
export * from "./schema/GGWireContextKey.node";
|
|
9
|
+
export * from "./schema/GGHeader";
|
|
9
10
|
export * from "./rpc/GGHttpRouteRPC";
|
|
10
11
|
export * from "./rpc/openApiSuccessResponse";
|
|
11
12
|
export * from "./rpc/openApiHelpers";
|
|
@@ -18,8 +19,12 @@ export * from "./server/GGHttp";
|
|
|
18
19
|
export * from "./server/GGHttpServer";
|
|
19
20
|
export * from "./server/GG_HTTP_SERVER";
|
|
20
21
|
export * from "./server/applyResponseMiddleware";
|
|
22
|
+
export * from "./server/applyRequestMiddleware";
|
|
23
|
+
export * from "./schema/GGHttpPermissionsChecker";
|
|
24
|
+
export * from "./client/GGContextKeySynchronizer";
|
|
21
25
|
export * from "./client/GGHttpSchema.createClient";
|
|
22
26
|
export * from "./server/GGHttpSchema.startServer";
|
|
23
27
|
import "./client/GGHttpSchema.createClient";
|
|
24
28
|
import "./server/GGHttpSchema.startServer";
|
|
29
|
+
import "./schema/GGWireContextKey.node";
|
|
25
30
|
//# sourceMappingURL=index-node.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-node.d.ts","sourceRoot":"","sources":["../../src/index-node.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index-node.d.ts","sourceRoot":"","sources":["../../src/index-node.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAgBvB,cAAc,wBAAwB,CAAC;AAGvC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC;AAGtD,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAGlD,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAIlD,OAAO,oCAAoC,CAAC;AAC5C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,gCAAgC,CAAC"}
|
package/dist/src/index-node.js
CHANGED
|
@@ -3,20 +3,25 @@ import "./_dedupCheck.js";
|
|
|
3
3
|
import { _registerRpcServerCodecFactory } from "./rpc/GGHttpRouteRPC.js";
|
|
4
4
|
import { GGRpcResponseBuilder } from "./rpc/RpcResponse/GGRpcResponseBuilder.js";
|
|
5
5
|
import { GGRpcRequestParser } from "./rpc/RpcRequest/GGRpcRequestParser.js";
|
|
6
|
-
_registerRpcServerCodecFactory((method, path, config) =>
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
_registerRpcServerCodecFactory((method, path, config) => {
|
|
7
|
+
const parser = new GGRpcRequestParser(method, path, config);
|
|
8
|
+
return {
|
|
9
|
+
readRequest: parser.readRequest,
|
|
10
|
+
validateInput: parser.validateInput,
|
|
11
|
+
sendResponse: new GGRpcResponseBuilder(config).sendResponse
|
|
12
|
+
};
|
|
13
|
+
});
|
|
10
14
|
// Metrics
|
|
11
15
|
export * from "./server/GGHttpMetrics.js";
|
|
12
16
|
// Context
|
|
13
17
|
export * from "./server/GG_HTTP_REQUEST.js";
|
|
14
|
-
export * from "./server/GG_PERMISSIONS.js";
|
|
15
18
|
// API Schema
|
|
16
19
|
export * from "./schema/GGHttpSchema.js";
|
|
17
20
|
export * from "./schema/httpSchema.js";
|
|
18
|
-
export * from "./schema/
|
|
19
|
-
export * from "./schema/
|
|
21
|
+
export * from "./schema/GGCookie.js";
|
|
22
|
+
export * from "./schema/GGWireContextKey.js";
|
|
23
|
+
export * from "./schema/GGWireContextKey.node.js";
|
|
24
|
+
export * from "./schema/GGHeader.js";
|
|
20
25
|
export * from "./rpc/GGHttpRouteRPC.js";
|
|
21
26
|
export * from "./rpc/openApiSuccessResponse.js";
|
|
22
27
|
export * from "./rpc/openApiHelpers.js";
|
|
@@ -30,10 +35,14 @@ export * from "./server/GGHttp.js";
|
|
|
30
35
|
export * from "./server/GGHttpServer.js";
|
|
31
36
|
export * from "./server/GG_HTTP_SERVER.js";
|
|
32
37
|
export * from "./server/applyResponseMiddleware.js";
|
|
38
|
+
export * from "./server/applyRequestMiddleware.js";
|
|
39
|
+
export * from "./schema/GGHttpPermissionsChecker.js";
|
|
33
40
|
// Client
|
|
41
|
+
export * from "./client/GGContextKeySynchronizer.js";
|
|
34
42
|
export * from "./client/GGHttpSchema.createClient.js";
|
|
35
43
|
export * from "./server/GGHttpSchema.startServer.js";
|
|
36
44
|
// Extensions
|
|
37
45
|
import "./client/GGHttpSchema.createClient.js";
|
|
38
46
|
import "./server/GGHttpSchema.startServer.js";
|
|
47
|
+
import "./schema/GGWireContextKey.node.js";
|
|
39
48
|
//# sourceMappingURL=index-node.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-node.js","sourceRoot":"","sources":["../../src/index-node.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,+EAA+E;AAC/E,OAAO,EAAC,8BAA8B,EAAC,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAC,kBAAkB,EAAC,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"index-node.js","sourceRoot":"","sources":["../../src/index-node.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,+EAA+E;AAC/E,OAAO,EAAC,8BAA8B,EAAC,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAC,kBAAkB,EAAC,MAAM,qCAAqC,CAAC;AAEvE,8BAA8B,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IACpD,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO;QACH,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,YAAY,EAAE,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC,YAAY;KAC9D,CAAC;AACN,CAAC,CAAC,CAAC;AAEH,UAAU;AACV,cAAc,wBAAwB,CAAC;AAEvC,UAAU;AACV,cAAc,0BAA0B,CAAC;AAEzC,aAAa;AACb,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,uCAAuC,CAAC;AAEtD,+BAA+B;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAElD,SAAS;AACT,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAGlD,aAAa;AACb,OAAO,oCAAoC,CAAC;AAC5C,OAAO,mCAAmC,CAAC;AAC3C,OAAO,gCAAgC,CAAC"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import type { HttpMethod } from "@grest-ts/common";
|
|
2
2
|
import { GGContractMethod } from "@grest-ts/schema";
|
|
3
|
-
import { ClientHttpRouteToRpcTransformClientConfig, GGHttpFetchRequest
|
|
3
|
+
import { ClientHttpRouteToRpcTransformClientConfig, GGHttpFetchRequest } from "../../schema/GGHttpSchema";
|
|
4
|
+
import { type GGTransportMiddleware } from "@grest-ts/context";
|
|
4
5
|
export declare class GGRpcRequestBuilder {
|
|
5
6
|
readonly contract: GGContractMethod;
|
|
6
|
-
readonly middlewares: readonly
|
|
7
|
+
readonly middlewares: readonly GGTransportMiddleware[];
|
|
7
8
|
readonly method: HttpMethod;
|
|
8
9
|
readonly pathTemplate: string;
|
|
9
10
|
readonly pathParams: string[];
|
|
10
11
|
readonly pathPrefix: string;
|
|
11
12
|
readonly hasBody: boolean;
|
|
12
13
|
constructor(method: HttpMethod, pathTemplate: string, config: ClientHttpRouteToRpcTransformClientConfig);
|
|
13
|
-
createRequest: (data: unknown) => GGHttpFetchRequest
|
|
14
|
+
createRequest: (data: unknown) => Promise<GGHttpFetchRequest>;
|
|
14
15
|
private buildPath;
|
|
15
16
|
private buildBody;
|
|
16
17
|
private buildQueryString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGRpcRequestBuilder.d.ts","sourceRoot":"","sources":["../../../../src/rpc/RpcRequest/GGRpcRequestBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAC,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAC,yCAAyC,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"GGRpcRequestBuilder.d.ts","sourceRoot":"","sources":["../../../../src/rpc/RpcRequest/GGRpcRequestBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAC,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAC,yCAAyC,EAAE,kBAAkB,EAAC,MAAM,2BAA2B,CAAC;AACxG,OAAO,EAAe,KAAK,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAG3E,qBAAa,mBAAmB;IAE5B,SAAgB,QAAQ,EAAE,gBAAgB,CAAA;IAC1C,SAAgB,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAA;IAC7D,SAAgB,MAAM,EAAE,UAAU,CAAC;IACnC,SAAgB,YAAY,EAAE,MAAM,CAAC;IACrC,SAAgB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,OAAO,EAAE,OAAO,CAAC;gBAG7B,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,yCAAyC;IAW9C,aAAa,GAAU,MAAM,OAAO,KAAG,OAAO,CAAC,kBAAkB,CAAC,CAwBxE;IAED,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,gBAAgB;CAkB3B"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { GGContextKey } from "@grest-ts/context";
|
|
2
|
+
import { GGContextKeySynchronizer } from "../../client/GGContextKeySynchronizer.js";
|
|
1
3
|
export class GGRpcRequestBuilder {
|
|
2
4
|
contract;
|
|
3
5
|
middlewares;
|
|
@@ -15,7 +17,7 @@ export class GGRpcRequestBuilder {
|
|
|
15
17
|
this.pathParams = (pathTemplate.match(/:(\w+)/g) || []).map(m => m.slice(1));
|
|
16
18
|
this.hasBody = method === "POST" || method === "PUT" || method === "PATCH";
|
|
17
19
|
}
|
|
18
|
-
createRequest = (data) => {
|
|
20
|
+
createRequest = async (data) => {
|
|
19
21
|
let result;
|
|
20
22
|
if (this.hasBody) {
|
|
21
23
|
result = {
|
|
@@ -33,7 +35,12 @@ export class GGRpcRequestBuilder {
|
|
|
33
35
|
body: undefined
|
|
34
36
|
};
|
|
35
37
|
}
|
|
36
|
-
this.middlewares
|
|
38
|
+
for (const mw of this.middlewares ?? []) {
|
|
39
|
+
if (mw instanceof GGContextKey) {
|
|
40
|
+
await GGContextKeySynchronizer.waitFor(mw);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
this.middlewares?.forEach(mw => mw.update?.(result));
|
|
37
44
|
return result;
|
|
38
45
|
};
|
|
39
46
|
buildPath(data) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGRpcRequestBuilder.js","sourceRoot":"","sources":["../../../../src/rpc/RpcRequest/GGRpcRequestBuilder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GGRpcRequestBuilder.js","sourceRoot":"","sources":["../../../../src/rpc/RpcRequest/GGRpcRequestBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,10 +8,10 @@ export declare class GGRpcRequestParser {
|
|
|
8
8
|
private readonly pathParams;
|
|
9
9
|
private readonly hasBody;
|
|
10
10
|
protected readonly contract: GGContractMethod;
|
|
11
|
-
private readonly
|
|
12
|
-
private readonly serverMiddlewares;
|
|
11
|
+
private readonly middlewares;
|
|
13
12
|
constructor(method: HttpMethod, pathTemplate: string, config: ClientHttpRouteToRpcTransformServerConfig);
|
|
14
|
-
|
|
13
|
+
readRequest: (req: http.IncomingMessage) => Promise<unknown>;
|
|
14
|
+
validateInput: (rawInput: unknown) => unknown;
|
|
15
15
|
private parseQueryString;
|
|
16
16
|
private extractPathParams;
|
|
17
17
|
private parseBody;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGRpcRequestParser.d.ts","sourceRoot":"","sources":["../../../../src/rpc/RpcRequest/GGRpcRequestParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAqB,gBAAgB,EAAoB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"GGRpcRequestParser.d.ts","sourceRoot":"","sources":["../../../../src/rpc/RpcRequest/GGRpcRequestParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAqB,gBAAgB,EAAoB,MAAM,kBAAkB,CAAC;AAEzF,OAAO,EAAC,yCAAyC,EAAC,MAAM,2BAA2B,CAAC;AAGpF,eAAO,MAAM,sBAAsB,QAAc,CAAC;AAElD,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;gBAG1D,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,yCAAyC;IAW9C,WAAW,GAAU,KAAK,IAAI,CAAC,eAAe,KAAG,OAAO,CAAC,OAAO,CAAC,CAgBvE;IAEM,aAAa,GAAI,UAAU,OAAO,KAAG,OAAO,CAElD;IAED,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,iBAAiB;YAiBX,SAAS;CAqC1B"}
|
|
@@ -1,44 +1,41 @@
|
|
|
1
1
|
import { GGContractExecutor, PAYLOAD_TOO_LARGE } from "@grest-ts/schema";
|
|
2
|
+
import { applyRequestMiddleware } from "../../server/applyRequestMiddleware.js";
|
|
2
3
|
export const DEFAULT_MAX_BODY_BYTES = 1024 * 1024;
|
|
3
4
|
export class GGRpcRequestParser {
|
|
4
5
|
pathTemplate;
|
|
5
6
|
pathParams;
|
|
6
7
|
hasBody;
|
|
7
8
|
contract;
|
|
8
|
-
|
|
9
|
-
serverMiddlewares;
|
|
9
|
+
middlewares;
|
|
10
10
|
constructor(method, pathTemplate, config) {
|
|
11
11
|
this.pathTemplate = pathTemplate;
|
|
12
12
|
this.pathParams = (pathTemplate.match(/:(\w+)/g) || []).map(m => m.slice(1));
|
|
13
13
|
this.hasBody = method === "POST" || method === "PUT" || method === "PATCH";
|
|
14
14
|
this.contract = config.contract;
|
|
15
|
-
this.
|
|
16
|
-
this.serverMiddlewares = config.serverMiddlewares;
|
|
15
|
+
this.middlewares = config.middlewares;
|
|
17
16
|
}
|
|
18
|
-
|
|
17
|
+
// Resolve identity (run the wire pipeline) and extract the raw, unvalidated input.
|
|
18
|
+
// Validation is deferred to validateInput so the permission gate can run in between.
|
|
19
|
+
readRequest = async (req) => {
|
|
19
20
|
const url = req.url || '/';
|
|
20
21
|
const qIndex = url.indexOf('?');
|
|
21
22
|
const queryArgs = this.parseQueryString(qIndex === -1 ? '' : url.substring(qIndex + 1));
|
|
22
|
-
|
|
23
|
-
const mwQuery = { headers: req.headers, queryArgs: queryArgs };
|
|
24
|
-
this.apiMiddlewares?.forEach(mw => mw.parseRequest?.(mwQuery));
|
|
25
|
-
}
|
|
26
|
-
for (const mw of this.serverMiddlewares ?? [])
|
|
27
|
-
await mw.process?.();
|
|
28
|
-
let input;
|
|
23
|
+
await applyRequestMiddleware(req, queryArgs, this.middlewares);
|
|
29
24
|
if (this.hasBody) {
|
|
30
|
-
|
|
25
|
+
return await this.parseBody(req);
|
|
31
26
|
}
|
|
32
27
|
else if (this.pathParams.length > 0) {
|
|
33
|
-
|
|
28
|
+
return {
|
|
34
29
|
...this.extractPathParams(qIndex === -1 ? url : url.substring(0, qIndex)),
|
|
35
30
|
...queryArgs
|
|
36
31
|
};
|
|
37
32
|
}
|
|
38
33
|
else {
|
|
39
|
-
|
|
34
|
+
return queryArgs;
|
|
40
35
|
}
|
|
41
|
-
|
|
36
|
+
};
|
|
37
|
+
validateInput = (rawInput) => {
|
|
38
|
+
return GGContractExecutor.parseInput(this.contract.input, rawInput);
|
|
42
39
|
};
|
|
43
40
|
parseQueryString(rawQuery) {
|
|
44
41
|
const result = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGRpcRequestParser.js","sourceRoot":"","sources":["../../../../src/rpc/RpcRequest/GGRpcRequestParser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,kBAAkB,EAAoB,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"GGRpcRequestParser.js","sourceRoot":"","sources":["../../../../src/rpc/RpcRequest/GGRpcRequestParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { ERROR, GGContractMethod, OK } from "@grest-ts/schema";
|
|
|
3
3
|
import { ClientHttpRouteToRpcTransformServerConfig } from "../../schema/GGHttpSchema";
|
|
4
4
|
export declare class GGRpcResponseBuilder {
|
|
5
5
|
protected readonly contract: GGContractMethod;
|
|
6
|
-
private readonly
|
|
6
|
+
private readonly middlewares;
|
|
7
7
|
constructor(config: ClientHttpRouteToRpcTransformServerConfig);
|
|
8
8
|
sendResponse: (res: http.ServerResponse, rpcResult: ERROR<string, unknown> | OK<unknown>) => Promise<void>;
|
|
9
9
|
private makeError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGRpcResponseBuilder.d.ts","sourceRoot":"","sources":["../../../../src/rpc/RpcResponse/GGRpcResponseBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAY,KAAK,EAAsB,gBAAgB,EAAsC,EAAE,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"GGRpcResponseBuilder.d.ts","sourceRoot":"","sources":["../../../../src/rpc/RpcResponse/GGRpcResponseBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAY,KAAK,EAAsB,gBAAgB,EAAsC,EAAE,EAAC,MAAM,kBAAkB,CAAC;AAEhI,OAAO,EAAC,yCAAyC,EAAC,MAAM,2BAA2B,CAAC;AAIpF,qBAAa,oBAAoB;IAE7B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;gBAElD,MAAM,EAAE,yCAAyC;IAKtD,YAAY,GAAU,KAAK,IAAI,CAAC,cAAc,EAAE,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAoBrH;IAED,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,YAAY;CA6BvB"}
|
|
@@ -2,10 +2,10 @@ import { ERROR, GGContractExecutor } from "@grest-ts/schema";
|
|
|
2
2
|
import { applyResponseMiddleware } from "../../server/applyResponseMiddleware.js";
|
|
3
3
|
export class GGRpcResponseBuilder {
|
|
4
4
|
contract;
|
|
5
|
-
|
|
5
|
+
middlewares;
|
|
6
6
|
constructor(config) {
|
|
7
7
|
this.contract = config.contract;
|
|
8
|
-
this.
|
|
8
|
+
this.middlewares = config.middlewares;
|
|
9
9
|
}
|
|
10
10
|
sendResponse = async (res, rpcResult) => {
|
|
11
11
|
let json;
|
|
@@ -22,7 +22,7 @@ export class GGRpcResponseBuilder {
|
|
|
22
22
|
json = this.makeError(GGContractExecutor.getResponseSchema(this.contract, rpcResult), rpcResult);
|
|
23
23
|
statusCode = rpcResult.statusCode;
|
|
24
24
|
}
|
|
25
|
-
applyResponseMiddleware(res, this.
|
|
25
|
+
applyResponseMiddleware(res, this.middlewares);
|
|
26
26
|
res.writeHead(statusCode, {
|
|
27
27
|
'Content-Type': 'application/json',
|
|
28
28
|
'Content-Length': Buffer.byteLength(json)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGRpcResponseBuilder.js","sourceRoot":"","sources":["../../../../src/rpc/RpcResponse/GGRpcResponseBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,EAAE,kBAAkB,EAA2D,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"GGRpcResponseBuilder.js","sourceRoot":"","sources":["../../../../src/rpc/RpcResponse/GGRpcResponseBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { GGContextKey, type GGInbound, type GGResponse } from "@grest-ts/context";
|
|
2
|
+
import { type GGSchema } from "@grest-ts/schema";
|
|
3
|
+
import { GGWireContextKey } from "./GGWireContextKey";
|
|
4
|
+
/**
|
|
5
|
+
* Per-request set of context-key names the current route is permitted to write a cookie
|
|
6
|
+
* for (declared via GGRpc.*(...).updatesCookie(key)). Populated by the server route
|
|
7
|
+
* handler; read by setCookie() to reject undeclared cookie writes.
|
|
8
|
+
*/
|
|
9
|
+
export declare const GG_COOKIE_WRITES: GGContextKey<Set<string>>;
|
|
10
|
+
export interface CookieOptions {
|
|
11
|
+
httpOnly?: boolean;
|
|
12
|
+
secure?: boolean;
|
|
13
|
+
sameSite?: "lax" | "strict" | "none";
|
|
14
|
+
path?: string;
|
|
15
|
+
domain?: string;
|
|
16
|
+
maxAgeSec?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A cookie that IS its own context key.
|
|
20
|
+
*
|
|
21
|
+
* // ambient — the named cookie's value lands in the wire and persists, no implementation needed.
|
|
22
|
+
* const SESSION_WIRE = new GGCookie("session_id")
|
|
23
|
+
*
|
|
24
|
+
* Reads ONLY the named cookie — never a header — from the inbound Cookie header into the wire.
|
|
25
|
+
* For HTTP that is the request Cookie; for WebSocket the real upgrade Cookie (the runtime fills
|
|
26
|
+
* inbound.cookie from there, never from the spoofable in-band message). The cookie name is the
|
|
27
|
+
* first constructor argument (case-sensitive — unlike a header it is not lowercased). To write
|
|
28
|
+
* the cookie, call GGCookie.setCookie(key, …) from a route that declared .updatesCookie(key);
|
|
29
|
+
* this wire flushes it as Set-Cookie (HTTP only — a WebSocket has no response to set a cookie on).
|
|
30
|
+
*/
|
|
31
|
+
export declare class GGCookie extends GGWireContextKey {
|
|
32
|
+
readonly cookieParams: Record<string, GGSchema<string | undefined>>;
|
|
33
|
+
constructor(name: string);
|
|
34
|
+
parse(inbound: GGInbound): void;
|
|
35
|
+
respond(res: GGResponse): void;
|
|
36
|
+
/**
|
|
37
|
+
* Schedule a Set-Cookie on the response (HTTP only). The value never touches key.get() —
|
|
38
|
+
* inbound reads stay set-once. The route must declare .updatesCookie(key); an undeclared
|
|
39
|
+
* call is invalid usage and throws SERVER_ERROR. The matching cookie() binding serializes
|
|
40
|
+
* the pending write with these options (HttpOnly/Secure/SameSite/Path/Domain/Max-Age).
|
|
41
|
+
*/
|
|
42
|
+
static setCookie(key: GGContextKey<string | undefined>, value: string | undefined, options?: CookieOptions): void;
|
|
43
|
+
/**
|
|
44
|
+
* Clear the cookie — schedules a Set-Cookie with Max-Age=0. Pass path/domain to match a
|
|
45
|
+
* scoped cookie (deletion only works when path+domain match what was set). Equivalent to
|
|
46
|
+
* setCookie(key, undefined, options), but reads clearer at logout-style call sites.
|
|
47
|
+
*/
|
|
48
|
+
static clearCookie(key: GGContextKey<string | undefined>, options?: CookieOptions): void;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=GGCookie.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGCookie.d.ts","sourceRoot":"","sources":["../../../src/schema/GGCookie.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAC,MAAM,mBAAmB,CAAA;AAC/E,OAAO,EAAC,KAAK,QAAQ,EAAgC,MAAM,kBAAkB,CAAA;AAC7E,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAA;AAEnD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,2BAA4F,CAAA;AAQzH,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IACpC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAcD;;;;;;;;;;;;GAYG;AACH,qBAAa,QAAS,SAAQ,gBAAgB;IAE1C,SAAgB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;gBAE9D,IAAI,EAAE,MAAM;IAOjB,KAAK,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI;IAK/B,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAUrC;;;;;OAKG;WACW,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAmBxH;;;;OAIG;WACW,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;CAIlG"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { GGContextKey } from "@grest-ts/context";
|
|
2
|
+
import { IsAny, IsString, SERVER_ERROR } from "@grest-ts/schema";
|
|
3
|
+
import { GGWireContextKey } from "./GGWireContextKey.js";
|
|
4
|
+
/**
|
|
5
|
+
* Per-request set of context-key names the current route is permitted to write a cookie
|
|
6
|
+
* for (declared via GGRpc.*(...).updatesCookie(key)). Populated by the server route
|
|
7
|
+
* handler; read by setCookie() to reject undeclared cookie writes.
|
|
8
|
+
*/
|
|
9
|
+
export const GG_COOKIE_WRITES = new GGContextKey("cookie:writes", IsAny);
|
|
10
|
+
/**
|
|
11
|
+
* Per-request Set-Cookie writes scheduled via setCookie()/clearCookie(), keyed by the
|
|
12
|
+
* context key's name. Flushed onto the response by the matching cookie() binding.
|
|
13
|
+
*/
|
|
14
|
+
const GG_COOKIE_PENDING = new GGContextKey("cookie:pending", IsAny);
|
|
15
|
+
const SAFE_DEFAULTS = {
|
|
16
|
+
httpOnly: true,
|
|
17
|
+
secure: true,
|
|
18
|
+
sameSite: "lax",
|
|
19
|
+
path: "/"
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* A cookie that IS its own context key.
|
|
23
|
+
*
|
|
24
|
+
* // ambient — the named cookie's value lands in the wire and persists, no implementation needed.
|
|
25
|
+
* const SESSION_WIRE = new GGCookie("session_id")
|
|
26
|
+
*
|
|
27
|
+
* Reads ONLY the named cookie — never a header — from the inbound Cookie header into the wire.
|
|
28
|
+
* For HTTP that is the request Cookie; for WebSocket the real upgrade Cookie (the runtime fills
|
|
29
|
+
* inbound.cookie from there, never from the spoofable in-band message). The cookie name is the
|
|
30
|
+
* first constructor argument (case-sensitive — unlike a header it is not lowercased). To write
|
|
31
|
+
* the cookie, call GGCookie.setCookie(key, …) from a route that declared .updatesCookie(key);
|
|
32
|
+
* this wire flushes it as Set-Cookie (HTTP only — a WebSocket has no response to set a cookie on).
|
|
33
|
+
*/
|
|
34
|
+
export class GGCookie extends GGWireContextKey {
|
|
35
|
+
cookieParams;
|
|
36
|
+
constructor(name) {
|
|
37
|
+
const WIRE_SCHEMA = IsString.orUndefined;
|
|
38
|
+
super(name, WIRE_SCHEMA);
|
|
39
|
+
_assertCookieSafe("name", this.name);
|
|
40
|
+
this.cookieParams = { [this.name]: WIRE_SCHEMA };
|
|
41
|
+
}
|
|
42
|
+
parse(inbound) {
|
|
43
|
+
const value = _readCookie(inbound.cookie, this.name);
|
|
44
|
+
if (value !== undefined)
|
|
45
|
+
this.set(value);
|
|
46
|
+
}
|
|
47
|
+
respond(res) {
|
|
48
|
+
const pending = GG_COOKIE_PENDING.get()?.get(this.name);
|
|
49
|
+
if (pending === undefined)
|
|
50
|
+
return;
|
|
51
|
+
const line = _serializeSetCookie(this.name, pending.value, pending.options);
|
|
52
|
+
const existing = res.headers["set-cookie"];
|
|
53
|
+
const arr = existing === undefined ? [] : Array.isArray(existing) ? existing : [existing];
|
|
54
|
+
arr.push(line);
|
|
55
|
+
res.headers["set-cookie"] = arr;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Schedule a Set-Cookie on the response (HTTP only). The value never touches key.get() —
|
|
59
|
+
* inbound reads stay set-once. The route must declare .updatesCookie(key); an undeclared
|
|
60
|
+
* call is invalid usage and throws SERVER_ERROR. The matching cookie() binding serializes
|
|
61
|
+
* the pending write with these options (HttpOnly/Secure/SameSite/Path/Domain/Max-Age).
|
|
62
|
+
*/
|
|
63
|
+
static setCookie(key, value, options) {
|
|
64
|
+
if (options) {
|
|
65
|
+
if (options.maxAgeSec !== undefined && !Number.isFinite(options.maxAgeSec)) {
|
|
66
|
+
throw new Error(`setCookie("${key.name}"): maxAgeSec must be a finite number, got ${options.maxAgeSec}.`);
|
|
67
|
+
}
|
|
68
|
+
if (options.path !== undefined)
|
|
69
|
+
_assertCookieSafe("path", options.path);
|
|
70
|
+
if (options.domain !== undefined)
|
|
71
|
+
_assertCookieSafe("domain", options.domain);
|
|
72
|
+
}
|
|
73
|
+
if (!GG_COOKIE_WRITES.get()?.has(key.name)) {
|
|
74
|
+
throw new SERVER_ERROR({ debugMessage: `setCookie("${key.name}") was called, but this route did not declare .updatesCookie(<key>). Only routes that declare it may set or clear the cookie.` });
|
|
75
|
+
}
|
|
76
|
+
let pending = GG_COOKIE_PENDING.get();
|
|
77
|
+
if (pending === undefined) {
|
|
78
|
+
pending = new Map();
|
|
79
|
+
GG_COOKIE_PENDING.set(pending);
|
|
80
|
+
}
|
|
81
|
+
pending.set(key.name, { value, options });
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Clear the cookie — schedules a Set-Cookie with Max-Age=0. Pass path/domain to match a
|
|
85
|
+
* scoped cookie (deletion only works when path+domain match what was set). Equivalent to
|
|
86
|
+
* setCookie(key, undefined, options), but reads clearer at logout-style call sites.
|
|
87
|
+
*/
|
|
88
|
+
static clearCookie(key, options) {
|
|
89
|
+
this.setCookie(key, undefined, options);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Reject anything that could break out of the Set-Cookie line / inject attributes.
|
|
93
|
+
function _assertCookieSafe(label, value) {
|
|
94
|
+
if (/[\x00-\x1f;]/.test(value)) {
|
|
95
|
+
throw new Error(`Cookie ${label} contains illegal characters (control chars or ';'): ${JSON.stringify(value)}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Read a single named cookie out of a raw `Cookie` header value. A malformed
|
|
100
|
+
* percent-encoding (e.g. "sid=%") must not crash — fall back to the raw value.
|
|
101
|
+
*/
|
|
102
|
+
function _readCookie(rawCookieHeader, name) {
|
|
103
|
+
if (typeof rawCookieHeader !== "string")
|
|
104
|
+
return undefined;
|
|
105
|
+
for (const part of rawCookieHeader.split(";")) {
|
|
106
|
+
const eq = part.indexOf("=");
|
|
107
|
+
if (eq === -1)
|
|
108
|
+
continue;
|
|
109
|
+
if (part.slice(0, eq).trim() === name) {
|
|
110
|
+
const rawValue = part.slice(eq + 1).trim();
|
|
111
|
+
try {
|
|
112
|
+
return decodeURIComponent(rawValue);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return rawValue;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
function _serializeSetCookie(name, value, options) {
|
|
122
|
+
const o = { ...SAFE_DEFAULTS, ...options };
|
|
123
|
+
const secure = o.sameSite === "none" ? true : o.secure;
|
|
124
|
+
const sameSite = `${o.sameSite.charAt(0).toUpperCase()}${o.sameSite.slice(1)}`;
|
|
125
|
+
const attrs = `; Path=${o.path}${o.domain ? `; Domain=${o.domain}` : ""}; SameSite=${sameSite}${secure ? "; Secure" : ""}${o.httpOnly ? "; HttpOnly" : ""}`;
|
|
126
|
+
return value
|
|
127
|
+
? `${name}=${encodeURIComponent(value)}${o.maxAgeSec !== undefined ? `; Max-Age=${Math.trunc(o.maxAgeSec)}` : ""}${attrs}`
|
|
128
|
+
: `${name}=; Max-Age=0${attrs}`;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=GGCookie.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGCookie.js","sourceRoot":"","sources":["../../../src/schema/GGCookie.ts"],"names":[],"mappings":"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"}
|