@memberjunction/server 6.2.0-edge.2 → 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 +928 -0
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +8482 -3649
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +43 -3
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +142 -27
- 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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +115 -49
- 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/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/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/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 +1 -83
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +4 -206
- package/dist/resolvers/RealtimeClientSessionResolver.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 -94
- 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__/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__/ResolverBase.adhocReadScope.test.ts +96 -0
- package/src/__tests__/ResolverBase.filterEscaping.test.ts +21 -2
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +291 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +41 -0
- package/src/__tests__/WorkQueueHostService.test.ts +133 -0
- package/src/__tests__/adhocTimeoutClamp.test.ts +26 -0
- package/src/__tests__/postgresqlPoolSettings.test.ts +131 -0
- package/src/__tests__/translateBracketsToPG.test.ts +20 -0
- package/src/config.ts +130 -3
- package/src/context.ts +11 -24
- package/src/generated/graphql-schemas/__mj.ts +22138 -18770
- package/src/generic/ResolverBase.ts +171 -27
- package/src/generic/RunViewResolver.ts +33 -2
- package/src/index.ts +127 -50
- package/src/postgresqlCompat.ts +21 -0
- package/src/postgresqlPoolSettings.ts +213 -0
- package/src/resolvers/AdhocQueryResolver.ts +88 -188
- package/src/resolvers/EntityRecordNameResolver.ts +9 -51
- package/src/resolvers/GetDataResolver.ts +10 -0
- package/src/resolvers/HumanHandoffResolver.ts +304 -0
- package/src/resolvers/MeetingResolver.ts +438 -0
- package/src/resolvers/RealtimeBridgeResolver.ts +227 -13
- package/src/resolvers/RealtimeClientSessionResolver.ts +6 -252
- 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';
|
|
@@ -57,12 +59,15 @@ import { RedisLocalStorageProvider } from '@memberjunction/redis-provider';
|
|
|
57
59
|
import { PubSubManager } from './generic/PubSubManager.js';
|
|
58
60
|
import { ReconcileOrphanedConversationDetails } from './generic/OrphanedConversationDetailReconciler.js';
|
|
59
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';
|
|
60
64
|
import { IntegrationProgressEmitter } from '@memberjunction/integration-progress-artifacts';
|
|
61
65
|
import { PublishIntegrationProgress } from './resolvers/IntegrationProgressResolver.js';
|
|
62
66
|
import { RegisterRSUProgressBridge } from './integration/RSUProgressBridge.js';
|
|
63
67
|
import { ClientToolRequestManager, AgentRunWatchdog } from '@memberjunction/ai-agents';
|
|
64
68
|
import { SessionJanitor } from './agentSessions/index.js';
|
|
65
69
|
import { StartTaskGraphDispatcher } from './services/StartTaskGraphDispatcher.js';
|
|
70
|
+
import { MJServerWorkQueueProviderSource, StartWorkQueueHost } from './services/WorkQueueHostService.js';
|
|
66
71
|
import { GetAttachmentService } from '@memberjunction/aiengine';
|
|
67
72
|
import { MJStorageBlobStore } from './services/MJStorageBlobStore.js';
|
|
68
73
|
import { CACHE_INVALIDATION_TOPIC, MayBroadcastRecordData, ConfigureRecordDataBroadcast } from './generic/CacheInvalidationResolver.js';
|
|
@@ -201,6 +206,7 @@ export * from './resolvers/CurrentUserContextResolver.js';
|
|
|
201
206
|
export * from './resolvers/RSUResolver.js';
|
|
202
207
|
export * from './resolvers/AgentSessionResolver.js';
|
|
203
208
|
export * from './resolvers/RealtimeClientSessionResolver.js';
|
|
209
|
+
export * from './resolvers/MeetingResolver.js';
|
|
204
210
|
export * from './resolvers/RemoteBrowserActionResolver.js';
|
|
205
211
|
export * from './agentSessions/index.js';
|
|
206
212
|
export { GetReadOnlyDataSource, GetReadWriteDataSource, GetReadWriteProvider, GetReadOnlyProvider } from './util.js';
|
|
@@ -234,7 +240,8 @@ function resolveServerVersion() {
|
|
|
234
240
|
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
235
241
|
return pkg.version;
|
|
236
242
|
}
|
|
237
|
-
catch {
|
|
243
|
+
catch (err) {
|
|
244
|
+
LogError('Failed to resolve server version from package.json', undefined, err);
|
|
238
245
|
return undefined;
|
|
239
246
|
}
|
|
240
247
|
}
|
|
@@ -272,8 +279,9 @@ async function wirePushStatusFanOut(redisProvider, startupLog) {
|
|
|
272
279
|
SourceServerId: payload.SourceServerId,
|
|
273
280
|
});
|
|
274
281
|
}
|
|
275
|
-
catch {
|
|
282
|
+
catch (err) {
|
|
276
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);
|
|
277
285
|
}
|
|
278
286
|
});
|
|
279
287
|
SetPushStatusPublishHook((payload) => {
|
|
@@ -290,6 +298,44 @@ async function wirePushStatusFanOut(redisProvider, startupLog) {
|
|
|
290
298
|
console.warn(`Push-status fan-out unavailable: ${err.message}`);
|
|
291
299
|
}
|
|
292
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
|
+
}
|
|
293
339
|
// Bind MJStorage as the conversation-attachment blob store. The attachment service itself no longer
|
|
294
340
|
// imports `@memberjunction/storage` — that dependency made it unusable from any browser or React
|
|
295
341
|
// Native client, which is why the same attachment rules had been reimplemented three times.
|
|
@@ -330,28 +376,39 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
330
376
|
startupLog.BeginPhase('Connecting to database');
|
|
331
377
|
startupLog.LogIf('verbose', 'Database type: PostgreSQL');
|
|
332
378
|
const pg = await import('pg');
|
|
333
|
-
const { PostgreSQLDataProvider, PostgreSQLProviderConfigData } = await import('@memberjunction/postgresql-dataprovider');
|
|
334
|
-
const
|
|
335
|
-
const
|
|
336
|
-
|
|
337
|
-
const
|
|
338
|
-
const
|
|
339
|
-
const pgPool = new pg.default.Pool({
|
|
340
|
-
host: pgHost,
|
|
341
|
-
port: pgPort,
|
|
342
|
-
user: pgUser,
|
|
343
|
-
password: pgPass,
|
|
344
|
-
database: pgDatabase,
|
|
345
|
-
max: configInfo.databaseSettings.connectionPool?.max ?? 50,
|
|
346
|
-
min: configInfo.databaseSettings.connectionPool?.min ?? 5,
|
|
347
|
-
idleTimeoutMillis: configInfo.databaseSettings.connectionPool?.idleTimeoutMillis ?? 30000,
|
|
348
|
-
connectionTimeoutMillis: configInfo.databaseSettings.connectionPool?.acquireTimeoutMillis ?? 30000,
|
|
349
|
-
});
|
|
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));
|
|
350
385
|
// Verify connection
|
|
351
386
|
const testClient = await pgPool.connect();
|
|
352
387
|
await testClient.query('SELECT 1');
|
|
353
388
|
testClient.release();
|
|
354
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
|
+
}
|
|
355
412
|
// Create a DataSourceInfo with a MSSQL-compatible wrapper around pg.Pool
|
|
356
413
|
// This allows existing code (types, util, context) to work without changes
|
|
357
414
|
const mssqlCompatPool = createMSSQLCompatPool(pgPool);
|
|
@@ -364,15 +421,6 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
364
421
|
userName: pgUser,
|
|
365
422
|
}));
|
|
366
423
|
// Set up the PostgreSQL provider
|
|
367
|
-
const pgConnectionConfig = {
|
|
368
|
-
Host: pgHost,
|
|
369
|
-
Port: pgPort,
|
|
370
|
-
Database: pgDatabase,
|
|
371
|
-
User: pgUser,
|
|
372
|
-
Password: pgPass,
|
|
373
|
-
MaxConnections: configInfo.databaseSettings.connectionPool?.max ?? 50,
|
|
374
|
-
MinConnections: configInfo.databaseSettings.connectionPool?.min ?? 5,
|
|
375
|
-
};
|
|
376
424
|
const pgConfigData = new PostgreSQLProviderConfigData(pgConnectionConfig, mj_core_schema, cacheRefreshInterval / 1000);
|
|
377
425
|
const provider = new PostgreSQLDataProvider();
|
|
378
426
|
await provider.Config(pgConfigData);
|
|
@@ -396,7 +444,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
396
444
|
if (poolAny._pgPool) {
|
|
397
445
|
const thePgPool = poolAny._pgPool;
|
|
398
446
|
// Translate SQL Server bracket syntax to PostgreSQL double-quote syntax
|
|
399
|
-
const pgQuery =
|
|
447
|
+
const pgQuery = TranslateBracketsToPG(query);
|
|
400
448
|
const result = await thePgPool.query(pgQuery);
|
|
401
449
|
return result.rows;
|
|
402
450
|
}
|
|
@@ -414,19 +462,15 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
414
462
|
const pgCodegenPass = process.env.CODEGEN_DB_PASSWORD;
|
|
415
463
|
if (pgCodegenUser && pgCodegenPass) {
|
|
416
464
|
try {
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
password: pgCodegenPass,
|
|
422
|
-
database: pgDatabase,
|
|
423
|
-
max: 10,
|
|
424
|
-
});
|
|
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));
|
|
425
469
|
const codegenTestClient = await codegenPgPool.connect();
|
|
426
470
|
await codegenTestClient.query('SELECT 1');
|
|
427
471
|
codegenTestClient.release();
|
|
428
472
|
const { RuntimeSchemaManager } = await import('@memberjunction/schema-engine');
|
|
429
|
-
const codegenPgConfigData = new PostgreSQLProviderConfigData(
|
|
473
|
+
const codegenPgConfigData = new PostgreSQLProviderConfigData(codegenPgConnectionConfig, mj_core_schema, cacheRefreshInterval / 1000);
|
|
430
474
|
const codegenPgProvider = new PostgreSQLDataProvider();
|
|
431
475
|
await codegenPgProvider.Config(codegenPgConfigData); // separate pool (per-instance manager); does NOT touch the global API provider
|
|
432
476
|
RuntimeSchemaManager.Instance.SetDDLProvider(codegenPgProvider);
|
|
@@ -670,6 +714,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
670
714
|
// forever for an event that was delivered to nobody. Replicating progress and completion over
|
|
671
715
|
// Redis closes that, and the durable tail query remains the backstop if Redis is down.
|
|
672
716
|
await wirePushStatusFanOut(redisProvider, startupLog);
|
|
717
|
+
await wireHandoffOfferFanOut(redisProvider, startupLog);
|
|
673
718
|
startupLog.LogIf('verbose', `Redis cache provider connected: ${process.env.REDIS_URL}`);
|
|
674
719
|
}
|
|
675
720
|
// If Redis is available, swap LocalCacheManager's storage provider to Redis.
|
|
@@ -1166,13 +1211,22 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1166
1211
|
// Backwards-compatibility shim: synthesize ServerExtensionConfig entries from legacy configInfo.telephony
|
|
1167
1212
|
const telephonyExtensionConfigs = [];
|
|
1168
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
|
+
};
|
|
1169
1223
|
if (configInfo.telephony.twilio) {
|
|
1170
1224
|
telephonyExtensionConfigs.push({
|
|
1171
1225
|
Enabled: true,
|
|
1172
1226
|
DriverClass: 'TwilioTelephonyExtension',
|
|
1173
1227
|
RootPath: '/telephony/twilio',
|
|
1174
1228
|
Phase: 'pre-auth',
|
|
1175
|
-
Settings: configInfo.telephony.twilio,
|
|
1229
|
+
Settings: { ...sharedTelephonySettings, ...configInfo.telephony.twilio },
|
|
1176
1230
|
});
|
|
1177
1231
|
}
|
|
1178
1232
|
if (configInfo.telephony.vonage) {
|
|
@@ -1181,7 +1235,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1181
1235
|
DriverClass: 'VonageTelephonyExtension',
|
|
1182
1236
|
RootPath: '/telephony/vonage',
|
|
1183
1237
|
Phase: 'pre-auth',
|
|
1184
|
-
Settings: configInfo.telephony.vonage,
|
|
1238
|
+
Settings: { ...sharedTelephonySettings, ...configInfo.telephony.vonage },
|
|
1185
1239
|
});
|
|
1186
1240
|
}
|
|
1187
1241
|
if (configInfo.telephony.ringcentral) {
|
|
@@ -1190,7 +1244,16 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1190
1244
|
DriverClass: 'RingCentralTelephonyExtension',
|
|
1191
1245
|
RootPath: '/telephony/ringcentral',
|
|
1192
1246
|
Phase: 'pre-auth',
|
|
1193
|
-
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 },
|
|
1194
1257
|
});
|
|
1195
1258
|
}
|
|
1196
1259
|
if (configInfo.telephony.teams?.enabled) {
|
|
@@ -1480,6 +1543,17 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1480
1543
|
StartTaskGraphDispatcher(taskGraphPool, resumeUser)
|
|
1481
1544
|
.catch(err => console.warn(`[TaskGraphDispatcher] Startup failed: ${err}`));
|
|
1482
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
|
+
}
|
|
1483
1557
|
// Set up graceful shutdown handlers
|
|
1484
1558
|
const gracefulShutdown = async (signal) => {
|
|
1485
1559
|
console.log(`\n${signal} received, shutting down gracefully...`);
|
|
@@ -1923,12 +1997,4 @@ function createMSSQLCompatPool(pgPool) {
|
|
|
1923
1997
|
};
|
|
1924
1998
|
return wrapper;
|
|
1925
1999
|
}
|
|
1926
|
-
/**
|
|
1927
|
-
* Translates SQL Server bracket-quoted identifiers to PostgreSQL double-quoted identifiers.
|
|
1928
|
-
* Converts [schema].[table] to "schema"."table" and handles common T-SQL patterns.
|
|
1929
|
-
*/
|
|
1930
|
-
function translateBracketsToPG(sql) {
|
|
1931
|
-
// Replace [identifier] with "identifier"
|
|
1932
|
-
return sql.replace(/\[([^\]]+)\]/g, '"$1"');
|
|
1933
|
-
}
|
|
1934
2000
|
//# sourceMappingURL=index.js.map
|