@grest-ts/http 0.0.47 → 0.0.48
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 +125 -0
- package/dist/src/_dedupCheck.js +1 -1
- package/dist/src/client/GGHttpSchema.createClient.d.ts +8 -0
- package/dist/src/client/GGHttpSchema.createClient.d.ts.map +1 -1
- package/dist/src/client/GGHttpSchema.createClient.js +2 -1
- package/dist/src/client/GGHttpSchema.createClient.js.map +1 -1
- package/dist/src/index-browser.d.ts +2 -0
- package/dist/src/index-browser.d.ts.map +1 -1
- package/dist/src/index-browser.js +2 -0
- package/dist/src/index-browser.js.map +1 -1
- package/dist/src/index-node.d.ts +3 -0
- package/dist/src/index-node.d.ts.map +1 -1
- package/dist/src/index-node.js +3 -0
- package/dist/src/index-node.js.map +1 -1
- package/dist/src/rpc/GGHttpRouteRPC.d.ts +4 -0
- package/dist/src/rpc/GGHttpRouteRPC.d.ts.map +1 -1
- package/dist/src/rpc/GGHttpRouteRPC.js +6 -0
- package/dist/src/rpc/GGHttpRouteRPC.js.map +1 -1
- package/dist/src/rpc/RpcResponse/GGRpcResponseBuilder.d.ts +1 -0
- package/dist/src/rpc/RpcResponse/GGRpcResponseBuilder.d.ts.map +1 -1
- package/dist/src/rpc/RpcResponse/GGRpcResponseBuilder.js +4 -0
- package/dist/src/rpc/RpcResponse/GGRpcResponseBuilder.js.map +1 -1
- package/dist/src/schema/GGHttpSchema.d.ts +13 -0
- package/dist/src/schema/GGHttpSchema.d.ts.map +1 -1
- package/dist/src/schema/GGHttpSchema.js.map +1 -1
- package/dist/src/schema/cookieMiddleware.d.ts +71 -0
- package/dist/src/schema/cookieMiddleware.d.ts.map +1 -0
- package/dist/src/schema/cookieMiddleware.js +126 -0
- package/dist/src/schema/cookieMiddleware.js.map +1 -0
- package/dist/src/schema/headerBinding.d.ts +35 -0
- package/dist/src/schema/headerBinding.d.ts.map +1 -0
- package/dist/src/schema/headerBinding.js +49 -0
- package/dist/src/schema/headerBinding.js.map +1 -0
- package/dist/src/schema/httpSchema.d.ts +0 -2
- package/dist/src/schema/httpSchema.d.ts.map +1 -1
- package/dist/src/schema/httpSchema.js +0 -48
- package/dist/src/schema/httpSchema.js.map +1 -1
- package/dist/src/server/GGHttpSchema.startServer.d.ts.map +1 -1
- package/dist/src/server/GGHttpSchema.startServer.js +4 -1
- package/dist/src/server/GGHttpSchema.startServer.js.map +1 -1
- package/dist/src/server/GGHttpServer.d.ts +29 -0
- package/dist/src/server/GGHttpServer.d.ts.map +1 -1
- package/dist/src/server/GGHttpServer.js +35 -8
- package/dist/src/server/GGHttpServer.js.map +1 -1
- package/dist/src/server/applyResponseMiddleware.d.ts +12 -0
- package/dist/src/server/applyResponseMiddleware.d.ts.map +1 -0
- package/dist/src/server/applyResponseMiddleware.js +25 -0
- package/dist/src/server/applyResponseMiddleware.js.map +1 -0
- package/dist/tsconfig.publish.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/_dedupCheck.ts +1 -1
- package/src/client/GGHttpSchema.createClient.ts +10 -1
- package/src/index-browser.ts +2 -0
- package/src/index-node.ts +3 -0
- package/src/rpc/GGHttpRouteRPC.ts +8 -0
- package/src/rpc/RpcResponse/GGRpcResponseBuilder.ts +5 -1
- package/src/schema/GGHttpSchema.ts +15 -0
- package/src/schema/cookieMiddleware.ts +164 -0
- package/src/schema/headerBinding.ts +65 -0
- package/src/schema/httpSchema.ts +2 -55
- package/src/server/GGHttpSchema.startServer.ts +4 -1
- package/src/server/GGHttpServer.ts +57 -8
- package/src/server/applyResponseMiddleware.ts +27 -0
package/README.md
CHANGED
|
@@ -478,6 +478,131 @@ httpServer.registerCorsHeaders(['x-custom-header'])
|
|
|
478
478
|
httpServer.registerCorsExposeHeaders(['x-custom-response-header'])
|
|
479
479
|
```
|
|
480
480
|
|
|
481
|
+
## Cookies (httpOnly sessions)
|
|
482
|
+
|
|
483
|
+
An httpOnly session cookie is a value the browser stores and re-sends automatically
|
|
484
|
+
that JavaScript cannot read (so XSS can't steal it). It is **server-minted**: the
|
|
485
|
+
server emits `Set-Cookie`, the browser stores and resends it, and JS never touches it.
|
|
486
|
+
|
|
487
|
+
A cookie is just a **context key bound to the wire** — same feel as an auth context
|
|
488
|
+
key. Define a `GGContextKeyForCookie` (a `GGContextKey` whose value rides as a cookie),
|
|
489
|
+
bind it with `.useCookie(SESSION)` on the schema, and use `.get()` / `.set()` in handlers:
|
|
490
|
+
|
|
491
|
+
```typescript
|
|
492
|
+
// shared api/
|
|
493
|
+
import {GGRpc, httpSchema, GGContextKeyForCookie} from "@grest-ts/http"
|
|
494
|
+
|
|
495
|
+
// The key's name IS the cookie's wire name. No cookie policy in the shared API.
|
|
496
|
+
export const SESSION = new GGContextKeyForCookie("session")
|
|
497
|
+
|
|
498
|
+
export const AuthApi = httpSchema(AuthContract)
|
|
499
|
+
.useCookie(SESSION)
|
|
500
|
+
.pathPrefix("api/auth")
|
|
501
|
+
.routes({
|
|
502
|
+
login: GGRpc.POST("login").updatesCookie(SESSION), // may write the cookie
|
|
503
|
+
logout: GGRpc.POST("logout").updatesCookie(SESSION), // may write (clear)
|
|
504
|
+
me: GGRpc.GET("me"), // read-only -> no declaration
|
|
505
|
+
})
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
```typescript
|
|
509
|
+
export class AuthService {
|
|
510
|
+
login = async (input: LoginRequest): Promise<User> => {
|
|
511
|
+
const {user, token} = await this.verify(input)
|
|
512
|
+
// Write rules live HERE, at the set site. Safe defaults (HttpOnly, Secure,
|
|
513
|
+
// SameSite=Lax, Path=/) are applied; pass only what differs:
|
|
514
|
+
SESSION.set(token, {maxAgeSec: input.remember ? 60*60*24*30 : 60*60})
|
|
515
|
+
return user
|
|
516
|
+
}
|
|
517
|
+
logout = async (): Promise<void> => { SESSION.delete() } // -> Max-Age=0 clear
|
|
518
|
+
me = async (): Promise<User> => this.fromSession(SESSION.get()) // read the cookie
|
|
519
|
+
}
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
**Read vs write.** Reading is implicit — `SESSION.get()` works on any route the schema
|
|
523
|
+
`.useCookie`-bound (just like an auth context key). **Writing is explicit**: only a
|
|
524
|
+
route that declared `.updatesCookie(SESSION)` may change the cookie. A handler that
|
|
525
|
+
calls `SESSION.set(...)` on a route that *didn't* declare it is a `SERVER_ERROR`
|
|
526
|
+
(logged, change rolled back), so a deep service function can't silently mint or change
|
|
527
|
+
someone's session — the capability is visible at the API boundary. (Auth context needs
|
|
528
|
+
no such gate: the server only *reads* it from the request; a cookie is *produced* by
|
|
529
|
+
the server.)
|
|
530
|
+
|
|
531
|
+
**Emit-on-change.** Within a route that may write, `useCookie` emits `Set-Cookie` only
|
|
532
|
+
when the handler **changes** the key versus what arrived: `set(token)` → `Set-Cookie`;
|
|
533
|
+
`delete()` (or `set(undefined)`) → `Max-Age=0` clear; untouched → nothing (read routes
|
|
534
|
+
don't re-emit, and there's no spurious clear when no cookie arrived).
|
|
535
|
+
|
|
536
|
+
**Write rules live at `.set(value, options)`**, never in the shared API — only the
|
|
537
|
+
cookie's wire name (the key's name, needed to *read* it on every route) is on the
|
|
538
|
+
schema. Options: `httpOnly`, `secure`, `sameSite`, `path`, `domain`, `maxAgeSec`. Safe
|
|
539
|
+
defaults (`HttpOnly`, `Secure`, `SameSite=Lax`, `Path=/`) are applied by the serializer,
|
|
540
|
+
so `set(token)` is safe; pass only deviations. `SameSite=None` forces `Secure`;
|
|
541
|
+
name/path/domain are validated (no CR/LF/`;`). A scoped cookie repeats `path`/`domain`
|
|
542
|
+
on clear so deletion matches:
|
|
543
|
+
|
|
544
|
+
```typescript
|
|
545
|
+
SESSION.set(token, {path: "/api", domain: ".example.com", sameSite: "none", maxAgeSec: WEEK})
|
|
546
|
+
SESSION.delete({path: "/api", domain: ".example.com"}) // clear must match scope
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
**Domain scope is a security boundary.** The default is **host-only** (no `Domain`):
|
|
550
|
+
the cookie is sent only to the exact host that set it. `domain: ".example.com"` sends
|
|
551
|
+
it to **every** subdomain, so *any* subdomain — including user-controlled or untrusted
|
|
552
|
+
content — can read it. Never share a parent domain with untrusted subdomains; host
|
|
553
|
+
untrusted/user content on a **separate registrable domain** instead.
|
|
554
|
+
|
|
555
|
+
**Cross-site cookies.** A `SameSite=Lax` cookie is not sent on cross-site requests.
|
|
556
|
+
For a cross-site setup (browser and API on different sites) use `sameSite: "none"` +
|
|
557
|
+
`secure: true` **and** credentialed CORS on the server (below) with an exact-origin
|
|
558
|
+
allowlist — never a wildcard.
|
|
559
|
+
|
|
560
|
+
### Credentialed CORS (cross-origin cookies)
|
|
561
|
+
|
|
562
|
+
Cross-origin cookie requests require the response to echo the **specific** request
|
|
563
|
+
Origin plus `Access-Control-Allow-Credentials: true` — browsers reject the wildcard
|
|
564
|
+
`*` when credentials are involved. Opt in per server (default off keeps the
|
|
565
|
+
permissive `*`):
|
|
566
|
+
|
|
567
|
+
```typescript
|
|
568
|
+
new GGHttpServer({
|
|
569
|
+
cors: {
|
|
570
|
+
origins: ["https://app.example.com"], // exact list, or (origin) => boolean
|
|
571
|
+
credentials: true,
|
|
572
|
+
},
|
|
573
|
+
})
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
Only an allowlisted Origin is echoed (never `*`), with `Vary: Origin`. Never reflect
|
|
577
|
+
an arbitrary origin with credentials — the allowlist is the gate.
|
|
578
|
+
|
|
579
|
+
### Client: send cookies
|
|
580
|
+
|
|
581
|
+
The browser attaches cross-origin cookies only when the caller opts in:
|
|
582
|
+
|
|
583
|
+
```typescript
|
|
584
|
+
const client = AuthApi.createClient({url: "https://api.example.com", credentials: "include"})
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
Same-origin calls and the default need nothing.
|
|
588
|
+
|
|
589
|
+
### WebSocket cookies
|
|
590
|
+
|
|
591
|
+
First-class WebSocket cookie support (the same `SESSION` key populated from the
|
|
592
|
+
browser's `Cookie` on the WS upgrade, read-only) is planned — see
|
|
593
|
+
`docs/plans/WS_COOKIE_SUPPORT.md`. Until it lands, gate a socket by the session with
|
|
594
|
+
the **ticket pattern**: a cookie-authenticated HTTP endpoint mints a short-lived,
|
|
595
|
+
single-use ticket; the browser opens the socket carrying that ticket on the handshake
|
|
596
|
+
via the existing token transport:
|
|
597
|
+
|
|
598
|
+
```typescript
|
|
599
|
+
// HTTP: cookie-authenticated endpoint mints a short-lived ticket
|
|
600
|
+
wsTicket = async (): Promise<{ticket: string}> => {
|
|
601
|
+
const session = SESSION.get() // read from the cookie
|
|
602
|
+
return {ticket: await this.mintTicket(session, {ttlSec: 10, singleUse: true})}
|
|
603
|
+
}
|
|
604
|
+
```
|
|
605
|
+
|
|
481
606
|
## HTTP Client
|
|
482
607
|
|
|
483
608
|
### Creating Clients
|
package/dist/src/_dedupCheck.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
const __KEY = Symbol.for("grest-ts:dedup:@grest-ts/http");
|
|
12
12
|
const __slot = globalThis;
|
|
13
13
|
const __existing = __slot[__KEY];
|
|
14
|
-
const __here = { path: import.meta.url, version: "0.0.
|
|
14
|
+
const __here = { path: import.meta.url, version: "0.0.48" };
|
|
15
15
|
// Same path + same version means the same physical package is being
|
|
16
16
|
// re-evaluated by a different ESM runner (e.g. vitest projects share one
|
|
17
17
|
// process but each project has its own module cache). That isn't a true
|
|
@@ -23,11 +23,19 @@ export type GGHttpTransport = (url: string, init: {
|
|
|
23
23
|
headers: Record<string, string>;
|
|
24
24
|
body: string | FormData | undefined;
|
|
25
25
|
signal: AbortSignal;
|
|
26
|
+
credentials?: "omit" | "same-origin" | "include";
|
|
26
27
|
}) => Promise<Response>;
|
|
27
28
|
export interface GGHttpClientConfig {
|
|
28
29
|
url?: string;
|
|
29
30
|
timeout?: number;
|
|
30
31
|
noValidation?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Cross-origin credentials mode for the default fetch transport. Default
|
|
34
|
+
* (unset → fetch's "same-origin") is unchanged; pass "include" so the browser
|
|
35
|
+
* attaches/stores cross-origin cookies. Ignored by custom transports unless
|
|
36
|
+
* they read it.
|
|
37
|
+
*/
|
|
38
|
+
credentials?: "omit" | "same-origin" | "include";
|
|
31
39
|
/**
|
|
32
40
|
* Override the wire-layer call. Defaults to `fetch`. When provided,
|
|
33
41
|
* service discovery is skipped (the transport is presumed to know how
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGHttpSchema.createClient.d.ts","sourceRoot":"","sources":["../../../src/client/GGHttpSchema.createClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,uBAAuB,EAAE,gBAAgB,EAA4E,MAAM,kBAAkB,CAAA;AACvK,OAAO,EAAwD,YAAY,EAAC,MAAM,wBAAwB,CAAC;AAI3G,OAAO,QAAQ,wBAAwB,CAAC;IACpC,UAAU,YAAY,CAAC,SAAS,SAAS,uBAAuB,EAAE,QAAQ,GAAG,EAAE;QAC3E,YAAY,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAA;KACzE;CACJ;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,eAAe,GAAG,CAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IACF,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;IACnC,MAAM,EAAE,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"GGHttpSchema.createClient.d.ts","sourceRoot":"","sources":["../../../src/client/GGHttpSchema.createClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,uBAAuB,EAAE,gBAAgB,EAA4E,MAAM,kBAAkB,CAAA;AACvK,OAAO,EAAwD,YAAY,EAAC,MAAM,wBAAwB,CAAC;AAI3G,OAAO,QAAQ,wBAAwB,CAAC;IACpC,UAAU,YAAY,CAAC,SAAS,SAAS,uBAAuB,EAAE,QAAQ,GAAG,EAAE;QAC3E,YAAY,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAA;KACzE;CACJ;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,eAAe,GAAG,CAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IACF,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;IACnC,MAAM,EAAE,WAAW,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAA;CACnD,KACA,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEtB,MAAM,WAAW,kBAAkB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAA;IAChD;;;;;OAKG;IACH,SAAS,CAAC,EAAE,eAAe,CAAA;CAC9B;AASD,wBAAgB,YAAY,CAAC,SAAS,SAAS,uBAAuB,EAAE,QAAQ,EAC5E,UAAU,EAAE,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,EAC7C,MAAM,CAAC,EAAE,kBAAkB,GAC5B,gBAAgB,CAAC,SAAS,CAAC,CAwF7B"}
|
|
@@ -52,7 +52,8 @@ export function createClient(httpSchema, config) {
|
|
|
52
52
|
method: fetchRequest.method,
|
|
53
53
|
signal: controller.signal,
|
|
54
54
|
headers: fetchRequest.headers,
|
|
55
|
-
body: fetchRequest.body
|
|
55
|
+
body: fetchRequest.body,
|
|
56
|
+
credentials: config.credentials
|
|
56
57
|
}).finally(() => clearTimeout(timeoutId));
|
|
57
58
|
const resData = await wireFormat.parseResponse(wireResponse);
|
|
58
59
|
// ---------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGHttpSchema.createClient.js","sourceRoot":"","sources":["../../../src/client/GGHttpSchema.createClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,EAA6C,kBAAkB,EAA4B,SAAS,EAAM,YAAY,EAAC,MAAM,kBAAkB,CAAA;AACvK,OAAO,EAAwD,YAAY,EAAC,MAAM,wBAAwB,CAAC;AAC3G,OAAO,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"GGHttpSchema.createClient.js","sourceRoot":"","sources":["../../../src/client/GGHttpSchema.createClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import "./_dedupCheck";
|
|
2
2
|
export * from "./schema/GGHttpSchema";
|
|
3
3
|
export * from "./schema/httpSchema";
|
|
4
|
+
export * from "./schema/cookieMiddleware";
|
|
5
|
+
export * from "./schema/headerBinding";
|
|
4
6
|
export * from "./rpc/GGHttpRouteRPC";
|
|
5
7
|
export * from "./rpc/RpcRequest/GGRpcRequestBuilder";
|
|
6
8
|
export * from "./rpc/RpcResponse/GGRpcResponseParser";
|
|
@@ -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,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AAGtD,cAAc,oCAAoC,CAAC;AAGnD,OAAO,oCAAoC,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,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AAGtD,cAAc,oCAAoC,CAAC;AAGnD,OAAO,oCAAoC,CAAC"}
|
|
@@ -2,6 +2,8 @@ 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/cookieMiddleware.js";
|
|
6
|
+
export * from "./schema/headerBinding.js";
|
|
5
7
|
export * from "./rpc/GGHttpRouteRPC.js";
|
|
6
8
|
export * from "./rpc/RpcRequest/GGRpcRequestBuilder.js";
|
|
7
9
|
export * from "./rpc/RpcResponse/GGRpcResponseParser.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,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AAEtD,SAAS;AACT,cAAc,oCAAoC,CAAC;AAEnD,aAAa;AACb,OAAO,oCAAoC,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,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AAEtD,SAAS;AACT,cAAc,oCAAoC,CAAC;AAEnD,aAAa;AACb,OAAO,oCAAoC,CAAC"}
|
package/dist/src/index-node.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export * from "./server/GG_HTTP_REQUEST";
|
|
|
4
4
|
export * from "./server/GG_PERMISSIONS";
|
|
5
5
|
export * from "./schema/GGHttpSchema";
|
|
6
6
|
export * from "./schema/httpSchema";
|
|
7
|
+
export * from "./schema/cookieMiddleware";
|
|
8
|
+
export * from "./schema/headerBinding";
|
|
7
9
|
export * from "./rpc/GGHttpRouteRPC";
|
|
8
10
|
export * from "./rpc/openApiSuccessResponse";
|
|
9
11
|
export * from "./rpc/openApiHelpers";
|
|
@@ -15,6 +17,7 @@ export * from "./server/GGHttp";
|
|
|
15
17
|
export * from "./server/GGHttp";
|
|
16
18
|
export * from "./server/GGHttpServer";
|
|
17
19
|
export * from "./server/GG_HTTP_SERVER";
|
|
20
|
+
export * from "./server/applyResponseMiddleware";
|
|
18
21
|
export * from "./client/GGHttpSchema.createClient";
|
|
19
22
|
export * from "./server/GGHttpSchema.startServer";
|
|
20
23
|
import "./client/GGHttpSchema.createClient";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-node.d.ts","sourceRoot":"","sources":["../../src/index-node.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAWvB,cAAc,wBAAwB,CAAC;AAGvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,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;
|
|
1
|
+
{"version":3,"file":"index-node.d.ts","sourceRoot":"","sources":["../../src/index-node.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAWvB,cAAc,wBAAwB,CAAC;AAGvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,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;AAGjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAIlD,OAAO,oCAAoC,CAAC;AAC5C,OAAO,mCAAmC,CAAC"}
|
package/dist/src/index-node.js
CHANGED
|
@@ -15,6 +15,8 @@ export * from "./server/GG_PERMISSIONS.js";
|
|
|
15
15
|
// API Schema
|
|
16
16
|
export * from "./schema/GGHttpSchema.js";
|
|
17
17
|
export * from "./schema/httpSchema.js";
|
|
18
|
+
export * from "./schema/cookieMiddleware.js";
|
|
19
|
+
export * from "./schema/headerBinding.js";
|
|
18
20
|
export * from "./rpc/GGHttpRouteRPC.js";
|
|
19
21
|
export * from "./rpc/openApiSuccessResponse.js";
|
|
20
22
|
export * from "./rpc/openApiHelpers.js";
|
|
@@ -27,6 +29,7 @@ export * from "./server/GGHttp.js";
|
|
|
27
29
|
export * from "./server/GGHttp.js";
|
|
28
30
|
export * from "./server/GGHttpServer.js";
|
|
29
31
|
export * from "./server/GG_HTTP_SERVER.js";
|
|
32
|
+
export * from "./server/applyResponseMiddleware.js";
|
|
30
33
|
// Client
|
|
31
34
|
export * from "./client/GGHttpSchema.createClient.js";
|
|
32
35
|
export * from "./server/GGHttpSchema.startServer.js";
|
|
@@ -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;AACvE,8BAA8B,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACtD,YAAY,EAAE,IAAI,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,YAAY;IACvE,YAAY,EAAE,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC,YAAY;CAC9D,CAAC,CAAC,CAAC;AAEJ,UAAU;AACV,cAAc,wBAAwB,CAAC;AAEvC,UAAU;AACV,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AAExC,aAAa;AACb,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,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;
|
|
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;AACvE,8BAA8B,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACtD,YAAY,EAAE,IAAI,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,YAAY;IACvE,YAAY,EAAE,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC,YAAY;CAC9D,CAAC,CAAC,CAAC;AAEJ,UAAU;AACV,cAAc,wBAAwB,CAAC;AAEvC,UAAU;AACV,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AAExC,aAAa;AACb,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,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;AAEjD,SAAS;AACT,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAGlD,aAAa;AACb,OAAO,oCAAoC,CAAC;AAC5C,OAAO,mCAAmC,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { HttpMethod } from "@grest-ts/common";
|
|
2
2
|
import { ClientHttpRouteToRpcTransformClientCodec, ClientHttpRouteToRpcTransformClientConfig, ClientHttpRouteToRpcTransformServerCodec, ClientHttpRouteToRpcTransformServerConfig, GGHttpCodec, GGHttpCodecOpenApiConfig } from "../schema/GGHttpSchema";
|
|
3
|
+
import type { GGContextKey } from "@grest-ts/context";
|
|
3
4
|
import type { OpenAPIV3_1 } from "openapi-types";
|
|
4
5
|
import { GGSchema } from "@grest-ts/schema";
|
|
5
6
|
export type GGRpcServerCodecFactory = (method: HttpMethod, path: string, config: ClientHttpRouteToRpcTransformServerConfig) => ClientHttpRouteToRpcTransformServerCodec;
|
|
@@ -23,7 +24,10 @@ declare class GGHttpRpcCodec implements GGHttpCodec {
|
|
|
23
24
|
readonly path: string;
|
|
24
25
|
readonly deprecated: boolean | undefined;
|
|
25
26
|
readonly responseHeaders: Record<string, GGSchema<string | undefined>>;
|
|
27
|
+
readonly updatesCookies: GGContextKey<string | undefined>[];
|
|
26
28
|
constructor(method: HttpMethod, path: string, deprecated?: boolean);
|
|
29
|
+
/** Permit this route to set/clear the given cookie context key(s). Reading needs no declaration. */
|
|
30
|
+
updatesCookie(...keys: GGContextKey<string | undefined>[]): this;
|
|
27
31
|
createForClient(config: ClientHttpRouteToRpcTransformClientConfig): ClientHttpRouteToRpcTransformClientCodec;
|
|
28
32
|
createForServer(config: ClientHttpRouteToRpcTransformServerConfig): ClientHttpRouteToRpcTransformServerCodec;
|
|
29
33
|
toOpenApiOperation(config: GGHttpCodecOpenApiConfig): Partial<OpenAPIV3_1.OperationObject>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGHttpRouteRPC.d.ts","sourceRoot":"","sources":["../../../src/rpc/GGHttpRouteRPC.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAC,wCAAwC,EAAE,yCAAyC,EAAE,wCAAwC,EAAE,yCAAyC,EAAE,WAAW,EAAE,wBAAwB,EAAC,MAAM,wBAAwB,CAAA;AAGtP,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAI1C,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,yCAAyC,KAAK,wCAAwC,CAAC;AAIxK,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAErF;AAED,eAAO,MAAM,KAAK;gBACC,MAAM,SAAS;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAC;mBACrC,MAAM,SAAS;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAC;iBACrC,MAAM,SAAS;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAC;gBACrC,MAAM,SAAS;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAC;CACvD,CAAA;AAED,cAAM,cAAe,YAAW,WAAW;IAEvC,SAAgB,MAAM,EAAE,UAAU,CAAA;IAClC,SAAgB,IAAI,EAAE,MAAM,CAAA;IAC5B,SAAgB,UAAU,EAAE,OAAO,GAAG,SAAS,CAAA;IAC/C,SAAgB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAK;
|
|
1
|
+
{"version":3,"file":"GGHttpRouteRPC.d.ts","sourceRoot":"","sources":["../../../src/rpc/GGHttpRouteRPC.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAC,wCAAwC,EAAE,yCAAyC,EAAE,wCAAwC,EAAE,yCAAyC,EAAE,WAAW,EAAE,wBAAwB,EAAC,MAAM,wBAAwB,CAAA;AAGtP,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAI1C,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,yCAAyC,KAAK,wCAAwC,CAAC;AAIxK,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAErF;AAED,eAAO,MAAM,KAAK;gBACC,MAAM,SAAS;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAC;mBACrC,MAAM,SAAS;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAC;iBACrC,MAAM,SAAS;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAC;gBACrC,MAAM,SAAS;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAC;CACvD,CAAA;AAED,cAAM,cAAe,YAAW,WAAW;IAEvC,SAAgB,MAAM,EAAE,UAAU,CAAA;IAClC,SAAgB,IAAI,EAAE,MAAM,CAAA;IAC5B,SAAgB,UAAU,EAAE,OAAO,GAAG,SAAS,CAAA;IAC/C,SAAgB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAK;IAClF,SAAgB,cAAc,EAAE,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAK;gBAE3D,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO;IAMlE,oGAAoG;IAC7F,aAAa,CAAC,GAAG,IAAI,EAAE,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,IAAI;IAKhE,eAAe,CAAC,MAAM,EAAE,yCAAyC,GAAG,wCAAwC;IAO5G,eAAe,CAAC,MAAM,EAAE,yCAAyC,GAAG,wCAAwC;IAK5G,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC;CAoBpG"}
|
|
@@ -17,11 +17,17 @@ class GGHttpRpcCodec {
|
|
|
17
17
|
path;
|
|
18
18
|
deprecated;
|
|
19
19
|
responseHeaders = {};
|
|
20
|
+
updatesCookies = [];
|
|
20
21
|
constructor(method, path, deprecated) {
|
|
21
22
|
this.method = method;
|
|
22
23
|
this.path = path;
|
|
23
24
|
this.deprecated = deprecated;
|
|
24
25
|
}
|
|
26
|
+
/** Permit this route to set/clear the given cookie context key(s). Reading needs no declaration. */
|
|
27
|
+
updatesCookie(...keys) {
|
|
28
|
+
this.updatesCookies.push(...keys);
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
25
31
|
createForClient(config) {
|
|
26
32
|
return {
|
|
27
33
|
createRequest: new GGRpcRequestBuilder(this.method, this.path, config).createRequest,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGHttpRouteRPC.js","sourceRoot":"","sources":["../../../src/rpc/GGHttpRouteRPC.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAC,mBAAmB,EAAC,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"GGHttpRouteRPC.js","sourceRoot":"","sources":["../../../src/rpc/GGHttpRouteRPC.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +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 apiMiddlewares;
|
|
6
7
|
constructor(config: ClientHttpRouteToRpcTransformServerConfig);
|
|
7
8
|
sendResponse: (res: http.ServerResponse, rpcResult: ERROR<string, unknown> | OK<unknown>) => Promise<void>;
|
|
8
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;AAChI,OAAO,EAAC,yCAAyC,
|
|
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;AAChI,OAAO,EAAC,yCAAyC,EAA4B,MAAM,2BAA2B,CAAC;AAI/G,qBAAa,oBAAoB;IAE7B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAA;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsC;gBAEzD,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"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { ERROR, GGContractExecutor } from "@grest-ts/schema";
|
|
2
|
+
import { applyResponseMiddleware } from "../../server/applyResponseMiddleware.js";
|
|
2
3
|
export class GGRpcResponseBuilder {
|
|
3
4
|
contract;
|
|
5
|
+
apiMiddlewares;
|
|
4
6
|
constructor(config) {
|
|
5
7
|
this.contract = config.contract;
|
|
8
|
+
this.apiMiddlewares = config.apiMiddlewares;
|
|
6
9
|
}
|
|
7
10
|
sendResponse = async (res, rpcResult) => {
|
|
8
11
|
let json;
|
|
@@ -19,6 +22,7 @@ export class GGRpcResponseBuilder {
|
|
|
19
22
|
json = this.makeError(GGContractExecutor.getResponseSchema(this.contract, rpcResult), rpcResult);
|
|
20
23
|
statusCode = rpcResult.statusCode;
|
|
21
24
|
}
|
|
25
|
+
applyResponseMiddleware(res, this.apiMiddlewares);
|
|
22
26
|
res.writeHead(statusCode, {
|
|
23
27
|
'Content-Type': 'application/json',
|
|
24
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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"}
|
|
@@ -2,6 +2,7 @@ import { ERROR, ERROR_JSON, GGContractApiDefinition, GGContractClass, GGContract
|
|
|
2
2
|
import type { HttpMethod } from "@grest-ts/common";
|
|
3
3
|
import type http from "http";
|
|
4
4
|
import type { GGHttpServerMiddleware } from "../server/GGHttpSchema.startServer";
|
|
5
|
+
import type { GGContextKey } from "@grest-ts/context";
|
|
5
6
|
import type { OpenAPIV3_1 } from "openapi-types";
|
|
6
7
|
export declare class GGHttpSchema<TContract extends GGContractApiDefinition, TContext> {
|
|
7
8
|
readonly name: string;
|
|
@@ -73,6 +74,12 @@ export interface GGHttpCodec {
|
|
|
73
74
|
* Use {} if the codec sets no custom response headers.
|
|
74
75
|
*/
|
|
75
76
|
readonly responseHeaders: Record<string, GGSchema<string | undefined>>;
|
|
77
|
+
/**
|
|
78
|
+
* Cookie context keys this route is permitted to modify (set/clear), declared via
|
|
79
|
+
* GGRpc.*(...).updatesCookie(key). A handler that changes a cookie its route did not
|
|
80
|
+
* declare is a SERVER_ERROR. Reading a cookie needs no declaration.
|
|
81
|
+
*/
|
|
82
|
+
readonly updatesCookies?: readonly GGContextKey<string | undefined>[];
|
|
76
83
|
createForClient(config: ClientHttpRouteToRpcTransformClientConfig): ClientHttpRouteToRpcTransformClientCodec;
|
|
77
84
|
createForServer(config: ClientHttpRouteToRpcTransformServerConfig): ClientHttpRouteToRpcTransformServerCodec;
|
|
78
85
|
/**
|
|
@@ -106,6 +113,12 @@ export interface GGHttpTransportMiddleware {
|
|
|
106
113
|
* Use {} if the middleware sets no custom response headers.
|
|
107
114
|
*/
|
|
108
115
|
readonly responseHeaders: Record<string, GGSchema<string | undefined>>;
|
|
116
|
+
/**
|
|
117
|
+
* Cookies this middleware reads, mapped to their value schemas. Emitted as `in: cookie`
|
|
118
|
+
* parameters in OpenAPI so cookie-bound inputs are documented. Absent for header/plain
|
|
119
|
+
* middlewares.
|
|
120
|
+
*/
|
|
121
|
+
readonly cookieParams?: Record<string, GGSchema<string | undefined>>;
|
|
109
122
|
/**
|
|
110
123
|
* Client-side: modify outgoing request (add headers, etc.)
|
|
111
124
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGHttpSchema.d.ts","sourceRoot":"","sources":["../../../src/schema/GGHttpSchema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GGHttpSchema.d.ts","sourceRoot":"","sources":["../../../src/schema/GGHttpSchema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GGHttpSchema.js","sourceRoot":"","sources":["../../../src/schema/GGHttpSchema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GGHttpSchema.js","sourceRoot":"","sources":["../../../src/schema/GGHttpSchema.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,YAAY;IAEL,IAAI,CAAQ;IACZ,UAAU,CAAQ;IAClB,cAAc,CAAsC;IACpD,KAAK,CAAsC;IAC3C,QAAQ,GAAsC,IAAI,CAAA;IAElE,YACI,UAAkB,EAClB,QAAoC,EACpC,SAA+C,EAC/C,cAAoD,EAAE;QAEtD,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;QACzB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,cAAc,GAAG,WAAW,CAAA;QACjC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAA;QACtB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACzB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;CACJ"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { GGContextKey } from "@grest-ts/context";
|
|
2
|
+
import { type GGSchema } from "@grest-ts/schema";
|
|
3
|
+
import type { GGHttpTransportMiddleware } from "./GGHttpSchema";
|
|
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
|
+
/**
|
|
11
|
+
* Cookie write rules — passed to setCookie(key, value, options). They live at the write
|
|
12
|
+
* call site (the handler that mints the cookie), never in the shared API.
|
|
13
|
+
*/
|
|
14
|
+
export interface CookieOptions {
|
|
15
|
+
httpOnly?: boolean;
|
|
16
|
+
secure?: boolean;
|
|
17
|
+
sameSite?: "lax" | "strict" | "none";
|
|
18
|
+
path?: string;
|
|
19
|
+
domain?: string;
|
|
20
|
+
maxAgeSec?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Read a single named cookie out of a raw `Cookie` header value. Shared by the HTTP
|
|
24
|
+
* binding (parseRequest) and the WebSocket binding (parseHandshake). A malformed
|
|
25
|
+
* percent-encoding (e.g. "sid=%") must not crash — fall back to the raw value.
|
|
26
|
+
*/
|
|
27
|
+
export declare function readCookie(rawCookieHeader: string | undefined, name: string): string | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Local structural copy of GGWebSocketHandshakeContext (defined in @grest-ts/websocket).
|
|
30
|
+
* http must not import websocket; cookie()'s WS half is typed against this shape and
|
|
31
|
+
* matches GGWebSocketMiddleware structurally at the webSocketSchema.use() call site.
|
|
32
|
+
* `upgradeHeaders` is the real browser upgrade request (carries httpOnly cookies); the
|
|
33
|
+
* in-band `headers` map cannot spoof it.
|
|
34
|
+
*/
|
|
35
|
+
interface WsHandshakeContextLike {
|
|
36
|
+
headers: Record<string, string>;
|
|
37
|
+
upgradeHeaders?: Record<string, string>;
|
|
38
|
+
queryArgs: Record<string, string>;
|
|
39
|
+
}
|
|
40
|
+
export interface GGCookieBinding extends GGHttpTransportMiddleware {
|
|
41
|
+
/** The cookie this binding reads, mapped to its value schema — emitted as an `in: cookie` doc param. */
|
|
42
|
+
readonly cookieParams: Record<string, GGSchema<string | undefined>>;
|
|
43
|
+
parseHandshake(ctx: WsHandshakeContextLike): void;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Bind a context key to a cookie, read-only on the wire. Reads ONLY the named cookie —
|
|
47
|
+
* never a header — from the incoming HTTP Cookie (parseRequest) or the real WS upgrade
|
|
48
|
+
* Cookie (parseHandshake), into key.get(). The cookie's wire name defaults to the key's
|
|
49
|
+
* name. To write the cookie, call setCookie(key, …) from a route that declared
|
|
50
|
+
* .updatesCookie(key); the matching binding flushes it as Set-Cookie (HTTP only — a
|
|
51
|
+
* WebSocket has no response to set a cookie on).
|
|
52
|
+
*/
|
|
53
|
+
export declare function cookie(key: GGContextKey<string | undefined>, opts?: {
|
|
54
|
+
name?: string;
|
|
55
|
+
schema?: GGSchema<string | undefined>;
|
|
56
|
+
}): GGCookieBinding;
|
|
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
|
+
export declare function setCookie(key: GGContextKey<string | undefined>, value: string | undefined, options?: CookieOptions): void;
|
|
64
|
+
/**
|
|
65
|
+
* Clear the cookie — schedules a Set-Cookie with Max-Age=0. Pass path/domain to match a
|
|
66
|
+
* scoped cookie (deletion only works when path+domain match what was set). Equivalent to
|
|
67
|
+
* setCookie(key, undefined, options), but reads clearer at logout-style call sites.
|
|
68
|
+
*/
|
|
69
|
+
export declare function clearCookie(key: GGContextKey<string | undefined>, options?: CookieOptions): void;
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=cookieMiddleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookieMiddleware.d.ts","sourceRoot":"","sources":["../../../src/schema/cookieMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAgC,KAAK,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAC7E,OAAO,KAAK,EAAgC,yBAAyB,EAAC,MAAM,gBAAgB,CAAA;AAE5F;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,2BAA4F,CAAA;AAEzH;;;GAGG;AACH,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;AAsBD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAehG;AAYD;;;;;;GAMG;AACH,UAAU,sBAAsB;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,eAAgB,SAAQ,yBAAyB;IAC9D,wGAAwG;IACxG,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IACnE,cAAc,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI,CAAA;CACpD;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,IAAI,CAAC,EAAE;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CAAC,GAAG,eAAe,CA0B5I;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAiBzH;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAEhG"}
|