@memberjunction/server 6.2.0-edge.1 → 6.2.0-edge.3
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 +30 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/config.d.ts +2189 -71
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +123 -3
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +11 -23
- package/dist/context.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +2143 -205
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +24441 -14433
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.d.ts +15 -1
- package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.js +16 -2
- package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts +31 -0
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js +215 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -0
- package/dist/generic/PushStatusResolver.d.ts +38 -0
- package/dist/generic/PushStatusResolver.d.ts.map +1 -1
- package/dist/generic/PushStatusResolver.js +84 -1
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +56 -4
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +191 -74
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +4 -0
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +33 -1
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +204 -50
- package/dist/index.js.map +1 -1
- package/dist/postgresqlCompat.d.ts +8 -0
- package/dist/postgresqlCompat.d.ts.map +1 -0
- package/dist/postgresqlCompat.js +19 -0
- package/dist/postgresqlCompat.js.map +1 -0
- package/dist/postgresqlPoolSettings.d.ts +108 -0
- package/dist/postgresqlPoolSettings.d.ts.map +1 -0
- package/dist/postgresqlPoolSettings.js +134 -0
- package/dist/postgresqlPoolSettings.js.map +1 -0
- package/dist/resolvers/AdhocQueryResolver.d.ts +23 -18
- package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +77 -167
- package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.d.ts +55 -0
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -0
- package/dist/resolvers/AgentRunStatusPublisher.js +141 -0
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -0
- package/dist/resolvers/ConversationRunEventsResolver.d.ts +90 -0
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -0
- package/dist/resolvers/ConversationRunEventsResolver.js +283 -0
- package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.d.ts +98 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.d.ts.map +1 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.js +227 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.js.map +1 -0
- package/dist/resolvers/EntityRecordNameResolver.d.ts +7 -23
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +9 -47
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +2 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +9 -0
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/HumanHandoffResolver.d.ts +107 -0
- package/dist/resolvers/HumanHandoffResolver.d.ts.map +1 -0
- package/dist/resolvers/HumanHandoffResolver.js +324 -0
- package/dist/resolvers/HumanHandoffResolver.js.map +1 -0
- package/dist/resolvers/MeetingResolver.d.ts +69 -0
- package/dist/resolvers/MeetingResolver.d.ts.map +1 -0
- package/dist/resolvers/MeetingResolver.js +381 -0
- package/dist/resolvers/MeetingResolver.js.map +1 -0
- package/dist/resolvers/MergeRecordsResolver.d.ts +7 -0
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +16 -2
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.d.ts +34 -1
- package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +202 -7
- package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +45 -89
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +94 -240
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +0 -16
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +23 -153
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunDecisionResolver.d.ts +149 -0
- package/dist/resolvers/RunDecisionResolver.d.ts.map +1 -0
- package/dist/resolvers/RunDecisionResolver.js +396 -0
- package/dist/resolvers/RunDecisionResolver.js.map +1 -0
- package/dist/resolvers/VectorizeEntityResolver.d.ts +1 -1
- package/dist/resolvers/VectorizeEntityResolver.d.ts.map +1 -1
- package/dist/resolvers/VectorizeEntityResolver.js +14 -10
- package/dist/resolvers/VectorizeEntityResolver.js.map +1 -1
- package/dist/resolvers/adhocTimeout.d.ts +7 -0
- package/dist/resolvers/adhocTimeout.d.ts.map +1 -0
- package/dist/resolvers/adhocTimeout.js +12 -0
- package/dist/resolvers/adhocTimeout.js.map +1 -0
- package/dist/resolvers/meetings/index.d.ts +5 -0
- package/dist/resolvers/meetings/index.d.ts.map +1 -0
- package/dist/resolvers/meetings/index.js +5 -0
- package/dist/resolvers/meetings/index.js.map +1 -0
- package/dist/resolvers/meetings/meetingHelpers.d.ts +17 -0
- package/dist/resolvers/meetings/meetingHelpers.d.ts.map +1 -0
- package/dist/resolvers/meetings/meetingHelpers.js +212 -0
- package/dist/resolvers/meetings/meetingHelpers.js.map +1 -0
- package/dist/resolvers/meetings/meetingMutations.d.ts +12 -0
- package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -0
- package/dist/resolvers/meetings/meetingMutations.js +418 -0
- package/dist/resolvers/meetings/meetingMutations.js.map +1 -0
- package/dist/resolvers/meetings/meetingQueries.d.ts +7 -0
- package/dist/resolvers/meetings/meetingQueries.d.ts.map +1 -0
- package/dist/resolvers/meetings/meetingQueries.js +113 -0
- package/dist/resolvers/meetings/meetingQueries.js.map +1 -0
- package/dist/resolvers/meetings/meetingTypes.d.ts +89 -0
- package/dist/resolvers/meetings/meetingTypes.d.ts.map +1 -0
- package/dist/resolvers/meetings/meetingTypes.js +345 -0
- package/dist/resolvers/meetings/meetingTypes.js.map +1 -0
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +8 -5
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts +8 -0
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +27 -1
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/services/WorkQueueHostService.d.ts +36 -0
- package/dist/services/WorkQueueHostService.d.ts.map +1 -0
- package/dist/services/WorkQueueHostService.js +97 -0
- package/dist/services/WorkQueueHostService.js.map +1 -0
- package/dist/services/workQueueConfig.d.ts +103 -0
- package/dist/services/workQueueConfig.d.ts.map +1 -0
- package/dist/services/workQueueConfig.js +48 -0
- package/dist/services/workQueueConfig.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +95 -92
- package/src/__tests__/AdhocQueryResolver.bugs.test.ts +14 -35
- package/src/__tests__/AdhocQueryResolver.pagination.test.ts +6 -2
- package/src/__tests__/AdhocQueryResolver.scopeGuard.test.ts +3 -3
- package/src/__tests__/AgentRunStatusPublisher.test.ts +175 -0
- package/src/__tests__/DuplicateEntryCheckResolver.test.ts +300 -0
- package/src/__tests__/EntityRecordNameResolver.fieldSecurity.test.ts +27 -72
- package/src/__tests__/HumanHandoffResolver.test.ts +233 -0
- package/src/__tests__/MeetingResolver.test.ts +374 -0
- package/src/__tests__/RealtimeBridgeResolver.test.ts +240 -2
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +216 -2
- package/src/__tests__/RemoteBrowserActionRecovery.test.ts +7 -1
- package/src/__tests__/RemoteBrowserAudioStream.test.ts +7 -1
- package/src/__tests__/RemoteBrowserSnapshot.test.ts +7 -1
- package/src/__tests__/ResolverBase.adhocReadScope.test.ts +96 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +52 -0
- package/src/__tests__/ResolverBase.filterEscaping.test.ts +21 -2
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +291 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +182 -12
- package/src/__tests__/RunAIAgentResolver.streaming.test.ts +18 -27
- package/src/__tests__/RunDecisionResolver.test.ts +699 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +43 -0
- package/src/__tests__/VectorizeEntityResolver.test.ts +106 -0
- package/src/__tests__/WorkQueueHostService.test.ts +133 -0
- package/src/__tests__/adhocTimeoutClamp.test.ts +26 -0
- package/src/__tests__/conversationRunEvents.test.ts +399 -0
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +283 -0
- package/src/__tests__/postgresqlPoolSettings.test.ts +131 -0
- package/src/__tests__/pushStatusFanOut.test.ts +206 -0
- package/src/__tests__/translateBracketsToPG.test.ts +20 -0
- package/src/auth/__tests__/backward-compatibility.test.ts +1 -0
- package/src/config.ts +130 -3
- package/src/context.ts +11 -24
- package/src/generated/graphql-schemas/__mj.ts +24183 -17182
- package/src/generic/FireAndForgetHeartbeat.ts +16 -2
- package/src/generic/OrphanedConversationDetailReconciler.ts +267 -0
- package/src/generic/PushStatusResolver.ts +97 -1
- package/src/generic/ResolverBase.ts +220 -76
- package/src/generic/RunViewResolver.ts +33 -2
- package/src/index.ts +228 -51
- package/src/postgresqlCompat.ts +21 -0
- package/src/postgresqlPoolSettings.ts +213 -0
- package/src/resolvers/AdhocQueryResolver.ts +88 -188
- package/src/resolvers/AgentRunStatusPublisher.ts +175 -0
- package/src/resolvers/ConversationRunEventsResolver.ts +308 -0
- package/src/resolvers/DuplicateEntryCheckResolver.ts +232 -0
- package/src/resolvers/EntityRecordNameResolver.ts +9 -51
- package/src/resolvers/FetchEntityVectorsResolver.ts +2 -1
- package/src/resolvers/GetDataResolver.ts +10 -0
- package/src/resolvers/HumanHandoffResolver.ts +304 -0
- package/src/resolvers/MeetingResolver.ts +438 -0
- package/src/resolvers/MergeRecordsResolver.ts +14 -2
- package/src/resolvers/RealtimeBridgeResolver.ts +227 -13
- package/src/resolvers/RealtimeClientSessionResolver.ts +99 -287
- package/src/resolvers/RunAIAgentResolver.ts +28 -174
- package/src/resolvers/RunDecisionResolver.ts +435 -0
- package/src/resolvers/VectorizeEntityResolver.ts +16 -11
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +93 -0
- package/src/resolvers/adhocTimeout.ts +12 -0
- package/src/resolvers/meetings/index.ts +4 -0
- package/src/resolvers/meetings/meetingHelpers.ts +307 -0
- package/src/resolvers/meetings/meetingMutations.ts +535 -0
- package/src/resolvers/meetings/meetingQueries.ts +172 -0
- package/src/resolvers/meetings/meetingTypes.ts +238 -0
- package/src/rest/ViewOperationsHandler.ts +8 -5
- package/src/services/TaskGraphActionRunner.ts +29 -1
- package/src/services/WorkQueueHostService.ts +129 -0
- package/src/services/workQueueConfig.ts +52 -0
- package/src/types.ts +5 -0
- package/dist/resolvers/adhoc-query-helpers.d.ts +0 -33
- package/dist/resolvers/adhoc-query-helpers.d.ts.map +0 -1
- package/dist/resolvers/adhoc-query-helpers.js +0 -50
- package/dist/resolvers/adhoc-query-helpers.js.map +0 -1
- package/src/__tests__/adhoc-query-helpers.test.ts +0 -50
- package/src/resolvers/adhoc-query-helpers.ts +0 -67
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,gBAAgB,EAAuI,MAAM,sBAAsB,CAAC;AAUvM,OAAgB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAQ/C,OAAO,kBAAkB,CAAC;AAQ1B,OAAO,EAA2I,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -29,6 +29,8 @@ import { WebSocketServer } from 'ws';
|
|
|
29
29
|
import { RealtimeProxyServer } from './realtimeProxy/RealtimeProxyServer.js';
|
|
30
30
|
import buildApolloServer from './apolloServer/index.js';
|
|
31
31
|
import { configInfo, configFilePath, dbDatabase, dbHost, dbPort, dbUsername, graphqlPort, graphqlRootPath, mj_core_schema, websiteRunFromPackage } from './config.js';
|
|
32
|
+
import { TranslateBracketsToPG } from './postgresqlCompat.js';
|
|
33
|
+
import { BuildPostgreSQLConnectionConfig, DescribeReadOnlyLoginOverreach, PostgreSQLReadOnlyPool, ResolvePostgreSQLEndpoint, ResolvePostgreSQLReadOnlyCredentials, ToPGPoolConfig } from './postgresqlPoolSettings.js';
|
|
32
34
|
import { default as jwt } from 'jsonwebtoken';
|
|
33
35
|
import { contextFunction, CreateUnifiedAuthMiddleware, getUserPayload } from './context.js';
|
|
34
36
|
import { requireSystemUserDirective, publicDirective } from './directives/index.js';
|
|
@@ -55,12 +57,17 @@ import { createAuthProviderCatalogRouter, AUTH_CATALOG_MOUNT_PATH } from './auth
|
|
|
55
57
|
import { GetAPIKeyEngine } from '@memberjunction/api-keys';
|
|
56
58
|
import { RedisLocalStorageProvider } from '@memberjunction/redis-provider';
|
|
57
59
|
import { PubSubManager } from './generic/PubSubManager.js';
|
|
60
|
+
import { ReconcileOrphanedConversationDetails } from './generic/OrphanedConversationDetailReconciler.js';
|
|
61
|
+
import { PUSH_STATUS_UPDATES_TOPIC, SetPushStatusPublishHook, ParseReplicatedStatusUpdate, } from './generic/PushStatusResolver.js';
|
|
62
|
+
import { HANDOFF_OFFER_FANOUT_CHANNEL, HANDOFF_OFFER_TOPIC, SetHandoffOfferPublishHook, ParseReplicatedHandoffOfferUpdate, } from './resolvers/HumanHandoffResolver.js';
|
|
63
|
+
import { RoomHandoffEngine } from '@memberjunction/livekit-room-server';
|
|
58
64
|
import { IntegrationProgressEmitter } from '@memberjunction/integration-progress-artifacts';
|
|
59
65
|
import { PublishIntegrationProgress } from './resolvers/IntegrationProgressResolver.js';
|
|
60
66
|
import { RegisterRSUProgressBridge } from './integration/RSUProgressBridge.js';
|
|
61
67
|
import { ClientToolRequestManager, AgentRunWatchdog } from '@memberjunction/ai-agents';
|
|
62
68
|
import { SessionJanitor } from './agentSessions/index.js';
|
|
63
69
|
import { StartTaskGraphDispatcher } from './services/StartTaskGraphDispatcher.js';
|
|
70
|
+
import { MJServerWorkQueueProviderSource, StartWorkQueueHost } from './services/WorkQueueHostService.js';
|
|
64
71
|
import { GetAttachmentService } from '@memberjunction/aiengine';
|
|
65
72
|
import { MJStorageBlobStore } from './services/MJStorageBlobStore.js';
|
|
66
73
|
import { CACHE_INVALIDATION_TOPIC, MayBroadcastRecordData, ConfigureRecordDataBroadcast } from './generic/CacheInvalidationResolver.js';
|
|
@@ -131,7 +138,9 @@ export * from './generic/refusalExtensions.js';
|
|
|
131
138
|
export * from './generic/RunViewResolver.js';
|
|
132
139
|
export * from './resolvers/RunTemplateResolver.js';
|
|
133
140
|
export * from './resolvers/RunAIPromptResolver.js';
|
|
141
|
+
export * from './resolvers/RunDecisionResolver.js';
|
|
134
142
|
export * from './resolvers/RunAIAgentResolver.js';
|
|
143
|
+
export { AgentRunStatusPublisher } from './resolvers/AgentRunStatusPublisher.js';
|
|
135
144
|
export * from './resolvers/VectorizeEntityResolver.js';
|
|
136
145
|
export * from './resolvers/SearchKnowledgeResolver.js';
|
|
137
146
|
export * from './resolvers/SearchKnowledgeStreamResolver.js';
|
|
@@ -186,6 +195,7 @@ export * from './rest/MediaAccessKeys.js';
|
|
|
186
195
|
export * from './rest/MediaStreamHandler.js';
|
|
187
196
|
export * from './resolvers/InfoResolver.js';
|
|
188
197
|
export * from './resolvers/PotentialDuplicateRecordResolver.js';
|
|
198
|
+
export * from './resolvers/DuplicateEntryCheckResolver.js';
|
|
189
199
|
export * from './resolvers/RunTestResolver.js';
|
|
190
200
|
export * from './resolvers/SearchEntitiesResolver.js';
|
|
191
201
|
export * from './resolvers/UserFavoriteResolver.js';
|
|
@@ -196,6 +206,7 @@ export * from './resolvers/CurrentUserContextResolver.js';
|
|
|
196
206
|
export * from './resolvers/RSUResolver.js';
|
|
197
207
|
export * from './resolvers/AgentSessionResolver.js';
|
|
198
208
|
export * from './resolvers/RealtimeClientSessionResolver.js';
|
|
209
|
+
export * from './resolvers/MeetingResolver.js';
|
|
199
210
|
export * from './resolvers/RemoteBrowserActionResolver.js';
|
|
200
211
|
export * from './agentSessions/index.js';
|
|
201
212
|
export { GetReadOnlyDataSource, GetReadWriteDataSource, GetReadWriteProvider, GetReadOnlyProvider } from './util.js';
|
|
@@ -229,10 +240,102 @@ function resolveServerVersion() {
|
|
|
229
240
|
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
230
241
|
return pkg.version;
|
|
231
242
|
}
|
|
232
|
-
catch {
|
|
243
|
+
catch (err) {
|
|
244
|
+
LogError('Failed to resolve server version from package.json', undefined, err);
|
|
233
245
|
return undefined;
|
|
234
246
|
}
|
|
235
247
|
}
|
|
248
|
+
/** How often to re-check for conversation details left behind by finished runs. */
|
|
249
|
+
const ORPHAN_DETAIL_SWEEP_INTERVAL_MS = 5 * 60_000;
|
|
250
|
+
/** Redis channel carrying replicated push-status updates between server instances. */
|
|
251
|
+
const PUSH_STATUS_FANOUT_CHANNEL = 'push-status-updates';
|
|
252
|
+
/**
|
|
253
|
+
* Replicate push-status updates across server instances over Redis (MJ #4222).
|
|
254
|
+
*
|
|
255
|
+
* Outbound: every locally-published update is forwarded on a shared channel. Inbound: a message
|
|
256
|
+
* from another instance is republished onto THIS instance's local topic, where the normal
|
|
257
|
+
* subscription filter decides who receives it — so the identity gate (`ownerUserId` vs. the
|
|
258
|
+
* connection's authenticated user) still applies to a replicated message exactly as it does to a
|
|
259
|
+
* local one. The replica has no say in who sees what.
|
|
260
|
+
*
|
|
261
|
+
* Republishing goes straight to `PubSubManager`, never back through `publishStatusUpdate`, so an
|
|
262
|
+
* inbound message cannot be re-broadcast and loop. `SourceServerId` guards the remaining case: a
|
|
263
|
+
* publisher also receives its own message from Redis.
|
|
264
|
+
*/
|
|
265
|
+
async function wirePushStatusFanOut(redisProvider, startupLog) {
|
|
266
|
+
try {
|
|
267
|
+
await redisProvider.SubscribeToChannel(PUSH_STATUS_FANOUT_CHANNEL, (raw) => {
|
|
268
|
+
try {
|
|
269
|
+
const payload = ParseReplicatedStatusUpdate(raw, MJGlobal.Instance.ProcessUUID);
|
|
270
|
+
if (!payload) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
// Rebuilt as a plain record: the topic's publish signature takes an index-signature type,
|
|
274
|
+
// and listing the fields keeps the wire shape explicit at the one place it crosses hosts.
|
|
275
|
+
PubSubManager.Instance.Publish(PUSH_STATUS_UPDATES_TOPIC, {
|
|
276
|
+
sessionId: payload.sessionId,
|
|
277
|
+
ownerUserId: payload.ownerUserId,
|
|
278
|
+
message: payload.message,
|
|
279
|
+
SourceServerId: payload.SourceServerId,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
// A malformed message on a shared channel must not take down the subscriber.
|
|
284
|
+
LogError('Error processing push-status fan-out message', undefined, err);
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
SetPushStatusPublishHook((payload) => {
|
|
288
|
+
redisProvider.PublishMessage(PUSH_STATUS_FANOUT_CHANNEL, JSON.stringify(payload));
|
|
289
|
+
});
|
|
290
|
+
// Printed unconditionally, not verbose-gated. "Is fan-out actually on?" is the first question
|
|
291
|
+
// anyone debugging a hung conversation behind a load balancer asks, and a silent default left
|
|
292
|
+
// no way to answer it.
|
|
293
|
+
console.log('[MJAPI] Push-status updates: cross-instance fan-out enabled via Redis');
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
// Single-instance delivery still works, and the durable tail query covers the rest. Degraded,
|
|
297
|
+
// not broken — so this must not stop the server from starting.
|
|
298
|
+
console.warn(`Push-status fan-out unavailable: ${err.message}`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Replicate handoff-offer updates across server instances over Redis.
|
|
303
|
+
*
|
|
304
|
+
* Outbound: every locally-published offer change is forwarded on a shared Redis channel.
|
|
305
|
+
* Inbound: a message from another instance is republished onto THIS instance's local GraphQL
|
|
306
|
+
* topic (where the subscription filter scopes to the target user) and delivered to RoomHandoffEngine
|
|
307
|
+
* so the call-hosting instance can transition its local flow (e.g. wait for the user to join the room).
|
|
308
|
+
*/
|
|
309
|
+
async function wireHandoffOfferFanOut(redisProvider, startupLog) {
|
|
310
|
+
try {
|
|
311
|
+
await redisProvider.SubscribeToChannel(HANDOFF_OFFER_FANOUT_CHANNEL, (raw) => {
|
|
312
|
+
try {
|
|
313
|
+
const payload = ParseReplicatedHandoffOfferUpdate(raw, MJGlobal.Instance.ProcessUUID);
|
|
314
|
+
if (!payload) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
PubSubManager.Instance.Publish(HANDOFF_OFFER_TOPIC, {
|
|
318
|
+
UserID: payload.UserID,
|
|
319
|
+
Kind: payload.Kind,
|
|
320
|
+
Offer: payload.Offer,
|
|
321
|
+
});
|
|
322
|
+
RoomHandoffEngine.Instance.OnRemoteOfferChange(payload);
|
|
323
|
+
}
|
|
324
|
+
catch (err) {
|
|
325
|
+
// A malformed message on a shared channel must not take down the subscriber.
|
|
326
|
+
LogError('Error processing handoff-offer fan-out message', undefined, err);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
SetHandoffOfferPublishHook((payload) => {
|
|
330
|
+
redisProvider.PublishMessage(HANDOFF_OFFER_FANOUT_CHANNEL, JSON.stringify(payload));
|
|
331
|
+
});
|
|
332
|
+
console.log('[MJAPI] Handoff-offer updates: cross-instance fan-out enabled via Redis');
|
|
333
|
+
startupLog.LogIf('verbose', 'Handoff-offer updates: cross-instance fan-out enabled via Redis');
|
|
334
|
+
}
|
|
335
|
+
catch (err) {
|
|
336
|
+
console.warn(`Handoff-offer fan-out unavailable: ${err instanceof Error ? err.message : String(err)}`);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
236
339
|
// Bind MJStorage as the conversation-attachment blob store. The attachment service itself no longer
|
|
237
340
|
// imports `@memberjunction/storage` — that dependency made it unusable from any browser or React
|
|
238
341
|
// Native client, which is why the same attachment rules had been reimplemented three times.
|
|
@@ -273,28 +376,39 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
273
376
|
startupLog.BeginPhase('Connecting to database');
|
|
274
377
|
startupLog.LogIf('verbose', 'Database type: PostgreSQL');
|
|
275
378
|
const pg = await import('pg');
|
|
276
|
-
const { PostgreSQLDataProvider, PostgreSQLProviderConfigData } = await import('@memberjunction/postgresql-dataprovider');
|
|
277
|
-
const
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
const
|
|
281
|
-
const
|
|
282
|
-
const pgPool = new pg.default.Pool({
|
|
283
|
-
host: pgHost,
|
|
284
|
-
port: pgPort,
|
|
285
|
-
user: pgUser,
|
|
286
|
-
password: pgPass,
|
|
287
|
-
database: pgDatabase,
|
|
288
|
-
max: configInfo.databaseSettings.connectionPool?.max ?? 50,
|
|
289
|
-
min: configInfo.databaseSettings.connectionPool?.min ?? 5,
|
|
290
|
-
idleTimeoutMillis: configInfo.databaseSettings.connectionPool?.idleTimeoutMillis ?? 30000,
|
|
291
|
-
connectionTimeoutMillis: configInfo.databaseSettings.connectionPool?.acquireTimeoutMillis ?? 30000,
|
|
292
|
-
});
|
|
379
|
+
const { PostgreSQLDataProvider, PostgreSQLProviderConfigData, MJPostgresTypes } = await import('@memberjunction/postgresql-dataprovider');
|
|
380
|
+
const pgEndpoint = ResolvePostgreSQLEndpoint();
|
|
381
|
+
const { Host: pgHost, Port: pgPort, User: pgUser, Database: pgDatabase } = pgEndpoint;
|
|
382
|
+
// Every API pool carries the statement and idle-in-transaction timeouts from connection #1.
|
|
383
|
+
const pgConnectionConfig = BuildPostgreSQLConnectionConfig(pgEndpoint, configInfo.databaseSettings, 'api');
|
|
384
|
+
const pgPool = new pg.default.Pool(ToPGPoolConfig(pgConnectionConfig));
|
|
293
385
|
// Verify connection
|
|
294
386
|
const testClient = await pgPool.connect();
|
|
295
387
|
await testClient.query('SELECT 1');
|
|
296
388
|
testClient.release();
|
|
297
389
|
startupLog.LogIf('verbose', `PostgreSQL pool connected to ${pgHost}:${pgPort}/${pgDatabase}`);
|
|
390
|
+
// A read-only pool opened with the read-only login, as SQL Server has. Read-only per-request
|
|
391
|
+
// providers (TestQuerySQL and other caller-supplied SQL) share it instead of the primary pool.
|
|
392
|
+
const pgReadOnlyCredentials = ResolvePostgreSQLReadOnlyCredentials(configInfo);
|
|
393
|
+
if (pgReadOnlyCredentials) {
|
|
394
|
+
// A pool a provider runs on must carry the provider's type parsers, so BIGINT and NUMERIC
|
|
395
|
+
// come back as numbers here as they do on the provider's own pool.
|
|
396
|
+
const readOnlyPgPool = new pg.default.Pool({
|
|
397
|
+
...ToPGPoolConfig(BuildPostgreSQLConnectionConfig({ ...pgEndpoint, ...pgReadOnlyCredentials }, configInfo.databaseSettings, 'read-only')),
|
|
398
|
+
types: MJPostgresTypes,
|
|
399
|
+
});
|
|
400
|
+
const readOnlyTestClient = await readOnlyPgPool.connect();
|
|
401
|
+
try {
|
|
402
|
+
for (const warning of await DescribeReadOnlyLoginOverreach(readOnlyTestClient, mj_core_schema)) {
|
|
403
|
+
LogStatus(`WARNING: ${warning}`);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
finally {
|
|
407
|
+
readOnlyTestClient.release();
|
|
408
|
+
}
|
|
409
|
+
PostgreSQLReadOnlyPool.Instance.Pool = readOnlyPgPool;
|
|
410
|
+
startupLog.LogIf('verbose', 'Read-only PostgreSQL pool has been initialized.');
|
|
411
|
+
}
|
|
298
412
|
// Create a DataSourceInfo with a MSSQL-compatible wrapper around pg.Pool
|
|
299
413
|
// This allows existing code (types, util, context) to work without changes
|
|
300
414
|
const mssqlCompatPool = createMSSQLCompatPool(pgPool);
|
|
@@ -307,15 +421,6 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
307
421
|
userName: pgUser,
|
|
308
422
|
}));
|
|
309
423
|
// Set up the PostgreSQL provider
|
|
310
|
-
const pgConnectionConfig = {
|
|
311
|
-
Host: pgHost,
|
|
312
|
-
Port: pgPort,
|
|
313
|
-
Database: pgDatabase,
|
|
314
|
-
User: pgUser,
|
|
315
|
-
Password: pgPass,
|
|
316
|
-
MaxConnections: configInfo.databaseSettings.connectionPool?.max ?? 50,
|
|
317
|
-
MinConnections: configInfo.databaseSettings.connectionPool?.min ?? 5,
|
|
318
|
-
};
|
|
319
424
|
const pgConfigData = new PostgreSQLProviderConfigData(pgConnectionConfig, mj_core_schema, cacheRefreshInterval / 1000);
|
|
320
425
|
const provider = new PostgreSQLDataProvider();
|
|
321
426
|
await provider.Config(pgConfigData);
|
|
@@ -339,7 +444,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
339
444
|
if (poolAny._pgPool) {
|
|
340
445
|
const thePgPool = poolAny._pgPool;
|
|
341
446
|
// Translate SQL Server bracket syntax to PostgreSQL double-quote syntax
|
|
342
|
-
const pgQuery =
|
|
447
|
+
const pgQuery = TranslateBracketsToPG(query);
|
|
343
448
|
const result = await thePgPool.query(pgQuery);
|
|
344
449
|
return result.rows;
|
|
345
450
|
}
|
|
@@ -357,19 +462,15 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
357
462
|
const pgCodegenPass = process.env.CODEGEN_DB_PASSWORD;
|
|
358
463
|
if (pgCodegenUser && pgCodegenPass) {
|
|
359
464
|
try {
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
password: pgCodegenPass,
|
|
365
|
-
database: pgDatabase,
|
|
366
|
-
max: 10,
|
|
367
|
-
});
|
|
465
|
+
// CodeGen and DDL work runs long statements across every entity, so this pool gets the
|
|
466
|
+
// long CodeGen timeout rather than the API one, as the SQL Server CodeGen pool does.
|
|
467
|
+
const codegenPgConnectionConfig = BuildPostgreSQLConnectionConfig({ ...pgEndpoint, User: pgCodegenUser, Password: pgCodegenPass }, configInfo.databaseSettings, 'codegen');
|
|
468
|
+
const codegenPgPool = new pg.default.Pool(ToPGPoolConfig(codegenPgConnectionConfig));
|
|
368
469
|
const codegenTestClient = await codegenPgPool.connect();
|
|
369
470
|
await codegenTestClient.query('SELECT 1');
|
|
370
471
|
codegenTestClient.release();
|
|
371
472
|
const { RuntimeSchemaManager } = await import('@memberjunction/schema-engine');
|
|
372
|
-
const codegenPgConfigData = new PostgreSQLProviderConfigData(
|
|
473
|
+
const codegenPgConfigData = new PostgreSQLProviderConfigData(codegenPgConnectionConfig, mj_core_schema, cacheRefreshInterval / 1000);
|
|
373
474
|
const codegenPgProvider = new PostgreSQLDataProvider();
|
|
374
475
|
await codegenPgProvider.Config(codegenPgConfigData); // separate pool (per-instance manager); does NOT touch the global API provider
|
|
375
476
|
RuntimeSchemaManager.Instance.SetDDLProvider(codegenPgProvider);
|
|
@@ -605,6 +706,15 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
605
706
|
});
|
|
606
707
|
}
|
|
607
708
|
});
|
|
709
|
+
// Fan push-status updates across server instances (MJ #4222).
|
|
710
|
+
//
|
|
711
|
+
// Behind a load balancer the browser's WebSocket lives on one replica while the mutation that
|
|
712
|
+
// drives the agent can be handled by another. The push topic is an in-process PubSub, so a
|
|
713
|
+
// completion published on replica B never reaches a subscriber on replica A — the browser waits
|
|
714
|
+
// forever for an event that was delivered to nobody. Replicating progress and completion over
|
|
715
|
+
// Redis closes that, and the durable tail query remains the backstop if Redis is down.
|
|
716
|
+
await wirePushStatusFanOut(redisProvider, startupLog);
|
|
717
|
+
await wireHandoffOfferFanOut(redisProvider, startupLog);
|
|
608
718
|
startupLog.LogIf('verbose', `Redis cache provider connected: ${process.env.REDIS_URL}`);
|
|
609
719
|
}
|
|
610
720
|
// If Redis is available, swap LocalCacheManager's storage provider to Redis.
|
|
@@ -909,6 +1019,14 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
909
1019
|
socket.destroy();
|
|
910
1020
|
}
|
|
911
1021
|
});
|
|
1022
|
+
// graphql-ws's ws integration takes its keepalive as a THIRD POSITIONAL argument to useServer,
|
|
1023
|
+
// defaulting to 12_000 when omitted. That default was doing real work here while being invisible
|
|
1024
|
+
// at the call site: the server pings every 12s and terminates the socket after an unanswered
|
|
1025
|
+
// pong, which is why MJAPI notices a half-open link in ~12-24s while the browser — whose
|
|
1026
|
+
// graphql-ws client does nothing on an unanswered pong — noticed nothing at all (MJ #4222).
|
|
1027
|
+
// Stated explicitly so the behaviour is visible and tunable, and so the next reader does not
|
|
1028
|
+
// conclude from the call site that no server-side heartbeat exists. Value unchanged.
|
|
1029
|
+
const WS_SERVER_KEEPALIVE_MS = 12_000;
|
|
912
1030
|
// Track per-connection expiry timers so we can clean them up on close
|
|
913
1031
|
const expiryTimers = new WeakMap();
|
|
914
1032
|
const serverCleanup = useServer({
|
|
@@ -979,7 +1097,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
979
1097
|
// so all errors here are genuine and worth logging.
|
|
980
1098
|
console.error('WebSocket error:', errors);
|
|
981
1099
|
},
|
|
982
|
-
}, webSocketServer);
|
|
1100
|
+
}, webSocketServer, WS_SERVER_KEEPALIVE_MS);
|
|
983
1101
|
const apolloServer = buildApolloServer({ schema }, { httpServer, serverCleanup }, mwApolloPlugins.length > 0 ? mwApolloPlugins : undefined);
|
|
984
1102
|
await apolloServer.start();
|
|
985
1103
|
// Fix #8: Add compression for better throughput performance
|
|
@@ -1093,13 +1211,22 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1093
1211
|
// Backwards-compatibility shim: synthesize ServerExtensionConfig entries from legacy configInfo.telephony
|
|
1094
1212
|
const telephonyExtensionConfigs = [];
|
|
1095
1213
|
if (configInfo.telephony?.enabled) {
|
|
1214
|
+
// Settings every carrier shares (inbound run-as user, call cap, outbound policy). Each carrier's own block is
|
|
1215
|
+
// spread AFTER them, so a carrier can override one explicitly.
|
|
1216
|
+
const sharedTelephonySettings = {
|
|
1217
|
+
inboundRunAsUserEmail: configInfo.telephony.inboundRunAsUserEmail,
|
|
1218
|
+
maxCallSeconds: configInfo.telephony.maxCallSeconds,
|
|
1219
|
+
maxConcurrentCalls: configInfo.telephony.maxConcurrentCalls,
|
|
1220
|
+
transferTargets: configInfo.telephony.transferTargets,
|
|
1221
|
+
outbound: configInfo.telephony.outbound,
|
|
1222
|
+
};
|
|
1096
1223
|
if (configInfo.telephony.twilio) {
|
|
1097
1224
|
telephonyExtensionConfigs.push({
|
|
1098
1225
|
Enabled: true,
|
|
1099
1226
|
DriverClass: 'TwilioTelephonyExtension',
|
|
1100
1227
|
RootPath: '/telephony/twilio',
|
|
1101
1228
|
Phase: 'pre-auth',
|
|
1102
|
-
Settings: configInfo.telephony.twilio,
|
|
1229
|
+
Settings: { ...sharedTelephonySettings, ...configInfo.telephony.twilio },
|
|
1103
1230
|
});
|
|
1104
1231
|
}
|
|
1105
1232
|
if (configInfo.telephony.vonage) {
|
|
@@ -1108,7 +1235,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1108
1235
|
DriverClass: 'VonageTelephonyExtension',
|
|
1109
1236
|
RootPath: '/telephony/vonage',
|
|
1110
1237
|
Phase: 'pre-auth',
|
|
1111
|
-
Settings: configInfo.telephony.vonage,
|
|
1238
|
+
Settings: { ...sharedTelephonySettings, ...configInfo.telephony.vonage },
|
|
1112
1239
|
});
|
|
1113
1240
|
}
|
|
1114
1241
|
if (configInfo.telephony.ringcentral) {
|
|
@@ -1117,7 +1244,16 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1117
1244
|
DriverClass: 'RingCentralTelephonyExtension',
|
|
1118
1245
|
RootPath: '/telephony/ringcentral',
|
|
1119
1246
|
Phase: 'pre-auth',
|
|
1120
|
-
Settings: configInfo.telephony.ringcentral,
|
|
1247
|
+
Settings: { ...sharedTelephonySettings, ...configInfo.telephony.ringcentral },
|
|
1248
|
+
});
|
|
1249
|
+
}
|
|
1250
|
+
if (configInfo.telephony.livekitSip) {
|
|
1251
|
+
telephonyExtensionConfigs.push({
|
|
1252
|
+
Enabled: true,
|
|
1253
|
+
DriverClass: 'LiveKitSipExtension',
|
|
1254
|
+
RootPath: '/telephony/livekit-sip',
|
|
1255
|
+
Phase: 'pre-auth',
|
|
1256
|
+
Settings: { ...sharedTelephonySettings, ...configInfo.telephony.livekitSip },
|
|
1121
1257
|
});
|
|
1122
1258
|
}
|
|
1123
1259
|
if (configInfo.telephony.teams?.enabled) {
|
|
@@ -1351,8 +1487,23 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1351
1487
|
// instance is still heart-beating. The watchdog also self-registers for graceful-shutdown
|
|
1352
1488
|
// cancellation (via ShutdownRegistry) once it begins tracking this process's first live run.
|
|
1353
1489
|
if (resumeUser && Metadata.Provider instanceof DatabaseProviderBase) { // global-provider-ok: server startup recovery — one-shot orphaned-run sweep at boot
|
|
1354
|
-
|
|
1490
|
+
const sweepUser = resumeUser;
|
|
1491
|
+
const sweepProvider = Metadata.Provider; // global-provider-ok: server startup recovery — one-shot orphaned-run sweep at boot
|
|
1492
|
+
AgentRunWatchdog.SweepOrphanedRuns(sweepProvider, sweepUser)
|
|
1355
1493
|
.catch(err => console.warn(`[AgentRunWatchdog] Startup sweep failed: ${err}`));
|
|
1494
|
+
// The watchdog repairs the RUN; nothing repaired the conversation detail, which is the row the
|
|
1495
|
+
// chat actually renders from (MJ #4222). A process that dies mid-run leaves a terminal run
|
|
1496
|
+
// beside a message that still claims to be generating, and it spins forever for anyone who
|
|
1497
|
+
// opens it. Runs at boot (closes restart orphans) and on a timer (closes mid-life orphans),
|
|
1498
|
+
// mirroring the watchdog's own two-phase shape.
|
|
1499
|
+
const reconcileOrphans = () => ReconcileOrphanedConversationDetails(sweepProvider, sweepUser)
|
|
1500
|
+
.catch(err => console.warn(`[OrphanDetailReconciler] Pass failed: ${err}`));
|
|
1501
|
+
void reconcileOrphans();
|
|
1502
|
+
const orphanDetailTimer = setInterval(() => void reconcileOrphans(), ORPHAN_DETAIL_SWEEP_INTERVAL_MS);
|
|
1503
|
+
ShutdownRegistry.Instance.Register({
|
|
1504
|
+
ShutdownName: 'OrphanDetailReconciler',
|
|
1505
|
+
Shutdown: () => { clearInterval(orphanDetailTimer); },
|
|
1506
|
+
});
|
|
1356
1507
|
}
|
|
1357
1508
|
// Launch the AI Agent Session janitor: run own-host orphan recovery once at boot, then keep a
|
|
1358
1509
|
// periodic staleness sweep running. Self-registers with ShutdownRegistry, so its timer is cleared
|
|
@@ -1392,6 +1543,17 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1392
1543
|
StartTaskGraphDispatcher(taskGraphPool, resumeUser)
|
|
1393
1544
|
.catch(err => console.warn(`[TaskGraphDispatcher] Startup failed: ${err}`));
|
|
1394
1545
|
}
|
|
1546
|
+
// Start the durable work-queue host where enabled. It plans which subscriptions this instance runs,
|
|
1547
|
+
// re-plans on a timer, and self-registers with ShutdownRegistry, so gracefulShutdown's awaited
|
|
1548
|
+
// ShutdownAll() drains it (up to 2 × shutdownDrainMs) before the HTTP server closes.
|
|
1549
|
+
// Not awaited: a slow engine load must not delay readiness, and a failure never stops the API.
|
|
1550
|
+
const workQueueProvider = Metadata.Provider; // global-provider-ok: server startup — the work-queue host runs on the server's own provider
|
|
1551
|
+
if (configInfo.workQueue?.enabled && workQueueProvider instanceof DatabaseProviderBase) {
|
|
1552
|
+
const workQueuePool = dataSources[0]?.dataSource;
|
|
1553
|
+
const providerSource = new MJServerWorkQueueProviderSource(workQueuePool instanceof sql.ConnectionPool ? workQueuePool : null, workQueueProvider);
|
|
1554
|
+
StartWorkQueueHost(configInfo.workQueue, workQueueProvider, providerSource)
|
|
1555
|
+
.catch(error => console.error('❌ Failed to start the work queue host:', error));
|
|
1556
|
+
}
|
|
1395
1557
|
// Set up graceful shutdown handlers
|
|
1396
1558
|
const gracefulShutdown = async (signal) => {
|
|
1397
1559
|
console.log(`\n${signal} received, shutting down gracefully...`);
|
|
@@ -1835,12 +1997,4 @@ function createMSSQLCompatPool(pgPool) {
|
|
|
1835
1997
|
};
|
|
1836
1998
|
return wrapper;
|
|
1837
1999
|
}
|
|
1838
|
-
/**
|
|
1839
|
-
* Translates SQL Server bracket-quoted identifiers to PostgreSQL double-quoted identifiers.
|
|
1840
|
-
* Converts [schema].[table] to "schema"."table" and handles common T-SQL patterns.
|
|
1841
|
-
*/
|
|
1842
|
-
function translateBracketsToPG(sql) {
|
|
1843
|
-
// Replace [identifier] with "identifier"
|
|
1844
|
-
return sql.replace(/\[([^\]]+)\]/g, '"$1"');
|
|
1845
|
-
}
|
|
1846
2000
|
//# sourceMappingURL=index.js.map
|