@client-compose/client 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +13 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -5
- package/dist/index.js.map +1 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +8 -2
- package/dist/proxy.js.map +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +7 -2
- package/dist/testing.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +49 -10
- package/src/proxy.ts +23 -8
- package/src/testing.ts +35 -10
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { type ActionDescriptor, type ActionRequest, type ActionResponse, type Capabilities, type ClientContext, type DeclaredError, type IslandDescriptor, type IslandEntry, type ScreenRequest, type ScreenResponse } from "@client-compose/protocol";
|
|
2
|
-
type OkEntry<P =
|
|
2
|
+
type OkEntry<P = unknown> = IslandEntry<P> & {
|
|
3
3
|
status: "ok";
|
|
4
4
|
};
|
|
5
5
|
type ErrorEntry = IslandEntry & {
|
|
6
6
|
status: "error";
|
|
7
7
|
};
|
|
8
|
-
export type IslandRenderer<R, P =
|
|
8
|
+
export type IslandRenderer<R, P = unknown> = (props: P, entry: OkEntry<P>) => R;
|
|
9
9
|
export declare class IslandRegistry<R> {
|
|
10
10
|
private renderers;
|
|
11
11
|
/** Register a renderer for a generated island descriptor: `register(ProfileHeaderV2, (props) => …)`. */
|
|
@@ -50,8 +50,18 @@ export declare class ActionFetchError extends Error {
|
|
|
50
50
|
/** A fresh idempotency key: one per user intent, reused when retrying it (spec §5.2). */
|
|
51
51
|
export declare function newIdempotencyKey(): string;
|
|
52
52
|
export declare function buildActionRequest<I>(action: ActionDescriptor<I, unknown, DeclaredError>, input: I, client: ClientContext, idempotencyKey?: string): ActionRequest<I>;
|
|
53
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* POST an action request. Resolves with the outcome the composer sent (ok or an error); throws
|
|
55
|
+
* ActionFetchError for a non-2xx response or a body that isn't an outcome. Check the outcome against
|
|
56
|
+
* the action with `checkActionResponse` (callAction does).
|
|
57
|
+
*/
|
|
54
58
|
export declare function fetchAction(baseUrl: string, request: ActionRequest, init?: RequestInit, fetchImpl?: typeof fetch): Promise<ActionResponse>;
|
|
59
|
+
/**
|
|
60
|
+
* The response, if it's a result or one of this action's own declared errors. Anything else throws
|
|
61
|
+
* ActionFetchError (status 200, with the code if there is one): an outcome the client can't read,
|
|
62
|
+
* or a code the action doesn't declare, such as one added after this app was built (spec §5.1).
|
|
63
|
+
*/
|
|
64
|
+
export declare function checkActionResponse<I, R, E extends DeclaredError>(action: ActionDescriptor<I, R, E>, response: unknown): ActionResponse<R, E>;
|
|
55
65
|
export interface CallActionOptions {
|
|
56
66
|
client: ClientContext;
|
|
57
67
|
/** Default: a new key. Pass the same key again to retry the same user intent. */
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -9,11 +9,15 @@ export class IslandRegistry {
|
|
|
9
9
|
: [islandOrType.type, islandOrType.version, versionOrRender];
|
|
10
10
|
if (!this.renderers.has(type))
|
|
11
11
|
this.renderers.set(type, new Map());
|
|
12
|
+
// The registry hands each renderer the props of its own island type and version.
|
|
12
13
|
this.renderers.get(type).set(version, render);
|
|
13
14
|
return this;
|
|
14
15
|
}
|
|
15
16
|
capabilities() {
|
|
16
|
-
return Object.fromEntries([...this.renderers].map(([type, versions]) => [
|
|
17
|
+
return Object.fromEntries([...this.renderers].map(([type, versions]) => [
|
|
18
|
+
type,
|
|
19
|
+
[...versions.keys()].sort((a, b) => a - b),
|
|
20
|
+
]));
|
|
17
21
|
}
|
|
18
22
|
get(type, version) {
|
|
19
23
|
return this.renderers.get(type)?.get(version);
|
|
@@ -115,7 +119,11 @@ export function buildActionRequest(action, input, client, idempotencyKey) {
|
|
|
115
119
|
...(idempotencyKey !== undefined && { idempotencyKey }),
|
|
116
120
|
};
|
|
117
121
|
}
|
|
118
|
-
/**
|
|
122
|
+
/**
|
|
123
|
+
* POST an action request. Resolves with the outcome the composer sent (ok or an error); throws
|
|
124
|
+
* ActionFetchError for a non-2xx response or a body that isn't an outcome. Check the outcome against
|
|
125
|
+
* the action with `checkActionResponse` (callAction does).
|
|
126
|
+
*/
|
|
119
127
|
export async function fetchAction(baseUrl, request, init = {}, fetchImpl = fetch) {
|
|
120
128
|
const res = await fetchImpl(`${baseUrl}/actions/${encodeURIComponent(request.action)}`, {
|
|
121
129
|
...init,
|
|
@@ -123,9 +131,29 @@ export async function fetchAction(baseUrl, request, init = {}, fetchImpl = fetch
|
|
|
123
131
|
headers: { "content-type": "application/json", ...init.headers },
|
|
124
132
|
body: JSON.stringify(request),
|
|
125
133
|
});
|
|
134
|
+
const text = await res.text();
|
|
126
135
|
if (!res.ok)
|
|
127
|
-
throw new ActionFetchError(res.status,
|
|
128
|
-
|
|
136
|
+
throw new ActionFetchError(res.status, text);
|
|
137
|
+
try {
|
|
138
|
+
return JSON.parse(text);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
throw new ActionFetchError(res.status, text);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* The response, if it's a result or one of this action's own declared errors. Anything else throws
|
|
146
|
+
* ActionFetchError (status 200, with the code if there is one): an outcome the client can't read,
|
|
147
|
+
* or a code the action doesn't declare, such as one added after this app was built (spec §5.1).
|
|
148
|
+
*/
|
|
149
|
+
export function checkActionResponse(action, response) {
|
|
150
|
+
const r = response;
|
|
151
|
+
const declared = r?.status === "error" &&
|
|
152
|
+
typeof r.error?.code === "string" &&
|
|
153
|
+
action.errors.includes(r.error.code);
|
|
154
|
+
if (r?.status === "ok" || declared)
|
|
155
|
+
return response;
|
|
156
|
+
throw new ActionFetchError(200, JSON.stringify(response));
|
|
129
157
|
}
|
|
130
158
|
/**
|
|
131
159
|
* Perform an action with its generated descriptor:
|
|
@@ -137,6 +165,6 @@ export async function fetchAction(baseUrl, request, init = {}, fetchImpl = fetch
|
|
|
137
165
|
*/
|
|
138
166
|
export async function callAction(baseUrl, action, input, options) {
|
|
139
167
|
const request = buildActionRequest(action, input, options.client, options.idempotencyKey ?? newIdempotencyKey());
|
|
140
|
-
return (await fetchAction(baseUrl, request, options.init, options.fetch));
|
|
168
|
+
return checkActionResponse(action, await fetchAction(baseUrl, request, options.init, options.fetch));
|
|
141
169
|
}
|
|
142
170
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kFAAkF;AAElF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAeA,OAAO,
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,cAAc,EAEnB,KAAK,aAAa,EAElB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAIlC,6EAA6E;AAC7E,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACjE,8EAA8E;AAC9E,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AAEjE,sEAAsE;AACtE,MAAM,MAAM,WAAW,CAAC,CAAC,IACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,MAAM,WAAW,oBAAoB;IACnC,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,MAAM,EAAE,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACrD,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzE,qEAAqE;IACrE,WAAW,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,mEAAmE;IACnE,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CACjB,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,cAAc,KACrB,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,aAAa;IAC5B,iGAAiG;IACjG,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC;IACnE,8FAA8F;IAC9F,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC;CACjE;AAkBD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAQpF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CASpF;AASD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAsChF"}
|
package/dist/proxy.js
CHANGED
|
@@ -54,7 +54,10 @@ export function createComposerProxy(options) {
|
|
|
54
54
|
const request = { ...body, client: await options.client() };
|
|
55
55
|
try {
|
|
56
56
|
const response = await fetchAction(options.baseUrl, request, await init(), options.fetch);
|
|
57
|
-
return {
|
|
57
|
+
return {
|
|
58
|
+
ok: true,
|
|
59
|
+
response: (await options.onActionResponse?.(request, response)) ?? response,
|
|
60
|
+
};
|
|
58
61
|
}
|
|
59
62
|
catch (error) {
|
|
60
63
|
if (error instanceof ActionFetchError)
|
|
@@ -67,7 +70,10 @@ export function createComposerProxy(options) {
|
|
|
67
70
|
return BAD_REQUEST;
|
|
68
71
|
const request = { ...body, client: await options.client() };
|
|
69
72
|
try {
|
|
70
|
-
return {
|
|
73
|
+
return {
|
|
74
|
+
ok: true,
|
|
75
|
+
response: await fetchScreen(options.baseUrl, request, await init(), options.fetch),
|
|
76
|
+
};
|
|
71
77
|
}
|
|
72
78
|
catch (error) {
|
|
73
79
|
if (error instanceof ScreenFetchError)
|
package/dist/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,oGAAoG;AACpG,+FAA+F;AAC/F,EAAE;AACF,0CAA0C;AAC1C,+BAA+B;AAC/B,0FAA0F;AAC1F,uFAAuF;AACvF,UAAU;AACV,+FAA+F;AAC/F,EAAE;AACF,mGAAmG;AACnG,kGAAkG;AAClG,WAAW;AAEX,OAAO,
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/testing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAYA,OAAO,
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
|
package/dist/testing.js
CHANGED
|
@@ -25,7 +25,9 @@ function capabilities(value) {
|
|
|
25
25
|
]));
|
|
26
26
|
}
|
|
27
27
|
function clientContext(value) {
|
|
28
|
-
if (!isRecord(value) ||
|
|
28
|
+
if (!isRecord(value) ||
|
|
29
|
+
typeof value.platform !== "string" ||
|
|
30
|
+
typeof value.appVersion !== "string")
|
|
29
31
|
return undefined;
|
|
30
32
|
return { ...value, platform: value.platform, appVersion: value.appVersion };
|
|
31
33
|
}
|
|
@@ -137,7 +139,10 @@ export function islandError(key, descriptor, error) {
|
|
|
137
139
|
}
|
|
138
140
|
/** A screen response. */
|
|
139
141
|
export function screen(id, islands, meta) {
|
|
140
|
-
return {
|
|
142
|
+
return {
|
|
143
|
+
status: 200,
|
|
144
|
+
body: { protocol: PROTOCOL_VERSION, screen: id, islands, ...(meta && { meta }) },
|
|
145
|
+
};
|
|
141
146
|
}
|
|
142
147
|
/** A screen request that fails, e.g. `screenError(404, "not_found")` or `screenError(401, "unauthenticated")`. */
|
|
143
148
|
export function screenError(status, code) {
|
package/dist/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,8FAA8F;AAC9F,yFAAyF;AACzF,EAAE;AACF,0CAA0C;AAC1C,6GAA6G;AAC7G,6EAA6E;AAC7E,UAAU;AACV,2FAA2F;AAC3F,EAAE;AACF,0FAA0F;AAE1F,OAAO,
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@client-compose/client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Framework-agnostic Client Compose client: island registry, screen requests and render planning.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"client-compose",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"@client-compose/protocol": "0.3.0"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@client-compose/conformance": "0.
|
|
50
|
+
"@client-compose/conformance": "0.6.0"
|
|
51
51
|
},
|
|
52
52
|
"publishConfig": {
|
|
53
53
|
"access": "public"
|
package/src/index.ts
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
// `R` is whatever your UI layer renders: a React element, a DOM node, a string...
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
|
-
PROTOCOL_VERSION,
|
|
6
5
|
type ActionDescriptor,
|
|
7
6
|
type ActionRequest,
|
|
8
7
|
type ActionResponse,
|
|
@@ -11,14 +10,15 @@ import {
|
|
|
11
10
|
type DeclaredError,
|
|
12
11
|
type IslandDescriptor,
|
|
13
12
|
type IslandEntry,
|
|
13
|
+
PROTOCOL_VERSION,
|
|
14
14
|
type ScreenRequest,
|
|
15
15
|
type ScreenResponse,
|
|
16
16
|
} from "@client-compose/protocol";
|
|
17
17
|
|
|
18
|
-
type OkEntry<P =
|
|
18
|
+
type OkEntry<P = unknown> = IslandEntry<P> & { status: "ok" };
|
|
19
19
|
type ErrorEntry = IslandEntry & { status: "error" };
|
|
20
20
|
|
|
21
|
-
export type IslandRenderer<R, P =
|
|
21
|
+
export type IslandRenderer<R, P = unknown> = (props: P, entry: OkEntry<P>) => R;
|
|
22
22
|
|
|
23
23
|
export class IslandRegistry<R> {
|
|
24
24
|
private renderers = new Map<string, Map<number, IslandRenderer<R>>>();
|
|
@@ -36,13 +36,17 @@ export class IslandRegistry<R> {
|
|
|
36
36
|
? [islandOrType, versionOrRender as number, maybeRender!]
|
|
37
37
|
: [islandOrType.type, islandOrType.version, versionOrRender as IslandRenderer<R, P>];
|
|
38
38
|
if (!this.renderers.has(type)) this.renderers.set(type, new Map());
|
|
39
|
-
|
|
39
|
+
// The registry hands each renderer the props of its own island type and version.
|
|
40
|
+
this.renderers.get(type)!.set(version, render as IslandRenderer<R>);
|
|
40
41
|
return this;
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
capabilities(): Capabilities {
|
|
44
45
|
return Object.fromEntries(
|
|
45
|
-
[...this.renderers].map(([type, versions]) => [
|
|
46
|
+
[...this.renderers].map(([type, versions]) => [
|
|
47
|
+
type,
|
|
48
|
+
[...versions.keys()].sort((a, b) => a - b),
|
|
49
|
+
]),
|
|
46
50
|
);
|
|
47
51
|
}
|
|
48
52
|
|
|
@@ -187,7 +191,11 @@ export function buildActionRequest<I>(
|
|
|
187
191
|
};
|
|
188
192
|
}
|
|
189
193
|
|
|
190
|
-
/**
|
|
194
|
+
/**
|
|
195
|
+
* POST an action request. Resolves with the outcome the composer sent (ok or an error); throws
|
|
196
|
+
* ActionFetchError for a non-2xx response or a body that isn't an outcome. Check the outcome against
|
|
197
|
+
* the action with `checkActionResponse` (callAction does).
|
|
198
|
+
*/
|
|
191
199
|
export async function fetchAction(
|
|
192
200
|
baseUrl: string,
|
|
193
201
|
request: ActionRequest,
|
|
@@ -200,8 +208,31 @@ export async function fetchAction(
|
|
|
200
208
|
headers: { "content-type": "application/json", ...init.headers },
|
|
201
209
|
body: JSON.stringify(request),
|
|
202
210
|
});
|
|
203
|
-
|
|
204
|
-
|
|
211
|
+
const text = await res.text();
|
|
212
|
+
if (!res.ok) throw new ActionFetchError(res.status, text);
|
|
213
|
+
try {
|
|
214
|
+
return JSON.parse(text) as ActionResponse;
|
|
215
|
+
} catch {
|
|
216
|
+
throw new ActionFetchError(res.status, text);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* The response, if it's a result or one of this action's own declared errors. Anything else throws
|
|
222
|
+
* ActionFetchError (status 200, with the code if there is one): an outcome the client can't read,
|
|
223
|
+
* or a code the action doesn't declare, such as one added after this app was built (spec §5.1).
|
|
224
|
+
*/
|
|
225
|
+
export function checkActionResponse<I, R, E extends DeclaredError>(
|
|
226
|
+
action: ActionDescriptor<I, R, E>,
|
|
227
|
+
response: unknown,
|
|
228
|
+
): ActionResponse<R, E> {
|
|
229
|
+
const r = response as { status?: unknown; error?: { code?: unknown } } | null;
|
|
230
|
+
const declared =
|
|
231
|
+
r?.status === "error" &&
|
|
232
|
+
typeof r.error?.code === "string" &&
|
|
233
|
+
action.errors.includes(r.error.code);
|
|
234
|
+
if (r?.status === "ok" || declared) return response as ActionResponse<R, E>;
|
|
235
|
+
throw new ActionFetchError(200, JSON.stringify(response));
|
|
205
236
|
}
|
|
206
237
|
|
|
207
238
|
export interface CallActionOptions {
|
|
@@ -226,6 +257,14 @@ export async function callAction<I, R, E extends DeclaredError>(
|
|
|
226
257
|
input: I,
|
|
227
258
|
options: CallActionOptions,
|
|
228
259
|
): Promise<ActionResponse<R, E>> {
|
|
229
|
-
const request = buildActionRequest(
|
|
230
|
-
|
|
260
|
+
const request = buildActionRequest(
|
|
261
|
+
action,
|
|
262
|
+
input,
|
|
263
|
+
options.client,
|
|
264
|
+
options.idempotencyKey ?? newIdempotencyKey(),
|
|
265
|
+
);
|
|
266
|
+
return checkActionResponse(
|
|
267
|
+
action,
|
|
268
|
+
await fetchAction(baseUrl, request, options.init, options.fetch),
|
|
269
|
+
);
|
|
231
270
|
}
|
package/src/proxy.ts
CHANGED
|
@@ -14,14 +14,15 @@
|
|
|
14
14
|
// browser.
|
|
15
15
|
|
|
16
16
|
import {
|
|
17
|
-
PROTOCOL_VERSION,
|
|
18
17
|
type ActionRequest,
|
|
19
18
|
type ActionResponse,
|
|
20
19
|
type Capabilities,
|
|
21
20
|
type ClientContext,
|
|
21
|
+
PROTOCOL_VERSION,
|
|
22
22
|
type ScreenRequest,
|
|
23
23
|
type ScreenResponse,
|
|
24
24
|
} from "@client-compose/protocol";
|
|
25
|
+
|
|
25
26
|
import { ActionFetchError, fetchAction, fetchScreen, ScreenFetchError } from "./index.ts";
|
|
26
27
|
|
|
27
28
|
/** A screen request from the browser: the server sets the client context. */
|
|
@@ -30,7 +31,8 @@ export type ProxiedScreenRequest = Omit<ScreenRequest, "client">;
|
|
|
30
31
|
export type ProxiedActionRequest = Omit<ActionRequest, "client">;
|
|
31
32
|
|
|
32
33
|
/** The composer's response, or the status and body it failed with. */
|
|
33
|
-
export type ProxyResult<T> =
|
|
34
|
+
export type ProxyResult<T> =
|
|
35
|
+
{ ok: true; response: T } | { ok: false; status: number; body: string };
|
|
34
36
|
|
|
35
37
|
export interface ComposerProxyOptions {
|
|
36
38
|
/** Composer base URL. */
|
|
@@ -47,7 +49,10 @@ export interface ComposerProxyOptions {
|
|
|
47
49
|
* Sees each action's response (ok or a declared error) before the browser does, and returns
|
|
48
50
|
* what the browser gets: e.g. keep a new session in a cookie, and take its token out.
|
|
49
51
|
*/
|
|
50
|
-
onActionResponse?: (
|
|
52
|
+
onActionResponse?: (
|
|
53
|
+
request: ActionRequest,
|
|
54
|
+
response: ActionResponse,
|
|
55
|
+
) => ActionResponse | Promise<ActionResponse>;
|
|
51
56
|
}
|
|
52
57
|
|
|
53
58
|
export interface ComposerProxy {
|
|
@@ -63,7 +68,9 @@ const isRecord = (value: unknown): value is Record<string, unknown> =>
|
|
|
63
68
|
function isCapabilities(value: unknown): value is Capabilities {
|
|
64
69
|
return (
|
|
65
70
|
isRecord(value) &&
|
|
66
|
-
Object.values(value).every(
|
|
71
|
+
Object.values(value).every(
|
|
72
|
+
(versions) => Array.isArray(versions) && versions.every((v) => typeof v === "number"),
|
|
73
|
+
)
|
|
67
74
|
);
|
|
68
75
|
}
|
|
69
76
|
|
|
@@ -110,9 +117,13 @@ export function createComposerProxy(options: ComposerProxyOptions): ComposerProx
|
|
|
110
117
|
const request: ActionRequest = { ...body, client: await options.client() };
|
|
111
118
|
try {
|
|
112
119
|
const response = await fetchAction(options.baseUrl, request, await init(), options.fetch);
|
|
113
|
-
return {
|
|
120
|
+
return {
|
|
121
|
+
ok: true,
|
|
122
|
+
response: (await options.onActionResponse?.(request, response)) ?? response,
|
|
123
|
+
};
|
|
114
124
|
} catch (error) {
|
|
115
|
-
if (error instanceof ActionFetchError)
|
|
125
|
+
if (error instanceof ActionFetchError)
|
|
126
|
+
return { ok: false, status: error.status, body: error.body };
|
|
116
127
|
throw error;
|
|
117
128
|
}
|
|
118
129
|
}
|
|
@@ -121,9 +132,13 @@ export function createComposerProxy(options: ComposerProxyOptions): ComposerProx
|
|
|
121
132
|
if (!isProxiedScreenRequest(body)) return BAD_REQUEST;
|
|
122
133
|
const request: ScreenRequest = { ...body, client: await options.client() };
|
|
123
134
|
try {
|
|
124
|
-
return {
|
|
135
|
+
return {
|
|
136
|
+
ok: true,
|
|
137
|
+
response: await fetchScreen(options.baseUrl, request, await init(), options.fetch),
|
|
138
|
+
};
|
|
125
139
|
} catch (error) {
|
|
126
|
-
if (error instanceof ScreenFetchError)
|
|
140
|
+
if (error instanceof ScreenFetchError)
|
|
141
|
+
return { ok: false, status: error.status, body: error.body };
|
|
127
142
|
throw error;
|
|
128
143
|
}
|
|
129
144
|
}
|
package/src/testing.ts
CHANGED
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
// For code that uses the global fetch itself, `installFakeGateway` puts one in its place.
|
|
12
12
|
|
|
13
13
|
import {
|
|
14
|
-
PROTOCOL_VERSION,
|
|
15
14
|
type ActionDescriptor,
|
|
16
15
|
type ActionEffects,
|
|
17
16
|
type Capabilities,
|
|
@@ -20,6 +19,7 @@ import {
|
|
|
20
19
|
type IslandDescriptor,
|
|
21
20
|
type IslandEntry,
|
|
22
21
|
type IslandError,
|
|
22
|
+
PROTOCOL_VERSION,
|
|
23
23
|
type ScreenMeta,
|
|
24
24
|
} from "@client-compose/protocol";
|
|
25
25
|
|
|
@@ -77,7 +77,9 @@ const isRecord = (value: unknown): value is Record<string, unknown> =>
|
|
|
77
77
|
|
|
78
78
|
function strings(value: unknown): Record<string, string> {
|
|
79
79
|
if (!isRecord(value)) return {};
|
|
80
|
-
return Object.fromEntries(
|
|
80
|
+
return Object.fromEntries(
|
|
81
|
+
Object.entries(value).filter((e): e is [string, string] => typeof e[1] === "string"),
|
|
82
|
+
);
|
|
81
83
|
}
|
|
82
84
|
|
|
83
85
|
function capabilities(value: unknown): Capabilities {
|
|
@@ -91,7 +93,12 @@ function capabilities(value: unknown): Capabilities {
|
|
|
91
93
|
}
|
|
92
94
|
|
|
93
95
|
function clientContext(value: unknown): ClientContext | undefined {
|
|
94
|
-
if (
|
|
96
|
+
if (
|
|
97
|
+
!isRecord(value) ||
|
|
98
|
+
typeof value.platform !== "string" ||
|
|
99
|
+
typeof value.appVersion !== "string"
|
|
100
|
+
)
|
|
101
|
+
return undefined;
|
|
95
102
|
return { ...value, platform: value.platform, appVersion: value.appVersion } as ClientContext;
|
|
96
103
|
}
|
|
97
104
|
|
|
@@ -117,7 +124,8 @@ function headersOf(init: HeadersInit | undefined): Record<string, string> {
|
|
|
117
124
|
|
|
118
125
|
function asScreenRequest(request: RecordedRequest): RecordedScreenRequest | undefined {
|
|
119
126
|
const { body } = request;
|
|
120
|
-
if (!request.url.includes("/screens/") || !isRecord(body) || typeof body.screen !== "string")
|
|
127
|
+
if (!request.url.includes("/screens/") || !isRecord(body) || typeof body.screen !== "string")
|
|
128
|
+
return undefined;
|
|
121
129
|
return {
|
|
122
130
|
...request,
|
|
123
131
|
screen: body.screen,
|
|
@@ -129,7 +137,8 @@ function asScreenRequest(request: RecordedRequest): RecordedScreenRequest | unde
|
|
|
129
137
|
|
|
130
138
|
function asActionRequest(request: RecordedRequest): RecordedActionRequest | undefined {
|
|
131
139
|
const { body } = request;
|
|
132
|
-
if (!request.url.includes("/actions/") || !isRecord(body) || typeof body.action !== "string")
|
|
140
|
+
if (!request.url.includes("/actions/") || !isRecord(body) || typeof body.action !== "string")
|
|
141
|
+
return undefined;
|
|
133
142
|
return {
|
|
134
143
|
...request,
|
|
135
144
|
action: body.action,
|
|
@@ -167,7 +176,9 @@ export function createFakeGateway(handlers: FakeGatewayHandlers = {}): FakeGatew
|
|
|
167
176
|
const actionRequest = asActionRequest(request);
|
|
168
177
|
const actionHandler = actionRequest && handlers.actions?.[actionRequest.action];
|
|
169
178
|
if (actionRequest && actionHandler) return respond(actionHandler(actionRequest));
|
|
170
|
-
throw new Error(
|
|
179
|
+
throw new Error(
|
|
180
|
+
`fake gateway: no handler for ${request.method} ${request.url} ${JSON.stringify(request.body)}`,
|
|
181
|
+
);
|
|
171
182
|
}
|
|
172
183
|
return {
|
|
173
184
|
fetch: fakeFetch,
|
|
@@ -206,13 +217,24 @@ export function island<P>(key: string, descriptor: IslandDescriptor<P>, props: P
|
|
|
206
217
|
}
|
|
207
218
|
|
|
208
219
|
/** An island that failed on the composer (spec §3.4). */
|
|
209
|
-
export function islandError(
|
|
220
|
+
export function islandError(
|
|
221
|
+
key: string,
|
|
222
|
+
descriptor: IslandDescriptor<unknown>,
|
|
223
|
+
error: IslandError,
|
|
224
|
+
): IslandEntry {
|
|
210
225
|
return { key, type: descriptor.type, version: descriptor.version, status: "error", error };
|
|
211
226
|
}
|
|
212
227
|
|
|
213
228
|
/** A screen response. */
|
|
214
|
-
export function screen(
|
|
215
|
-
|
|
229
|
+
export function screen(
|
|
230
|
+
id: string,
|
|
231
|
+
islands: IslandEntry<unknown>[],
|
|
232
|
+
meta?: ScreenMeta,
|
|
233
|
+
): FakeResponse {
|
|
234
|
+
return {
|
|
235
|
+
status: 200,
|
|
236
|
+
body: { protocol: PROTOCOL_VERSION, screen: id, islands, ...(meta && { meta }) },
|
|
237
|
+
};
|
|
216
238
|
}
|
|
217
239
|
|
|
218
240
|
/** A screen request that fails, e.g. `screenError(404, "not_found")` or `screenError(401, "unauthenticated")`. */
|
|
@@ -231,7 +253,10 @@ export function actionOk<I, R, E extends DeclaredError>(
|
|
|
231
253
|
}
|
|
232
254
|
|
|
233
255
|
/** An action that ended with one of its declared errors. */
|
|
234
|
-
export function actionError<I, R, E extends DeclaredError>(
|
|
256
|
+
export function actionError<I, R, E extends DeclaredError>(
|
|
257
|
+
action: ActionDescriptor<I, R, E>,
|
|
258
|
+
error: E,
|
|
259
|
+
): FakeResponse {
|
|
235
260
|
const base = { protocol: PROTOCOL_VERSION, action: action.action, version: action.version };
|
|
236
261
|
return { status: 200, body: { ...base, status: "error", error } };
|
|
237
262
|
}
|