@adonis-agora/collaboration-client 0.2.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 +86 -0
- package/dist/src/context.d.ts +28 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +45 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/hooks/use_automerge_doc.d.ts +29 -0
- package/dist/src/hooks/use_automerge_doc.d.ts.map +1 -0
- package/dist/src/hooks/use_automerge_doc.js +93 -0
- package/dist/src/hooks/use_automerge_doc.js.map +1 -0
- package/dist/src/hooks/use_awareness.d.ts +12 -0
- package/dist/src/hooks/use_awareness.d.ts.map +1 -0
- package/dist/src/hooks/use_awareness.js +47 -0
- package/dist/src/hooks/use_awareness.js.map +1 -0
- package/dist/src/hooks/use_collab_doc.d.ts +17 -0
- package/dist/src/hooks/use_collab_doc.d.ts.map +1 -0
- package/dist/src/hooks/use_collab_doc.js +24 -0
- package/dist/src/hooks/use_collab_doc.js.map +1 -0
- package/dist/src/hooks/use_comments.d.ts +21 -0
- package/dist/src/hooks/use_comments.d.ts.map +1 -0
- package/dist/src/hooks/use_comments.js +66 -0
- package/dist/src/hooks/use_comments.js.map +1 -0
- package/dist/src/hooks/use_versions.d.ts +18 -0
- package/dist/src/hooks/use_versions.d.ts.map +1 -0
- package/dist/src/hooks/use_versions.js +58 -0
- package/dist/src/hooks/use_versions.js.map +1 -0
- package/dist/src/index.d.ts +20 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +13 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/rest_client.d.ts +27 -0
- package/dist/src/rest_client.d.ts.map +1 -0
- package/dist/src/rest_client.js +89 -0
- package/dist/src/rest_client.js.map +1 -0
- package/dist/src/session.d.ts +26 -0
- package/dist/src/session.d.ts.map +1 -0
- package/dist/src/session.js +129 -0
- package/dist/src/session.js.map +1 -0
- package/dist/src/transports/hocuspocus.d.ts +20 -0
- package/dist/src/transports/hocuspocus.d.ts.map +1 -0
- package/dist/src/transports/hocuspocus.js +45 -0
- package/dist/src/transports/hocuspocus.js.map +1 -0
- package/dist/src/transports/index.d.ts +4 -0
- package/dist/src/transports/index.d.ts.map +1 -0
- package/dist/src/transports/index.js +16 -0
- package/dist/src/transports/index.js.map +1 -0
- package/dist/src/transports/normalize_status.d.ts +7 -0
- package/dist/src/transports/normalize_status.d.ts.map +1 -0
- package/dist/src/transports/normalize_status.js +12 -0
- package/dist/src/transports/normalize_status.js.map +1 -0
- package/dist/src/transports/partykit.d.ts +15 -0
- package/dist/src/transports/partykit.d.ts.map +1 -0
- package/dist/src/transports/partykit.js +63 -0
- package/dist/src/transports/partykit.js.map +1 -0
- package/dist/src/transports/partyserver.d.ts +15 -0
- package/dist/src/transports/partyserver.d.ts.map +1 -0
- package/dist/src/transports/partyserver.js +61 -0
- package/dist/src/transports/partyserver.js.map +1 -0
- package/dist/src/types.d.ts +85 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC9E,YAAY,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,YAAY,EACV,aAAa,EACb,UAAU,EACV,YAAY,EACZ,eAAe,EACf,eAAe,EACf,aAAa,EACb,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { CollaborationProvider, useCollaborationContext } from './context.js';
|
|
2
|
+
export { DocSession } from './session.js';
|
|
3
|
+
export { CollabRestError, collabFetch, createComment, createVersion, deleteComment, fetchToken, listComments, listVersions, resolveComment, restoreVersion, } from './rest_client.js';
|
|
4
|
+
export { defaultTransportFactory } from './transports/index.js';
|
|
5
|
+
export { HocuspocusCollabTransport } from './transports/hocuspocus.js';
|
|
6
|
+
export { PartyKitCollabTransport } from './transports/partykit.js';
|
|
7
|
+
export { PartyServerCollabTransport } from './transports/partyserver.js';
|
|
8
|
+
export { useCollabDoc } from './hooks/use_collab_doc.js';
|
|
9
|
+
export { useAwareness } from './hooks/use_awareness.js';
|
|
10
|
+
export { useComments } from './hooks/use_comments.js';
|
|
11
|
+
export { useVersions } from './hooks/use_versions.js';
|
|
12
|
+
export { useAutomergeDoc } from './hooks/use_automerge_doc.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAYtD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CollaborationClientConfig } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Cliente REST mínimo pra rotas de colaboração geradas por
|
|
4
|
+
* `node ace collaboration:init`. docName sempre por query/body —
|
|
5
|
+
* nomes de documento contêm barras.
|
|
6
|
+
*/
|
|
7
|
+
export declare class CollabRestError extends Error {
|
|
8
|
+
readonly status: number;
|
|
9
|
+
readonly body: string;
|
|
10
|
+
constructor(status: number, body: string);
|
|
11
|
+
}
|
|
12
|
+
export declare function collabFetch<T>(config: CollaborationClientConfig, path: string, init?: {
|
|
13
|
+
method?: 'GET' | 'POST' | 'PATCH' | 'DELETE';
|
|
14
|
+
params?: Record<string, string | undefined>;
|
|
15
|
+
body?: unknown;
|
|
16
|
+
}): Promise<T>;
|
|
17
|
+
export declare function fetchToken(config: CollaborationClientConfig, docName: string): Promise<import("./types.js").CollabTokenInfo>;
|
|
18
|
+
export declare function listComments(config: CollaborationClientConfig, docName: string, space?: string): Promise<import("./types.js").CollabComment[]>;
|
|
19
|
+
export declare function createComment(config: CollaborationClientConfig, input: Omit<import('./types.js').CollabComment, 'id' | 'createdAt' | 'updatedAt' | 'resolvedAt'>): Promise<import("./types.js").CollabComment>;
|
|
20
|
+
export declare function resolveComment(config: CollaborationClientConfig, docName: string, commentId: string, resolved: boolean): Promise<import("./types.js").CollabComment | null>;
|
|
21
|
+
export declare function deleteComment(config: CollaborationClientConfig, docName: string, commentId: string): Promise<{
|
|
22
|
+
deleted: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
export declare function listVersions(config: CollaborationClientConfig, docName: string): Promise<import("./types.js").CollabVersion[]>;
|
|
25
|
+
export declare function createVersion(config: CollaborationClientConfig, docName: string, label: string | null, userId?: string | null): Promise<import("./types.js").CollabVersion>;
|
|
26
|
+
export declare function restoreVersion(config: CollaborationClientConfig, docName: string, versionId: string): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=rest_client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest_client.d.ts","sourceRoot":"","sources":["../../src/rest_client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;GAIG;AAEH,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM;gBADZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM;CAK/B;AAeD,wBAAsB,WAAW,CAAC,CAAC,EACjC,MAAM,EAAE,yBAAyB,EACjC,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;IACL,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,CAAC,CAAC,CA2BZ;AAID,wBAAgB,UAAU,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,iDAI5E;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,iDAI9F;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,yBAAyB,EACjC,KAAK,EAAE,IAAI,CAAC,OAAO,YAAY,EAAE,aAAa,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC,+CAMjG;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,sDAOlB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM;aAEa,OAAO;GAKtC;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,iDAI9E;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,+CAMvB;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,iBAMlB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cliente REST mínimo pra rotas de colaboração geradas por
|
|
3
|
+
* `node ace collaboration:init`. docName sempre por query/body —
|
|
4
|
+
* nomes de documento contêm barras.
|
|
5
|
+
*/
|
|
6
|
+
export class CollabRestError extends Error {
|
|
7
|
+
status;
|
|
8
|
+
body;
|
|
9
|
+
constructor(status, body) {
|
|
10
|
+
super(`Collaboration API respondeu ${status}: ${body}`);
|
|
11
|
+
this.status = status;
|
|
12
|
+
this.body = body;
|
|
13
|
+
this.name = 'CollabRestError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function buildUrl(config, path, params) {
|
|
17
|
+
const base = config.baseUrl.replace(/\/$/, '');
|
|
18
|
+
const url = new URL(`${base}${path}`);
|
|
19
|
+
for (const [key, value] of Object.entries(params ?? {})) {
|
|
20
|
+
if (value !== undefined)
|
|
21
|
+
url.searchParams.set(key, value);
|
|
22
|
+
}
|
|
23
|
+
return url.toString();
|
|
24
|
+
}
|
|
25
|
+
export async function collabFetch(config, path, init) {
|
|
26
|
+
const fetchImpl = config.fetchImpl ?? fetch;
|
|
27
|
+
const staticHeaders = (await config.getHeaders?.()) ?? {};
|
|
28
|
+
const headers = {
|
|
29
|
+
accept: 'application/json',
|
|
30
|
+
...staticHeaders,
|
|
31
|
+
};
|
|
32
|
+
const requestInit = {
|
|
33
|
+
method: init?.method ?? 'GET',
|
|
34
|
+
headers,
|
|
35
|
+
};
|
|
36
|
+
if (init?.body !== undefined) {
|
|
37
|
+
headers['content-type'] = 'application/json';
|
|
38
|
+
requestInit.body = JSON.stringify(init.body);
|
|
39
|
+
}
|
|
40
|
+
const response = await fetchImpl(buildUrl(config, path, init?.params), requestInit);
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
throw new CollabRestError(response.status, await response.text().catch(() => ''));
|
|
43
|
+
}
|
|
44
|
+
if (response.status === 204) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
return (await response.json());
|
|
48
|
+
}
|
|
49
|
+
/* ───────────────────────── endpoints tipados ───────────────────────── */
|
|
50
|
+
export function fetchToken(config, docName) {
|
|
51
|
+
return collabFetch(config, '/collaboration/token', {
|
|
52
|
+
params: { doc: docName },
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
export function listComments(config, docName, space) {
|
|
56
|
+
return collabFetch(config, '/collaboration/comments', {
|
|
57
|
+
params: { doc: docName, space },
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export function createComment(config, input) {
|
|
61
|
+
return collabFetch(config, '/collaboration/comments', {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
body: input,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
export function resolveComment(config, docName, commentId, resolved) {
|
|
67
|
+
return collabFetch(config, `/collaboration/comments/${encodeURIComponent(commentId)}`, { method: 'PATCH', params: { doc: docName }, body: { resolved } });
|
|
68
|
+
}
|
|
69
|
+
export function deleteComment(config, docName, commentId) {
|
|
70
|
+
return collabFetch(config, `/collaboration/comments/${encodeURIComponent(commentId)}`, { method: 'DELETE', params: { doc: docName } });
|
|
71
|
+
}
|
|
72
|
+
export function listVersions(config, docName) {
|
|
73
|
+
return collabFetch(config, '/collaboration/versions', {
|
|
74
|
+
params: { doc: docName },
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
export function createVersion(config, docName, label, userId) {
|
|
78
|
+
return collabFetch(config, '/collaboration/versions', {
|
|
79
|
+
method: 'POST',
|
|
80
|
+
body: { docName, label, userId },
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
export function restoreVersion(config, docName, versionId) {
|
|
84
|
+
return collabFetch(config, '/collaboration/versions/restore', {
|
|
85
|
+
method: 'POST',
|
|
86
|
+
body: { docName, versionId },
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=rest_client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest_client.js","sourceRoot":"","sources":["../../src/rest_client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as Y from 'yjs';
|
|
2
|
+
import type { CollabStatus, CollabTransport, CollaborationClientConfig } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Session for a single document: fetches the ephemeral token, creates the
|
|
5
|
+
* transport and exposes an observable status store (consumed via
|
|
6
|
+
* useSyncExternalStore). One session per docName per provider — it
|
|
7
|
+
* outlives individual hook unmounts.
|
|
8
|
+
*
|
|
9
|
+
* Ephemeral tokens expire, so on `disconnected` (after having connected at
|
|
10
|
+
* least once) the transport is torn down and rebuilt with a fresh token,
|
|
11
|
+
* using exponential backoff.
|
|
12
|
+
*/
|
|
13
|
+
export declare class DocSession {
|
|
14
|
+
#private;
|
|
15
|
+
readonly docName: string;
|
|
16
|
+
readonly doc: Y.Doc;
|
|
17
|
+
constructor(docName: string, config: CollaborationClientConfig);
|
|
18
|
+
get transport(): CollabTransport | undefined;
|
|
19
|
+
get error(): Error | null;
|
|
20
|
+
getStatus(): CollabStatus;
|
|
21
|
+
subscribe(listener: () => void): () => void;
|
|
22
|
+
/** Idempotent — token + transport created a single time per generation. */
|
|
23
|
+
start(): Promise<void>;
|
|
24
|
+
destroy(): void;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,KAAK,EACV,YAAY,EAEZ,eAAe,EACf,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAIpB;;;;;;;;;GASG;AACH,qBAAa,UAAU;;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;gBAYR,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB;IAM9D,IAAI,SAAS,IAAI,eAAe,GAAG,SAAS,CAE3C;IAED,IAAI,KAAK,IAAI,KAAK,GAAG,IAAI,CAExB;IAED,SAAS,IAAI,YAAY;IAIzB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAS3C,2EAA2E;IAC3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+EtB,OAAO,IAAI,IAAI;CAQhB"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import * as Y from 'yjs';
|
|
2
|
+
import { fetchToken } from './rest_client.js';
|
|
3
|
+
import { defaultTransportFactory } from './transports/index.js';
|
|
4
|
+
const MAX_RECONNECT_DELAY_MS = 15_000;
|
|
5
|
+
/**
|
|
6
|
+
* Session for a single document: fetches the ephemeral token, creates the
|
|
7
|
+
* transport and exposes an observable status store (consumed via
|
|
8
|
+
* useSyncExternalStore). One session per docName per provider — it
|
|
9
|
+
* outlives individual hook unmounts.
|
|
10
|
+
*
|
|
11
|
+
* Ephemeral tokens expire, so on `disconnected` (after having connected at
|
|
12
|
+
* least once) the transport is torn down and rebuilt with a fresh token,
|
|
13
|
+
* using exponential backoff.
|
|
14
|
+
*/
|
|
15
|
+
export class DocSession {
|
|
16
|
+
docName;
|
|
17
|
+
doc;
|
|
18
|
+
#config;
|
|
19
|
+
#status = 'connecting';
|
|
20
|
+
#error = null;
|
|
21
|
+
#transport;
|
|
22
|
+
#listeners = new Set();
|
|
23
|
+
#startPromise;
|
|
24
|
+
#destroyed = false;
|
|
25
|
+
#reconnectTimer;
|
|
26
|
+
#attempt = 0;
|
|
27
|
+
constructor(docName, config) {
|
|
28
|
+
this.docName = docName;
|
|
29
|
+
this.#config = config;
|
|
30
|
+
this.doc = new Y.Doc();
|
|
31
|
+
}
|
|
32
|
+
get transport() {
|
|
33
|
+
return this.#transport;
|
|
34
|
+
}
|
|
35
|
+
get error() {
|
|
36
|
+
return this.#error;
|
|
37
|
+
}
|
|
38
|
+
getStatus() {
|
|
39
|
+
return this.#status;
|
|
40
|
+
}
|
|
41
|
+
subscribe(listener) {
|
|
42
|
+
this.#listeners.add(listener);
|
|
43
|
+
// Idempotent: start only fires once (first subscriber).
|
|
44
|
+
void this.start();
|
|
45
|
+
return () => {
|
|
46
|
+
this.#listeners.delete(listener);
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Idempotent — token + transport created a single time per generation. */
|
|
50
|
+
start() {
|
|
51
|
+
if (this.#startPromise)
|
|
52
|
+
return this.#startPromise;
|
|
53
|
+
this.#startPromise = this.#start();
|
|
54
|
+
return this.#startPromise;
|
|
55
|
+
}
|
|
56
|
+
async #start() {
|
|
57
|
+
try {
|
|
58
|
+
const info = await fetchToken(this.#config, this.docName);
|
|
59
|
+
if (this.#destroyed)
|
|
60
|
+
return;
|
|
61
|
+
if (info.engine === 'automerge') {
|
|
62
|
+
throw new Error("engine 'automerge' has no client-side hooks yet — use engine yjs or partykit");
|
|
63
|
+
}
|
|
64
|
+
const factory = this.#config.createTransport ?? defaultTransportFactory;
|
|
65
|
+
const transport = factory(info, this.doc, this.docName);
|
|
66
|
+
this.#transport = transport;
|
|
67
|
+
transport.subscribe(() => {
|
|
68
|
+
if (!this.#transport)
|
|
69
|
+
return;
|
|
70
|
+
this.#applyStatus(this.#transport.getStatus());
|
|
71
|
+
});
|
|
72
|
+
this.#applyStatus(transport.getStatus());
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
this.#setStatus('error', error instanceof Error ? error : new Error(String(error)));
|
|
76
|
+
this.#scheduleReconnect();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
#applyStatus(status) {
|
|
80
|
+
if (status === 'connected') {
|
|
81
|
+
// Successful connection resets the backoff window.
|
|
82
|
+
this.#attempt = 0;
|
|
83
|
+
}
|
|
84
|
+
this.#setStatus(status);
|
|
85
|
+
if (status === 'disconnected' && !this.#destroyed) {
|
|
86
|
+
this.#scheduleReconnect();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
#setStatus(status, error = this.#error) {
|
|
90
|
+
const changed = status !== this.#status || error !== this.#error;
|
|
91
|
+
this.#status = status;
|
|
92
|
+
this.#error = error;
|
|
93
|
+
if (changed) {
|
|
94
|
+
for (const listener of this.#listeners)
|
|
95
|
+
listener();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Tears the current transport down and rebuilds it with a fresh token.
|
|
100
|
+
* Backoff doubles per failed attempt and caps at {@link MAX_RECONNECT_DELAY_MS}.
|
|
101
|
+
*/
|
|
102
|
+
#scheduleReconnect() {
|
|
103
|
+
if (this.#reconnectTimer || this.#destroyed)
|
|
104
|
+
return;
|
|
105
|
+
const delay = Math.min(1000 * 2 ** this.#attempt, MAX_RECONNECT_DELAY_MS);
|
|
106
|
+
this.#attempt += 1;
|
|
107
|
+
this.#reconnectTimer = setTimeout(() => {
|
|
108
|
+
this.#reconnectTimer = undefined;
|
|
109
|
+
if (this.#destroyed)
|
|
110
|
+
return;
|
|
111
|
+
this.#transport?.destroy();
|
|
112
|
+
this.#transport = undefined;
|
|
113
|
+
this.#startPromise = undefined;
|
|
114
|
+
this.#setStatus('connecting');
|
|
115
|
+
void this.start();
|
|
116
|
+
}, delay);
|
|
117
|
+
}
|
|
118
|
+
destroy() {
|
|
119
|
+
this.#destroyed = true;
|
|
120
|
+
if (this.#reconnectTimer)
|
|
121
|
+
clearTimeout(this.#reconnectTimer);
|
|
122
|
+
this.#transport?.destroy();
|
|
123
|
+
this.doc.destroy();
|
|
124
|
+
for (const listener of this.#listeners)
|
|
125
|
+
listener();
|
|
126
|
+
this.#listeners.clear();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as Y from 'yjs';
|
|
2
|
+
import type { CollabTokenInfo, CollabTransport } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Transporte pra engine `yjs` self-hosted: Hocuspocus rodando embutido no
|
|
5
|
+
* server Adonis (upgrade no path /collaboration).
|
|
6
|
+
*/
|
|
7
|
+
type StatusListener = () => void;
|
|
8
|
+
export declare class HocuspocusCollabTransport implements CollabTransport {
|
|
9
|
+
readonly doc: Y.Doc;
|
|
10
|
+
private provider;
|
|
11
|
+
private status;
|
|
12
|
+
private listeners;
|
|
13
|
+
constructor(info: CollabTokenInfo, doc: Y.Doc, docName: string);
|
|
14
|
+
get awareness(): import("y-protocols/awareness.js").Awareness | null;
|
|
15
|
+
getStatus(): import('../types.js').CollabStatus;
|
|
16
|
+
subscribe(listener: StatusListener): () => void;
|
|
17
|
+
destroy(): void;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=hocuspocus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hocuspocus.d.ts","sourceRoot":"","sources":["../../../src/transports/hocuspocus.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGpE;;;GAGG;AAEH,KAAK,cAAc,GAAG,MAAM,IAAI,CAAC;AAEjC,qBAAa,yBAA0B,YAAW,eAAe;IAC/D,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,MAAM,CAAoD;IAClE,OAAO,CAAC,SAAS,CAA6B;gBAElC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM;IA2B9D,IAAI,SAAS,wDAEZ;IAED,SAAS,IAAI,OAAO,aAAa,EAAE,YAAY;IAI/C,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI;IAK/C,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { HocuspocusProvider } from '@hocuspocus/provider';
|
|
2
|
+
export class HocuspocusCollabTransport {
|
|
3
|
+
doc;
|
|
4
|
+
provider;
|
|
5
|
+
status = 'connecting';
|
|
6
|
+
listeners = new Set();
|
|
7
|
+
constructor(info, doc, docName) {
|
|
8
|
+
this.doc = doc;
|
|
9
|
+
// wsUrl do server é o path (/collaboration); converte pra ws(s)://
|
|
10
|
+
// usando o origin da página quando relativo.
|
|
11
|
+
const url = info.wsUrl.startsWith('ws')
|
|
12
|
+
? info.wsUrl
|
|
13
|
+
: `${globalThis.location?.protocol === 'https:' ? 'wss' : 'ws'}://${globalThis.location?.host ?? 'localhost'}${info.wsUrl}`;
|
|
14
|
+
this.provider = new HocuspocusProvider({
|
|
15
|
+
url,
|
|
16
|
+
name: docName,
|
|
17
|
+
document: doc,
|
|
18
|
+
token: info.token,
|
|
19
|
+
});
|
|
20
|
+
this.provider.on('status', ({ status }) => {
|
|
21
|
+
this.status =
|
|
22
|
+
status === 'connected'
|
|
23
|
+
? 'connected'
|
|
24
|
+
: status === 'disconnected'
|
|
25
|
+
? 'disconnected'
|
|
26
|
+
: 'connecting';
|
|
27
|
+
for (const listener of this.listeners)
|
|
28
|
+
listener();
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
get awareness() {
|
|
32
|
+
return this.provider.awareness;
|
|
33
|
+
}
|
|
34
|
+
getStatus() {
|
|
35
|
+
return this.status;
|
|
36
|
+
}
|
|
37
|
+
subscribe(listener) {
|
|
38
|
+
this.listeners.add(listener);
|
|
39
|
+
return () => this.listeners.delete(listener);
|
|
40
|
+
}
|
|
41
|
+
destroy() {
|
|
42
|
+
void this.provider.destroy();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=hocuspocus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hocuspocus.js","sourceRoot":"","sources":["../../../src/transports/hocuspocus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAY1D,MAAM,OAAO,yBAAyB;IAC3B,GAAG,CAAQ;IACZ,QAAQ,CAAqB;IAC7B,MAAM,GAAuC,YAAY,CAAC;IAC1D,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE9C,YAAY,IAAqB,EAAE,GAAU,EAAE,OAAe;QAC5D,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,mEAAmE;QACnE,6CAA6C;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;YACrC,CAAC,CAAC,IAAI,CAAC,KAAK;YACZ,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,UAAU,CAAC,QAAQ,EAAE,IAAI,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAE9H,IAAI,CAAC,QAAQ,GAAG,IAAI,kBAAkB,CAAC;YACrC,GAAG;YACH,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAsB,EAAE,EAAE;YAC5D,IAAI,CAAC,MAAM;gBACT,MAAM,KAAK,WAAW;oBACpB,CAAC,CAAC,WAAW;oBACb,CAAC,CAAC,MAAM,KAAK,cAAc;wBACzB,CAAC,CAAC,cAAc;wBAChB,CAAC,CAAC,YAAY,CAAC;YACrB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;gBAAE,QAAQ,EAAE,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;IACjC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,SAAS,CAAC,QAAwB;QAChC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transports/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoC,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKtF,+EAA+E;AAC/E,eAAO,MAAM,uBAAuB,EAAE,gBAcrC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { HocuspocusCollabTransport } from './hocuspocus.js';
|
|
2
|
+
import { PartyKitCollabTransport } from './partykit.js';
|
|
3
|
+
import { PartyServerCollabTransport } from './partyserver.js';
|
|
4
|
+
/** Factory default: escolhe o transporte pelo engine informado pelo server. */
|
|
5
|
+
export const defaultTransportFactory = (info, doc, docName) => {
|
|
6
|
+
if (info.engine === 'partykit') {
|
|
7
|
+
return new PartyKitCollabTransport(info, doc, docName);
|
|
8
|
+
}
|
|
9
|
+
if (info.engine === 'partyserver') {
|
|
10
|
+
return new PartyServerCollabTransport(info, doc, docName);
|
|
11
|
+
}
|
|
12
|
+
// yjs self-hosted (hocuspocus embutido). Automerge client ainda não tem
|
|
13
|
+
// provider aqui — erro explícito no session.start().
|
|
14
|
+
return new HocuspocusCollabTransport(info, doc, docName);
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transports/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAE9D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,uBAAuB,GAAqB,CACvD,IAAqB,EACrB,GAAU,EACV,OAAe,EACE,EAAE;IACnB,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO,IAAI,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;QAClC,OAAO,IAAI,0BAA0B,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IACD,wEAAwE;IACxE,qDAAqD;IACrD,OAAO,IAAI,yBAAyB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CollabStatus } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Maps a provider's raw status string onto the session-level CollabStatus.
|
|
4
|
+
* Single normalization point for every transport adapter.
|
|
5
|
+
*/
|
|
6
|
+
export declare function normalizeStatus(raw: string | undefined, fallback?: CollabStatus): CollabStatus;
|
|
7
|
+
//# sourceMappingURL=normalize_status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize_status.d.ts","sourceRoot":"","sources":["../../../src/transports/normalize_status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,QAAQ,GAAE,YAA2B,GACpC,YAAY,CAId"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps a provider's raw status string onto the session-level CollabStatus.
|
|
3
|
+
* Single normalization point for every transport adapter.
|
|
4
|
+
*/
|
|
5
|
+
export function normalizeStatus(raw, fallback = 'connecting') {
|
|
6
|
+
if (raw === 'connected')
|
|
7
|
+
return 'connected';
|
|
8
|
+
if (raw === 'disconnected')
|
|
9
|
+
return 'disconnected';
|
|
10
|
+
return fallback;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=normalize_status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize_status.js","sourceRoot":"","sources":["../../../src/transports/normalize_status.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAuB,EACvB,WAAyB,YAAY;IAErC,IAAI,GAAG,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IAC5C,IAAI,GAAG,KAAK,cAAc;QAAE,OAAO,cAAc,CAAC;IAClD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type * as AwarenessProtocol from 'y-protocols/awareness.js';
|
|
2
|
+
import * as Y from 'yjs';
|
|
3
|
+
import type { CollabStatus, CollabTokenInfo, CollabTransport } from '../types.js';
|
|
4
|
+
export declare class PartyKitCollabTransport implements CollabTransport {
|
|
5
|
+
readonly doc: Y.Doc;
|
|
6
|
+
private provider;
|
|
7
|
+
private status;
|
|
8
|
+
private listeners;
|
|
9
|
+
constructor(info: CollabTokenInfo, doc: Y.Doc, docName: string);
|
|
10
|
+
get awareness(): AwarenessProtocol.Awareness;
|
|
11
|
+
getStatus(): CollabStatus;
|
|
12
|
+
subscribe(listener: () => void): () => void;
|
|
13
|
+
destroy(): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=partykit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partykit.d.ts","sourceRoot":"","sources":["../../../src/transports/partykit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAmClF,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;IACpB,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,SAAS,CAAyB;gBAE9B,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM;IAiD9D,IAAI,SAAS,IAAI,iBAAiB,CAAC,SAAS,CAE3C;IAED,SAAS,IAAI,YAAY;IAIzB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAK3C,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as PartyKitModule from 'y-partykit/provider';
|
|
2
|
+
const YPartyKitProviderCtor = PartyKitModule
|
|
3
|
+
.YPartyKitProvider;
|
|
4
|
+
export class PartyKitCollabTransport {
|
|
5
|
+
doc;
|
|
6
|
+
provider;
|
|
7
|
+
status = 'connecting';
|
|
8
|
+
listeners = new Set();
|
|
9
|
+
constructor(info, doc, docName) {
|
|
10
|
+
this.doc = doc;
|
|
11
|
+
// wsUrl esperado: <host>/parties/<party>/<room> ou host simples.
|
|
12
|
+
const url = new URL(info.wsUrl.startsWith('http') ? info.wsUrl : `https://${info.wsUrl}`, globalThis.location?.origin ?? 'https://localhost');
|
|
13
|
+
const partyFromPath = /^\/parties\/([^/]+)\//.exec(url.pathname);
|
|
14
|
+
const party = partyFromPath?.[1];
|
|
15
|
+
const room = partyFromPath
|
|
16
|
+
? decodeURIComponent(url.pathname.replace(/^\/parties\/[^/]+\//, ''))
|
|
17
|
+
: decodeURIComponent(url.pathname.replace(/^\//, ''));
|
|
18
|
+
const protocol = url.protocol === 'http:' || url.protocol === 'ws:' ? 'ws' : 'wss';
|
|
19
|
+
this.provider = new YPartyKitProviderCtor(url.host, room.length > 0 ? room : docName, doc, {
|
|
20
|
+
...(party ? { party } : {}),
|
|
21
|
+
protocol: protocol === 'ws' ? 'ws' : 'wss',
|
|
22
|
+
params: { token: info.token },
|
|
23
|
+
});
|
|
24
|
+
const emit = () => {
|
|
25
|
+
for (const listener of this.listeners)
|
|
26
|
+
listener();
|
|
27
|
+
};
|
|
28
|
+
this.provider.on('status', (arg) => {
|
|
29
|
+
const status = arg?.status ?? '';
|
|
30
|
+
this.status =
|
|
31
|
+
status === 'connected'
|
|
32
|
+
? 'connected'
|
|
33
|
+
: status === 'disconnected'
|
|
34
|
+
? 'disconnected'
|
|
35
|
+
: 'connecting';
|
|
36
|
+
emit();
|
|
37
|
+
});
|
|
38
|
+
this.provider.on('connection-error', () => {
|
|
39
|
+
this.status = 'error';
|
|
40
|
+
emit();
|
|
41
|
+
});
|
|
42
|
+
this.provider.on('connection-close', () => {
|
|
43
|
+
if (this.status !== 'error') {
|
|
44
|
+
this.status = 'disconnected';
|
|
45
|
+
emit();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
get awareness() {
|
|
50
|
+
return this.provider.awareness;
|
|
51
|
+
}
|
|
52
|
+
getStatus() {
|
|
53
|
+
return this.status;
|
|
54
|
+
}
|
|
55
|
+
subscribe(listener) {
|
|
56
|
+
this.listeners.add(listener);
|
|
57
|
+
return () => this.listeners.delete(listener);
|
|
58
|
+
}
|
|
59
|
+
destroy() {
|
|
60
|
+
this.provider.destroy();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=partykit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partykit.js","sourceRoot":"","sources":["../../../src/transports/partykit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type * as AwarenessProtocol from 'y-protocols/awareness.js';
|
|
2
|
+
import * as Y from 'yjs';
|
|
3
|
+
import type { CollabStatus, CollabTokenInfo, CollabTransport } from '../types.js';
|
|
4
|
+
export declare class PartyServerCollabTransport implements CollabTransport {
|
|
5
|
+
readonly doc: Y.Doc;
|
|
6
|
+
private provider;
|
|
7
|
+
private status;
|
|
8
|
+
private listeners;
|
|
9
|
+
constructor(info: CollabTokenInfo, doc: Y.Doc, docName: string);
|
|
10
|
+
get awareness(): AwarenessProtocol.Awareness;
|
|
11
|
+
getStatus(): CollabStatus;
|
|
12
|
+
subscribe(listener: () => void): () => void;
|
|
13
|
+
destroy(): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=partyserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partyserver.d.ts","sourceRoot":"","sources":["../../../src/transports/partyserver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAqClF,qBAAa,0BAA2B,YAAW,eAAe;IAChE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,SAAS,CAAyB;gBAE9B,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM;IA+C9D,IAAI,SAAS,IAAI,iBAAiB,CAAC,SAAS,CAE3C;IAED,SAAS,IAAI,YAAY;IAIzB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAK3C,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as PartyServerModule from 'y-partyserver/provider';
|
|
2
|
+
const YProviderCtor = PartyServerModule
|
|
3
|
+
.YProvider ?? PartyServerModule.default;
|
|
4
|
+
export class PartyServerCollabTransport {
|
|
5
|
+
doc;
|
|
6
|
+
provider;
|
|
7
|
+
status = 'connecting';
|
|
8
|
+
listeners = new Set();
|
|
9
|
+
constructor(info, doc, docName) {
|
|
10
|
+
if (!YProviderCtor) {
|
|
11
|
+
throw new Error('y-partyserver/provider did not export a provider class');
|
|
12
|
+
}
|
|
13
|
+
this.doc = doc;
|
|
14
|
+
// wsUrl expected: <host>/parties/<party>/<room> or a bare host.
|
|
15
|
+
const url = new URL(info.wsUrl.startsWith('http') ? info.wsUrl : `https://${info.wsUrl}`, globalThis.location?.origin ?? 'https://localhost');
|
|
16
|
+
const partyFromPath = /^\/parties\/([^/]+)\//.exec(url.pathname);
|
|
17
|
+
const party = partyFromPath?.[1];
|
|
18
|
+
const room = partyFromPath
|
|
19
|
+
? decodeURIComponent(url.pathname.replace(/^\/parties\/[^/]+\//, ''))
|
|
20
|
+
: decodeURIComponent(url.pathname.replace(/^\//, ''));
|
|
21
|
+
this.provider = new YProviderCtor(url.host, room.length > 0 ? room : docName, doc, {
|
|
22
|
+
...(party ? { party } : {}),
|
|
23
|
+
protocol: url.protocol === 'http:' || url.protocol === 'ws:' ? 'ws' : 'wss',
|
|
24
|
+
params: { token: info.token },
|
|
25
|
+
});
|
|
26
|
+
const emit = () => {
|
|
27
|
+
for (const listener of this.listeners)
|
|
28
|
+
listener();
|
|
29
|
+
};
|
|
30
|
+
this.provider.on('status', (arg) => {
|
|
31
|
+
const raw = arg?.status;
|
|
32
|
+
this.status =
|
|
33
|
+
raw === 'connected' ? 'connected' : raw === 'disconnected' ? 'disconnected' : 'connecting';
|
|
34
|
+
emit();
|
|
35
|
+
});
|
|
36
|
+
this.provider.on('connection-error', () => {
|
|
37
|
+
this.status = 'error';
|
|
38
|
+
emit();
|
|
39
|
+
});
|
|
40
|
+
this.provider.on('connection-close', () => {
|
|
41
|
+
if (this.status !== 'error') {
|
|
42
|
+
this.status = 'disconnected';
|
|
43
|
+
emit();
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
get awareness() {
|
|
48
|
+
return this.provider.awareness;
|
|
49
|
+
}
|
|
50
|
+
getStatus() {
|
|
51
|
+
return this.status;
|
|
52
|
+
}
|
|
53
|
+
subscribe(listener) {
|
|
54
|
+
this.listeners.add(listener);
|
|
55
|
+
return () => this.listeners.delete(listener);
|
|
56
|
+
}
|
|
57
|
+
destroy() {
|
|
58
|
+
this.provider.destroy();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=partyserver.js.map
|