@athenaintel/react 0.30.0 → 0.35.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 +160 -9
- package/dist/agent-runtime/src/athena-asset-drag.cjs +44 -0
- package/dist/agent-runtime/src/athena-asset-drag.cjs.map +1 -0
- package/dist/agent-runtime/src/athena-asset-drag.js +44 -0
- package/dist/agent-runtime/src/athena-asset-drag.js.map +1 -0
- package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
- package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
- package/dist/agent-runtime/src/config-mutations.cjs +59 -0
- package/dist/agent-runtime/src/config-mutations.cjs.map +1 -0
- package/dist/agent-runtime/src/config-mutations.js +59 -0
- package/dist/agent-runtime/src/config-mutations.js.map +1 -0
- package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs +2 -3
- package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
- package/dist/agent-runtime/src/deep-agent-transport-recipe.js +3 -4
- package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
- package/dist/agent-runtime/src/edit-command.cjs.map +1 -1
- package/dist/agent-runtime/src/edit-command.js.map +1 -1
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs +6 -0
- package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
- package/dist/agent-runtime/src/generated/runconfig-contract.js +6 -0
- package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
- package/dist/agent-runtime/src/messages.cjs +57 -2
- package/dist/agent-runtime/src/messages.cjs.map +1 -1
- package/dist/agent-runtime/src/messages.js +57 -2
- package/dist/agent-runtime/src/messages.js.map +1 -1
- package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +72 -3
- package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
- package/dist/agent-runtime/src/quota-safe-local-storage-session.js +73 -4
- package/dist/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
- package/dist/agent-runtime/src/statewire-transport.cjs +4 -13
- package/dist/agent-runtime/src/statewire-transport.cjs.map +1 -1
- package/dist/agent-runtime/src/statewire-transport.js +5 -14
- package/dist/agent-runtime/src/statewire-transport.js.map +1 -1
- package/dist/agent-runtime/src/tool-metadata.cjs +26 -7
- package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
- package/dist/agent-runtime/src/tool-metadata.js +26 -7
- package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-config.cjs +117 -1
- package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-config.js +118 -2
- package/dist/agent-runtime/src/use-deep-agent-config.js.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
- package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
- package/dist/assets/AthenaAssetEmbed.cjs +9 -2
- package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
- package/dist/assets/AthenaAssetEmbed.d.ts +9 -0
- package/dist/assets/AthenaAssetEmbed.js +11 -4
- package/dist/assets/AthenaAssetEmbed.js.map +1 -1
- package/dist/assets/asset-embed-messages.cjs +6 -0
- package/dist/assets/asset-embed-messages.cjs.map +1 -1
- package/dist/assets/asset-embed-messages.d.ts +7 -0
- package/dist/assets/asset-embed-messages.js +6 -0
- package/dist/assets/asset-embed-messages.js.map +1 -1
- package/dist/assets/use-asset-embed.cjs +71 -71
- package/dist/assets/use-asset-embed.cjs.map +1 -1
- package/dist/assets/use-asset-embed.d.ts +20 -7
- package/dist/assets/use-asset-embed.js +72 -72
- package/dist/assets/use-asset-embed.js.map +1 -1
- package/dist/catalog/agent-model-options.cjs +122 -0
- package/dist/catalog/agent-model-options.cjs.map +1 -0
- package/dist/catalog/agent-model-options.d.ts +115 -0
- package/dist/catalog/agent-model-options.js +122 -0
- package/dist/catalog/agent-model-options.js.map +1 -0
- package/dist/catalog/chat-pickers.cjs +184 -4
- package/dist/catalog/chat-pickers.cjs.map +1 -1
- package/dist/catalog/chat-pickers.d.ts +27 -3
- package/dist/catalog/chat-pickers.js +187 -7
- package/dist/catalog/chat-pickers.js.map +1 -1
- package/dist/catalog/runtime-catalog.cjs +117 -3
- package/dist/catalog/runtime-catalog.cjs.map +1 -1
- package/dist/catalog/runtime-catalog.d.ts +104 -0
- package/dist/catalog/runtime-catalog.js +119 -5
- package/dist/catalog/runtime-catalog.js.map +1 -1
- package/dist/chat/AthenaChat.cjs +41 -26
- package/dist/chat/AthenaChat.cjs.map +1 -1
- package/dist/chat/AthenaChat.d.ts +8 -7
- package/dist/chat/AthenaChat.js +41 -26
- package/dist/chat/AthenaChat.js.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.cjs +61 -14
- package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingCard.d.ts +26 -12
- package/dist/chat/super-grouping/SuperGroupingCard.js +63 -16
- package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +80 -53
- package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
- package/dist/chat/super-grouping/SuperGroupingTranscript.d.ts +10 -10
- package/dist/chat/super-grouping/SuperGroupingTranscript.js +81 -54
- package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.cjs +19 -4
- package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
- package/dist/chat/super-grouping/activity-timeline.d.ts +24 -5
- package/dist/chat/super-grouping/activity-timeline.js +19 -4
- package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
- package/dist/chat/super-grouping/index.cjs +2 -0
- package/dist/chat/super-grouping/index.cjs.map +1 -1
- package/dist/chat/super-grouping/index.d.ts +7 -6
- package/dist/chat/super-grouping/index.js +3 -1
- package/dist/chat/super-grouping/toolkit-map.cjs +4 -1
- package/dist/chat/super-grouping/toolkit-map.cjs.map +1 -1
- package/dist/chat/super-grouping/toolkit-map.js +4 -1
- package/dist/chat/super-grouping/toolkit-map.js.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.cjs +40 -4
- package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
- package/dist/chat-ui/composer/tiptap-composer.js +40 -4
- package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
- package/dist/chat-ui/index.cjs +1 -0
- package/dist/chat-ui/index.cjs.map +1 -1
- package/dist/chat-ui/index.d.ts +1 -1
- package/dist/chat-ui/index.js +2 -1
- package/dist/chat-ui/mentions/mention-chip.cjs +29 -2
- package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.d.ts +2 -5
- package/dist/chat-ui/mentions/mention-chip.js +30 -3
- package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
- package/dist/chat-ui/mentions/mention-extension.cjs +1 -1
- package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-extension.js +1 -1
- package/dist/chat-ui/mentions/mention-extension.js.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +33 -2
- package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
- package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +14 -0
- package/dist/chat-ui/mentions/suggestions/data/api-client.js +33 -2
- package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
- package/dist/chat-ui/mentions/use-account-workspace-id.cjs +61 -0
- package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -0
- package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +3 -0
- package/dist/chat-ui/mentions/use-account-workspace-id.js +61 -0
- package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -0
- package/dist/chat-ui/mentions/use-member-avatar.cjs +75 -0
- package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -0
- package/dist/chat-ui/mentions/use-member-avatar.d.ts +2 -0
- package/dist/chat-ui/mentions/use-member-avatar.js +75 -0
- package/dist/chat-ui/mentions/use-member-avatar.js.map +1 -0
- package/dist/collab/client.cjs +80 -19
- package/dist/collab/client.cjs.map +1 -1
- package/dist/collab/client.d.ts +22 -0
- package/dist/collab/client.js +80 -19
- package/dist/collab/client.js.map +1 -1
- package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
- package/dist/diagnostics/athena-diagnostics.d.ts +3 -1
- package/dist/diagnostics/athena-diagnostics.js.map +1 -1
- package/dist/index.cjs +5 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/use-athena-rest-query.cjs +4 -0
- package/dist/lib/use-athena-rest-query.cjs.map +1 -1
- package/dist/lib/use-athena-rest-query.d.ts +6 -0
- package/dist/lib/use-athena-rest-query.js +4 -0
- package/dist/lib/use-athena-rest-query.js.map +1 -1
- package/dist/provider/AthenaProvider.cjs +57 -6
- package/dist/provider/AthenaProvider.cjs.map +1 -1
- package/dist/provider/AthenaProvider.d.ts +21 -5
- package/dist/provider/AthenaProvider.js +59 -8
- package/dist/provider/AthenaProvider.js.map +1 -1
- package/dist/provider/agent-selection-context.cjs +6 -0
- package/dist/provider/agent-selection-context.cjs.map +1 -0
- package/dist/provider/agent-selection-context.d.ts +14 -0
- package/dist/provider/agent-selection-context.js +6 -0
- package/dist/provider/agent-selection-context.js.map +1 -0
- package/dist/react/package.json.cjs +1 -1
- package/dist/react/package.json.js +1 -1
- package/dist/runtime/StatewireThreadConfigLaneSync.cjs +125 -0
- package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -0
- package/dist/runtime/StatewireThreadConfigLaneSync.d.ts +54 -0
- package/dist/runtime/StatewireThreadConfigLaneSync.js +125 -0
- package/dist/runtime/StatewireThreadConfigLaneSync.js.map +1 -0
- package/dist/runtime/statewire-lifecycle.cjs +5 -2
- package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
- package/dist/runtime/statewire-lifecycle.d.ts +5 -0
- package/dist/runtime/statewire-lifecycle.js +5 -2
- package/dist/runtime/statewire-lifecycle.js.map +1 -1
- package/dist/runtime/statewire-model-lane.cjs +16 -0
- package/dist/runtime/statewire-model-lane.cjs.map +1 -0
- package/dist/runtime/statewire-model-lane.d.ts +66 -0
- package/dist/runtime/statewire-model-lane.js +16 -0
- package/dist/runtime/statewire-model-lane.js.map +1 -0
- package/dist/runtime/statewire-run-config.cjs +16 -2
- package/dist/runtime/statewire-run-config.cjs.map +1 -1
- package/dist/runtime/statewire-run-config.d.ts +10 -0
- package/dist/runtime/statewire-run-config.js +16 -2
- package/dist/runtime/statewire-run-config.js.map +1 -1
- package/dist/runtime/statewire-server-lane-context.cjs +24 -0
- package/dist/runtime/statewire-server-lane-context.cjs.map +1 -0
- package/dist/runtime/statewire-server-lane-context.d.ts +30 -0
- package/dist/runtime/statewire-server-lane-context.js +24 -0
- package/dist/runtime/statewire-server-lane-context.js.map +1 -0
- package/dist/runtime/statewire-thread-config-lane.cjs +84 -0
- package/dist/runtime/statewire-thread-config-lane.cjs.map +1 -0
- package/dist/runtime/statewire-thread-config-lane.d.ts +94 -0
- package/dist/runtime/statewire-thread-config-lane.js +84 -0
- package/dist/runtime/statewire-thread-config-lane.js.map +1 -0
- package/dist/runtime/useAthenaStatewireRuntime.cjs +38 -18
- package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
- package/dist/runtime/useAthenaStatewireRuntime.d.ts +8 -1
- package/dist/runtime/useAthenaStatewireRuntime.js +39 -19
- package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/threads/api.cjs +2 -1
- package/dist/threads/api.cjs.map +1 -1
- package/dist/threads/api.d.ts +1 -0
- package/dist/threads/api.js +2 -1
- package/dist/threads/api.js.map +1 -1
- package/dist/threads/use-athena-thread-model.cjs +22 -0
- package/dist/threads/use-athena-thread-model.cjs.map +1 -0
- package/dist/threads/use-athena-thread-model.d.ts +27 -0
- package/dist/threads/use-athena-thread-model.js +22 -0
- package/dist/threads/use-athena-thread-model.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { useState, useEffect } from "react";
|
|
2
|
+
import { withCredentialRenewal } from "../../runtime/credential-renewal.js";
|
|
3
|
+
import { fetchAccountIdentity } from "../../threads/api.js";
|
|
4
|
+
const workspaceIdRequests = /* @__PURE__ */ new Map();
|
|
5
|
+
function loadWorkspaceId(auth) {
|
|
6
|
+
if (auth.workspaceId) return Promise.resolve(auth.workspaceId);
|
|
7
|
+
const cacheKey = `${auth.backendUrl}|${auth.userId ?? ""}`;
|
|
8
|
+
const cached = workspaceIdRequests.get(cacheKey);
|
|
9
|
+
if (cached) return cached;
|
|
10
|
+
const request = withCredentialRenewal(
|
|
11
|
+
async ({ force } = {}) => {
|
|
12
|
+
var _a, _b;
|
|
13
|
+
return {
|
|
14
|
+
token: (force ? await ((_a = auth.renewAccessToken) == null ? void 0 : _a.call(auth)) : await ((_b = auth.getAccessToken) == null ? void 0 : _b.call(auth))) ?? auth.accessToken ?? null,
|
|
15
|
+
apiKey: auth.apiKey,
|
|
16
|
+
credentials: auth.credentials
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
(credential) => fetchAccountIdentity(auth.backendUrl, credential)
|
|
20
|
+
).then((identity) => identity.workspaceId ?? void 0).catch((error) => {
|
|
21
|
+
if (workspaceIdRequests.get(cacheKey) === request) {
|
|
22
|
+
workspaceIdRequests.delete(cacheKey);
|
|
23
|
+
}
|
|
24
|
+
throw error;
|
|
25
|
+
});
|
|
26
|
+
workspaceIdRequests.set(cacheKey, request);
|
|
27
|
+
return request;
|
|
28
|
+
}
|
|
29
|
+
function useAccountWorkspaceId(auth) {
|
|
30
|
+
const cacheKey = auth ? `${auth.backendUrl}|${auth.userId ?? ""}` : void 0;
|
|
31
|
+
const [resolvedWorkspace, setResolvedWorkspace] = useState();
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (!auth || !cacheKey) {
|
|
34
|
+
setResolvedWorkspace(void 0);
|
|
35
|
+
return void 0;
|
|
36
|
+
}
|
|
37
|
+
if (auth.workspaceId) {
|
|
38
|
+
setResolvedWorkspace({ cacheKey, workspaceId: auth.workspaceId });
|
|
39
|
+
return void 0;
|
|
40
|
+
}
|
|
41
|
+
let cancelled = false;
|
|
42
|
+
setResolvedWorkspace(void 0);
|
|
43
|
+
loadWorkspaceId(auth).then(
|
|
44
|
+
(workspaceId) => {
|
|
45
|
+
if (!cancelled) setResolvedWorkspace({ cacheKey, workspaceId });
|
|
46
|
+
},
|
|
47
|
+
() => {
|
|
48
|
+
if (!cancelled) setResolvedWorkspace({ cacheKey, workspaceId: void 0 });
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
return () => {
|
|
52
|
+
cancelled = true;
|
|
53
|
+
};
|
|
54
|
+
}, [auth, cacheKey]);
|
|
55
|
+
if (auth == null ? void 0 : auth.workspaceId) return auth.workspaceId;
|
|
56
|
+
return cacheKey && (resolvedWorkspace == null ? void 0 : resolvedWorkspace.cacheKey) === cacheKey ? resolvedWorkspace.workspaceId : void 0;
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
useAccountWorkspaceId
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=use-account-workspace-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-account-workspace-id.js","sources":["../../../src/chat-ui/mentions/use-account-workspace-id.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { withCredentialRenewal } from \"../../runtime/credential-renewal\";\nimport { fetchAccountIdentity } from \"../../threads/api\";\nimport type { MentionAuthContext } from \"./suggestions/data/api-client\";\n\nconst workspaceIdRequests = new Map<string, Promise<string | undefined>>();\n\nfunction loadWorkspaceId(auth: MentionAuthContext): Promise<string | undefined> {\n if (auth.workspaceId) return Promise.resolve(auth.workspaceId);\n\n const cacheKey = `${auth.backendUrl}|${auth.userId ?? \"\"}`;\n const cached = workspaceIdRequests.get(cacheKey);\n if (cached) return cached;\n\n const request = withCredentialRenewal(\n async ({ force }: { force?: boolean } = {}) => ({\n token: (force ? await auth.renewAccessToken?.() : await auth.getAccessToken?.()) ?? auth.accessToken ?? null,\n apiKey: auth.apiKey,\n credentials: auth.credentials,\n }),\n (credential) => fetchAccountIdentity(auth.backendUrl, credential),\n )\n .then((identity) => identity.workspaceId ?? undefined)\n .catch((error: unknown) => {\n if (workspaceIdRequests.get(cacheKey) === request) {\n workspaceIdRequests.delete(cacheKey);\n }\n throw error;\n });\n\n workspaceIdRequests.set(cacheKey, request);\n return request;\n}\n\nexport function useAccountWorkspaceId(auth: MentionAuthContext | null): string | undefined {\n const cacheKey = auth ? `${auth.backendUrl}|${auth.userId ?? \"\"}` : undefined;\n const [resolvedWorkspace, setResolvedWorkspace] = useState<{\n cacheKey: string;\n workspaceId: string | undefined;\n }>();\n\n useEffect(() => {\n if (!auth || !cacheKey) {\n setResolvedWorkspace(undefined);\n return undefined;\n }\n if (auth.workspaceId) {\n setResolvedWorkspace({ cacheKey, workspaceId: auth.workspaceId });\n return undefined;\n }\n\n let cancelled = false;\n setResolvedWorkspace(undefined);\n loadWorkspaceId(auth).then(\n (workspaceId) => {\n if (!cancelled) setResolvedWorkspace({ cacheKey, workspaceId });\n },\n () => {\n if (!cancelled) setResolvedWorkspace({ cacheKey, workspaceId: undefined });\n },\n );\n\n return () => {\n cancelled = true;\n };\n }, [auth, cacheKey]);\n\n if (auth?.workspaceId) return auth.workspaceId;\n return cacheKey && resolvedWorkspace?.cacheKey === cacheKey ? resolvedWorkspace.workspaceId : undefined;\n}\n\nexport function resetAccountWorkspaceIdForTests(): void {\n workspaceIdRequests.clear();\n}\n"],"names":[],"mappings":";;;AAKA,MAAM,0CAA0B,IAAA;AAEhC,SAAS,gBAAgB,MAAuD;AAC9E,MAAI,KAAK,YAAa,QAAO,QAAQ,QAAQ,KAAK,WAAW;AAE7D,QAAM,WAAW,GAAG,KAAK,UAAU,IAAI,KAAK,UAAU,EAAE;AACxD,QAAM,SAAS,oBAAoB,IAAI,QAAQ;AAC/C,MAAI,OAAQ,QAAO;AAEnB,QAAM,UAAU;AAAA,IACd,OAAO,EAAE,MAAA,IAA+B,OAAC;;AAAO;AAAA,QAC9C,QAAQ,QAAQ,QAAM,UAAK,qBAAL,iCAA4B,QAAM,UAAK,mBAAL,mCAA4B,KAAK,eAAe;AAAA,QACxG,QAAQ,KAAK;AAAA,QACb,aAAa,KAAK;AAAA,MAAA;AAAA;AAAA,IAEpB,CAAC,eAAe,qBAAqB,KAAK,YAAY,UAAU;AAAA,EAAA,EAE/D,KAAK,CAAC,aAAa,SAAS,eAAe,MAAS,EACpD,MAAM,CAAC,UAAmB;AACzB,QAAI,oBAAoB,IAAI,QAAQ,MAAM,SAAS;AACjD,0BAAoB,OAAO,QAAQ;AAAA,IACrC;AACA,UAAM;AAAA,EACR,CAAC;AAEH,sBAAoB,IAAI,UAAU,OAAO;AACzC,SAAO;AACT;AAEO,SAAS,sBAAsB,MAAqD;AACzF,QAAM,WAAW,OAAO,GAAG,KAAK,UAAU,IAAI,KAAK,UAAU,EAAE,KAAK;AACpE,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAA;AAKlD,YAAU,MAAM;AACd,QAAI,CAAC,QAAQ,CAAC,UAAU;AACtB,2BAAqB,MAAS;AAC9B,aAAO;AAAA,IACT;AACA,QAAI,KAAK,aAAa;AACpB,2BAAqB,EAAE,UAAU,aAAa,KAAK,aAAa;AAChE,aAAO;AAAA,IACT;AAEA,QAAI,YAAY;AAChB,yBAAqB,MAAS;AAC9B,oBAAgB,IAAI,EAAE;AAAA,MACpB,CAAC,gBAAgB;AACf,YAAI,CAAC,UAAW,sBAAqB,EAAE,UAAU,aAAa;AAAA,MAChE;AAAA,MACA,MAAM;AACJ,YAAI,CAAC,UAAW,sBAAqB,EAAE,UAAU,aAAa,QAAW;AAAA,MAC3E;AAAA,IAAA;AAGF,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,MAAI,6BAAM,YAAa,QAAO,KAAK;AACnC,SAAO,aAAY,uDAAmB,cAAa,WAAW,kBAAkB,cAAc;AAChG;"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const apiClient = require("./suggestions/data/api-client.cjs");
|
|
5
|
+
const MEMBER_AVATAR_TTL_MS = 5 * 60 * 1e3;
|
|
6
|
+
const memberAvatarRequests = /* @__PURE__ */ new Map();
|
|
7
|
+
function loadMemberAvatars(auth) {
|
|
8
|
+
const workspaceId = auth.workspaceId;
|
|
9
|
+
if (!workspaceId) return Promise.resolve(/* @__PURE__ */ new Map());
|
|
10
|
+
const cacheKey = `${auth.backendUrl}|${workspaceId}`;
|
|
11
|
+
const cached = memberAvatarRequests.get(cacheKey);
|
|
12
|
+
if (cached && (cached.fetchedAt === null || Date.now() - cached.fetchedAt < MEMBER_AVATAR_TTL_MS)) {
|
|
13
|
+
return cached.request;
|
|
14
|
+
}
|
|
15
|
+
const entry = {
|
|
16
|
+
request: Promise.resolve(/* @__PURE__ */ new Map()),
|
|
17
|
+
fetchedAt: null
|
|
18
|
+
};
|
|
19
|
+
const request = apiClient.fetchGraphQL(
|
|
20
|
+
auth,
|
|
21
|
+
apiClient.WORKSPACE_MEMBERS_QUERY,
|
|
22
|
+
{ workspaceId }
|
|
23
|
+
).then((data) => {
|
|
24
|
+
var _a;
|
|
25
|
+
const avatars = /* @__PURE__ */ new Map();
|
|
26
|
+
for (const member of data.getUsersInWorkspace ?? []) {
|
|
27
|
+
const email = (_a = member.email) == null ? void 0 : _a.trim().toLowerCase();
|
|
28
|
+
if (email && member.avatarUrl != null) {
|
|
29
|
+
avatars.set(email, member.avatarUrl);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
entry.fetchedAt = Date.now();
|
|
33
|
+
return avatars;
|
|
34
|
+
}).catch((error) => {
|
|
35
|
+
if (memberAvatarRequests.get(cacheKey) === entry) {
|
|
36
|
+
memberAvatarRequests.delete(cacheKey);
|
|
37
|
+
}
|
|
38
|
+
throw error;
|
|
39
|
+
});
|
|
40
|
+
entry.request = request;
|
|
41
|
+
memberAvatarRequests.set(cacheKey, entry);
|
|
42
|
+
return request;
|
|
43
|
+
}
|
|
44
|
+
function useMemberAvatarUrl(email) {
|
|
45
|
+
const auth = react.useContext(apiClient.MentionAuthCtx);
|
|
46
|
+
const normalizedEmail = email == null ? void 0 : email.trim().toLowerCase();
|
|
47
|
+
const cacheKey = (auth == null ? void 0 : auth.workspaceId) && `${auth.backendUrl}|${auth.workspaceId}`;
|
|
48
|
+
const [resolvedAvatar, setResolvedAvatar] = react.useState();
|
|
49
|
+
react.useEffect(() => {
|
|
50
|
+
if (!auth || !cacheKey || !normalizedEmail) {
|
|
51
|
+
setResolvedAvatar(void 0);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
let cancelled = false;
|
|
55
|
+
loadMemberAvatars(auth).then(
|
|
56
|
+
(avatars) => {
|
|
57
|
+
if (!cancelled) {
|
|
58
|
+
setResolvedAvatar({ cacheKey, url: avatars.get(normalizedEmail) });
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
() => {
|
|
62
|
+
if (!cancelled) setResolvedAvatar({ cacheKey, url: void 0 });
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
return () => {
|
|
66
|
+
cancelled = true;
|
|
67
|
+
};
|
|
68
|
+
}, [auth, cacheKey, normalizedEmail]);
|
|
69
|
+
if (!cacheKey || !resolvedAvatar || resolvedAvatar.cacheKey !== cacheKey) {
|
|
70
|
+
return void 0;
|
|
71
|
+
}
|
|
72
|
+
return resolvedAvatar.url;
|
|
73
|
+
}
|
|
74
|
+
exports.useMemberAvatarUrl = useMemberAvatarUrl;
|
|
75
|
+
//# sourceMappingURL=use-member-avatar.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-member-avatar.cjs","sources":["../../../src/chat-ui/mentions/use-member-avatar.ts"],"sourcesContent":["import { useContext, useEffect, useState } from \"react\";\nimport {\n fetchGraphQL,\n MentionAuthCtx,\n WORKSPACE_MEMBERS_QUERY,\n} from \"./suggestions/data/api-client\";\nimport type { MentionAuthContext } from \"./suggestions/data/api-client\";\n\ntype WorkspaceMemberAvatar = {\n email?: string | null;\n avatarUrl?: string | null;\n};\n\ntype WorkspaceMembersResponse = {\n getUsersInWorkspace?: WorkspaceMemberAvatar[] | null;\n};\n\nconst MEMBER_AVATAR_TTL_MS = 5 * 60 * 1000;\n\ntype MemberAvatarCacheEntry = {\n request: Promise<Map<string, string>>;\n fetchedAt: number | null;\n};\n\nconst memberAvatarRequests = new Map<string, MemberAvatarCacheEntry>();\n\nfunction loadMemberAvatars(\n auth: MentionAuthContext,\n): Promise<Map<string, string>> {\n const workspaceId = auth.workspaceId;\n if (!workspaceId) return Promise.resolve(new Map());\n\n const cacheKey = `${auth.backendUrl}|${workspaceId}`;\n const cached = memberAvatarRequests.get(cacheKey);\n if (cached && (cached.fetchedAt === null || Date.now() - cached.fetchedAt < MEMBER_AVATAR_TTL_MS)) {\n return cached.request;\n }\n\n const entry: MemberAvatarCacheEntry = {\n request: Promise.resolve(new Map<string, string>()),\n fetchedAt: null,\n };\n const request = fetchGraphQL<WorkspaceMembersResponse>(\n auth,\n WORKSPACE_MEMBERS_QUERY,\n { workspaceId },\n )\n .then((data) => {\n const avatars = new Map<string, string>();\n for (const member of data.getUsersInWorkspace ?? []) {\n const email = member.email?.trim().toLowerCase();\n if (email && member.avatarUrl != null) {\n avatars.set(email, member.avatarUrl);\n }\n }\n entry.fetchedAt = Date.now();\n return avatars;\n })\n .catch((error: unknown) => {\n if (memberAvatarRequests.get(cacheKey) === entry) {\n memberAvatarRequests.delete(cacheKey);\n }\n throw error;\n });\n\n entry.request = request;\n memberAvatarRequests.set(cacheKey, entry);\n return request;\n}\n\nexport function useMemberAvatarUrl(\n email: string | undefined,\n): string | undefined {\n const auth = useContext(MentionAuthCtx);\n const normalizedEmail = email?.trim().toLowerCase();\n const cacheKey =\n auth?.workspaceId && `${auth.backendUrl}|${auth.workspaceId}`;\n const [resolvedAvatar, setResolvedAvatar] = useState<{\n cacheKey: string;\n url: string | undefined;\n }>();\n\n useEffect(() => {\n if (!auth || !cacheKey || !normalizedEmail) {\n setResolvedAvatar(undefined);\n return;\n }\n\n let cancelled = false;\n loadMemberAvatars(auth).then(\n (avatars) => {\n if (!cancelled) {\n setResolvedAvatar({ cacheKey, url: avatars.get(normalizedEmail) });\n }\n },\n () => {\n if (!cancelled) setResolvedAvatar({ cacheKey, url: undefined });\n },\n );\n\n return () => {\n cancelled = true;\n };\n }, [auth, cacheKey, normalizedEmail]);\n\n if (!cacheKey || !resolvedAvatar || resolvedAvatar.cacheKey !== cacheKey) {\n return undefined;\n }\n return resolvedAvatar.url;\n}\n\nexport function resetMemberAvatarsForTests(): void {\n memberAvatarRequests.clear();\n}\n"],"names":["fetchGraphQL","WORKSPACE_MEMBERS_QUERY","useContext","MentionAuthCtx","useState","useEffect"],"mappings":";;;;AAiBA,MAAM,uBAAuB,IAAI,KAAK;AAOtC,MAAM,2CAA2B,IAAA;AAEjC,SAAS,kBACP,MAC8B;AAC9B,QAAM,cAAc,KAAK;AACzB,MAAI,CAAC,YAAa,QAAO,QAAQ,QAAQ,oBAAI,KAAK;AAElD,QAAM,WAAW,GAAG,KAAK,UAAU,IAAI,WAAW;AAClD,QAAM,SAAS,qBAAqB,IAAI,QAAQ;AAChD,MAAI,WAAW,OAAO,cAAc,QAAQ,KAAK,IAAA,IAAQ,OAAO,YAAY,uBAAuB;AACjG,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,QAAgC;AAAA,IACpC,SAAS,QAAQ,QAAQ,oBAAI,KAAqB;AAAA,IAClD,WAAW;AAAA,EAAA;AAEb,QAAM,UAAUA,UAAAA;AAAAA,IACd;AAAA,IACAC,UAAAA;AAAAA,IACA,EAAE,YAAA;AAAA,EAAY,EAEb,KAAK,CAAC,SAAS;;AACd,UAAM,8BAAc,IAAA;AACpB,eAAW,UAAU,KAAK,uBAAuB,CAAA,GAAI;AACnD,YAAM,SAAQ,YAAO,UAAP,mBAAc,OAAO;AACnC,UAAI,SAAS,OAAO,aAAa,MAAM;AACrC,gBAAQ,IAAI,OAAO,OAAO,SAAS;AAAA,MACrC;AAAA,IACF;AACA,UAAM,YAAY,KAAK,IAAA;AACvB,WAAO;AAAA,EACT,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,QAAI,qBAAqB,IAAI,QAAQ,MAAM,OAAO;AAChD,2BAAqB,OAAO,QAAQ;AAAA,IACtC;AACA,UAAM;AAAA,EACR,CAAC;AAEH,QAAM,UAAU;AAChB,uBAAqB,IAAI,UAAU,KAAK;AACxC,SAAO;AACT;AAEO,SAAS,mBACd,OACoB;AACpB,QAAM,OAAOC,MAAAA,WAAWC,wBAAc;AACtC,QAAM,kBAAkB,+BAAO,OAAO;AACtC,QAAM,YACJ,6BAAM,gBAAe,GAAG,KAAK,UAAU,IAAI,KAAK,WAAW;AAC7D,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,eAAA;AAK5CC,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,iBAAiB;AAC1C,wBAAkB,MAAS;AAC3B;AAAA,IACF;AAEA,QAAI,YAAY;AAChB,sBAAkB,IAAI,EAAE;AAAA,MACtB,CAAC,YAAY;AACX,YAAI,CAAC,WAAW;AACd,4BAAkB,EAAE,UAAU,KAAK,QAAQ,IAAI,eAAe,GAAG;AAAA,QACnE;AAAA,MACF;AAAA,MACA,MAAM;AACJ,YAAI,CAAC,UAAW,mBAAkB,EAAE,UAAU,KAAK,QAAW;AAAA,MAChE;AAAA,IAAA;AAGF,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,eAAe,CAAC;AAEpC,MAAI,CAAC,YAAY,CAAC,kBAAkB,eAAe,aAAa,UAAU;AACxE,WAAO;AAAA,EACT;AACA,SAAO,eAAe;AACxB;;"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { useContext, useState, useEffect } from "react";
|
|
2
|
+
import { MentionAuthCtx, fetchGraphQL, WORKSPACE_MEMBERS_QUERY } from "./suggestions/data/api-client.js";
|
|
3
|
+
const MEMBER_AVATAR_TTL_MS = 5 * 60 * 1e3;
|
|
4
|
+
const memberAvatarRequests = /* @__PURE__ */ new Map();
|
|
5
|
+
function loadMemberAvatars(auth) {
|
|
6
|
+
const workspaceId = auth.workspaceId;
|
|
7
|
+
if (!workspaceId) return Promise.resolve(/* @__PURE__ */ new Map());
|
|
8
|
+
const cacheKey = `${auth.backendUrl}|${workspaceId}`;
|
|
9
|
+
const cached = memberAvatarRequests.get(cacheKey);
|
|
10
|
+
if (cached && (cached.fetchedAt === null || Date.now() - cached.fetchedAt < MEMBER_AVATAR_TTL_MS)) {
|
|
11
|
+
return cached.request;
|
|
12
|
+
}
|
|
13
|
+
const entry = {
|
|
14
|
+
request: Promise.resolve(/* @__PURE__ */ new Map()),
|
|
15
|
+
fetchedAt: null
|
|
16
|
+
};
|
|
17
|
+
const request = fetchGraphQL(
|
|
18
|
+
auth,
|
|
19
|
+
WORKSPACE_MEMBERS_QUERY,
|
|
20
|
+
{ workspaceId }
|
|
21
|
+
).then((data) => {
|
|
22
|
+
var _a;
|
|
23
|
+
const avatars = /* @__PURE__ */ new Map();
|
|
24
|
+
for (const member of data.getUsersInWorkspace ?? []) {
|
|
25
|
+
const email = (_a = member.email) == null ? void 0 : _a.trim().toLowerCase();
|
|
26
|
+
if (email && member.avatarUrl != null) {
|
|
27
|
+
avatars.set(email, member.avatarUrl);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
entry.fetchedAt = Date.now();
|
|
31
|
+
return avatars;
|
|
32
|
+
}).catch((error) => {
|
|
33
|
+
if (memberAvatarRequests.get(cacheKey) === entry) {
|
|
34
|
+
memberAvatarRequests.delete(cacheKey);
|
|
35
|
+
}
|
|
36
|
+
throw error;
|
|
37
|
+
});
|
|
38
|
+
entry.request = request;
|
|
39
|
+
memberAvatarRequests.set(cacheKey, entry);
|
|
40
|
+
return request;
|
|
41
|
+
}
|
|
42
|
+
function useMemberAvatarUrl(email) {
|
|
43
|
+
const auth = useContext(MentionAuthCtx);
|
|
44
|
+
const normalizedEmail = email == null ? void 0 : email.trim().toLowerCase();
|
|
45
|
+
const cacheKey = (auth == null ? void 0 : auth.workspaceId) && `${auth.backendUrl}|${auth.workspaceId}`;
|
|
46
|
+
const [resolvedAvatar, setResolvedAvatar] = useState();
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (!auth || !cacheKey || !normalizedEmail) {
|
|
49
|
+
setResolvedAvatar(void 0);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
let cancelled = false;
|
|
53
|
+
loadMemberAvatars(auth).then(
|
|
54
|
+
(avatars) => {
|
|
55
|
+
if (!cancelled) {
|
|
56
|
+
setResolvedAvatar({ cacheKey, url: avatars.get(normalizedEmail) });
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
() => {
|
|
60
|
+
if (!cancelled) setResolvedAvatar({ cacheKey, url: void 0 });
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
return () => {
|
|
64
|
+
cancelled = true;
|
|
65
|
+
};
|
|
66
|
+
}, [auth, cacheKey, normalizedEmail]);
|
|
67
|
+
if (!cacheKey || !resolvedAvatar || resolvedAvatar.cacheKey !== cacheKey) {
|
|
68
|
+
return void 0;
|
|
69
|
+
}
|
|
70
|
+
return resolvedAvatar.url;
|
|
71
|
+
}
|
|
72
|
+
export {
|
|
73
|
+
useMemberAvatarUrl
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=use-member-avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-member-avatar.js","sources":["../../../src/chat-ui/mentions/use-member-avatar.ts"],"sourcesContent":["import { useContext, useEffect, useState } from \"react\";\nimport {\n fetchGraphQL,\n MentionAuthCtx,\n WORKSPACE_MEMBERS_QUERY,\n} from \"./suggestions/data/api-client\";\nimport type { MentionAuthContext } from \"./suggestions/data/api-client\";\n\ntype WorkspaceMemberAvatar = {\n email?: string | null;\n avatarUrl?: string | null;\n};\n\ntype WorkspaceMembersResponse = {\n getUsersInWorkspace?: WorkspaceMemberAvatar[] | null;\n};\n\nconst MEMBER_AVATAR_TTL_MS = 5 * 60 * 1000;\n\ntype MemberAvatarCacheEntry = {\n request: Promise<Map<string, string>>;\n fetchedAt: number | null;\n};\n\nconst memberAvatarRequests = new Map<string, MemberAvatarCacheEntry>();\n\nfunction loadMemberAvatars(\n auth: MentionAuthContext,\n): Promise<Map<string, string>> {\n const workspaceId = auth.workspaceId;\n if (!workspaceId) return Promise.resolve(new Map());\n\n const cacheKey = `${auth.backendUrl}|${workspaceId}`;\n const cached = memberAvatarRequests.get(cacheKey);\n if (cached && (cached.fetchedAt === null || Date.now() - cached.fetchedAt < MEMBER_AVATAR_TTL_MS)) {\n return cached.request;\n }\n\n const entry: MemberAvatarCacheEntry = {\n request: Promise.resolve(new Map<string, string>()),\n fetchedAt: null,\n };\n const request = fetchGraphQL<WorkspaceMembersResponse>(\n auth,\n WORKSPACE_MEMBERS_QUERY,\n { workspaceId },\n )\n .then((data) => {\n const avatars = new Map<string, string>();\n for (const member of data.getUsersInWorkspace ?? []) {\n const email = member.email?.trim().toLowerCase();\n if (email && member.avatarUrl != null) {\n avatars.set(email, member.avatarUrl);\n }\n }\n entry.fetchedAt = Date.now();\n return avatars;\n })\n .catch((error: unknown) => {\n if (memberAvatarRequests.get(cacheKey) === entry) {\n memberAvatarRequests.delete(cacheKey);\n }\n throw error;\n });\n\n entry.request = request;\n memberAvatarRequests.set(cacheKey, entry);\n return request;\n}\n\nexport function useMemberAvatarUrl(\n email: string | undefined,\n): string | undefined {\n const auth = useContext(MentionAuthCtx);\n const normalizedEmail = email?.trim().toLowerCase();\n const cacheKey =\n auth?.workspaceId && `${auth.backendUrl}|${auth.workspaceId}`;\n const [resolvedAvatar, setResolvedAvatar] = useState<{\n cacheKey: string;\n url: string | undefined;\n }>();\n\n useEffect(() => {\n if (!auth || !cacheKey || !normalizedEmail) {\n setResolvedAvatar(undefined);\n return;\n }\n\n let cancelled = false;\n loadMemberAvatars(auth).then(\n (avatars) => {\n if (!cancelled) {\n setResolvedAvatar({ cacheKey, url: avatars.get(normalizedEmail) });\n }\n },\n () => {\n if (!cancelled) setResolvedAvatar({ cacheKey, url: undefined });\n },\n );\n\n return () => {\n cancelled = true;\n };\n }, [auth, cacheKey, normalizedEmail]);\n\n if (!cacheKey || !resolvedAvatar || resolvedAvatar.cacheKey !== cacheKey) {\n return undefined;\n }\n return resolvedAvatar.url;\n}\n\nexport function resetMemberAvatarsForTests(): void {\n memberAvatarRequests.clear();\n}\n"],"names":[],"mappings":";;AAiBA,MAAM,uBAAuB,IAAI,KAAK;AAOtC,MAAM,2CAA2B,IAAA;AAEjC,SAAS,kBACP,MAC8B;AAC9B,QAAM,cAAc,KAAK;AACzB,MAAI,CAAC,YAAa,QAAO,QAAQ,QAAQ,oBAAI,KAAK;AAElD,QAAM,WAAW,GAAG,KAAK,UAAU,IAAI,WAAW;AAClD,QAAM,SAAS,qBAAqB,IAAI,QAAQ;AAChD,MAAI,WAAW,OAAO,cAAc,QAAQ,KAAK,IAAA,IAAQ,OAAO,YAAY,uBAAuB;AACjG,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,QAAgC;AAAA,IACpC,SAAS,QAAQ,QAAQ,oBAAI,KAAqB;AAAA,IAClD,WAAW;AAAA,EAAA;AAEb,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,EAAE,YAAA;AAAA,EAAY,EAEb,KAAK,CAAC,SAAS;;AACd,UAAM,8BAAc,IAAA;AACpB,eAAW,UAAU,KAAK,uBAAuB,CAAA,GAAI;AACnD,YAAM,SAAQ,YAAO,UAAP,mBAAc,OAAO;AACnC,UAAI,SAAS,OAAO,aAAa,MAAM;AACrC,gBAAQ,IAAI,OAAO,OAAO,SAAS;AAAA,MACrC;AAAA,IACF;AACA,UAAM,YAAY,KAAK,IAAA;AACvB,WAAO;AAAA,EACT,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,QAAI,qBAAqB,IAAI,QAAQ,MAAM,OAAO;AAChD,2BAAqB,OAAO,QAAQ;AAAA,IACtC;AACA,UAAM;AAAA,EACR,CAAC;AAEH,QAAM,UAAU;AAChB,uBAAqB,IAAI,UAAU,KAAK;AACxC,SAAO;AACT;AAEO,SAAS,mBACd,OACoB;AACpB,QAAM,OAAO,WAAW,cAAc;AACtC,QAAM,kBAAkB,+BAAO,OAAO;AACtC,QAAM,YACJ,6BAAM,gBAAe,GAAG,KAAK,UAAU,IAAI,KAAK,WAAW;AAC7D,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAA;AAK5C,YAAU,MAAM;AACd,QAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,iBAAiB;AAC1C,wBAAkB,MAAS;AAC3B;AAAA,IACF;AAEA,QAAI,YAAY;AAChB,sBAAkB,IAAI,EAAE;AAAA,MACtB,CAAC,YAAY;AACX,YAAI,CAAC,WAAW;AACd,4BAAkB,EAAE,UAAU,KAAK,QAAQ,IAAI,eAAe,GAAG;AAAA,QACnE;AAAA,MACF;AAAA,MACA,MAAM;AACJ,YAAI,CAAC,UAAW,mBAAkB,EAAE,UAAU,KAAK,QAAW;AAAA,MAChE;AAAA,IAAA;AAGF,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,eAAe,CAAC;AAEpC,MAAI,CAAC,YAAY,CAAC,kBAAkB,eAAe,aAAa,UAAU;AACxE,WAAO;AAAA,EACT;AACA,SAAO,eAAe;AACxB;"}
|
package/dist/collab/client.cjs
CHANGED
|
@@ -50,7 +50,8 @@ function connectGenericDoc(args) {
|
|
|
50
50
|
let openingPastThreshold = null;
|
|
51
51
|
let mintRetries = 0;
|
|
52
52
|
let destroyed = false;
|
|
53
|
-
let
|
|
53
|
+
let connectionEnabled = args.connectionEnabled ?? true;
|
|
54
|
+
let status = connectionEnabled ? "connecting" : "disconnected";
|
|
54
55
|
let synced = false;
|
|
55
56
|
let accessType = null;
|
|
56
57
|
let error = null;
|
|
@@ -86,11 +87,10 @@ function connectGenericDoc(args) {
|
|
|
86
87
|
};
|
|
87
88
|
const refreshLocalChangesSynced = () => {
|
|
88
89
|
const next = carriedUpdates.length === 0 && ((provider == null ? void 0 : provider.unconfirmedUpdates.length) ?? 0) === 0;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
notify();
|
|
92
|
-
}
|
|
90
|
+
const changed = next !== localChangesSynced;
|
|
91
|
+
localChangesSynced = next;
|
|
93
92
|
transportChanged();
|
|
93
|
+
if (changed) notify();
|
|
94
94
|
};
|
|
95
95
|
doc.on("update", (update, origin) => {
|
|
96
96
|
if (!prepared || provider !== null || destroyed || origin instanceof websocket.WebsocketProvider) return;
|
|
@@ -140,9 +140,10 @@ function connectGenericDoc(args) {
|
|
|
140
140
|
notify();
|
|
141
141
|
}
|
|
142
142
|
if (provider) {
|
|
143
|
-
|
|
144
|
-
provider.destroy();
|
|
143
|
+
const previous = provider;
|
|
145
144
|
provider = null;
|
|
145
|
+
carriedUpdates = [...carriedUpdates, ...previous.unconfirmedUpdates];
|
|
146
|
+
previous.destroy();
|
|
146
147
|
}
|
|
147
148
|
};
|
|
148
149
|
const scheduleRefresh = (grant) => {
|
|
@@ -162,17 +163,17 @@ function connectGenericDoc(args) {
|
|
|
162
163
|
}, delay);
|
|
163
164
|
};
|
|
164
165
|
const onBrowserOnline = () => {
|
|
165
|
-
if (destroyed || status === "closed" || status === "error" || provider !== null || held) return;
|
|
166
|
+
if (destroyed || !connectionEnabled || status === "closed" || status === "error" || provider !== null || held) return;
|
|
166
167
|
mintRetries = 0;
|
|
167
168
|
clearRetryTimer();
|
|
168
169
|
void connect();
|
|
169
170
|
};
|
|
170
171
|
if (typeof window !== "undefined") window.addEventListener("online", onBrowserOnline);
|
|
171
172
|
const armOfflineTakeover = () => {
|
|
172
|
-
if (offlineTimer !== null || !(localCopy == null ? void 0 : localCopy.beforeConnect)) return;
|
|
173
|
+
if (!connectionEnabled || offlineTimer !== null || !(localCopy == null ? void 0 : localCopy.beforeConnect)) return;
|
|
173
174
|
offlineTimer = setTimeout(() => {
|
|
174
175
|
offlineTimer = null;
|
|
175
|
-
if (destroyed || status === "connected" || provider === null) return;
|
|
176
|
+
if (destroyed || !connectionEnabled || status === "connected" || provider === null) return;
|
|
176
177
|
if (provider.wsconnecting && !hasUnsyncedLocalEdits()) {
|
|
177
178
|
openingPastThreshold = provider;
|
|
178
179
|
armOfflineTakeover();
|
|
@@ -184,10 +185,10 @@ function connectGenericDoc(args) {
|
|
|
184
185
|
};
|
|
185
186
|
const hasUnsyncedLocalEdits = () => carriedUpdates.length > 0 || ((provider == null ? void 0 : provider.unconfirmedUpdates.length) ?? 0) > 0;
|
|
186
187
|
const connect = async (opts) => {
|
|
187
|
-
if (destroyed) return;
|
|
188
|
-
await preparing;
|
|
189
|
-
if (destroyed) return;
|
|
188
|
+
if (destroyed || !connectionEnabled) return;
|
|
190
189
|
const seq = ++connectSeq;
|
|
190
|
+
await preparing;
|
|
191
|
+
if (destroyed || !connectionEnabled || seq !== connectSeq) return;
|
|
191
192
|
const scheduledRefresh = (opts == null ? void 0 : opts.scheduledRefresh) === true && status === "connected";
|
|
192
193
|
if (!scheduledRefresh) {
|
|
193
194
|
teardownProvider();
|
|
@@ -195,6 +196,7 @@ function connectGenericDoc(args) {
|
|
|
195
196
|
clearRefreshTimer();
|
|
196
197
|
}
|
|
197
198
|
clearRetryTimer();
|
|
199
|
+
if (destroyed || !connectionEnabled || seq !== connectSeq) return;
|
|
198
200
|
let grant;
|
|
199
201
|
if ((opts == null ? void 0 : opts.grant) && opts.grant.expires_at_ms - Date.now() > tokenRefresh.MIN_REFRESH_DELAY_MS) {
|
|
200
202
|
grant = opts.grant;
|
|
@@ -202,7 +204,7 @@ function connectGenericDoc(args) {
|
|
|
202
204
|
try {
|
|
203
205
|
grant = await mint2({ assetId: args.assetId, access });
|
|
204
206
|
} catch (err) {
|
|
205
|
-
if (destroyed || seq !== connectSeq) return;
|
|
207
|
+
if (destroyed || !connectionEnabled || seq !== connectSeq) return;
|
|
206
208
|
if (scheduledRefresh) {
|
|
207
209
|
refreshTimer = setTimeout(() => {
|
|
208
210
|
void connect({ scheduledRefresh: true });
|
|
@@ -218,7 +220,7 @@ function connectGenericDoc(args) {
|
|
|
218
220
|
return;
|
|
219
221
|
}
|
|
220
222
|
}
|
|
221
|
-
if (destroyed || seq !== connectSeq) return;
|
|
223
|
+
if (destroyed || !connectionEnabled || seq !== connectSeq) return;
|
|
222
224
|
mintRetries = 0;
|
|
223
225
|
accessType = grant.access_type;
|
|
224
226
|
const beforeConnect = localCopy == null ? void 0 : localCopy.beforeConnect;
|
|
@@ -234,12 +236,12 @@ function connectGenericDoc(args) {
|
|
|
234
236
|
hasUnsyncedEdits: hasUnsyncedLocalEdits()
|
|
235
237
|
});
|
|
236
238
|
} catch {
|
|
237
|
-
if (destroyed || seq !== connectSeq) return;
|
|
239
|
+
if (destroyed || !connectionEnabled || seq !== connectSeq) return;
|
|
238
240
|
if (status !== "disconnected") setStatus("disconnected");
|
|
239
241
|
scheduleRetry();
|
|
240
242
|
return;
|
|
241
243
|
}
|
|
242
|
-
if (destroyed || seq !== connectSeq) return;
|
|
244
|
+
if (destroyed || !connectionEnabled || seq !== connectSeq) return;
|
|
243
245
|
if (decision === "hold") {
|
|
244
246
|
held = true;
|
|
245
247
|
heldGrant = grant;
|
|
@@ -251,6 +253,7 @@ function connectGenericDoc(args) {
|
|
|
251
253
|
if (scheduledRefresh) {
|
|
252
254
|
teardownProvider();
|
|
253
255
|
}
|
|
256
|
+
if (destroyed || !connectionEnabled || seq !== connectSeq) return;
|
|
254
257
|
const nextProvider = new websocket.WebsocketProvider(grant.ws_url, `${grant.org}/${grant.doc_id}`, doc, {
|
|
255
258
|
params: {
|
|
256
259
|
yauth: grant.token,
|
|
@@ -372,6 +375,41 @@ function connectGenericDoc(args) {
|
|
|
372
375
|
};
|
|
373
376
|
listeners.add(listener);
|
|
374
377
|
});
|
|
378
|
+
const waitForAcknowledged = (timeoutMs = 15e3) => new Promise((resolve, reject) => {
|
|
379
|
+
let finished = false;
|
|
380
|
+
let checkQueued = false;
|
|
381
|
+
let timer = null;
|
|
382
|
+
const finish = (failure) => {
|
|
383
|
+
if (finished) return;
|
|
384
|
+
finished = true;
|
|
385
|
+
if (timer !== null) clearTimeout(timer);
|
|
386
|
+
listeners.delete(check);
|
|
387
|
+
if (failure) reject(failure);
|
|
388
|
+
else resolve();
|
|
389
|
+
};
|
|
390
|
+
const check = () => {
|
|
391
|
+
if (finished || checkQueued) return;
|
|
392
|
+
checkQueued = true;
|
|
393
|
+
queueMicrotask(() => {
|
|
394
|
+
checkQueued = false;
|
|
395
|
+
if (finished) return;
|
|
396
|
+
if (destroyed) {
|
|
397
|
+
finish(new Error("Handle destroyed before local changes were acknowledged"));
|
|
398
|
+
} else if (!connectionEnabled) {
|
|
399
|
+
finish(new Error("Connection disabled before local changes were acknowledged"));
|
|
400
|
+
} else if (status === "closed" || status === "error") {
|
|
401
|
+
finish(error ?? new Error(`Connection ${status} before local changes were acknowledged`));
|
|
402
|
+
} else if (prepared && status === "connected" && synced && localChangesSynced) {
|
|
403
|
+
finish();
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
};
|
|
407
|
+
timer = setTimeout(() => {
|
|
408
|
+
finish(new Error(`Timed out after ${timeoutMs}ms waiting for local changes to be acknowledged`));
|
|
409
|
+
}, timeoutMs);
|
|
410
|
+
listeners.add(check);
|
|
411
|
+
check();
|
|
412
|
+
});
|
|
375
413
|
return {
|
|
376
414
|
doc,
|
|
377
415
|
get status() {
|
|
@@ -392,6 +430,9 @@ function connectGenericDoc(args) {
|
|
|
392
430
|
get prepared() {
|
|
393
431
|
return prepared;
|
|
394
432
|
},
|
|
433
|
+
get connectionEnabled() {
|
|
434
|
+
return connectionEnabled;
|
|
435
|
+
},
|
|
395
436
|
get held() {
|
|
396
437
|
return held;
|
|
397
438
|
},
|
|
@@ -399,6 +440,7 @@ function connectGenericDoc(args) {
|
|
|
399
440
|
return version;
|
|
400
441
|
},
|
|
401
442
|
waitForSync,
|
|
443
|
+
waitForAcknowledged,
|
|
402
444
|
getPresence: () => {
|
|
403
445
|
if (!provider) return [];
|
|
404
446
|
const entries = [];
|
|
@@ -412,11 +454,30 @@ function connectGenericDoc(args) {
|
|
|
412
454
|
provider == null ? void 0 : provider.awareness.setLocalState(state);
|
|
413
455
|
},
|
|
414
456
|
refreshNow: () => {
|
|
415
|
-
if (held) return Promise.resolve();
|
|
457
|
+
if (!connectionEnabled || held) return Promise.resolve();
|
|
416
458
|
return provider ? connect({ scheduledRefresh: true }) : connect();
|
|
417
459
|
},
|
|
460
|
+
setConnectionEnabled: (enabled) => {
|
|
461
|
+
var _a, _b;
|
|
462
|
+
if (destroyed || enabled === connectionEnabled) return;
|
|
463
|
+
connectionEnabled = enabled;
|
|
464
|
+
if (!enabled) {
|
|
465
|
+
connectSeq += 1;
|
|
466
|
+
clearRetryTimer();
|
|
467
|
+
clearOfflineTimer();
|
|
468
|
+
teardownProvider();
|
|
469
|
+
setStatus("disconnected");
|
|
470
|
+
(_a = localCopy == null ? void 0 : localCopy.connectionPolicyChanged) == null ? void 0 : _a.call(localCopy, false);
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
(_b = localCopy == null ? void 0 : localCopy.connectionPolicyChanged) == null ? void 0 : _b.call(localCopy, true);
|
|
474
|
+
held = false;
|
|
475
|
+
heldGrant = null;
|
|
476
|
+
setStatus("connecting");
|
|
477
|
+
void connect();
|
|
478
|
+
},
|
|
418
479
|
resume: () => {
|
|
419
|
-
if (!held || destroyed) return;
|
|
480
|
+
if (!held || destroyed || !connectionEnabled) return;
|
|
420
481
|
held = false;
|
|
421
482
|
const grant = heldGrant;
|
|
422
483
|
heldGrant = null;
|