@heojeongbo/wirestage 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +1 -1
  2. package/dist/features/rest/index.d.ts +1 -1
  3. package/dist/features/rest/index.d.ts.map +1 -1
  4. package/dist/features/rest/lib/calls.d.ts +7 -1
  5. package/dist/features/rest/lib/calls.d.ts.map +1 -1
  6. package/dist/features/rest/lib/calls.js +11 -0
  7. package/dist/features/rest/lib/calls.js.map +1 -1
  8. package/dist/features/rest/lib/create-rest.d.ts.map +1 -1
  9. package/dist/features/rest/lib/create-rest.js +22 -8
  10. package/dist/features/rest/lib/create-rest.js.map +1 -1
  11. package/dist/features/rest/lib/serve.d.ts +21 -0
  12. package/dist/features/rest/lib/serve.d.ts.map +1 -0
  13. package/dist/features/rest/lib/serve.js +223 -0
  14. package/dist/features/rest/lib/serve.js.map +1 -0
  15. package/dist/features/rest/model/types.d.ts +37 -1
  16. package/dist/features/rest/model/types.d.ts.map +1 -1
  17. package/dist/shared/api/http-server/index.d.ts +2 -0
  18. package/dist/shared/api/http-server/index.d.ts.map +1 -1
  19. package/dist/shared/api/http-server/index.js +1 -0
  20. package/dist/shared/api/http-server/index.js.map +1 -1
  21. package/dist/shared/api/http-server/serve.d.ts +29 -0
  22. package/dist/shared/api/http-server/serve.d.ts.map +1 -0
  23. package/dist/shared/api/http-server/serve.js +54 -0
  24. package/dist/shared/api/http-server/serve.js.map +1 -0
  25. package/package.json +1 -1
  26. package/src/features/rest/index.ts +2 -0
  27. package/src/features/rest/lib/calls.ts +27 -1
  28. package/src/features/rest/lib/create-rest.ts +28 -12
  29. package/src/features/rest/lib/serve.ts +338 -0
  30. package/src/features/rest/model/types.ts +40 -1
  31. package/src/shared/api/http-server/index.ts +6 -0
  32. package/src/shared/api/http-server/serve.ts +112 -0
package/README.md CHANGED
@@ -62,7 +62,7 @@ ones you use.
62
62
 
63
63
  | Subpath | Plugin | Fakes | Records | Faults | Extra peers |
64
64
  | --- | --- | --- | --- | --- | --- |
65
- | `/rest` | `rest()` | routes with `:params`, `json`/`text`/`bytes` replies | requests and real responses | abort, delay, status | — |
65
+ | `/rest` | `rest()` | routes with `:params`, `json`/`text`/`bytes` replies; servers for clients outside the browser | requests and real responses | abort, delay, status | — |
66
66
  | `/connect` | `connect()` | Connect, gRPC-web: unary, server streams, whole services | decoded messages and status | fail, abort, hold, cut | `@connectrpc/connect`, `@connectrpc/connect-node`, `@bufbuild/protobuf` |
67
67
  | `/sse` | `sse()` | event streams driven from the test | events sent | end, cut | — |
68
68
  | `/websocket` | `websocket()` | a fake server, or a proxy in front of the real one | both directions | drop, close | — |
@@ -1,5 +1,5 @@
1
1
  export { rest } from "./lib/create-rest.js";
2
2
  export type { ReplyInit } from "./lib/reply.js";
3
3
  export { abort, bytes, delay, empty, json, passthrough, text, } from "./lib/reply.js";
4
- export type { RestApi, RestCall, RestMethod, RestOptions, RestPath, RestReply, RestRequest, RestResolver, RestRoute, RestRouteOptions, } from "./model/types.js";
4
+ export type { RestApi, RestCall, RestMethod, RestOptions, RestPath, RestReply, RestRequest, RestResolver, RestRoute, RestRouteOptions, RestServeOptions, RestServer, } from "./model/types.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/rest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,WAAW,EACX,IAAI,GACJ,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACX,OAAO,EACP,QAAQ,EACR,UAAU,EACV,WAAW,EACX,QAAQ,EACR,SAAS,EACT,WAAW,EACX,YAAY,EACZ,SAAS,EACT,gBAAgB,GAChB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/rest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,WAAW,EACX,IAAI,GACJ,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACX,OAAO,EACP,QAAQ,EACR,UAAU,EACV,WAAW,EACX,QAAQ,EACR,SAAS,EACT,WAAW,EACX,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,GACV,MAAM,kBAAkB,CAAC"}
@@ -1,5 +1,11 @@
1
1
  import type { Frame } from "../../../entities/frame/index.js";
2
- import type { RestCall } from "../model/types.js";
2
+ import type { RestCall, RestPath } from "../model/types.js";
3
+ export interface CallFilter {
4
+ readonly method?: string;
5
+ readonly path?: RestPath;
6
+ }
7
+ /** The calls of `frames` a `calls()` filter asks for. */
8
+ export declare function filterCalls(frames: readonly Frame[], filter: CallFilter, baseURL: string | undefined): RestCall[];
3
9
  /**
4
10
  * Pair each recorded request with how it ended. One call per exchange,
5
11
  * oldest first; a frame with no correlation is an exchange of its own.
@@ -1 +1 @@
1
- {"version":3,"file":"calls.d.ts","sourceRoot":"","sources":["../../../../src/features/rest/lib/calls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,QAAQ,EAAE,CAuBlE"}
1
+ {"version":3,"file":"calls.d.ts","sourceRoot":"","sources":["../../../../src/features/rest/lib/calls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG5D,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;CACzB;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAC1B,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,GAAG,SAAS,GACzB,QAAQ,EAAE,CASZ;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,QAAQ,EAAE,CA2BlE"}
@@ -1,3 +1,11 @@
1
+ import { compilePath } from "./path.js";
2
+ /** The calls of `frames` a `calls()` filter asks for. */
3
+ export function filterCalls(frames, filter, baseURL) {
4
+ const matcher = filter.path === undefined ? undefined : compilePath(filter.path, baseURL);
5
+ const wanted = filter.method?.toUpperCase();
6
+ return assembleCalls(frames).filter((call) => (wanted === undefined || wanted === call.method) &&
7
+ (matcher === undefined || matcher.match(new URL(call.url)) !== undefined));
8
+ }
1
9
  /**
2
10
  * Pair each recorded request with how it ended. One call per exchange,
3
11
  * oldest first; a frame with no correlation is an exchange of its own.
@@ -25,6 +33,9 @@ export function assembleCalls(frames) {
25
33
  request,
26
34
  response: end?.kind === "response" ? end : undefined,
27
35
  status: typeof status === "number" ? status : undefined,
36
+ server: typeof request.meta["server"] === "string"
37
+ ? request.meta["server"]
38
+ : undefined,
28
39
  });
29
40
  }
30
41
  return calls;
@@ -1 +1 @@
1
- {"version":3,"file":"calls.js","sourceRoot":"","sources":["../../../../src/features/rest/lib/calls.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAwB;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4C,CAAC;IACnE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;;YAC/C,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC;QACtD,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;QACpC,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC;YACV,WAAW;YACX,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO;YACP,QAAQ,EAAE,GAAG,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;YACpD,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SACvD,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"calls.js","sourceRoot":"","sources":["../../../../src/features/rest/lib/calls.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAOxC,yDAAyD;AACzD,MAAM,UAAU,WAAW,CAC1B,MAAwB,EACxB,MAAkB,EAClB,OAA2B;IAE3B,MAAM,OAAO,GACZ,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IAC5C,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CAClC,CAAC,IAAI,EAAE,EAAE,CACR,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;QAChD,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,CAC1E,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAwB;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4C,CAAC;IACnE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;;YAC/C,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC;QACtD,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;QACpC,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC;YACV,WAAW;YACX,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO;YACP,QAAQ,EAAE,GAAG,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;YACpD,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACvD,MAAM,EACL,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ;gBACzC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACxB,CAAC,CAAC,SAAS;SACb,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-rest.d.ts","sourceRoot":"","sources":["../../../../src/features/rest/lib/create-rest.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,UAAU,EACf,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EACX,OAAO,EAEP,WAAW,EAGX,MAAM,mBAAmB,CAAC;AAI3B;;;GAGG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAmJ3E"}
1
+ {"version":3,"file":"create-rest.d.ts","sourceRoot":"","sources":["../../../../src/features/rest/lib/create-rest.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,UAAU,EACf,MAAM,mCAAmC,CAAC;AAG3C,OAAO,KAAK,EACX,OAAO,EAEP,WAAW,EAIX,MAAM,mBAAmB,CAAC;AAK3B;;;GAGG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAgK3E"}
@@ -1,7 +1,9 @@
1
1
  import { definePlugin, } from "../../../entities/plugin/index.js";
2
2
  import { createArrivals } from "../../../shared/lib/async/index.js";
3
- import { assembleCalls } from "./calls.js";
3
+ import { createSequence } from "../../../shared/lib/id/index.js";
4
+ import { filterCalls } from "./calls.js";
4
5
  import { compilePath } from "./path.js";
6
+ import { serveRest } from "./serve.js";
5
7
  /**
6
8
  * REST and other plain HTTP: routes by method and path with `:params`, replies
7
9
  * built from small helpers, faults, and recording of the real responses.
@@ -14,6 +16,9 @@ export function rest(options = {}) {
14
16
  const { name } = context;
15
17
  /** The record rule being added, once: every context gets it. */
16
18
  let recording;
19
+ const servers = new Set();
20
+ // Under the plugin's own name: two instances never share an id.
21
+ const servedCorrelation = createSequence(`${name}-`);
17
22
  const toOutcome = async (reply) => {
18
23
  switch (reply.kind) {
19
24
  case "response":
@@ -98,17 +103,26 @@ export function rest(options = {}) {
98
103
  delete: verb("DELETE"),
99
104
  async calls(filter = {}) {
100
105
  await context.sync();
101
- const matcher = filter.path === undefined
102
- ? undefined
103
- : compilePath(filter.path, options.baseURL);
104
- const wanted = filter.method?.toUpperCase();
105
- return assembleCalls(context.timeline.frames({ protocol: name })).filter((call) => (wanted === undefined || wanted === call.method) &&
106
- (matcher === undefined ||
107
- matcher.match(new URL(call.url)) !== undefined));
106
+ return filterCalls(context.timeline.frames({ protocol: name }), filter, options.baseURL);
107
+ },
108
+ async serve(serveOptions = {}) {
109
+ const server = await serveRest({
110
+ protocol: name,
111
+ timeline: context.timeline,
112
+ clock: context.clock,
113
+ log: context.log,
114
+ correlation: servedCorrelation,
115
+ onClose: (closed) => servers.delete(closed),
116
+ }, serveOptions);
117
+ servers.add(server);
118
+ return server;
108
119
  },
109
120
  };
110
121
  return {
111
122
  api,
123
+ async dispose() {
124
+ await Promise.all([...servers].map((server) => server.close()));
125
+ },
112
126
  async attach() {
113
127
  if (options.record === undefined || options.record === false)
114
128
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"create-rest.js","sourceRoot":"","sources":["../../../../src/features/rest/lib/create-rest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-rest.js","sourceRoot":"","sources":["../../../../src/features/rest/lib/create-rest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Timeline } from "../../../entities/frame/index.js";
2
+ import type { Clock } from "../../../shared/lib/clock/index.js";
3
+ import type { ScopedLogger } from "../../../shared/lib/logger/index.js";
4
+ import type { RestServeOptions, RestServer } from "../model/types.js";
5
+ export interface ServeDeps {
6
+ /** The protocol the server's frames are recorded under. */
7
+ readonly protocol: string;
8
+ readonly timeline: Timeline;
9
+ readonly clock: Clock;
10
+ readonly log: ScopedLogger;
11
+ readonly correlation: () => string;
12
+ /** Told when the server closes, so the plugin can forget it. */
13
+ readonly onClose: (server: RestServer) => void;
14
+ }
15
+ /**
16
+ * A served fake: routes, newest first, as the browser's are; every exchange
17
+ * on the timeline, the client's request as `network` and the answer as
18
+ * `server`.
19
+ */
20
+ export declare function serveRest(deps: ServeDeps, options: RestServeOptions): Promise<RestServer>;
21
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../../src/features/rest/lib/serve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAU5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,KAAK,EAMX,gBAAgB,EAChB,UAAU,EACV,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,SAAS;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC;IACnC,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CAC/C;AA0CD;;;;GAIG;AACH,wBAAsB,SAAS,CAC9B,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,gBAAgB,GACvB,OAAO,CAAC,UAAU,CAAC,CA6PrB"}
@@ -0,0 +1,223 @@
1
+ import { serveHttp, } from "../../../shared/api/http-server/index.js";
2
+ import { createArrivals, } from "../../../shared/lib/async/index.js";
3
+ import { WirestageError } from "../../../shared/lib/errors/index.js";
4
+ import { filterCalls } from "./calls.js";
5
+ import { compilePath } from "./path.js";
6
+ const TEXT = { "content-type": "text/plain; charset=utf-8" };
7
+ const failureOf = (error) => error instanceof Error ? error.message : String(error);
8
+ /** A served request as a route sees it, with that route's params. */
9
+ function restRequest(request, correlation, params) {
10
+ const text = () => new TextDecoder().decode(request.body);
11
+ return {
12
+ correlation,
13
+ method: request.method,
14
+ url: request.url,
15
+ headers: request.headers,
16
+ page: undefined,
17
+ context: "",
18
+ resourceType: "other",
19
+ body: () => request.body,
20
+ text,
21
+ json: () => JSON.parse(text()),
22
+ params,
23
+ query: request.url.searchParams,
24
+ };
25
+ }
26
+ /**
27
+ * A served fake: routes, newest first, as the browser's are; every exchange
28
+ * on the timeline, the client's request as `network` and the answer as
29
+ * `server`.
30
+ */
31
+ export async function serveRest(deps, options) {
32
+ const name = options.name ?? `${deps.protocol} server`;
33
+ /** Routes, oldest first. */
34
+ const routes = [];
35
+ let url = "";
36
+ const record = (init, path) => deps.timeline.append({
37
+ protocol: deps.protocol,
38
+ endpoint: path,
39
+ ...init,
40
+ meta: { ...init.meta, server: url },
41
+ });
42
+ const retire = (route) => {
43
+ if (!route.active)
44
+ return;
45
+ route.active = false;
46
+ routes.splice(routes.indexOf(route), 1);
47
+ };
48
+ /** Carry a reply out; `undefined` when it passes the request on. */
49
+ const answer = async (reply, response, path, correlation) => {
50
+ switch (reply.kind) {
51
+ case "response": {
52
+ const body = reply.body ?? "";
53
+ // Recorded before it is sent: a client that reads its answer and
54
+ // asks for `calls()` at once must find it there.
55
+ record({
56
+ kind: "response",
57
+ direction: "in",
58
+ source: "server",
59
+ data: body,
60
+ meta: { status: reply.status, headers: reply.headers },
61
+ correlation,
62
+ }, path);
63
+ await response.send(reply.status, reply.headers, body);
64
+ return "answered";
65
+ }
66
+ case "passthrough":
67
+ return undefined;
68
+ case "abort":
69
+ record({
70
+ kind: "fault",
71
+ direction: "none",
72
+ source: "server",
73
+ meta: { reason: "abort", error: reply.error },
74
+ correlation,
75
+ }, path);
76
+ response.reset();
77
+ return "answered";
78
+ case "delay":
79
+ await deps.clock.sleep(reply.ms);
80
+ return answer(reply.reply, response, path, correlation);
81
+ }
82
+ };
83
+ /** A route's bug: logged, on the timeline, and the client gets a 500 saying so. */
84
+ const fail = async (route, error, response, path, correlation) => {
85
+ deps.log.error("rule failed", { rule: route.label, server: name }, error);
86
+ record({
87
+ kind: "fault",
88
+ direction: "none",
89
+ source: "server",
90
+ meta: {
91
+ reason: "rule-error",
92
+ rule: route.label,
93
+ error: failureOf(error),
94
+ },
95
+ correlation,
96
+ }, path);
97
+ await response.send(500, TEXT, `wirestage: rule "${route.label}" failed: ${failureOf(error)}`);
98
+ };
99
+ const handle = async (request, response) => {
100
+ const correlation = deps.correlation();
101
+ const path = request.url.pathname;
102
+ record({
103
+ kind: "request",
104
+ direction: "out",
105
+ source: "network",
106
+ data: request.body,
107
+ meta: {
108
+ method: request.method,
109
+ url: request.url.href,
110
+ headers: request.headers,
111
+ },
112
+ correlation,
113
+ }, path);
114
+ // The chain as it stands now: a route added while this one waits on a
115
+ // resolver takes the next request, not this one.
116
+ for (const route of [...routes].reverse()) {
117
+ if (!route.active)
118
+ continue;
119
+ if (route.method !== undefined && route.method !== request.method)
120
+ continue;
121
+ const params = route.matcher.match(request.url);
122
+ if (params === undefined)
123
+ continue;
124
+ const view = restRequest(request, correlation, params);
125
+ try {
126
+ if (route.match !== undefined && !route.match(view))
127
+ continue;
128
+ // Claimed before the resolver runs, which may wait: two requests
129
+ // at once cannot both take a route's last turn.
130
+ route.hits += 1;
131
+ if (route.remaining !== undefined && --route.remaining === 0)
132
+ retire(route);
133
+ route.requests.push(view);
134
+ const reply = typeof route.resolver === "function"
135
+ ? await route.resolver(view)
136
+ : route.resolver;
137
+ if ((await answer(reply, response, path, correlation)) !== undefined)
138
+ return;
139
+ }
140
+ catch (error) {
141
+ await fail(route, error, response, path, correlation);
142
+ return;
143
+ }
144
+ }
145
+ record({
146
+ kind: "response",
147
+ direction: "in",
148
+ source: "server",
149
+ data: "",
150
+ meta: { status: 404, headers: TEXT, unmatched: true },
151
+ correlation,
152
+ }, path);
153
+ await response.send(404, TEXT, `wirestage: ${name} has no route for ${request.method} ${path}`);
154
+ };
155
+ const listening = await serveHttp({
156
+ name,
157
+ ...(options.host === undefined ? {} : { host: options.host }),
158
+ ...(options.port === undefined ? {} : { port: options.port }),
159
+ }, handle);
160
+ url = listening.url;
161
+ const on = async (method, path, resolver, routeOptions = {}) => {
162
+ if (routeOptions.times !== undefined &&
163
+ (!Number.isInteger(routeOptions.times) || routeOptions.times < 1))
164
+ throw new WirestageError("INVALID_ARGUMENT", `route "${method} ${String(path)}": times must be a positive integer, got ${routeOptions.times}`);
165
+ const label = `${method} ${String(path)}`;
166
+ const route = {
167
+ label,
168
+ method: method === "*" ? undefined : method,
169
+ matcher: compilePath(path, options.baseURL),
170
+ resolver,
171
+ match: routeOptions.match,
172
+ requests: createArrivals({
173
+ clock: deps.clock,
174
+ label: `${label} request to ${name}`,
175
+ }),
176
+ remaining: routeOptions.times,
177
+ hits: 0,
178
+ active: true,
179
+ };
180
+ routes.push(route);
181
+ return {
182
+ get hits() {
183
+ return route.hits;
184
+ },
185
+ get requests() {
186
+ return route.requests.items;
187
+ },
188
+ next: (waitOptions) => route.requests.next(waitOptions),
189
+ async remove() {
190
+ retire(route);
191
+ },
192
+ };
193
+ };
194
+ const verb = (method) => (path, resolver, routeOptions) => on(method, path, resolver, routeOptions);
195
+ let closing;
196
+ const server = {
197
+ url,
198
+ port: listening.port,
199
+ on,
200
+ get: verb("GET"),
201
+ post: verb("POST"),
202
+ put: verb("PUT"),
203
+ patch: verb("PATCH"),
204
+ delete: verb("DELETE"),
205
+ async calls(filter = {}) {
206
+ return filterCalls(deps.timeline.frames({
207
+ protocol: deps.protocol,
208
+ where: (frame) => frame.meta["server"] === url,
209
+ }), filter, options.baseURL);
210
+ },
211
+ close() {
212
+ closing ??= (async () => {
213
+ for (const route of [...routes])
214
+ retire(route);
215
+ deps.onClose(server);
216
+ await listening.close();
217
+ })();
218
+ return closing;
219
+ },
220
+ };
221
+ return server;
222
+ }
223
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../../src/features/rest/lib/serve.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,11 @@ export interface RestOptions {
12
12
  */
13
13
  readonly record?: boolean | UrlMatcher;
14
14
  }
15
+ /**
16
+ * A request a route is deciding about. For a request a served fake received
17
+ * (`serve()`), `page` is undefined, `context` is empty and `resourceType` is
18
+ * `other`.
19
+ */
15
20
  export interface RestRequest extends HttpRequestView {
16
21
  /** `:name` segments of the matched path. */
17
22
  readonly params: Readonly<Record<string, string>>;
@@ -56,6 +61,35 @@ export interface RestCall {
56
61
  readonly response: Frame | undefined;
57
62
  /** The HTTP status; undefined for an aborted or unfinished request. */
58
63
  readonly status: number | undefined;
64
+ /** The served fake that received it (its URL); undefined for a page's. */
65
+ readonly server: string | undefined;
66
+ }
67
+ export interface RestServeOptions {
68
+ /** 0, the default, picks a free port. A fixed port that is taken fails, naming the server. */
69
+ readonly port?: number;
70
+ /** Default 127.0.0.1. */
71
+ readonly host?: string;
72
+ /** Names the server in errors, 404s and logs. Default `<plugin> server`. */
73
+ readonly name?: string;
74
+ /** A path prefix the server's routes are relative to. */
75
+ readonly baseURL?: string;
76
+ }
77
+ /**
78
+ * A fake HTTP backend for clients outside the browser — a service under
79
+ * test, an agent — routed and recorded like the page's own requests. A route
80
+ * that passes a request through hands it to the next older route; with none
81
+ * left, the server answers 404.
82
+ */
83
+ export interface RestServer extends Pick<RestApi, "on" | "get" | "post" | "put" | "patch" | "delete"> {
84
+ readonly url: string;
85
+ readonly port: number;
86
+ /** This server's calls, oldest first. */
87
+ calls(filter?: {
88
+ readonly method?: string;
89
+ readonly path?: RestPath;
90
+ }): Promise<RestCall[]>;
91
+ /** Stop accepting and drop open connections. The stage closes it too. */
92
+ close(): Promise<void>;
59
93
  }
60
94
  export type RestPath = string | RegExp;
61
95
  export interface RestApi {
@@ -65,10 +99,12 @@ export interface RestApi {
65
99
  put(path: RestPath, resolver: RestResolver, options?: RestRouteOptions): Promise<RestRoute>;
66
100
  patch(path: RestPath, resolver: RestResolver, options?: RestRouteOptions): Promise<RestRoute>;
67
101
  delete(path: RestPath, resolver: RestResolver, options?: RestRouteOptions): Promise<RestRoute>;
68
- /** Recorded REST exchanges, oldest first. */
102
+ /** Recorded REST exchanges, oldest first: the pages' and served fakes'. */
69
103
  calls(filter?: {
70
104
  readonly method?: string;
71
105
  readonly path?: RestPath;
72
106
  }): Promise<RestCall[]>;
107
+ /** Serve routes on a port of their own, for clients outside the browser. */
108
+ serve(options?: RestServeOptions): Promise<RestServer>;
73
109
  }
74
110
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/features/rest/model/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/features/rest/model/types.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
1
  export type { Listening, ListenOptions } from "./listen.js";
2
2
  export { listen } from "./listen.js";
3
+ export type { RequestHandler, ServedRequest, ServedResponse, } from "./serve.js";
4
+ export { serveHttp } from "./serve.js";
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared/api/http-server/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared/api/http-server/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EACX,cAAc,EACd,aAAa,EACb,cAAc,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export { listen } from "./listen.js";
2
+ export { serveHttp } from "./serve.js";
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared/api/http-server/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared/api/http-server/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAMrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type Listening, type ListenOptions } from "./listen.js";
2
+ /** A request a served fake received, read in full before it is handed on. */
3
+ export interface ServedRequest {
4
+ readonly method: string;
5
+ /** Absolute: the server's origin, then the path and query the client sent. */
6
+ readonly url: URL;
7
+ /** Lower-cased names; a repeated header's values joined with `, `. */
8
+ readonly headers: Readonly<Record<string, string>>;
9
+ readonly body: Uint8Array;
10
+ }
11
+ /** The answer to a {@link ServedRequest}: one of the two, once. */
12
+ export interface ServedResponse {
13
+ /**
14
+ * Send a complete response. A header may carry several values separated
15
+ * by a newline (`set-cookie`). Resolves once it is written.
16
+ */
17
+ send(status: number, headers: Readonly<Record<string, string>>, body: Uint8Array | string): Promise<void>;
18
+ /** Drop the connection: no status, no body — a network failure. */
19
+ reset(): void;
20
+ }
21
+ export type RequestHandler = (request: ServedRequest, response: ServedResponse) => void | Promise<void>;
22
+ /**
23
+ * An HTTP/1.1 server for clients outside the browser, handing each request,
24
+ * body read, to `handle`. The handler is the caller's to make safe; one that
25
+ * throws anyway gets a 500 rather than a client left waiting, and closing the
26
+ * server drops open connections at once (`listen`).
27
+ */
28
+ export declare function serveHttp(options: Omit<ListenOptions, "protocol">, handle: RequestHandler): Promise<Listening>;
29
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../../src/shared/api/http-server/serve.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAU,MAAM,aAAa,CAAC;AAEzE,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC1B;AAED,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC9B;;;OAGG;IACH,IAAI,CACH,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACzC,IAAI,EAAE,UAAU,GAAG,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,mEAAmE;IACnE,KAAK,IAAI,IAAI,CAAC;CACd;AAED,MAAM,MAAM,cAAc,GAAG,CAC5B,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,cAAc,KACpB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAsC1B;;;;;GAKG;AACH,wBAAsB,SAAS,CAC9B,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EACxC,MAAM,EAAE,cAAc,GACpB,OAAO,CAAC,SAAS,CAAC,CA4BpB"}
@@ -0,0 +1,54 @@
1
+ import { createServer, } from "node:http";
2
+ import { listen } from "./listen.js";
3
+ const headersOf = (message) => Object.fromEntries(Object.entries(message.headersDistinct).map(([name, values]) => [name, values.join(", ")]));
4
+ const readBody = (message) => new Promise((resolve, reject) => {
5
+ const chunks = [];
6
+ message.on("data", (chunk) => chunks.push(chunk));
7
+ message.once("end", () => resolve(new Uint8Array(Buffer.concat(chunks))));
8
+ message.once("error", reject);
9
+ });
10
+ function responderOf(response) {
11
+ return {
12
+ send(status, headers, body) {
13
+ for (const [name, value] of Object.entries(headers))
14
+ response.setHeader(name, value.includes("\n") ? value.split("\n") : value);
15
+ response.statusCode = status;
16
+ return new Promise((resolve) => {
17
+ // `close` too: a client that went away never sees `finish`.
18
+ response.once("close", () => resolve());
19
+ response.end(body);
20
+ });
21
+ },
22
+ reset() {
23
+ response.destroy();
24
+ },
25
+ };
26
+ }
27
+ /**
28
+ * An HTTP/1.1 server for clients outside the browser, handing each request,
29
+ * body read, to `handle`. The handler is the caller's to make safe; one that
30
+ * throws anyway gets a 500 rather than a client left waiting, and closing the
31
+ * server drops open connections at once (`listen`).
32
+ */
33
+ export async function serveHttp(options, handle) {
34
+ const server = createServer((message, response) => {
35
+ const responder = responderOf(response);
36
+ readBody(message)
37
+ .then((body) => handle({
38
+ // Always set on a request an http.Server received.
39
+ method: message.method,
40
+ url: new URL(message.url, listening.url),
41
+ headers: headersOf(message),
42
+ body,
43
+ }, responder))
44
+ .catch((error) => {
45
+ if (response.headersSent)
46
+ response.destroy();
47
+ else
48
+ void responder.send(500, { "content-type": "text/plain; charset=utf-8" }, `wirestage: ${options.name} failed: ${error instanceof Error ? error.message : String(error)}`);
49
+ });
50
+ });
51
+ const listening = await listen(server, { ...options, protocol: "http" });
52
+ return listening;
53
+ }
54
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../../src/shared/api/http-server/serve.ts"],"names":[],"mappings":"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"}