@dvina/sdk 4.0.215 → 4.0.217
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/angular/index.cjs +4 -4
- package/dist/adapters/angular/index.d.cts +2 -2
- package/dist/adapters/angular/index.d.ts +2 -2
- package/dist/adapters/angular/index.js +2 -2
- package/dist/billing/index.cjs +5 -5
- package/dist/billing/index.js +1 -1
- package/dist/{chunk-Y4OD5SDF.cjs → chunk-5JLVHE5X.cjs} +2 -4
- package/dist/chunk-5JLVHE5X.cjs.map +1 -0
- package/dist/{chunk-Q5XGHH7D.js → chunk-GJXK5EID.js} +3 -3
- package/dist/chunk-GJXK5EID.js.map +1 -0
- package/dist/{chunk-BJDU4UX4.js → chunk-IM7TFRLL.js} +417 -220
- package/dist/chunk-IM7TFRLL.js.map +1 -0
- package/dist/{chunk-XK5PW7IX.cjs → chunk-SQ3TK5MI.cjs} +440 -243
- package/dist/chunk-SQ3TK5MI.cjs.map +1 -0
- package/dist/{client-Bn-0nJ8y.d.ts → client-B4c82App.d.ts} +1 -1
- package/dist/{client-Ca2wlmC4.d.cts → client-CluqWlY-.d.cts} +1 -1
- package/dist/{index-Ct2Mh0zl.d.cts → index-D2HJtzDx.d.cts} +1 -1
- package/dist/{index-D50r0Gl0.d.ts → index-DCrLPp9U.d.ts} +1 -1
- package/dist/index.cjs +387 -387
- package/dist/index.d.cts +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +2 -2
- package/dist/pagination/index.d.cts +2 -2
- package/dist/pagination/index.d.ts +2 -2
- package/dist/{sync-engine-D35aV8Zc.d.ts → sync-engine-CBYlsAfA.d.ts} +1 -2
- package/dist/{sync-engine-21OlgS5_.d.cts → sync-engine-CvB6DrbK.d.cts} +1 -2
- package/package.json +1 -1
- package/dist/chunk-BJDU4UX4.js.map +0 -1
- package/dist/chunk-Q5XGHH7D.js.map +0 -1
- package/dist/chunk-XK5PW7IX.cjs.map +0 -1
- package/dist/chunk-Y4OD5SDF.cjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Request, Connection, PageInfo, defaultConnection } from './chunk-KEM6SUTS.js';
|
|
2
2
|
import { createInferenceClientInternal } from './chunk-PDM2KR7T.js';
|
|
3
|
-
import {
|
|
3
|
+
import { createHttpTransport, BillingClient, refreshTokenSingleFlight, print, Kind } from './chunk-GJXK5EID.js';
|
|
4
4
|
import { GRAPHQL_ERROR_CODES, DvinaAuthenticationError, DvinaNetworkError, DvinaGraphQLError, DvinaError, createGraphQLError } from './chunk-7XBJ77RJ.js';
|
|
5
5
|
import { ChatConnectionFragmentDoc, ChatFragmentDoc, FileFragmentDoc, ChatMessageFragmentDoc, AgentConnectionFragmentDoc, ArtifactConnectionFragmentDoc, DesktopDeviceFragmentDoc, InsightFragmentDoc, ChatMessageConnectionFragmentDoc, ProjectFragmentDoc, ContentBlockFragmentDoc, FeedbackFragmentDoc, DatabaseEngineFragmentDoc, TableConnectionFragmentDoc, ProjectDesktopBindingFragmentDoc, DocumentContentFragmentDoc, DocumentFormatFragmentDoc, FeedSendMessageActionFragmentDoc, FeedArtifactDataFragmentDoc, ReportMemberFragmentDoc, ReportConnectionFragmentDoc, IntegrationProviderFragmentDoc, FeedItemGeneratedFragmentDoc, CandidateFragmentDoc, IntegrationFragmentDoc, InsightConnectionFragmentDoc, DatabaseFragmentDoc, DocumentFragmentDoc, RelationFragmentDoc, AbortChatDocument, AddInsightToReportDocument, CancelOauthFlowDocument, CancelWorkspaceDeletionDocument, ConnectIntegrationDocument, ConsumePulseEventsDocument, ContinueImportedChatDocument, ContinueInterpretationDocument, CreateAgentDocument, CreateChatDocument, CreateDatabaseDocument, CreateDocumentDocument, CreateFeedbackDocument, CreateFolderDocument, CreateInsightDocument, CreateIntegrationDocument, CreateProjectDocument, CreateReportDocument, CreateTableDocument, CreateUserSkillFileDocument, CreateUserSkillFolderDocument, DeleteAgentDocument, DeleteAiProviderSettingDocument, DeleteArtifactDocument, DeleteChatDocument, DeleteDatabaseDocument, DeleteDocumentDocument, DeleteFolderDocument, DeleteInsightDocument, DeleteInsightsDocument, DeleteIntegrationDocument, DeleteProjectDocument, DeleteReportDocument, DeleteTableDocument, DeleteUserSkillFileDocument, DeleteUserSkillFolderDocument, DisconnectIntegrationDocument, DismissPulseEventDocument, ExecuteChatImportDocument, GenerateUploadUriDocument, PreviewChatImportDocument, ReanalyzeDocumentDocument, RefineAgentInstructionDocument, RefineSkillInstructionDocument, RefreshDatabaseSchemaDocument, RefreshInsightDocument, RegisterDesktopDeviceDocument, ReinterpretSourceDocument, ReinterpretSourcesOfuserDocument, RelocateInsightDocument, RemoveInsightFromReportDocument, ResetWorkspaceDocument, ResolvePulseEventDocument, ScheduleWorkspaceDeletionDocument, SendMessageDocument, SetDatabasePrimaryKeyDocument, SyncProjectDesktopBindingDocument, UpdateAgentDocument, UpdateArtifactNameDocument, UpdateChatDocument, UpdateDatabaseDocument, UpdateDocumentDocument, UpdateFolderDocument, UpdateInsightDocument, UpdateInsightInReportDocument, UpdateInsightThumbnailDocument, UpdateInterpDocument, UpdateLiveContextDocument, UpdateProjectDocument, UpdatePulseTriggerDocument, UpdateReportDocument, UpdateTableDocument, UpdateUserSkillFileDocument, UpdateUserSkillFolderDocument, UpsertAiProviderSettingDocument, AgentDocument, Agent_ChatsDocument, AgentsDocument, AiProviderSettingDocument, ArtifactDocument, Artifact_ChatDocument, Artifact_Chat_DesktopDeviceDocument, Artifact_Chat_InsightDocument, Artifact_Chat_ProjectDocument, Artifact_FileDocument, Artifact_MessageDocument, Artifact_Message_ChatDocument, Artifact_Message_ContentsDocument, Artifact_Message_FeedbackDocument, ArtifactsDocument, ChatDocument, Chat_AgentsDocument, Chat_ArtifactsDocument, Chat_DesktopDeviceDocument, Chat_DesktopDevice_DesktopBindingsDocument, Chat_InsightDocument, Chat_Insight_ReportMembersDocument, Chat_Insight_ThumbnailFileDocument, Chat_MessagesDocument, Chat_ProjectDocument, Chat_Project_DesktopBindingDocument, ChatMessageDocument, ChatMessage_ArtifactsDocument, ChatMessage_ChatDocument, ChatMessage_Chat_DesktopDeviceDocument, ChatMessage_Chat_InsightDocument, ChatMessage_Chat_ProjectDocument, ChatMessage_ContentsDocument, ChatMessage_FeedbackDocument, ChatMessagesDocument, ChatsDocument, DatabaseDocument, Database_EngineDocument, Database_Engine_CatalogDocument, Database_TablesDocument, DatabaseCatalogDocument, DatabaseCatalog_EngineDocument, DatabaseCatalogsDocument, DatabaseSchemaDocument, DatabasesDocument, DesktopDeviceDocument, DesktopDevice_ChatsDocument, DesktopDevice_DesktopBindingsDocument, DesktopDevicesDocument, DocumentDocument, Document_ContentsDocument, Document_FileDocument, Document_FormatDocument, Document_Format_CatalogDocument, Document_TablesDocument, DocumentCatalogDocument, DocumentCatalog_FormatDocument, DocumentCatalogsDocument, DocumentsDocument, ExportDocument, ExportWithInsightIdDocument, FeedItemDocument, FeedItem_ActionDocument, FeedItem_DataDocument, FeedItemsDocument, FileDocument, FileMetaDocument, FileUrlsDocument, FindFitTierDocument, FolderDocument, FoldersDocument, GetCapabilityDocument, GetDevAccessTokenDocument, GetLimitDocument, GetRemainingDocument, GetTokenUsageByModelDocument, GetTokenUsageHistoryDocument, GetTokenUsageStatusDocument, UsageWindowsStatusTypeFragmentDoc, GetTokenUsageStatus_WindowsDocument, GetTokenUsageStatus_Windows_DayDocument, GetTokenUsageStatus_Windows_FiveHourDocument, GetTokenUsageStatus_Windows_MonthDocument, GetTokenUsageStatus_Windows_WeekDocument, GetUsageDocument, InsightDocument, Insight_ChatDocument, Insight_Chat_DesktopDeviceDocument, Insight_Chat_ProjectDocument, Insight_ReportMembersDocument, Insight_ReportsDocument, Insight_ThumbnailFileDocument, InsightsDocument, IntegrationDocument, Integration_ProviderDocument, Integration_Provider_CatalogDocument, IntegrationCatalogDocument, IntegrationCatalog_ProviderDocument, IntegrationCatalogToolsDocument, IntegrationCatalogsDocument, IntegrationsDocument, InterpretationsDocument, LiveContextDocument, LiveContext_ItemsDocument, LiveContext_SourceDocument, LiveContext_Source_EvidencesDocument, LiveContextsDocument, LocalSandboxDeviceStatusesDocument, NotificationDocument, NotificationsDocument, NotificationsByReferenceDocument, PrivacyStatsDocument, ProjectDocument, Project_ChatsDocument, Project_DesktopBindingDocument, Project_DesktopBinding_DeviceDocument, ProjectsDocument, PulseAppSummaryDocument, PulseEventDocument, PulseEvent_IntegrationDocument, PulseEvent_Integration_ProviderDocument, PulseEventsDocument, PulseTriggerSettingsDocument, QueryDocument, QueryWithInsightIdDocument, QueryWithMessageIdDocument, ReportDocument, Report_InsightsDocument, Report_LayoutDocument, ReportsDocument, TableDocument, Table_DatabaseDocument, Table_Database_EngineDocument, Table_DocumentDocument, Table_Document_ContentsDocument, Table_Document_FileDocument, Table_Document_FormatDocument, Table_FromRelationsDocument, Table_ToRelationsDocument, TablesDocument, UserSkillFileDocument, UserSkillFilesDocument, UserSkillFolderDocument, UserSkillFoldersDocument, WorkspaceDeletionScheduleDocument, McpAuthUpdatesDocument, TokenUsageUpdatesDocument } from './chunk-ETPR6MV5.js';
|
|
6
6
|
import { __commonJS, __toESM } from './chunk-5WRI5ZAA.js';
|
|
@@ -6033,6 +6033,7 @@ var require_dexie = __commonJS({
|
|
|
6033
6033
|
// src/chat-stream.ts
|
|
6034
6034
|
var INITIAL_RECONNECT_DELAY_MS = 1e3;
|
|
6035
6035
|
var MAX_RECONNECT_DELAY_MS = 3e4;
|
|
6036
|
+
var RECONNECT_BACKOFF_MULTIPLIER = 2;
|
|
6036
6037
|
var MAX_CONSECUTIVE_AUTH_FAILURES = 3;
|
|
6037
6038
|
var AuthChatStreamError = class extends Error {
|
|
6038
6039
|
constructor(status) {
|
|
@@ -6046,63 +6047,24 @@ var ChatStreamConnection = class {
|
|
|
6046
6047
|
this.chatId = chatId;
|
|
6047
6048
|
this.options = options;
|
|
6048
6049
|
this.onEmpty = onEmpty;
|
|
6049
|
-
this.supervisor = new ConnectionSupervisor({
|
|
6050
|
-
authRetryDelayMs: INITIAL_RECONNECT_DELAY_MS,
|
|
6051
|
-
baseReconnectDelayMs: INITIAL_RECONNECT_DELAY_MS,
|
|
6052
|
-
getToken: options.getToken,
|
|
6053
|
-
id: chatId,
|
|
6054
|
-
isAuthError: (error) => error instanceof AuthChatStreamError,
|
|
6055
|
-
kind: "chat-sse",
|
|
6056
|
-
maxConsecutiveAuthFailures: MAX_CONSECUTIVE_AUTH_FAILURES,
|
|
6057
|
-
maxReconnectDelayMs: MAX_RECONNECT_DELAY_MS,
|
|
6058
|
-
onFatalError: () => {
|
|
6059
|
-
const authError = new DvinaAuthenticationError("Chat SSE stream authentication failed permanently");
|
|
6060
|
-
this.options.onError?.(authError);
|
|
6061
|
-
this.close(authError);
|
|
6062
|
-
},
|
|
6063
|
-
dial: async (context) => {
|
|
6064
|
-
const url = new URL(`${this.options.baseUrl}/${encodeURIComponent(this.chatId)}/stream`);
|
|
6065
|
-
if (this.lastEventId) {
|
|
6066
|
-
url.searchParams.set("lastEventId", this.lastEventId);
|
|
6067
|
-
}
|
|
6068
|
-
const response = await fetch(url.toString(), {
|
|
6069
|
-
method: "GET",
|
|
6070
|
-
headers: {
|
|
6071
|
-
Accept: "text/event-stream",
|
|
6072
|
-
Authorization: `Bearer ${context.token}`,
|
|
6073
|
-
"Cache-Control": "no-cache",
|
|
6074
|
-
...this.lastEventId ? { "Last-Event-ID": this.lastEventId } : {}
|
|
6075
|
-
},
|
|
6076
|
-
signal: context.signal
|
|
6077
|
-
});
|
|
6078
|
-
if (!response.ok) {
|
|
6079
|
-
if (response.status === 401 || response.status === 403) {
|
|
6080
|
-
throw new AuthChatStreamError(response.status);
|
|
6081
|
-
}
|
|
6082
|
-
throw new Error(`Chat stream connection failed: ${response.status} ${response.statusText}`);
|
|
6083
|
-
}
|
|
6084
|
-
if (!response.body) {
|
|
6085
|
-
throw new Error("Chat stream response has no body");
|
|
6086
|
-
}
|
|
6087
|
-
context.markConnected();
|
|
6088
|
-
await consumeSseStream(response.body, context.signal, {
|
|
6089
|
-
onChunk: () => context.markActivity(),
|
|
6090
|
-
onEventBlock: (block) => this.processEventBlock(block, context.requestTokenRefresh)
|
|
6091
|
-
});
|
|
6092
|
-
}
|
|
6093
|
-
});
|
|
6094
6050
|
}
|
|
6051
|
+
abortController;
|
|
6052
|
+
consecutiveAuthFailures = 0;
|
|
6095
6053
|
destroyed = false;
|
|
6096
6054
|
lastEventId;
|
|
6055
|
+
needsForceRefresh = false;
|
|
6056
|
+
reconnectDelay = INITIAL_RECONNECT_DELAY_MS;
|
|
6057
|
+
reconnectTimer;
|
|
6058
|
+
shouldReconnect = false;
|
|
6097
6059
|
subscribers = /* @__PURE__ */ new Set();
|
|
6098
|
-
supervisor;
|
|
6099
6060
|
addSubscriber(subscriber) {
|
|
6100
6061
|
if (this.destroyed) {
|
|
6101
6062
|
throw new Error(`Chat stream '${this.chatId}' is closed`);
|
|
6102
6063
|
}
|
|
6103
6064
|
this.subscribers.add(subscriber);
|
|
6104
|
-
if (this.
|
|
6105
|
-
|
|
6065
|
+
if (!this.shouldReconnect) {
|
|
6066
|
+
this.shouldReconnect = true;
|
|
6067
|
+
void this.doConnect();
|
|
6106
6068
|
}
|
|
6107
6069
|
}
|
|
6108
6070
|
removeSubscriber(subscriber) {
|
|
@@ -6112,17 +6074,30 @@ var ChatStreamConnection = class {
|
|
|
6112
6074
|
}
|
|
6113
6075
|
}
|
|
6114
6076
|
reconnect() {
|
|
6115
|
-
if (this.destroyed || this.subscribers.size === 0) {
|
|
6077
|
+
if (!this.shouldReconnect || this.destroyed || this.subscribers.size === 0) {
|
|
6116
6078
|
return;
|
|
6117
6079
|
}
|
|
6118
|
-
this.
|
|
6080
|
+
if (this.reconnectTimer) {
|
|
6081
|
+
clearTimeout(this.reconnectTimer);
|
|
6082
|
+
this.reconnectTimer = void 0;
|
|
6083
|
+
}
|
|
6084
|
+
if (this.abortController) {
|
|
6085
|
+
this.abortController.abort();
|
|
6086
|
+
this.abortController = void 0;
|
|
6087
|
+
}
|
|
6088
|
+
void this.doConnect();
|
|
6119
6089
|
}
|
|
6120
6090
|
close(error) {
|
|
6121
|
-
|
|
6122
|
-
return;
|
|
6123
|
-
}
|
|
6091
|
+
this.shouldReconnect = false;
|
|
6124
6092
|
this.destroyed = true;
|
|
6125
|
-
this.
|
|
6093
|
+
if (this.reconnectTimer) {
|
|
6094
|
+
clearTimeout(this.reconnectTimer);
|
|
6095
|
+
this.reconnectTimer = void 0;
|
|
6096
|
+
}
|
|
6097
|
+
if (this.abortController) {
|
|
6098
|
+
this.abortController.abort();
|
|
6099
|
+
this.abortController = void 0;
|
|
6100
|
+
}
|
|
6126
6101
|
for (const subscriber of Array.from(this.subscribers)) {
|
|
6127
6102
|
subscriber.finish(error);
|
|
6128
6103
|
}
|
|
@@ -6132,7 +6107,94 @@ var ChatStreamConnection = class {
|
|
|
6132
6107
|
get isDestroyed() {
|
|
6133
6108
|
return this.destroyed;
|
|
6134
6109
|
}
|
|
6135
|
-
|
|
6110
|
+
async doConnect() {
|
|
6111
|
+
if (!this.shouldReconnect || this.destroyed || this.subscribers.size === 0) {
|
|
6112
|
+
return;
|
|
6113
|
+
}
|
|
6114
|
+
this.abortController = new AbortController();
|
|
6115
|
+
try {
|
|
6116
|
+
const forceRefresh = this.needsForceRefresh;
|
|
6117
|
+
this.needsForceRefresh = false;
|
|
6118
|
+
const token = await this.options.getToken(forceRefresh ? { forceRefresh: true } : void 0);
|
|
6119
|
+
const url = new URL(`${this.options.baseUrl}/${encodeURIComponent(this.chatId)}/stream`);
|
|
6120
|
+
if (this.lastEventId) {
|
|
6121
|
+
url.searchParams.set("lastEventId", this.lastEventId);
|
|
6122
|
+
}
|
|
6123
|
+
const response = await fetch(url.toString(), {
|
|
6124
|
+
method: "GET",
|
|
6125
|
+
headers: {
|
|
6126
|
+
Accept: "text/event-stream",
|
|
6127
|
+
Authorization: `Bearer ${token}`,
|
|
6128
|
+
"Cache-Control": "no-cache",
|
|
6129
|
+
...this.lastEventId ? { "Last-Event-ID": this.lastEventId } : {}
|
|
6130
|
+
},
|
|
6131
|
+
signal: this.abortController.signal
|
|
6132
|
+
});
|
|
6133
|
+
if (!response.ok) {
|
|
6134
|
+
if (response.status === 401 || response.status === 403) {
|
|
6135
|
+
throw new AuthChatStreamError(response.status);
|
|
6136
|
+
}
|
|
6137
|
+
throw new Error(`Chat stream connection failed: ${response.status} ${response.statusText}`);
|
|
6138
|
+
}
|
|
6139
|
+
if (!response.body) {
|
|
6140
|
+
throw new Error("Chat stream response has no body");
|
|
6141
|
+
}
|
|
6142
|
+
this.consecutiveAuthFailures = 0;
|
|
6143
|
+
this.reconnectDelay = INITIAL_RECONNECT_DELAY_MS;
|
|
6144
|
+
await this.parseSseStream(response.body, this.abortController.signal);
|
|
6145
|
+
} catch (error) {
|
|
6146
|
+
if (error.name === "AbortError") {
|
|
6147
|
+
return;
|
|
6148
|
+
}
|
|
6149
|
+
if (!this.shouldReconnect || this.destroyed || this.subscribers.size === 0) {
|
|
6150
|
+
return;
|
|
6151
|
+
}
|
|
6152
|
+
const isAuthError2 = error instanceof AuthChatStreamError;
|
|
6153
|
+
if (isAuthError2) {
|
|
6154
|
+
this.consecutiveAuthFailures += 1;
|
|
6155
|
+
if (this.consecutiveAuthFailures >= MAX_CONSECUTIVE_AUTH_FAILURES) {
|
|
6156
|
+
const authError = new DvinaAuthenticationError("Chat SSE stream authentication failed permanently");
|
|
6157
|
+
this.options.onError?.(authError);
|
|
6158
|
+
this.close(authError);
|
|
6159
|
+
return;
|
|
6160
|
+
}
|
|
6161
|
+
this.needsForceRefresh = true;
|
|
6162
|
+
}
|
|
6163
|
+
const delay = isAuthError2 ? INITIAL_RECONNECT_DELAY_MS : this.reconnectDelay;
|
|
6164
|
+
this.scheduleReconnect(delay);
|
|
6165
|
+
if (!isAuthError2) {
|
|
6166
|
+
this.reconnectDelay = Math.min(
|
|
6167
|
+
this.reconnectDelay * RECONNECT_BACKOFF_MULTIPLIER,
|
|
6168
|
+
MAX_RECONNECT_DELAY_MS
|
|
6169
|
+
);
|
|
6170
|
+
}
|
|
6171
|
+
}
|
|
6172
|
+
}
|
|
6173
|
+
async parseSseStream(body, signal) {
|
|
6174
|
+
const reader = body.getReader();
|
|
6175
|
+
const decoder = new TextDecoder();
|
|
6176
|
+
let buffer = "";
|
|
6177
|
+
try {
|
|
6178
|
+
while (!signal.aborted && this.shouldReconnect && !this.destroyed) {
|
|
6179
|
+
const { done, value } = await reader.read();
|
|
6180
|
+
if (done) {
|
|
6181
|
+
break;
|
|
6182
|
+
}
|
|
6183
|
+
buffer += decoder.decode(value, { stream: true });
|
|
6184
|
+
const parts = buffer.split(/(?:\r\n|\r|\n){2}/);
|
|
6185
|
+
buffer = parts.pop() ?? "";
|
|
6186
|
+
for (const part of parts) {
|
|
6187
|
+
this.processEventBlock(part.trim());
|
|
6188
|
+
}
|
|
6189
|
+
}
|
|
6190
|
+
} finally {
|
|
6191
|
+
reader.releaseLock();
|
|
6192
|
+
}
|
|
6193
|
+
if (this.shouldReconnect && !this.destroyed && this.subscribers.size > 0) {
|
|
6194
|
+
this.scheduleReconnect(this.reconnectDelay);
|
|
6195
|
+
}
|
|
6196
|
+
}
|
|
6197
|
+
processEventBlock(block) {
|
|
6136
6198
|
if (!block || block.startsWith(":")) {
|
|
6137
6199
|
return;
|
|
6138
6200
|
}
|
|
@@ -6149,8 +6211,8 @@ var ChatStreamConnection = class {
|
|
|
6149
6211
|
}
|
|
6150
6212
|
}
|
|
6151
6213
|
if (eventType === "token-expired") {
|
|
6152
|
-
|
|
6153
|
-
|
|
6214
|
+
this.needsForceRefresh = true;
|
|
6215
|
+
return;
|
|
6154
6216
|
}
|
|
6155
6217
|
if (!eventId || dataLines.length === 0) {
|
|
6156
6218
|
return;
|
|
@@ -6167,64 +6229,40 @@ var ChatStreamConnection = class {
|
|
|
6167
6229
|
subscriber.push(value);
|
|
6168
6230
|
}
|
|
6169
6231
|
}
|
|
6232
|
+
scheduleReconnect(delay) {
|
|
6233
|
+
if (!this.shouldReconnect || this.destroyed || this.subscribers.size === 0) {
|
|
6234
|
+
return;
|
|
6235
|
+
}
|
|
6236
|
+
if (this.reconnectTimer) {
|
|
6237
|
+
clearTimeout(this.reconnectTimer);
|
|
6238
|
+
}
|
|
6239
|
+
this.reconnectTimer = setTimeout(() => {
|
|
6240
|
+
this.reconnectTimer = void 0;
|
|
6241
|
+
void this.doConnect();
|
|
6242
|
+
}, delay);
|
|
6243
|
+
}
|
|
6170
6244
|
};
|
|
6171
6245
|
var ActiveChatStreamConnection = class {
|
|
6172
6246
|
constructor(options, onEmpty) {
|
|
6173
6247
|
this.options = options;
|
|
6174
6248
|
this.onEmpty = onEmpty;
|
|
6175
|
-
this.supervisor = new ConnectionSupervisor({
|
|
6176
|
-
authRetryDelayMs: INITIAL_RECONNECT_DELAY_MS,
|
|
6177
|
-
baseReconnectDelayMs: INITIAL_RECONNECT_DELAY_MS,
|
|
6178
|
-
getToken: options.getToken,
|
|
6179
|
-
id: "active",
|
|
6180
|
-
isAuthError: (error) => error instanceof AuthChatStreamError,
|
|
6181
|
-
kind: "active-chat-sse",
|
|
6182
|
-
maxConsecutiveAuthFailures: MAX_CONSECUTIVE_AUTH_FAILURES,
|
|
6183
|
-
maxReconnectDelayMs: MAX_RECONNECT_DELAY_MS,
|
|
6184
|
-
onFatalError: () => {
|
|
6185
|
-
const authError = new DvinaAuthenticationError(
|
|
6186
|
-
"Active chat SSE stream authentication failed permanently"
|
|
6187
|
-
);
|
|
6188
|
-
this.options.onError?.(authError);
|
|
6189
|
-
this.close(authError);
|
|
6190
|
-
},
|
|
6191
|
-
dial: async (context) => {
|
|
6192
|
-
const response = await fetch(new URL(`${this.options.baseUrl}/active`).toString(), {
|
|
6193
|
-
method: "GET",
|
|
6194
|
-
headers: {
|
|
6195
|
-
Accept: "text/event-stream",
|
|
6196
|
-
Authorization: `Bearer ${context.token}`,
|
|
6197
|
-
"Cache-Control": "no-cache"
|
|
6198
|
-
},
|
|
6199
|
-
signal: context.signal
|
|
6200
|
-
});
|
|
6201
|
-
if (!response.ok) {
|
|
6202
|
-
if (response.status === 401 || response.status === 403) {
|
|
6203
|
-
throw new AuthChatStreamError(response.status);
|
|
6204
|
-
}
|
|
6205
|
-
throw new Error(`Active chat stream connection failed: ${response.status} ${response.statusText}`);
|
|
6206
|
-
}
|
|
6207
|
-
if (!response.body) {
|
|
6208
|
-
throw new Error("Active chat stream response has no body");
|
|
6209
|
-
}
|
|
6210
|
-
context.markConnected();
|
|
6211
|
-
await consumeSseStream(response.body, context.signal, {
|
|
6212
|
-
onChunk: () => context.markActivity(),
|
|
6213
|
-
onEventBlock: (block) => this.processEventBlock(block, context.requestTokenRefresh)
|
|
6214
|
-
});
|
|
6215
|
-
}
|
|
6216
|
-
});
|
|
6217
6249
|
}
|
|
6250
|
+
abortController;
|
|
6251
|
+
consecutiveAuthFailures = 0;
|
|
6218
6252
|
destroyed = false;
|
|
6253
|
+
needsForceRefresh = false;
|
|
6254
|
+
reconnectDelay = INITIAL_RECONNECT_DELAY_MS;
|
|
6255
|
+
reconnectTimer;
|
|
6256
|
+
shouldReconnect = false;
|
|
6219
6257
|
subscribers = /* @__PURE__ */ new Set();
|
|
6220
|
-
supervisor;
|
|
6221
6258
|
addSubscriber(subscriber) {
|
|
6222
6259
|
if (this.destroyed) {
|
|
6223
6260
|
throw new Error("Active chat stream is closed");
|
|
6224
6261
|
}
|
|
6225
6262
|
this.subscribers.add(subscriber);
|
|
6226
|
-
if (this.
|
|
6227
|
-
|
|
6263
|
+
if (!this.shouldReconnect) {
|
|
6264
|
+
this.shouldReconnect = true;
|
|
6265
|
+
void this.doConnect();
|
|
6228
6266
|
}
|
|
6229
6267
|
}
|
|
6230
6268
|
removeSubscriber(subscriber) {
|
|
@@ -6234,17 +6272,30 @@ var ActiveChatStreamConnection = class {
|
|
|
6234
6272
|
}
|
|
6235
6273
|
}
|
|
6236
6274
|
reconnect() {
|
|
6237
|
-
if (this.destroyed || this.subscribers.size === 0) {
|
|
6275
|
+
if (!this.shouldReconnect || this.destroyed || this.subscribers.size === 0) {
|
|
6238
6276
|
return;
|
|
6239
6277
|
}
|
|
6240
|
-
this.
|
|
6278
|
+
if (this.reconnectTimer) {
|
|
6279
|
+
clearTimeout(this.reconnectTimer);
|
|
6280
|
+
this.reconnectTimer = void 0;
|
|
6281
|
+
}
|
|
6282
|
+
if (this.abortController) {
|
|
6283
|
+
this.abortController.abort();
|
|
6284
|
+
this.abortController = void 0;
|
|
6285
|
+
}
|
|
6286
|
+
void this.doConnect();
|
|
6241
6287
|
}
|
|
6242
6288
|
close(error) {
|
|
6243
|
-
|
|
6244
|
-
return;
|
|
6245
|
-
}
|
|
6289
|
+
this.shouldReconnect = false;
|
|
6246
6290
|
this.destroyed = true;
|
|
6247
|
-
this.
|
|
6291
|
+
if (this.reconnectTimer) {
|
|
6292
|
+
clearTimeout(this.reconnectTimer);
|
|
6293
|
+
this.reconnectTimer = void 0;
|
|
6294
|
+
}
|
|
6295
|
+
if (this.abortController) {
|
|
6296
|
+
this.abortController.abort();
|
|
6297
|
+
this.abortController = void 0;
|
|
6298
|
+
}
|
|
6248
6299
|
for (const subscriber of Array.from(this.subscribers)) {
|
|
6249
6300
|
subscriber.finish(error);
|
|
6250
6301
|
}
|
|
@@ -6254,7 +6305,91 @@ var ActiveChatStreamConnection = class {
|
|
|
6254
6305
|
get isDestroyed() {
|
|
6255
6306
|
return this.destroyed;
|
|
6256
6307
|
}
|
|
6257
|
-
|
|
6308
|
+
async doConnect() {
|
|
6309
|
+
if (!this.shouldReconnect || this.destroyed || this.subscribers.size === 0) {
|
|
6310
|
+
return;
|
|
6311
|
+
}
|
|
6312
|
+
this.abortController = new AbortController();
|
|
6313
|
+
try {
|
|
6314
|
+
const forceRefresh = this.needsForceRefresh;
|
|
6315
|
+
this.needsForceRefresh = false;
|
|
6316
|
+
const token = await this.options.getToken(forceRefresh ? { forceRefresh: true } : void 0);
|
|
6317
|
+
const response = await fetch(new URL(`${this.options.baseUrl}/active`).toString(), {
|
|
6318
|
+
method: "GET",
|
|
6319
|
+
headers: {
|
|
6320
|
+
Accept: "text/event-stream",
|
|
6321
|
+
Authorization: `Bearer ${token}`,
|
|
6322
|
+
"Cache-Control": "no-cache"
|
|
6323
|
+
},
|
|
6324
|
+
signal: this.abortController.signal
|
|
6325
|
+
});
|
|
6326
|
+
if (!response.ok) {
|
|
6327
|
+
if (response.status === 401 || response.status === 403) {
|
|
6328
|
+
throw new AuthChatStreamError(response.status);
|
|
6329
|
+
}
|
|
6330
|
+
throw new Error(`Active chat stream connection failed: ${response.status} ${response.statusText}`);
|
|
6331
|
+
}
|
|
6332
|
+
if (!response.body) {
|
|
6333
|
+
throw new Error("Active chat stream response has no body");
|
|
6334
|
+
}
|
|
6335
|
+
this.consecutiveAuthFailures = 0;
|
|
6336
|
+
this.reconnectDelay = INITIAL_RECONNECT_DELAY_MS;
|
|
6337
|
+
await this.parseSseStream(response.body, this.abortController.signal);
|
|
6338
|
+
} catch (error) {
|
|
6339
|
+
if (error.name === "AbortError") {
|
|
6340
|
+
return;
|
|
6341
|
+
}
|
|
6342
|
+
if (!this.shouldReconnect || this.destroyed || this.subscribers.size === 0) {
|
|
6343
|
+
return;
|
|
6344
|
+
}
|
|
6345
|
+
const isAuthError2 = error instanceof AuthChatStreamError;
|
|
6346
|
+
if (isAuthError2) {
|
|
6347
|
+
this.consecutiveAuthFailures += 1;
|
|
6348
|
+
if (this.consecutiveAuthFailures >= MAX_CONSECUTIVE_AUTH_FAILURES) {
|
|
6349
|
+
const authError = new DvinaAuthenticationError(
|
|
6350
|
+
"Active chat SSE stream authentication failed permanently"
|
|
6351
|
+
);
|
|
6352
|
+
this.options.onError?.(authError);
|
|
6353
|
+
this.close(authError);
|
|
6354
|
+
return;
|
|
6355
|
+
}
|
|
6356
|
+
this.needsForceRefresh = true;
|
|
6357
|
+
}
|
|
6358
|
+
const delay = isAuthError2 ? INITIAL_RECONNECT_DELAY_MS : this.reconnectDelay;
|
|
6359
|
+
this.scheduleReconnect(delay);
|
|
6360
|
+
if (!isAuthError2) {
|
|
6361
|
+
this.reconnectDelay = Math.min(
|
|
6362
|
+
this.reconnectDelay * RECONNECT_BACKOFF_MULTIPLIER,
|
|
6363
|
+
MAX_RECONNECT_DELAY_MS
|
|
6364
|
+
);
|
|
6365
|
+
}
|
|
6366
|
+
}
|
|
6367
|
+
}
|
|
6368
|
+
async parseSseStream(body, signal) {
|
|
6369
|
+
const reader = body.getReader();
|
|
6370
|
+
const decoder = new TextDecoder();
|
|
6371
|
+
let buffer = "";
|
|
6372
|
+
try {
|
|
6373
|
+
while (!signal.aborted && this.shouldReconnect && !this.destroyed) {
|
|
6374
|
+
const { done, value } = await reader.read();
|
|
6375
|
+
if (done) {
|
|
6376
|
+
break;
|
|
6377
|
+
}
|
|
6378
|
+
buffer += decoder.decode(value, { stream: true });
|
|
6379
|
+
const parts = buffer.split(/(?:\r\n|\r|\n){2}/);
|
|
6380
|
+
buffer = parts.pop() ?? "";
|
|
6381
|
+
for (const part of parts) {
|
|
6382
|
+
this.processEventBlock(part.trim());
|
|
6383
|
+
}
|
|
6384
|
+
}
|
|
6385
|
+
} finally {
|
|
6386
|
+
reader.releaseLock();
|
|
6387
|
+
}
|
|
6388
|
+
if (this.shouldReconnect && !this.destroyed && this.subscribers.size > 0) {
|
|
6389
|
+
this.scheduleReconnect(this.reconnectDelay);
|
|
6390
|
+
}
|
|
6391
|
+
}
|
|
6392
|
+
processEventBlock(block) {
|
|
6258
6393
|
if (!block || block.startsWith(":")) {
|
|
6259
6394
|
return;
|
|
6260
6395
|
}
|
|
@@ -6268,8 +6403,8 @@ var ActiveChatStreamConnection = class {
|
|
|
6268
6403
|
}
|
|
6269
6404
|
}
|
|
6270
6405
|
if (eventType === "token-expired") {
|
|
6271
|
-
|
|
6272
|
-
|
|
6406
|
+
this.needsForceRefresh = true;
|
|
6407
|
+
return;
|
|
6273
6408
|
}
|
|
6274
6409
|
if (eventType !== "active" || dataLines.length === 0) {
|
|
6275
6410
|
return;
|
|
@@ -6288,6 +6423,18 @@ var ActiveChatStreamConnection = class {
|
|
|
6288
6423
|
subscriber.push(value);
|
|
6289
6424
|
}
|
|
6290
6425
|
}
|
|
6426
|
+
scheduleReconnect(delay) {
|
|
6427
|
+
if (!this.shouldReconnect || this.destroyed || this.subscribers.size === 0) {
|
|
6428
|
+
return;
|
|
6429
|
+
}
|
|
6430
|
+
if (this.reconnectTimer) {
|
|
6431
|
+
clearTimeout(this.reconnectTimer);
|
|
6432
|
+
}
|
|
6433
|
+
this.reconnectTimer = setTimeout(() => {
|
|
6434
|
+
this.reconnectTimer = void 0;
|
|
6435
|
+
void this.doConnect();
|
|
6436
|
+
}, delay);
|
|
6437
|
+
}
|
|
6291
6438
|
};
|
|
6292
6439
|
function createChatStreamClient(options) {
|
|
6293
6440
|
const connections = /* @__PURE__ */ new Map();
|
|
@@ -7965,47 +8112,44 @@ var AuthSseError = class extends Error {
|
|
|
7965
8112
|
};
|
|
7966
8113
|
var INITIAL_RECONNECT_DELAY_MS2 = 1e3;
|
|
7967
8114
|
var MAX_RECONNECT_DELAY_MS2 = 3e4;
|
|
8115
|
+
var RECONNECT_BACKOFF_MULTIPLIER2 = 2;
|
|
7968
8116
|
var MAX_CONSECUTIVE_AUTH_FAILURES2 = 3;
|
|
7969
8117
|
var SUBSCRIPTION_REFRESH_INTERVAL_MS = 5 * 60 * 1e3;
|
|
7970
|
-
function mapSupervisorState(state) {
|
|
7971
|
-
if (state === "connected") {
|
|
7972
|
-
return "connected";
|
|
7973
|
-
}
|
|
7974
|
-
if (state === "connecting") {
|
|
7975
|
-
return "connecting";
|
|
7976
|
-
}
|
|
7977
|
-
return "disconnected";
|
|
7978
|
-
}
|
|
7979
8118
|
function createSseTransport(options) {
|
|
8119
|
+
let abortController;
|
|
7980
8120
|
let isConnected = false;
|
|
7981
|
-
let
|
|
8121
|
+
let reconnectDelay = INITIAL_RECONNECT_DELAY_MS2;
|
|
8122
|
+
let reconnectTimer;
|
|
7982
8123
|
let refreshTimer;
|
|
8124
|
+
let shouldReconnect = false;
|
|
8125
|
+
let currentLastSyncId;
|
|
8126
|
+
let needsForceRefresh = false;
|
|
8127
|
+
let consecutiveAuthFailures = 0;
|
|
7983
8128
|
let hasConnectedOnce = false;
|
|
7984
|
-
let lastLegacyState;
|
|
7985
8129
|
const activeSubscriptions = /* @__PURE__ */ new Map();
|
|
7986
|
-
|
|
7987
|
-
|
|
7988
|
-
|
|
8130
|
+
async function connect(lastSyncId) {
|
|
8131
|
+
disconnect();
|
|
8132
|
+
shouldReconnect = true;
|
|
8133
|
+
currentLastSyncId = lastSyncId;
|
|
8134
|
+
await doConnect();
|
|
8135
|
+
}
|
|
8136
|
+
function reconnect() {
|
|
8137
|
+
const lastSyncId = currentLastSyncId;
|
|
8138
|
+
disconnect();
|
|
8139
|
+
shouldReconnect = true;
|
|
8140
|
+
currentLastSyncId = lastSyncId;
|
|
8141
|
+
void doConnect();
|
|
8142
|
+
}
|
|
8143
|
+
async function doConnect() {
|
|
8144
|
+
if (!shouldReconnect) {
|
|
7989
8145
|
return;
|
|
7990
8146
|
}
|
|
7991
|
-
|
|
7992
|
-
|
|
7993
|
-
|
|
7994
|
-
|
|
7995
|
-
|
|
7996
|
-
|
|
7997
|
-
};
|
|
7998
|
-
const supervisor = new ConnectionSupervisor({
|
|
7999
|
-
authRetryDelayMs: INITIAL_RECONNECT_DELAY_MS2,
|
|
8000
|
-
baseReconnectDelayMs: INITIAL_RECONNECT_DELAY_MS2,
|
|
8001
|
-
getToken: options.getToken,
|
|
8002
|
-
id: "primary",
|
|
8003
|
-
isAuthError: (error) => error instanceof AuthSseError,
|
|
8004
|
-
kind: "sync-sse",
|
|
8005
|
-
maxConsecutiveAuthFailures: MAX_CONSECUTIVE_AUTH_FAILURES2,
|
|
8006
|
-
maxReconnectDelayMs: MAX_RECONNECT_DELAY_MS2,
|
|
8007
|
-
onStateChange: (snapshot) => emitLegacyState(snapshot.state),
|
|
8008
|
-
dial: async (context) => {
|
|
8147
|
+
abortController = new AbortController();
|
|
8148
|
+
options.onStateChange?.("connecting");
|
|
8149
|
+
try {
|
|
8150
|
+
const forceRefresh = needsForceRefresh;
|
|
8151
|
+
needsForceRefresh = false;
|
|
8152
|
+
const token = await options.getToken(forceRefresh ? { forceRefresh: true } : void 0);
|
|
8009
8153
|
const url = new URL(options.url);
|
|
8010
8154
|
if (currentLastSyncId && currentLastSyncId !== "0") {
|
|
8011
8155
|
url.searchParams.set("lastSyncId", currentLastSyncId);
|
|
@@ -8013,11 +8157,11 @@ function createSseTransport(options) {
|
|
|
8013
8157
|
const response = await fetch(url.toString(), {
|
|
8014
8158
|
method: "GET",
|
|
8015
8159
|
headers: {
|
|
8016
|
-
Authorization: `Bearer ${
|
|
8160
|
+
Authorization: `Bearer ${token}`,
|
|
8017
8161
|
Accept: "text/event-stream",
|
|
8018
8162
|
"Cache-Control": "no-cache"
|
|
8019
8163
|
},
|
|
8020
|
-
signal:
|
|
8164
|
+
signal: abortController.signal
|
|
8021
8165
|
});
|
|
8022
8166
|
if (!response.ok) {
|
|
8023
8167
|
if (response.status === 401 || response.status === 403) {
|
|
@@ -8028,36 +8172,143 @@ function createSseTransport(options) {
|
|
|
8028
8172
|
if (!response.body) {
|
|
8029
8173
|
throw new Error("SSE response has no body");
|
|
8030
8174
|
}
|
|
8175
|
+
isConnected = true;
|
|
8176
|
+
consecutiveAuthFailures = 0;
|
|
8177
|
+
reconnectDelay = INITIAL_RECONNECT_DELAY_MS2;
|
|
8178
|
+
options.onStateChange?.("connected");
|
|
8031
8179
|
const isReconnect = hasConnectedOnce;
|
|
8032
8180
|
hasConnectedOnce = true;
|
|
8033
|
-
|
|
8034
|
-
await syncActiveSubscriptions(context.token);
|
|
8181
|
+
await syncActiveSubscriptions(token);
|
|
8035
8182
|
startSubscriptionRefresh();
|
|
8036
8183
|
if (isReconnect && activeSubscriptions.size > 0) {
|
|
8037
8184
|
options.onReconnect?.();
|
|
8038
8185
|
}
|
|
8039
|
-
await
|
|
8040
|
-
|
|
8041
|
-
|
|
8042
|
-
|
|
8186
|
+
await parseSseStream(response.body, abortController.signal);
|
|
8187
|
+
} catch (error) {
|
|
8188
|
+
if (error.name === "AbortError") {
|
|
8189
|
+
return;
|
|
8190
|
+
}
|
|
8191
|
+
isConnected = false;
|
|
8192
|
+
stopSubscriptionRefresh();
|
|
8193
|
+
options.onStateChange?.("disconnected");
|
|
8194
|
+
if (!shouldReconnect) {
|
|
8195
|
+
return;
|
|
8196
|
+
}
|
|
8197
|
+
const isAuthError2 = error instanceof AuthSseError;
|
|
8198
|
+
if (isAuthError2) {
|
|
8199
|
+
consecutiveAuthFailures += 1;
|
|
8200
|
+
if (consecutiveAuthFailures >= MAX_CONSECUTIVE_AUTH_FAILURES2) {
|
|
8201
|
+
disconnect();
|
|
8202
|
+
return;
|
|
8203
|
+
}
|
|
8204
|
+
needsForceRefresh = true;
|
|
8205
|
+
}
|
|
8206
|
+
const delay = isAuthError2 ? INITIAL_RECONNECT_DELAY_MS2 : reconnectDelay;
|
|
8207
|
+
reconnectTimer = setTimeout(() => {
|
|
8208
|
+
void doConnect();
|
|
8209
|
+
}, delay);
|
|
8210
|
+
if (!isAuthError2) {
|
|
8211
|
+
reconnectDelay = Math.min(reconnectDelay * RECONNECT_BACKOFF_MULTIPLIER2, MAX_RECONNECT_DELAY_MS2);
|
|
8212
|
+
}
|
|
8043
8213
|
}
|
|
8044
|
-
});
|
|
8045
|
-
async function connect(lastSyncId) {
|
|
8046
|
-
currentLastSyncId = lastSyncId;
|
|
8047
|
-
disconnect();
|
|
8048
|
-
await supervisor.start();
|
|
8049
8214
|
}
|
|
8050
|
-
function
|
|
8051
|
-
|
|
8215
|
+
async function parseSseStream(body, signal) {
|
|
8216
|
+
const reader = body.getReader();
|
|
8217
|
+
const decoder = new TextDecoder();
|
|
8218
|
+
let buffer = "";
|
|
8219
|
+
try {
|
|
8220
|
+
while (!signal.aborted) {
|
|
8221
|
+
const { done, value } = await reader.read();
|
|
8222
|
+
if (done) {
|
|
8223
|
+
break;
|
|
8224
|
+
}
|
|
8225
|
+
buffer += decoder.decode(value, { stream: true });
|
|
8226
|
+
const parts = buffer.split(/(?:\r\n|\r|\n){2}/);
|
|
8227
|
+
buffer = parts.pop() ?? "";
|
|
8228
|
+
for (const part of parts) {
|
|
8229
|
+
processEventBlock(part.trim());
|
|
8230
|
+
}
|
|
8231
|
+
}
|
|
8232
|
+
} finally {
|
|
8233
|
+
reader.releaseLock();
|
|
8234
|
+
}
|
|
8235
|
+
if (!shouldReconnect) {
|
|
8236
|
+
return;
|
|
8237
|
+
}
|
|
8052
8238
|
isConnected = false;
|
|
8053
8239
|
stopSubscriptionRefresh();
|
|
8054
|
-
|
|
8055
|
-
|
|
8056
|
-
|
|
8240
|
+
options.onStateChange?.("disconnected");
|
|
8241
|
+
reconnectTimer = setTimeout(() => {
|
|
8242
|
+
void doConnect();
|
|
8243
|
+
}, reconnectDelay);
|
|
8244
|
+
}
|
|
8245
|
+
function processEventBlock(block) {
|
|
8246
|
+
if (!block || block.startsWith(":")) {
|
|
8247
|
+
return;
|
|
8248
|
+
}
|
|
8249
|
+
let eventId;
|
|
8250
|
+
let eventType;
|
|
8251
|
+
let eventData;
|
|
8252
|
+
for (const line of block.split(/\r\n|\r|\n/)) {
|
|
8253
|
+
if (line.startsWith("id: ")) {
|
|
8254
|
+
eventId = line.slice(4).trim();
|
|
8255
|
+
} else if (line.startsWith("event: ")) {
|
|
8256
|
+
eventType = line.slice(7).trim();
|
|
8257
|
+
} else if (line.startsWith("data: ")) {
|
|
8258
|
+
eventData = line.slice(6);
|
|
8259
|
+
}
|
|
8260
|
+
}
|
|
8261
|
+
if (eventType === "token-expired") {
|
|
8262
|
+
needsForceRefresh = true;
|
|
8263
|
+
return;
|
|
8264
|
+
}
|
|
8265
|
+
if (eventType === "full-resync") {
|
|
8266
|
+
options.onFullResync?.();
|
|
8267
|
+
return;
|
|
8268
|
+
}
|
|
8269
|
+
if ((eventType === "query-add" || eventType === "query-remove") && eventData) {
|
|
8270
|
+
try {
|
|
8271
|
+
const parsed = JSON.parse(eventData);
|
|
8272
|
+
options.onQueryEvent?.({
|
|
8273
|
+
type: eventType === "query-add" ? "add" : "remove",
|
|
8274
|
+
...parsed
|
|
8275
|
+
});
|
|
8276
|
+
} catch {
|
|
8277
|
+
}
|
|
8278
|
+
return;
|
|
8279
|
+
}
|
|
8280
|
+
if (!eventId) {
|
|
8281
|
+
return;
|
|
8282
|
+
}
|
|
8283
|
+
currentLastSyncId = eventId;
|
|
8284
|
+
if (eventType === "cursor") {
|
|
8285
|
+
options.onCursor?.(eventId);
|
|
8286
|
+
return;
|
|
8287
|
+
}
|
|
8288
|
+
if (eventType === "sync" && eventData) {
|
|
8289
|
+
try {
|
|
8290
|
+
const parsed = JSON.parse(eventData);
|
|
8291
|
+
options.onEvent({
|
|
8292
|
+
id: eventId,
|
|
8293
|
+
...parsed
|
|
8294
|
+
});
|
|
8295
|
+
} catch {
|
|
8296
|
+
}
|
|
8057
8297
|
}
|
|
8058
8298
|
}
|
|
8059
|
-
function
|
|
8060
|
-
|
|
8299
|
+
function disconnect() {
|
|
8300
|
+
shouldReconnect = false;
|
|
8301
|
+
isConnected = false;
|
|
8302
|
+
stopSubscriptionRefresh();
|
|
8303
|
+
if (reconnectTimer) {
|
|
8304
|
+
clearTimeout(reconnectTimer);
|
|
8305
|
+
reconnectTimer = void 0;
|
|
8306
|
+
}
|
|
8307
|
+
if (abortController) {
|
|
8308
|
+
abortController.abort();
|
|
8309
|
+
abortController = void 0;
|
|
8310
|
+
}
|
|
8311
|
+
options.onStateChange?.("disconnected");
|
|
8061
8312
|
}
|
|
8062
8313
|
function subscribe(descriptor) {
|
|
8063
8314
|
activeSubscriptions.set(descriptor.id, descriptor);
|
|
@@ -8121,60 +8372,6 @@ function createSseTransport(options) {
|
|
|
8121
8372
|
resolvedToken = await refreshTokenSingleFlight(options.getToken, resolvedToken);
|
|
8122
8373
|
}
|
|
8123
8374
|
}
|
|
8124
|
-
function processEventBlock(block, requestTokenRefresh) {
|
|
8125
|
-
if (!block || block.startsWith(":")) {
|
|
8126
|
-
return;
|
|
8127
|
-
}
|
|
8128
|
-
let eventId;
|
|
8129
|
-
let eventType;
|
|
8130
|
-
let eventData;
|
|
8131
|
-
for (const line of block.split(/\r\n|\r|\n/)) {
|
|
8132
|
-
if (line.startsWith("id: ")) {
|
|
8133
|
-
eventId = line.slice(4).trim();
|
|
8134
|
-
} else if (line.startsWith("event: ")) {
|
|
8135
|
-
eventType = line.slice(7).trim();
|
|
8136
|
-
} else if (line.startsWith("data: ")) {
|
|
8137
|
-
eventData = line.slice(6);
|
|
8138
|
-
}
|
|
8139
|
-
}
|
|
8140
|
-
if (eventType === "token-expired") {
|
|
8141
|
-
requestTokenRefresh();
|
|
8142
|
-
throw new AuthSseError(401);
|
|
8143
|
-
}
|
|
8144
|
-
if (eventType === "full-resync") {
|
|
8145
|
-
options.onFullResync?.();
|
|
8146
|
-
return;
|
|
8147
|
-
}
|
|
8148
|
-
if ((eventType === "query-add" || eventType === "query-remove") && eventData) {
|
|
8149
|
-
try {
|
|
8150
|
-
const parsed = JSON.parse(eventData);
|
|
8151
|
-
options.onQueryEvent?.({
|
|
8152
|
-
type: eventType === "query-add" ? "add" : "remove",
|
|
8153
|
-
...parsed
|
|
8154
|
-
});
|
|
8155
|
-
} catch {
|
|
8156
|
-
}
|
|
8157
|
-
return;
|
|
8158
|
-
}
|
|
8159
|
-
if (!eventId) {
|
|
8160
|
-
return;
|
|
8161
|
-
}
|
|
8162
|
-
currentLastSyncId = eventId;
|
|
8163
|
-
if (eventType === "cursor") {
|
|
8164
|
-
options.onCursor?.(eventId);
|
|
8165
|
-
return;
|
|
8166
|
-
}
|
|
8167
|
-
if (eventType === "sync" && eventData) {
|
|
8168
|
-
try {
|
|
8169
|
-
const parsed = JSON.parse(eventData);
|
|
8170
|
-
options.onEvent({
|
|
8171
|
-
id: eventId,
|
|
8172
|
-
...parsed
|
|
8173
|
-
});
|
|
8174
|
-
} catch {
|
|
8175
|
-
}
|
|
8176
|
-
}
|
|
8177
|
-
}
|
|
8178
8375
|
return {
|
|
8179
8376
|
connect,
|
|
8180
8377
|
disconnect,
|
|
@@ -22674,5 +22871,5 @@ var DvinaSdk = class extends Request {
|
|
|
22674
22871
|
};
|
|
22675
22872
|
|
|
22676
22873
|
export { AbortChatMutation, Action, AddInsightToReportMutation, Agent, AgentConnection, AgentQuery, AgentSubBuilder, Agent_ChatsQuery, AgentsQuery, AiProviderSettingQuery, Artifact, ArtifactConnection, ArtifactQuery, ArtifactSubBuilder, Artifact_ChatQuery, Artifact_Chat_DesktopDeviceQuery, Artifact_Chat_InsightQuery, Artifact_Chat_ProjectQuery, Artifact_FileQuery, Artifact_MessageQuery, Artifact_Message_ChatQuery, Artifact_Message_ContentsQuery, Artifact_Message_FeedbackQuery, ArtifactsQuery, AudioEventOutput, CancelOauthFlowMutation, CancelWorkspaceDeletionMutation, Candidate, CandidateEvidence, Chat, ChatConnection, ChatImportExecuteOutput, ChatImportPreviewOutput, ChatMessage, ChatMessageConnection, ChatMessageQuery, ChatMessageSubBuilder, ChatMessage_ArtifactsQuery, ChatMessage_ChatQuery, ChatMessage_Chat_DesktopDeviceQuery, ChatMessage_Chat_InsightQuery, ChatMessage_Chat_ProjectQuery, ChatMessage_ContentsQuery, ChatMessage_FeedbackQuery, ChatMessagesQuery, ChatQuery, ChatSubBuilder, ChatTitleEventOutput, Chat_AgentsQuery, Chat_ArtifactsQuery, Chat_DesktopDeviceQuery, Chat_DesktopDevice_DesktopBindingsQuery, Chat_InsightQuery, Chat_Insight_ReportMembersQuery, Chat_Insight_ThumbnailFileQuery, Chat_MessagesQuery, Chat_ProjectQuery, Chat_Project_DesktopBindingQuery, ChatsQuery, ConnectIntegrationMutation, ConsumePulseEventsMutation, ContentBlock, ContentMask, ContinueImportedChatMutation, ContinueInterpretationMutation, CreateAgentMutation, CreateChatMutation, CreateDatabaseMutation, CreateDocumentMutation, CreateFeedbackMutation, CreateFolderMutation, CreateInsightMutation, CreateIntegrationMutation, CreateIntegrationOutput, CreateProjectMutation, CreateReportMutation, CreateTableMutation, CreateUserSkillFileMutation, CreateUserSkillFolderMutation, CubeModel, DB_ENTITY_SCHEMA, Database, DatabaseCatalog, DatabaseCatalogConnection, DatabaseCatalogQuery, DatabaseCatalogSubBuilder, DatabaseCatalog_EngineQuery, DatabaseCatalogsQuery, DatabaseConnection, DatabaseEngine, DatabaseQuery, DatabaseSchemaQuery, DatabaseSubBuilder, Database_EngineQuery, Database_Engine_CatalogQuery, Database_TablesQuery, DatabasesQuery, DeepAnalysisUsage, DeferredDvinaQueryRef, DeleteAgentMutation, DeleteAiProviderSettingMutation, DeleteArtifactMutation, DeleteChatMutation, DeleteDatabaseMutation, DeleteDocumentMutation, DeleteFolderMutation, DeleteInsightMutation, DeleteInsightsMutation, DeleteIntegrationMutation, DeleteProjectMutation, DeleteReportMutation, DeleteTableMutation, DeleteUserSkillFileMutation, DeleteUserSkillFolderMutation, DesktopDevice, DesktopDeviceConnection, DesktopDeviceQuery, DesktopDeviceSubBuilder, DesktopDevice_ChatsQuery, DesktopDevice_DesktopBindingsQuery, DesktopDevicesQuery, DevAccessTokenOutput, DexieLiveQueryRef, DisconnectIntegrationMutation, DismissPulseEventMutation, Document, DocumentCatalog, DocumentCatalogConnection, DocumentCatalogQuery, DocumentCatalogSubBuilder, DocumentCatalog_FormatQuery, DocumentCatalogsQuery, DocumentConnection, DocumentContent, DocumentFormat, DocumentQuery, DocumentSubBuilder, Document_ContentsQuery, Document_FileQuery, Document_FormatQuery, Document_Format_CatalogQuery, Document_TablesQuery, DocumentsQuery, DvinaDatabase, DvinaModel, DvinaSdk, Evidence, ExecuteChatImportMutation, ExportQuery, ExportWithInsightIdQuery, FailedSyncEventIngestion, FeedArtifactData, FeedConnection, FeedDatabaseData, FeedDocumentData, FeedInsightData, FeedIntegrationData, FeedItem, FeedItemGenerated, FeedItemQuery, FeedItemSubBuilder, FeedItem_ActionQuery, FeedItem_DataQuery, FeedItemsQuery, FeedLiveContextData, FeedProjectData, FeedPulseData, FeedSendMessageAction, Feedback, File, FileMetaQuery, FileModel, FileQuery, FileUrlsQuery, FinalContentEventOutput, FindFitTierQuery, Folder, FolderConnection, FolderQuery, FoldersQuery, GenerateUploadUriMutation, GetCapabilityQuery, GetDevAccessTokenQuery, GetLimitQuery, GetRemainingQuery, GetTokenUsageByModelQuery, GetTokenUsageHistoryQuery, GetTokenUsageStatusQuery, GetTokenUsageStatus_WindowsQuery, GetTokenUsageStatus_Windows_DayQuery, GetTokenUsageStatus_Windows_FiveHourQuery, GetTokenUsageStatus_Windows_MonthQuery, GetTokenUsageStatus_Windows_WeekQuery, GetUsageQuery, ImportedChatSummaryOutput, InferenceRequestAudit, Insight, InsightConnection, InsightQuery, InsightSubBuilder, Insight_ChatQuery, Insight_Chat_DesktopDeviceQuery, Insight_Chat_ProjectQuery, Insight_ReportMembersQuery, Insight_ReportsQuery, Insight_ThumbnailFileQuery, InsightsQuery, Integration, IntegrationCatalog, IntegrationCatalogConnection, IntegrationCatalogQuery, IntegrationCatalogSubBuilder, IntegrationCatalogToolsQuery, IntegrationCatalog_ProviderQuery, IntegrationCatalogsQuery, IntegrationConnection, IntegrationProvider, IntegrationQuery, IntegrationSubBuilder, Integration_ProviderQuery, Integration_Provider_CatalogQuery, IntegrationsQuery, Interpretation, InterpretationConnection, InterpretationsQuery, Invocation, LiveContext, LiveContextConnection, LiveContextQuery, LiveContextSubBuilder, LiveContext_ItemsQuery, LiveContext_SourceQuery, LiveContext_Source_EvidencesQuery, LiveContextsQuery, LocalSandboxDeviceStatusModel, LocalSandboxDeviceStatusesQuery, MUTATION_CACHE_RULES, MappedDvinaQueryRef, McpAuthUpdateModel, McpAuthUpdatesSubscription, McpClientInformation, McpCodeVerifier, McpServer, McpTokens, McpTool, MessageEndEventOutput, MessageStartEventOutput, ModelTokenUsage, Notification, NotificationConnection, NotificationQuery, NotificationsByReferenceQuery, NotificationsQuery, PRIMARY_KEY_CONFIG, PreviewChatImportMutation, PrivacyStats, PrivacyStatsQuery, ProgressSummaryEventOutput, Project, ProjectConnection, ProjectDesktopBinding, ProjectQuery, ProjectSubBuilder, Project_ChatsQuery, Project_DesktopBindingQuery, Project_DesktopBinding_DeviceQuery, ProjectsQuery, PulseAppSummaryModel, PulseAppSummaryQuery, PulseEvent, PulseEventConnection, PulseEventQuery, PulseEventSubBuilder, PulseEvent_IntegrationQuery, PulseEvent_Integration_ProviderQuery, PulseEventsQuery, PulseTriggerSettingModel, PulseTriggerSettingsQuery, QueryQuery, QueryWithInsightIdQuery, QueryWithMessageIdQuery, ReanalyzeDocumentMutation, ReasoningEventOutput, RefineAgentInstructionMutation, RefineSkillInstructionMutation, RefreshDatabaseSchemaMutation, RefreshInsightMutation, RegisterDesktopDeviceMutation, ReinterpretSourceMutation, ReinterpretSourcesOfuserMutation, Relation, RelocateInsightMutation, RemoveInsightFromReportMutation, Report, ReportConnection, ReportMember, ReportQuery, ReportSubBuilder, Report_InsightsQuery, Report_LayoutQuery, ReportsQuery, ResetWorkspaceMutation, ResolvePulseEventMutation, ResolvedFileUrl, ScheduleWorkspaceDeletionMutation, SendMessageMutation, SetDatabasePrimaryKeyMutation, StreamEventSchemaAnchor, StreamMessageContentOutput, StreamMessageOutput, SyncEngine, SyncEvent, SyncEventCursor, SyncProjectDesktopBindingMutation, TABLE_TO_TYPENAME, TYPENAME_TO_TABLE, Table, TableConnection, TableQuery, TableSubBuilder, Table_DatabaseQuery, Table_Database_EngineQuery, Table_DocumentQuery, Table_Document_ContentsQuery, Table_Document_FileQuery, Table_Document_FormatQuery, Table_FromRelationsQuery, Table_ToRelationsQuery, TablesQuery, TextBlockEventOutput, TextDeltaEventOutput, TokenUsage, TokenUsageUpdatesSubscription, ToolInputDeltaEventOutput, ToolResultArtifactOutput, ToolResultEventOutput, ToolStartEventOutput, UpdateAgentMutation, UpdateArtifactNameMutation, UpdateChatMutation, UpdateDatabaseMutation, UpdateDocumentMutation, UpdateFolderMutation, UpdateInsightInReportMutation, UpdateInsightMutation, UpdateInsightThumbnailMutation, UpdateInterpMutation, UpdateLiveContextMutation, UpdateProjectMutation, UpdatePulseTriggerMutation, UpdateReportMutation, UpdateTableMutation, UpdateUserSkillFileMutation, UpdateUserSkillFolderMutation, UpsertAiProviderSettingMutation, UsageMetaOutput, UsageStatus, UsageWindowsStatusType, UserAiProviderSetting, UserSkillFile, UserSkillFileModel, UserSkillFileQuery, UserSkillFilesQuery, UserSkillFolder, UserSkillFolderModel, UserSkillFolderQuery, UserSkillFoldersQuery, WidgetBlockCompleteEventOutput, WidgetBlockErrorEventOutput, WidgetBlockStartEventOutput, WidgetHtmlDeltaEventOutput, WindowDetailType, WorkspaceDeleteSchedule, WorkspaceDeletionScheduleQuery, closeDatabase, createChatStreamClient, createDvinaClient, createLazySyncEngine, createSseTransport, createWsTransport, deleteDatabase, getOrCreateDatabase, reconstructConnectionNodes, reconstructEntity, uploadFile };
|
|
22677
|
-
//# sourceMappingURL=chunk-
|
|
22678
|
-
//# sourceMappingURL=chunk-
|
|
22874
|
+
//# sourceMappingURL=chunk-IM7TFRLL.js.map
|
|
22875
|
+
//# sourceMappingURL=chunk-IM7TFRLL.js.map
|