@archipelago-js/client 0.2.0 → 0.10.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/README.md +163 -5
- package/dist/fetch.d.ts +6 -0
- package/dist/fetch.js +87 -29
- package/dist/fetch.js.map +1 -1
- package/package.json +4 -5
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @archipelago-js/client
|
|
2
2
|
|
|
3
|
-
Core client
|
|
3
|
+
Core client library for [Archipelago](https://github.com/Catchhook/archipelago-rails) — the low-level fetch, response parsing, and error handling used by `@archipelago-js/react` and available standalone.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
@@ -8,8 +8,166 @@ Core client utilities for Archipelago islands.
|
|
|
8
8
|
yarn add @archipelago-js/client
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Quick Start
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
```ts
|
|
14
|
+
import { islandFetch } from "@archipelago-js/client"
|
|
15
|
+
|
|
16
|
+
const response = await islandFetch("TeamMembers", "add_member", {
|
|
17
|
+
team_id: 42,
|
|
18
|
+
email: "new@example.com"
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
if (response.status === "ok") {
|
|
22
|
+
console.log("Updated props:", response.props)
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## `islandFetch(component, operation, payload?, options?)`
|
|
27
|
+
|
|
28
|
+
Sends a POST to the Archipelago Rails endpoint and returns a typed `IslandResponse`.
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
const response = await islandFetch("TeamMembers", "add_member", payload, {
|
|
32
|
+
endpoint: "/islands", // default
|
|
33
|
+
fixedParams: { team_id: 42 }, // merged under payload
|
|
34
|
+
overridePayload: {}, // merged over payload
|
|
35
|
+
headers: {}, // extra request headers
|
|
36
|
+
signal: abortController.signal,
|
|
37
|
+
stream: "TeamMembers:42", // sent as X-Archipelago-Stream header
|
|
38
|
+
navigate: (url) => { ... }, // called on redirect responses (default: Turbo.visit or location.assign)
|
|
39
|
+
fetchImpl: fetch, // swap fetch for testing
|
|
40
|
+
onUploadProgress: (progress) => {
|
|
41
|
+
// progress.percentage (0-100), progress.loaded, progress.total
|
|
42
|
+
// automatically switches to XHR transport when provided
|
|
43
|
+
}
|
|
44
|
+
})
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Response Types
|
|
48
|
+
|
|
49
|
+
Every response is a discriminated union on `status`:
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
type IslandResponse =
|
|
53
|
+
| { status: "ok"; props: Record<string, unknown>; version: number }
|
|
54
|
+
| { status: "redirect"; location: string }
|
|
55
|
+
| { status: "error"; errors: Record<string, string[]> }
|
|
56
|
+
| { status: "forbidden" }
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`ArchipelagoResponse` is exported as an alias for `IslandResponse`.
|
|
60
|
+
|
|
61
|
+
### Handling responses
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
switch (response.status) {
|
|
65
|
+
case "ok":
|
|
66
|
+
// response.props, response.version
|
|
67
|
+
break
|
|
68
|
+
case "redirect":
|
|
69
|
+
// response.location — navigation already happened via navigate()
|
|
70
|
+
break
|
|
71
|
+
case "error":
|
|
72
|
+
// response.errors — e.g. { email: ["can't be blank"] }
|
|
73
|
+
break
|
|
74
|
+
case "forbidden":
|
|
75
|
+
// no additional data
|
|
76
|
+
break
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## `parseIslandResponse(value)`
|
|
81
|
+
|
|
82
|
+
Parses a raw JSON value into a typed `IslandResponse`. Throws `ArchipelagoTransportError` on invalid payloads. Used internally by `islandFetch` and useful for parsing ActionCable broadcast payloads.
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
import { parseIslandResponse } from "@archipelago-js/client"
|
|
86
|
+
|
|
87
|
+
const parsed = parseIslandResponse(rawPayload)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## `buildIslandPayload(payload?, fixedParams?, overridePayload?)`
|
|
91
|
+
|
|
92
|
+
Merges three layers of params with precedence: `fixedParams` < `payload` < `overridePayload`.
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
import { buildIslandPayload } from "@archipelago-js/client"
|
|
96
|
+
|
|
97
|
+
buildIslandPayload(
|
|
98
|
+
{ email: "user@example.com" },
|
|
99
|
+
{ team_id: 42 },
|
|
100
|
+
{ email: "override@example.com" }
|
|
101
|
+
)
|
|
102
|
+
// => { team_id: 42, email: "override@example.com" }
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Error Handling
|
|
106
|
+
|
|
107
|
+
### `FORM_ERROR`
|
|
108
|
+
|
|
109
|
+
A constant equal to `"_base"` — the conventional key for form-level (non-field) errors:
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
import { FORM_ERROR } from "@archipelago-js/client"
|
|
113
|
+
|
|
114
|
+
if (response.status === "error" && response.errors[FORM_ERROR]) {
|
|
115
|
+
console.log("Form-level errors:", response.errors[FORM_ERROR])
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### `ArchipelagoTransportError`
|
|
120
|
+
|
|
121
|
+
A typed `Error` subclass thrown when the network request fails, the response is HTML instead of JSON, or JSON parsing fails. Properties:
|
|
122
|
+
|
|
123
|
+
| Property | Type | Description |
|
|
124
|
+
|----------------|-----------------------|--------------------------------------|
|
|
125
|
+
| `message` | `string` | Human-readable error description |
|
|
126
|
+
| `statusCode` | `number \| undefined` | HTTP status code (if available) |
|
|
127
|
+
| `responseBody` | `string \| undefined` | First 500 chars of the response body |
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
import { ArchipelagoTransportError } from "@archipelago-js/client"
|
|
131
|
+
|
|
132
|
+
try {
|
|
133
|
+
await islandFetch("TeamMembers", "add_member", payload)
|
|
134
|
+
} catch (error) {
|
|
135
|
+
if (error instanceof ArchipelagoTransportError) {
|
|
136
|
+
console.error("Transport failed:", error.message, error.statusCode)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## CSRF
|
|
142
|
+
|
|
143
|
+
CSRF tokens are automatically read from `<meta name="csrf-token">` and sent as `X-CSRF-Token`. The cache refreshes automatically on 422 responses (Rails CSRF rotation).
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
import { getCsrfToken, refreshCsrfToken, clearCsrfCache } from "@archipelago-js/client"
|
|
147
|
+
|
|
148
|
+
getCsrfToken() // read cached or from DOM
|
|
149
|
+
refreshCsrfToken() // force re-read from DOM
|
|
150
|
+
clearCsrfCache() // clear cache (next call reads from DOM)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## API Reference
|
|
154
|
+
|
|
155
|
+
| Export | Description |
|
|
156
|
+
|-----------------------------|--------------------------------------------------|
|
|
157
|
+
| `islandFetch` | POST to island endpoint, returns typed response |
|
|
158
|
+
| `buildIslandPayload` | Merge fixed/payload/override params |
|
|
159
|
+
| `parseIslandResponse` | Parse raw JSON into typed `IslandResponse` |
|
|
160
|
+
| `FORM_ERROR` | `"_base"` constant for form-level errors |
|
|
161
|
+
| `ArchipelagoTransportError` | Typed error for network/parse failures |
|
|
162
|
+
| `getCsrfToken` | Read CSRF token from DOM (cached) |
|
|
163
|
+
| `refreshCsrfToken` | Force re-read CSRF token |
|
|
164
|
+
| `clearCsrfCache` | Clear CSRF token cache |
|
|
165
|
+
| `IslandResponse` | Union type for all response statuses |
|
|
166
|
+
| `ArchipelagoResponse` | Alias for `IslandResponse` |
|
|
167
|
+
| `IslandOkResponse` | `{ status: "ok", props, version }` |
|
|
168
|
+
| `IslandRedirectResponse` | `{ status: "redirect", location }` |
|
|
169
|
+
| `IslandErrorResponse` | `{ status: "error", errors }` |
|
|
170
|
+
| `IslandForbiddenResponse` | `{ status: "forbidden" }` |
|
|
171
|
+
| `IslandFetchOptions` | Options type for `islandFetch` |
|
|
172
|
+
| `IslandFetchPayload` | Payload type (`Record<string, unknown>`) |
|
|
173
|
+
| `UploadProgress` | `{ percentage, loaded, total }` for upload tracking |
|
package/dist/fetch.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { IslandResponse } from "./types";
|
|
2
|
+
export type UploadProgress = {
|
|
3
|
+
percentage: number;
|
|
4
|
+
loaded: number;
|
|
5
|
+
total: number | undefined;
|
|
6
|
+
};
|
|
2
7
|
export type IslandFetchOptions = {
|
|
3
8
|
endpoint?: string;
|
|
4
9
|
fixedParams?: Record<string, unknown>;
|
|
@@ -8,6 +13,7 @@ export type IslandFetchOptions = {
|
|
|
8
13
|
fetchImpl?: typeof fetch;
|
|
9
14
|
navigate?: (location: string) => void;
|
|
10
15
|
stream?: string;
|
|
16
|
+
onUploadProgress?: (progress: UploadProgress) => void;
|
|
11
17
|
};
|
|
12
18
|
export type IslandFetchPayload = Record<string, unknown>;
|
|
13
19
|
export declare function buildIslandPayload(payload?: IslandFetchPayload, fixedParams?: Record<string, unknown>, overridePayload?: Record<string, unknown>): Record<string, unknown>;
|
package/dist/fetch.js
CHANGED
|
@@ -23,11 +23,76 @@ export function buildIslandPayload(payload = {}, fixedParams = {}, overridePaylo
|
|
|
23
23
|
...overridePayload
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
|
+
function xhrFetch(url, headers, body, signal, onUploadProgress) {
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
const xhr = new XMLHttpRequest();
|
|
29
|
+
xhr.open("POST", url, true);
|
|
30
|
+
xhr.withCredentials = true;
|
|
31
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
32
|
+
xhr.setRequestHeader(key, value);
|
|
33
|
+
}
|
|
34
|
+
xhr.upload.addEventListener("progress", (event) => {
|
|
35
|
+
onUploadProgress({
|
|
36
|
+
percentage: event.lengthComputable ? Math.round((event.loaded / event.total) * 100) : 0,
|
|
37
|
+
loaded: event.loaded,
|
|
38
|
+
total: event.lengthComputable ? event.total : undefined
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
xhr.addEventListener("load", () => {
|
|
42
|
+
resolve({
|
|
43
|
+
status: xhr.status,
|
|
44
|
+
text: xhr.responseText,
|
|
45
|
+
getHeader: (name) => xhr.getResponseHeader(name)
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
xhr.addEventListener("error", () => {
|
|
49
|
+
reject(new ArchipelagoTransportError("Network request failed"));
|
|
50
|
+
});
|
|
51
|
+
xhr.addEventListener("abort", () => {
|
|
52
|
+
reject(new DOMException("The operation was aborted.", "AbortError"));
|
|
53
|
+
});
|
|
54
|
+
if (signal) {
|
|
55
|
+
if (signal.aborted) {
|
|
56
|
+
xhr.abort();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
signal.addEventListener("abort", () => xhr.abort(), { once: true });
|
|
60
|
+
}
|
|
61
|
+
xhr.send(body);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function parseResponseText(text, statusCode, navigate) {
|
|
65
|
+
if (text.trim().length === 0) {
|
|
66
|
+
return { status: "ok", props: {}, version: Date.now() };
|
|
67
|
+
}
|
|
68
|
+
if (looksLikeHtml(text)) {
|
|
69
|
+
throw new ArchipelagoTransportError("Received HTML instead of JSON", {
|
|
70
|
+
statusCode,
|
|
71
|
+
responseBody: text.slice(0, 500)
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
let parsed;
|
|
75
|
+
try {
|
|
76
|
+
parsed = JSON.parse(text);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw new ArchipelagoTransportError("Failed to parse JSON response", {
|
|
80
|
+
statusCode,
|
|
81
|
+
responseBody: text.slice(0, 500),
|
|
82
|
+
cause: error
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
const result = parseIslandResponse(parsed);
|
|
86
|
+
if (result.status === "redirect") {
|
|
87
|
+
navigate(result.location);
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
26
91
|
export async function islandFetch(component, operation, payload = {}, options = {}) {
|
|
27
|
-
const fetchImpl = options.fetchImpl ?? fetch;
|
|
28
92
|
const endpoint = options.endpoint ?? "/islands";
|
|
29
93
|
const mergedPayload = buildIslandPayload(payload, options.fixedParams, options.overridePayload);
|
|
30
94
|
const csrfToken = getCsrfToken();
|
|
95
|
+
const navigate = options.navigate ?? defaultNavigate;
|
|
31
96
|
const requestHeaders = {
|
|
32
97
|
"content-type": "application/json",
|
|
33
98
|
"x-requested-with": "XMLHttpRequest",
|
|
@@ -35,14 +100,32 @@ export async function islandFetch(component, operation, payload = {}, options =
|
|
|
35
100
|
...(options.stream ? { "x-archipelago-stream": options.stream } : {}),
|
|
36
101
|
...(options.headers ?? {})
|
|
37
102
|
};
|
|
103
|
+
const url = `${endpoint}/${encodeURIComponent(component)}/${encodeURIComponent(operation)}`;
|
|
104
|
+
const body = JSON.stringify(mergedPayload);
|
|
105
|
+
if (options.onUploadProgress) {
|
|
106
|
+
const xhrResult = await xhrFetch(url, requestHeaders, body, options.signal, options.onUploadProgress);
|
|
107
|
+
if (xhrResult.status === 422) {
|
|
108
|
+
clearCsrfCache();
|
|
109
|
+
}
|
|
110
|
+
const contentLength = xhrResult.getHeader("content-length");
|
|
111
|
+
const hasBody = contentLength == null || contentLength !== "0";
|
|
112
|
+
if (xhrResult.status === 403 && !hasBody) {
|
|
113
|
+
return { status: "forbidden" };
|
|
114
|
+
}
|
|
115
|
+
if (!hasBody) {
|
|
116
|
+
return { status: "ok", props: {}, version: Date.now() };
|
|
117
|
+
}
|
|
118
|
+
return parseResponseText(xhrResult.text, xhrResult.status, navigate);
|
|
119
|
+
}
|
|
120
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
38
121
|
let response;
|
|
39
122
|
try {
|
|
40
|
-
response = await fetchImpl(
|
|
123
|
+
response = await fetchImpl(url, {
|
|
41
124
|
method: "POST",
|
|
42
125
|
signal: options.signal,
|
|
43
126
|
credentials: "same-origin",
|
|
44
127
|
headers: requestHeaders,
|
|
45
|
-
body
|
|
128
|
+
body
|
|
46
129
|
});
|
|
47
130
|
}
|
|
48
131
|
catch (error) {
|
|
@@ -67,31 +150,6 @@ export async function islandFetch(component, operation, payload = {}, options =
|
|
|
67
150
|
cause: error
|
|
68
151
|
});
|
|
69
152
|
}
|
|
70
|
-
|
|
71
|
-
return { status: "ok", props: {}, version: Date.now() };
|
|
72
|
-
}
|
|
73
|
-
if (looksLikeHtml(text)) {
|
|
74
|
-
throw new ArchipelagoTransportError("Received HTML instead of JSON", {
|
|
75
|
-
statusCode: response.status,
|
|
76
|
-
responseBody: text.slice(0, 500)
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
let parsed;
|
|
80
|
-
try {
|
|
81
|
-
parsed = JSON.parse(text);
|
|
82
|
-
}
|
|
83
|
-
catch (error) {
|
|
84
|
-
throw new ArchipelagoTransportError("Failed to parse JSON response", {
|
|
85
|
-
statusCode: response.status,
|
|
86
|
-
responseBody: text.slice(0, 500),
|
|
87
|
-
cause: error
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
const result = parseIslandResponse(parsed);
|
|
91
|
-
if (result.status === "redirect") {
|
|
92
|
-
const navigate = options.navigate ?? defaultNavigate;
|
|
93
|
-
navigate(result.location);
|
|
94
|
-
}
|
|
95
|
-
return result;
|
|
153
|
+
return parseResponseText(text, response.status, navigate);
|
|
96
154
|
}
|
|
97
155
|
//# sourceMappingURL=fetch.js.map
|
package/dist/fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrD,OAAO,EACL,yBAAyB,EAEzB,mBAAmB,EACpB,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@archipelago-js/client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Core client utilities for Archipelago islands",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -28,11 +28,10 @@
|
|
|
28
28
|
},
|
|
29
29
|
"repository": {
|
|
30
30
|
"type": "git",
|
|
31
|
-
"url": "git+https://github.com/
|
|
32
|
-
"directory": "packages/client"
|
|
31
|
+
"url": "git+https://github.com/Catchhook/archipelago-js-client.git"
|
|
33
32
|
},
|
|
34
33
|
"bugs": {
|
|
35
|
-
"url": "https://github.com/
|
|
34
|
+
"url": "https://github.com/Catchhook/archipelago-js-client/issues"
|
|
36
35
|
},
|
|
37
|
-
"homepage": "https://github.com/
|
|
36
|
+
"homepage": "https://github.com/Catchhook/archipelago-js-client"
|
|
38
37
|
}
|