@rool-dev/sdk 0.8.1 → 0.8.2-dev.d82ea25

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 (56) hide show
  1. package/README.md +465 -1005
  2. package/dist/channel.d.ts +93 -248
  3. package/dist/channel.d.ts.map +1 -1
  4. package/dist/channel.js +410 -577
  5. package/dist/channel.js.map +1 -1
  6. package/dist/client.d.ts +14 -40
  7. package/dist/client.d.ts.map +1 -1
  8. package/dist/client.js +31 -116
  9. package/dist/client.js.map +1 -1
  10. package/dist/graphql.d.ts +11 -35
  11. package/dist/graphql.d.ts.map +1 -1
  12. package/dist/graphql.js +72 -298
  13. package/dist/graphql.js.map +1 -1
  14. package/dist/index.d.ts +4 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +4 -4
  17. package/dist/index.js.map +1 -1
  18. package/dist/path.d.ts +6 -0
  19. package/dist/path.d.ts.map +1 -0
  20. package/dist/path.js +47 -0
  21. package/dist/path.js.map +1 -0
  22. package/dist/reroute.d.ts +22 -0
  23. package/dist/reroute.d.ts.map +1 -0
  24. package/dist/reroute.js +61 -0
  25. package/dist/reroute.js.map +1 -0
  26. package/dist/rest.d.ts +27 -0
  27. package/dist/rest.d.ts.map +1 -0
  28. package/dist/rest.js +78 -0
  29. package/dist/rest.js.map +1 -0
  30. package/dist/router.d.ts.map +1 -1
  31. package/dist/router.js +25 -10
  32. package/dist/router.js.map +1 -1
  33. package/dist/space.d.ts +23 -16
  34. package/dist/space.d.ts.map +1 -1
  35. package/dist/space.js +115 -67
  36. package/dist/space.js.map +1 -1
  37. package/dist/subscription.d.ts.map +1 -1
  38. package/dist/subscription.js +47 -36
  39. package/dist/subscription.js.map +1 -1
  40. package/dist/types.d.ts +86 -203
  41. package/dist/types.d.ts.map +1 -1
  42. package/dist/types.js +0 -4
  43. package/dist/types.js.map +1 -1
  44. package/dist/webdav.d.ts +176 -0
  45. package/dist/webdav.d.ts.map +1 -0
  46. package/dist/webdav.js +495 -0
  47. package/dist/webdav.js.map +1 -0
  48. package/package.json +2 -1
  49. package/dist/apps.d.ts +0 -30
  50. package/dist/apps.d.ts.map +0 -1
  51. package/dist/apps.js +0 -81
  52. package/dist/apps.js.map +0 -1
  53. package/dist/media.d.ts +0 -76
  54. package/dist/media.d.ts.map +0 -1
  55. package/dist/media.js +0 -249
  56. package/dist/media.js.map +0 -1
package/dist/path.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export declare function machinePath(input: string, ctx?: {
2
+ spaceId?: string;
3
+ }): string;
4
+ export declare function isObjectPath(input: string): boolean;
5
+ export declare function machineUri(path: string): string;
6
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAqBjF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAanD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C"}
package/dist/path.js ADDED
@@ -0,0 +1,47 @@
1
+ const MACHINE_URI_RE = /^rool-machine(?::|%3A)(.*)$/i;
2
+ export function machinePath(input, ctx = {}) {
3
+ let value = input.trim();
4
+ const machine = MACHINE_URI_RE.exec(value);
5
+ if (machine)
6
+ value = machine[1] || '/';
7
+ if (/^[a-z][a-z0-9+.-]*:/i.test(value)) {
8
+ value = new URL(value).pathname;
9
+ }
10
+ let parts = value.split('/').filter(Boolean).map(decodePart);
11
+ if (ctx.spaceId && parts[0] === 'space' && parts[1] === ctx.spaceId) {
12
+ parts = parts.slice(2);
13
+ }
14
+ else if (ctx.spaceId && parts[0] === 'dav' && parts[1] === ctx.spaceId) {
15
+ parts = ['rool-drive', ...parts.slice(2)];
16
+ }
17
+ const path = parts.length ? `/${parts.join('/')}` : '/';
18
+ if (path.includes('\\') || /[\x00-\x1f\x7f]/.test(path)) {
19
+ throw new Error('Invalid machine path');
20
+ }
21
+ return path;
22
+ }
23
+ export function isObjectPath(input) {
24
+ try {
25
+ const parts = machinePath(input).split('/').filter(Boolean);
26
+ return (parts.length === 3 &&
27
+ parts[0] === 'space' &&
28
+ !parts[1].startsWith('.') &&
29
+ !parts[2].startsWith('.') &&
30
+ parts[2].endsWith('.json'));
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ export function machineUri(path) {
37
+ return `rool-machine:${machinePath(path).split('/').map(encodeURIComponent).join('/')}`;
38
+ }
39
+ function decodePart(value) {
40
+ try {
41
+ return decodeURIComponent(value);
42
+ }
43
+ catch {
44
+ return value;
45
+ }
46
+ }
47
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,8BAA8B,CAAC;AAEtD,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,MAA4B,EAAE;IACvE,IAAI,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,OAAO;QAAE,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IAEvC,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7D,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;QACpE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;SAAM,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;QACzE,KAAK,GAAG,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACxD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5D,OAAO,CACL,KAAK,CAAC,MAAM,KAAK,CAAC;YAClB,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO;YACpB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YACzB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YACzB,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC3B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,gBAAgB,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1F,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ export declare function isThrowRetryable(method?: string): boolean;
2
+ export interface RerouteOptions {
3
+ /** Issue the request against the current (possibly just-rerouted) node. */
4
+ send: () => Promise<Response>;
5
+ /** Re-resolve the owning node and update client URL state. Throws if it fails. */
6
+ reroute?: () => Promise<void>;
7
+ /**
8
+ * Whether the request may be re-sent after a thrown fetch (opaque network/CORS
9
+ * failure). Only true for idempotent requests — see THROW_RETRYABLE.
10
+ */
11
+ retryOnThrow: boolean;
12
+ }
13
+ /**
14
+ * Fetch with shard-reroute retries. A node being drained returns a readable
15
+ * 421/503: re-resolve the owner and retry. A node that has fully rolled away no
16
+ * longer answers, so the LB's CORS-less 5xx makes fetch reject opaquely (no
17
+ * status to inspect); for idempotent requests we treat that throw as the same
18
+ * reroute signal, since otherwise the request keeps targeting a dead node and
19
+ * surfaces only as an opaque CORS error.
20
+ */
21
+ export declare function fetchWithReroute(opts: RerouteOptions): Promise<Response>;
22
+ //# sourceMappingURL=reroute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reroute.d.ts","sourceRoot":"","sources":["../src/reroute.ts"],"names":[],"mappings":"AAgBA,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoC9E"}
@@ -0,0 +1,61 @@
1
+ const REQUEST_MAX_RETRIES = 6;
2
+ const RETRY_BASE_MS = 150;
3
+ const RETRY_MAX_MS = 5_000;
4
+ const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
5
+ function retryBackoffMs(attempt) {
6
+ const ceil = Math.min(RETRY_BASE_MS * 2 ** attempt, RETRY_MAX_MS);
7
+ return ceil / 2 + Math.random() * (ceil / 2);
8
+ }
9
+ // Methods safe to re-send after a thrown fetch: reads, plus the idempotent
10
+ // writes. A node that has fully rolled away makes fetch reject opaquely instead
11
+ // of returning a readable 503, and we can't prove the request didn't execute, so
12
+ // we only re-send when re-sending is harmless. POST/MKCOL/MOVE/COPY/LOCK are not.
13
+ const THROW_RETRYABLE = new Set(['GET', 'HEAD', 'OPTIONS', 'PROPFIND', 'REPORT', 'PUT', 'DELETE']);
14
+ export function isThrowRetryable(method) {
15
+ return method ? THROW_RETRYABLE.has(method.toUpperCase()) : false;
16
+ }
17
+ /**
18
+ * Fetch with shard-reroute retries. A node being drained returns a readable
19
+ * 421/503: re-resolve the owner and retry. A node that has fully rolled away no
20
+ * longer answers, so the LB's CORS-less 5xx makes fetch reject opaquely (no
21
+ * status to inspect); for idempotent requests we treat that throw as the same
22
+ * reroute signal, since otherwise the request keeps targeting a dead node and
23
+ * surfaces only as an opaque CORS error.
24
+ */
25
+ export async function fetchWithReroute(opts) {
26
+ const { send, reroute, retryOnThrow } = opts;
27
+ let response = null;
28
+ let thrown;
29
+ try {
30
+ response = await send();
31
+ }
32
+ catch (error) {
33
+ if (!reroute || !retryOnThrow)
34
+ throw error;
35
+ thrown = error;
36
+ }
37
+ for (let attempt = 0; reroute && attempt < REQUEST_MAX_RETRIES &&
38
+ (response === null || response.status === 421 || response.status === 503); attempt++) {
39
+ await delay(retryBackoffMs(attempt));
40
+ try {
41
+ await reroute();
42
+ }
43
+ catch {
44
+ continue; // reroute itself failed (e.g. /route exhausted its own retries); keep backing off
45
+ }
46
+ try {
47
+ response = await send();
48
+ thrown = undefined;
49
+ }
50
+ catch (error) {
51
+ if (!retryOnThrow)
52
+ throw error;
53
+ response = null;
54
+ thrown = error;
55
+ }
56
+ }
57
+ if (response === null)
58
+ throw thrown;
59
+ return response;
60
+ }
61
+ //# sourceMappingURL=reroute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reroute.js","sourceRoot":"","sources":["../src/reroute.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,YAAY,GAAG,KAAK,CAAC;AAC3B,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEtF,SAAS,cAAc,CAAC,OAAe;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,IAAI,OAAO,EAAE,YAAY,CAAC,CAAC;IAClE,OAAO,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,2EAA2E;AAC3E,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEnG,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC9C,OAAO,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACpE,CAAC;AAcD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAoB;IACzD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAE7C,IAAI,QAAQ,GAAoB,IAAI,CAAC;IACrC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,OAAO,IAAI,CAAC,YAAY;YAAE,MAAM,KAAK,CAAC;QAC3C,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC;IAED,KACE,IAAI,OAAO,GAAG,CAAC,EACf,OAAO,IAAI,OAAO,GAAG,mBAAmB;QACtC,CAAC,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,EAC3E,OAAO,EAAE,EACT,CAAC;QACD,MAAM,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,kFAAkF;QAC9F,CAAC;QACD,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC;YACxB,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,YAAY;gBAAE,MAAM,KAAK,CAAC;YAC/B,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,KAAK,IAAI;QAAE,MAAM,MAAM,CAAC;IACpC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
package/dist/rest.d.ts ADDED
@@ -0,0 +1,27 @@
1
+ import type { AuthManager } from './auth.js';
2
+ import type { GetObjectsResult } from './types.js';
3
+ export interface RestClientConfig {
4
+ apiUrl: string;
5
+ authManager: AuthManager;
6
+ /** Called on shard refusal/drain (421/503). Return the new API base URL. */
7
+ onRefused?: () => Promise<string>;
8
+ }
9
+ export declare class RestClient {
10
+ private apiUrl;
11
+ private authManager;
12
+ private onRefused?;
13
+ constructor(config: RestClientConfig);
14
+ /** Update the API base URL (used after shard rerouting). */
15
+ setApiUrl(apiUrl: string): void;
16
+ /** Wire the shard-reroute callback (used after shard rerouting). */
17
+ setOnRefused(onRefused: () => Promise<string>): void;
18
+ proxyFetch(spaceId: string, url: string, init?: {
19
+ method?: string;
20
+ headers?: Record<string, string>;
21
+ body?: unknown;
22
+ }): Promise<Response>;
23
+ getObjects(spaceId: string, paths: string[]): Promise<GetObjectsResult>;
24
+ importArchive(name: string, archive: Blob): Promise<string>;
25
+ private authenticatedFetch;
26
+ }
27
+ //# sourceMappingURL=rest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../src/rest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAC,CAAwB;gBAE9B,MAAM,EAAE,gBAAgB;IAMpC,4DAA4D;IAC5D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,oEAAoE;IACpE,YAAY,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI;IAI9C,UAAU,CACd,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAC3E,OAAO,CAAC,QAAQ,CAAC;IAed,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsBvE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YAmBnD,kBAAkB;CAejC"}
package/dist/rest.js ADDED
@@ -0,0 +1,78 @@
1
+ import { fetchWithReroute, isThrowRetryable } from './reroute.js';
2
+ export class RestClient {
3
+ apiUrl;
4
+ authManager;
5
+ onRefused;
6
+ constructor(config) {
7
+ this.apiUrl = config.apiUrl.replace(/\/+$/, '');
8
+ this.authManager = config.authManager;
9
+ this.onRefused = config.onRefused;
10
+ }
11
+ /** Update the API base URL (used after shard rerouting). */
12
+ setApiUrl(apiUrl) {
13
+ this.apiUrl = apiUrl.replace(/\/+$/, '');
14
+ }
15
+ /** Wire the shard-reroute callback (used after shard rerouting). */
16
+ setOnRefused(onRefused) {
17
+ this.onRefused = onRefused;
18
+ }
19
+ async proxyFetch(spaceId, url, init) {
20
+ const response = await this.authenticatedFetch(`/fetch/${encodeURIComponent(spaceId)}`, {
21
+ method: 'POST',
22
+ headers: { 'Content-Type': 'application/json' },
23
+ body: JSON.stringify({
24
+ url,
25
+ method: init?.method,
26
+ headers: init?.headers,
27
+ body: init?.body,
28
+ }),
29
+ });
30
+ return response;
31
+ }
32
+ async getObjects(spaceId, paths) {
33
+ const response = await this.authenticatedFetch(`/spaces/${encodeURIComponent(spaceId)}/getObjects`, {
34
+ method: 'POST',
35
+ headers: { 'Content-Type': 'application/json' },
36
+ body: JSON.stringify({ paths }),
37
+ });
38
+ if (!response.ok) {
39
+ const errorText = await response.text().catch(() => response.statusText);
40
+ throw new Error(`Failed to get objects: ${response.status} ${errorText}`);
41
+ }
42
+ const result = await response.json();
43
+ return {
44
+ objects: result.objects.map((object) => ({ path: object.path, body: object.body })),
45
+ missing: result.missing,
46
+ };
47
+ }
48
+ async importArchive(name, archive) {
49
+ const formData = new FormData();
50
+ formData.append('name', name);
51
+ formData.append('archive', archive, 'archive.zip');
52
+ const response = await this.authenticatedFetch('/spaces/import', {
53
+ method: 'POST',
54
+ body: formData,
55
+ });
56
+ if (!response.ok) {
57
+ const errorText = await response.text().catch(() => response.statusText);
58
+ throw new Error(`Failed to import space: ${response.status} ${errorText}`);
59
+ }
60
+ const result = await response.json();
61
+ return result.spaceId;
62
+ }
63
+ async authenticatedFetch(path, init) {
64
+ const tokens = await this.authManager.getTokens();
65
+ if (!tokens)
66
+ throw new Error('Not authenticated');
67
+ const headers = new Headers(init.headers);
68
+ headers.set('Authorization', `Bearer ${tokens.accessToken}`);
69
+ headers.set('X-Rool-Token', tokens.roolToken);
70
+ const onRefused = this.onRefused;
71
+ return fetchWithReroute({
72
+ send: () => fetch(`${this.apiUrl}${path}`, { ...init, headers }),
73
+ reroute: onRefused ? async () => this.setApiUrl(await onRefused()) : undefined,
74
+ retryOnThrow: isThrowRetryable(init.method),
75
+ });
76
+ }
77
+ }
78
+ //# sourceMappingURL=rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.js","sourceRoot":"","sources":["../src/rest.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAyC;gBAE7C,MAAM,EAAE,iBAAiB;IAKrC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YAW9B,UAAU;CAkBzB"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAW7C,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAyC;gBAE7C,MAAM,EAAE,iBAAiB;IAKrC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YAW9B,UAAU;CAwBzB"}
package/dist/router.js CHANGED
@@ -1,3 +1,11 @@
1
+ const ROUTE_MAX_RETRIES = 6;
2
+ const ROUTE_RETRY_BASE_MS = 150;
3
+ const ROUTE_RETRY_MAX_MS = 2_000;
4
+ const delay = (ms) => new Promise((r) => setTimeout(r, ms));
5
+ function routeBackoffMs(attempt) {
6
+ const ceil = Math.min(ROUTE_RETRY_BASE_MS * 2 ** attempt, ROUTE_RETRY_MAX_MS);
7
+ return ceil / 2 + Math.random() * (ceil / 2);
8
+ }
1
9
  export class SpaceRouter {
2
10
  apiUrl;
3
11
  authManager;
@@ -20,17 +28,24 @@ export class SpaceRouter {
20
28
  const tokens = await this.authManager.getTokens();
21
29
  if (!tokens)
22
30
  throw new Error('Not authenticated');
23
- const response = await fetch(`${this.apiUrl}/route/${encodeURIComponent(spaceId)}`, {
24
- headers: {
25
- Authorization: `Bearer ${tokens.accessToken}`,
26
- 'X-Rool-Token': tokens.roolToken,
27
- },
28
- });
29
- if (!response.ok) {
30
- throw new Error(`Route resolution failed: ${response.status} ${response.statusText}`);
31
+ // A draining shard 503s /route (it must not re-claim the lease for a dying
32
+ // instance). /route is any-shard, so retry until a live shard answers.
33
+ for (let attempt = 0;; attempt++) {
34
+ const response = await fetch(`${this.apiUrl}/route/${encodeURIComponent(spaceId)}`, {
35
+ headers: {
36
+ Authorization: `Bearer ${tokens.accessToken}`,
37
+ 'X-Rool-Token': tokens.roolToken,
38
+ },
39
+ });
40
+ if (response.ok) {
41
+ const data = await response.json();
42
+ return { server: data.server, generation: data.generation };
43
+ }
44
+ if (response.status !== 503 || attempt >= ROUTE_MAX_RETRIES) {
45
+ throw new Error(`Route resolution failed: ${response.status} ${response.statusText}`);
46
+ }
47
+ await delay(routeBackoffMs(attempt));
31
48
  }
32
- const data = await response.json();
33
- return { server: data.server, generation: data.generation };
34
49
  }
35
50
  }
36
51
  //# sourceMappingURL=router.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,WAAW;IACd,MAAM,CAAS;IACf,WAAW,CAAc;IACzB,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IAEzD,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACpD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,OAAe;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;QAClD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAElD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,UAAU,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE;YAClF,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE;gBAC7C,cAAc,EAAE,MAAM,CAAC,SAAS;aACjC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA4C,CAAC;QAC7E,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAC9D,CAAC;CACF"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AACpE,SAAS,cAAc,CAAC,OAAe;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,IAAI,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAC9E,OAAO,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC;AAYD,MAAM,OAAO,WAAW;IACd,MAAM,CAAS;IACf,WAAW,CAAc;IACzB,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IAEzD,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACpD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,OAAe;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;QAClD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAElD,2EAA2E;QAC3E,uEAAuE;QACvE,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,UAAU,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE;gBAClF,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,MAAM,CAAC,WAAW,EAAE;oBAC7C,cAAc,EAAE,MAAM,CAAC,SAAS;iBACjC;aACF,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA4C,CAAC;gBAC7E,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9D,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,IAAI,iBAAiB,EAAE,CAAC;gBAC5D,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACxF,CAAC;YACD,MAAM,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;CACF"}
package/dist/space.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import { EventEmitter } from './event-emitter.js';
2
2
  import type { GraphQLClient, OpenSpaceFullResult } from './graphql.js';
3
- import type { MediaClient } from './media.js';
3
+ import type { RestClient } from './rest.js';
4
4
  import { RoolChannel } from './channel.js';
5
+ import { RoolWebDAV, type SpaceFileStorageUsage } from './webdav.js';
5
6
  import type { AuthManager } from './auth.js';
6
7
  import type { Logger } from './logger.js';
7
8
  import type { SpaceRouter, RouteInfo } from './router.js';
@@ -16,7 +17,7 @@ export interface SpaceConfig {
16
17
  /** Full space data from openSpaceFull */
17
18
  fullData: OpenSpaceFullResult;
18
19
  graphqlClient: GraphQLClient;
19
- mediaClient: MediaClient;
20
+ restClient: RestClient;
20
21
  authManager: AuthManager;
21
22
  router: SpaceRouter;
22
23
  initialRoute: RouteInfo;
@@ -43,16 +44,20 @@ export declare class RoolSpace extends EventEmitter<RoolSpaceEvents> {
43
44
  private _channels;
44
45
  private _knownChannelIds;
45
46
  private graphqlClient;
46
- private mediaClient;
47
+ private restClient;
47
48
  private authManager;
48
49
  private router;
49
50
  private _route;
51
+ private _webdav;
50
52
  private logger;
51
53
  private onCloseCallback;
52
54
  private subscriptionManager;
55
+ private _closed;
56
+ private _resyncing;
57
+ private _resyncPending;
58
+ private _resyncTimer;
53
59
  private _subscriptionReady;
54
60
  private openChannels;
55
- private _objectIds;
56
61
  private _objectStats;
57
62
  private _schema;
58
63
  private _meta;
@@ -64,6 +69,18 @@ export declare class RoolSpace extends EventEmitter<RoolSpaceEvents> {
64
69
  get linkAccess(): LinkAccess;
65
70
  get memberCount(): number;
66
71
  get route(): RouteInfo;
72
+ /** WebDAV client for this space's user-visible files and object filesystem. */
73
+ get webdav(): RoolWebDAV;
74
+ /** Return file-storage quota usage for this space. */
75
+ getStorageUsage(): Promise<SpaceFileStorageUsage>;
76
+ /** Fetch a user-visible file path through the current space. */
77
+ fetchPath(path: string, options?: {
78
+ range?: string | {
79
+ start: number;
80
+ end?: number;
81
+ };
82
+ signal?: AbortSignal;
83
+ }): Promise<Response>;
67
84
  /**
68
85
  * Live list of channels in this space.
69
86
  * Auto-updates via SSE when channels are created, updated, or deleted.
@@ -104,12 +121,6 @@ export declare class RoolSpace extends EventEmitter<RoolSpaceEvents> {
104
121
  * Requires owner or admin role.
105
122
  */
106
123
  setLinkAccess(linkAccess: LinkAccess): Promise<void>;
107
- /**
108
- * List channels in this space.
109
- * Returns the live channel list (kept current via SSE).
110
- * @deprecated Use the `channels` property instead.
111
- */
112
- getChannels(): ChannelInfo[];
113
124
  /**
114
125
  * Rename a channel in this space.
115
126
  */
@@ -118,9 +129,6 @@ export declare class RoolSpace extends EventEmitter<RoolSpaceEvents> {
118
129
  * Delete a channel from this space.
119
130
  */
120
131
  deleteChannel(channelId: string): Promise<void>;
121
- /**
122
- * Export space data and media as a zip archive.
123
- */
124
132
  exportArchive(): Promise<Blob>;
125
133
  /**
126
134
  * Refresh space data from the server.
@@ -136,10 +144,9 @@ export declare class RoolSpace extends EventEmitter<RoolSpaceEvents> {
136
144
  * Routes to channels and emits channel lifecycle events.
137
145
  */
138
146
  private handleSpaceEvent;
139
- /**
140
- * Handle reconnection: fetch full state once, distribute to all channels.
141
- */
142
147
  private handleResync;
148
+ private _resyncWithRetry;
149
+ private _finishResync;
143
150
  /**
144
151
  * Apply full space data from server (initial load or resync).
145
152
  */
@@ -1 +1 @@
1
- {"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"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"}