@memberjunction/server 6.2.0-edge.4 → 6.2.0-edge.6

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.
Files changed (560) hide show
  1. package/README.md +47 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentSessions/SessionJanitor.d.ts +91 -30
  4. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  5. package/dist/agentSessions/SessionJanitor.js +311 -81
  6. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  7. package/dist/agentSessions/SessionManager.d.ts +17 -3
  8. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  9. package/dist/agentSessions/SessionManager.js +44 -10
  10. package/dist/agentSessions/SessionManager.js.map +1 -1
  11. package/dist/apiRoot.d.ts +32 -0
  12. package/dist/apiRoot.d.ts.map +1 -0
  13. package/dist/apiRoot.js +67 -0
  14. package/dist/apiRoot.js.map +1 -0
  15. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  16. package/dist/auth/AuthProviderCatalogRouter.js +27 -0
  17. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  18. package/dist/auth/LoginScreenEngine.d.ts +22 -0
  19. package/dist/auth/LoginScreenEngine.d.ts.map +1 -0
  20. package/dist/auth/LoginScreenEngine.js +57 -0
  21. package/dist/auth/LoginScreenEngine.js.map +1 -0
  22. package/dist/auth/index.d.ts +1 -0
  23. package/dist/auth/index.d.ts.map +1 -1
  24. package/dist/auth/index.js +52 -10
  25. package/dist/auth/index.js.map +1 -1
  26. package/dist/auth/initializeProviders.d.ts +10 -0
  27. package/dist/auth/initializeProviders.d.ts.map +1 -1
  28. package/dist/auth/initializeProviders.js +37 -1
  29. package/dist/auth/initializeProviders.js.map +1 -1
  30. package/dist/auth/localDevAuth.d.ts +79 -0
  31. package/dist/auth/localDevAuth.d.ts.map +1 -0
  32. package/dist/auth/localDevAuth.js +439 -0
  33. package/dist/auth/localDevAuth.js.map +1 -0
  34. package/dist/auth/magicLink/MagicLinkKeys.d.ts +2 -2
  35. package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
  36. package/dist/auth/magicLink/MagicLinkKeys.js +1 -1
  37. package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
  38. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  39. package/dist/auth/magicLink/MagicLinkRouter.js +3 -2
  40. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  41. package/dist/auth/magicLink/types.d.ts +12 -0
  42. package/dist/auth/magicLink/types.d.ts.map +1 -1
  43. package/dist/auth/sessionUserClone.d.ts +1 -1
  44. package/dist/auth/sessionUserClone.d.ts.map +1 -1
  45. package/dist/auth/sessionUserClone.js +3 -2
  46. package/dist/auth/sessionUserClone.js.map +1 -1
  47. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
  48. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
  49. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
  50. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
  51. package/dist/broadcast/index.d.ts +6 -0
  52. package/dist/broadcast/index.d.ts.map +1 -0
  53. package/dist/broadcast/index.js +6 -0
  54. package/dist/broadcast/index.js.map +1 -0
  55. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
  56. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
  57. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
  58. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
  59. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
  60. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
  61. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
  62. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
  63. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
  64. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
  65. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
  66. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
  67. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
  68. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
  69. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
  70. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
  71. package/dist/cache.d.ts +3 -2
  72. package/dist/cache.d.ts.map +1 -1
  73. package/dist/cache.js.map +1 -1
  74. package/dist/config.d.ts +632 -22
  75. package/dist/config.d.ts.map +1 -1
  76. package/dist/config.js +104 -4
  77. package/dist/config.js.map +1 -1
  78. package/dist/context.d.ts +3 -1
  79. package/dist/context.d.ts.map +1 -1
  80. package/dist/context.js +29 -8
  81. package/dist/context.js.map +1 -1
  82. package/dist/coreRoutes.d.ts +29 -0
  83. package/dist/coreRoutes.d.ts.map +1 -0
  84. package/dist/coreRoutes.js +156 -0
  85. package/dist/coreRoutes.js.map +1 -0
  86. package/dist/generated/graphql-schemas/__mj.d.ts +1016 -29
  87. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  88. package/dist/generated/graphql-schemas/__mj.js +5125 -434
  89. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  90. package/dist/generic/CacheInvalidationResolver.d.ts +85 -30
  91. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  92. package/dist/generic/CacheInvalidationResolver.js +175 -60
  93. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  94. package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
  95. package/dist/generic/OrphanedConversationDetailReconciler.js +2 -0
  96. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  97. package/dist/generic/PubSubManager.d.ts +10 -0
  98. package/dist/generic/PubSubManager.d.ts.map +1 -1
  99. package/dist/generic/PubSubManager.js +44 -1
  100. package/dist/generic/PubSubManager.js.map +1 -1
  101. package/dist/generic/PushStatusResolver.d.ts +39 -6
  102. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  103. package/dist/generic/PushStatusResolver.js +94 -12
  104. package/dist/generic/PushStatusResolver.js.map +1 -1
  105. package/dist/generic/ResolverBase.d.ts +168 -69
  106. package/dist/generic/ResolverBase.d.ts.map +1 -1
  107. package/dist/generic/ResolverBase.js +464 -405
  108. package/dist/generic/ResolverBase.js.map +1 -1
  109. package/dist/generic/RunViewResolver.d.ts +11 -3
  110. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  111. package/dist/generic/RunViewResolver.js +91 -13
  112. package/dist/generic/RunViewResolver.js.map +1 -1
  113. package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
  114. package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
  115. package/dist/generic/actionOutputFieldSecurity.js +47 -0
  116. package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
  117. package/dist/generic/fieldSecurityTransport.d.ts +30 -0
  118. package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
  119. package/dist/generic/fieldSecurityTransport.js +30 -0
  120. package/dist/generic/fieldSecurityTransport.js.map +1 -0
  121. package/dist/globalCors.d.ts +33 -0
  122. package/dist/globalCors.d.ts.map +1 -0
  123. package/dist/globalCors.js +58 -0
  124. package/dist/globalCors.js.map +1 -0
  125. package/dist/index.d.ts +14 -0
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +230 -222
  128. package/dist/index.js.map +1 -1
  129. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  130. package/dist/integration/CustomColumnPromoter.js +6 -1
  131. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  132. package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
  133. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  134. package/dist/logging/variablesLoggingMiddleware.js +50 -1
  135. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  136. package/dist/multiTenancy/index.d.ts.map +1 -1
  137. package/dist/multiTenancy/index.js +22 -2
  138. package/dist/multiTenancy/index.js.map +1 -1
  139. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -1
  140. package/dist/realtimeSessions/RealtimeSessionVerificationService.js +2 -1
  141. package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -1
  142. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -1
  143. package/dist/realtimeSessions/RealtimeVerifyRouter.js +2 -1
  144. package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -1
  145. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts +100 -0
  146. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts.map +1 -0
  147. package/dist/realtimeSessions/RecordingAssemblyScheduler.js +173 -0
  148. package/dist/realtimeSessions/RecordingAssemblyScheduler.js.map +1 -0
  149. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
  150. package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
  151. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
  152. package/dist/realtimeSessions/index.d.ts +2 -0
  153. package/dist/realtimeSessions/index.d.ts.map +1 -1
  154. package/dist/realtimeSessions/index.js +2 -0
  155. package/dist/realtimeSessions/index.js.map +1 -1
  156. package/dist/realtimeSessions/ownedRealtimeSession.d.ts +32 -0
  157. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
  158. package/dist/realtimeSessions/ownedRealtimeSession.js +56 -0
  159. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
  160. package/dist/realtimeSessions/sessionAccess.d.ts +91 -8
  161. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
  162. package/dist/realtimeSessions/sessionAccess.js +127 -20
  163. package/dist/realtimeSessions/sessionAccess.js.map +1 -1
  164. package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
  165. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
  166. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
  167. package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
  168. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
  169. package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
  170. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
  171. package/dist/realtimeSessions/verificationWorkflow.js +1 -1
  172. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
  173. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
  174. package/dist/realtimeWidget/WidgetRouter.js +19 -3
  175. package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
  176. package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
  177. package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
  178. package/dist/realtimeWidget/WidgetSessionService.js +201 -19
  179. package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
  180. package/dist/realtimeWidget/host-identity.d.ts +1 -1
  181. package/dist/realtimeWidget/host-identity.js +1 -1
  182. package/dist/realtimeWidget/widgetCore.d.ts +20 -1
  183. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  184. package/dist/realtimeWidget/widgetCore.js +17 -1
  185. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  186. package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
  187. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  188. package/dist/realtimeWidget/widgetGuestElevation.js +2 -1
  189. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  190. package/dist/resolvers/ActionResolver.d.ts +19 -1
  191. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  192. package/dist/resolvers/ActionResolver.js +63 -12
  193. package/dist/resolvers/ActionResolver.js.map +1 -1
  194. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  195. package/dist/resolvers/AdhocQueryResolver.js +1 -0
  196. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  197. package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
  198. package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
  199. package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
  200. package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
  201. package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
  202. package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
  203. package/dist/resolvers/AgentSessionResolver.js +40 -17
  204. package/dist/resolvers/AgentSessionResolver.js.map +1 -1
  205. package/dist/resolvers/ArtifactFileResolver.d.ts +5 -1
  206. package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -1
  207. package/dist/resolvers/ArtifactFileResolver.js +9 -7
  208. package/dist/resolvers/ArtifactFileResolver.js.map +1 -1
  209. package/dist/resolvers/ConversationRunEventsResolver.d.ts +8 -4
  210. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
  211. package/dist/resolvers/ConversationRunEventsResolver.js +6 -6
  212. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
  213. package/dist/resolvers/DatasetResolver.d.ts +24 -3
  214. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  215. package/dist/resolvers/DatasetResolver.js +57 -8
  216. package/dist/resolvers/DatasetResolver.js.map +1 -1
  217. package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
  218. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  219. package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
  220. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  221. package/dist/resolvers/EntityRecordNameResolver.d.ts +2 -1
  222. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  223. package/dist/resolvers/EntityRecordNameResolver.js +3 -2
  224. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  225. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +46 -3
  226. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  227. package/dist/resolvers/FetchEntityVectorsResolver.js +211 -50
  228. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  229. package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
  230. package/dist/resolvers/FileCategoryResolver.js +1 -0
  231. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  232. package/dist/resolvers/FileResolver.d.ts +87 -11
  233. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  234. package/dist/resolvers/FileResolver.js +292 -105
  235. package/dist/resolvers/FileResolver.js.map +1 -1
  236. package/dist/resolvers/GetDataContextDataResolver.d.ts +33 -7
  237. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  238. package/dist/resolvers/GetDataContextDataResolver.js +117 -38
  239. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  240. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  241. package/dist/resolvers/GetDataResolver.js +6 -3
  242. package/dist/resolvers/GetDataResolver.js.map +1 -1
  243. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  244. package/dist/resolvers/IntegrationDiscoveryResolver.js +49 -9
  245. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  246. package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
  247. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  248. package/dist/resolvers/MergeRecordsResolver.js +31 -3
  249. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  250. package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
  251. package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
  252. package/dist/resolvers/PipelineProgressResolver.js +5 -3
  253. package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
  254. package/dist/resolvers/QueryResolver.d.ts +2 -0
  255. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  256. package/dist/resolvers/QueryResolver.js +33 -6
  257. package/dist/resolvers/QueryResolver.js.map +1 -1
  258. package/dist/resolvers/QuerySystemUserResolver.d.ts +2 -0
  259. package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
  260. package/dist/resolvers/QuerySystemUserResolver.js +15 -6
  261. package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
  262. package/dist/resolvers/RSUResolver.d.ts.map +1 -1
  263. package/dist/resolvers/RSUResolver.js +12 -0
  264. package/dist/resolvers/RSUResolver.js.map +1 -1
  265. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +18 -10
  266. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  267. package/dist/resolvers/RealtimeClientSessionResolver.js +92 -54
  268. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  269. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  270. package/dist/resolvers/RemoteBrowserActionResolver.js +11 -9
  271. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  272. package/dist/resolvers/RunAIAgentResolver.d.ts +56 -8
  273. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  274. package/dist/resolvers/RunAIAgentResolver.js +241 -67
  275. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  276. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  277. package/dist/resolvers/RunTemplateResolver.js +4 -4
  278. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  279. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  280. package/dist/resolvers/RunTestResolver.js +3 -1
  281. package/dist/resolvers/RunTestResolver.js.map +1 -1
  282. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts +12 -1
  283. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts.map +1 -1
  284. package/dist/resolvers/SearchKnowledgeStreamResolver.js +15 -2
  285. package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
  286. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  287. package/dist/resolvers/SqlLoggingConfigResolver.js +2 -3
  288. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  289. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  290. package/dist/resolvers/SyncDataResolver.js +4 -0
  291. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  292. package/dist/resolvers/TaskGraphFrameResolver.d.ts +2 -1
  293. package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
  294. package/dist/resolvers/TaskGraphFrameResolver.js +28 -1
  295. package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
  296. package/dist/resolvers/TestQuerySQLResolver.d.ts +24 -0
  297. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  298. package/dist/resolvers/TestQuerySQLResolver.js +66 -13
  299. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  300. package/dist/resolvers/TransactionGroupResolver.d.ts +34 -2
  301. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  302. package/dist/resolvers/TransactionGroupResolver.js +150 -27
  303. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  304. package/dist/resolvers/UserViewResolver.d.ts +1 -1
  305. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  306. package/dist/resolvers/UserViewResolver.js +2 -1
  307. package/dist/resolvers/UserViewResolver.js.map +1 -1
  308. package/dist/resolvers/agent-run-data-guard.d.ts +31 -0
  309. package/dist/resolvers/agent-run-data-guard.d.ts.map +1 -0
  310. package/dist/resolvers/agent-run-data-guard.js +72 -0
  311. package/dist/resolvers/agent-run-data-guard.js.map +1 -0
  312. package/dist/rest/EntityCRUDHandler.d.ts +6 -0
  313. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  314. package/dist/rest/EntityCRUDHandler.js +19 -5
  315. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  316. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  317. package/dist/rest/RESTEndpointHandler.js +8 -5
  318. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  319. package/dist/rest/RealtimeRecordingHandler.d.ts +49 -0
  320. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -0
  321. package/dist/rest/RealtimeRecordingHandler.js +383 -0
  322. package/dist/rest/RealtimeRecordingHandler.js.map +1 -0
  323. package/dist/rest/ViewOperationsHandler.d.ts +9 -1
  324. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  325. package/dist/rest/ViewOperationsHandler.js +43 -17
  326. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  327. package/dist/rest/setupRESTEndpoints.d.ts +6 -0
  328. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  329. package/dist/rest/setupRESTEndpoints.js +6 -0
  330. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  331. package/dist/serverExtensionReservedRoots.d.ts +12 -10
  332. package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
  333. package/dist/serverExtensionReservedRoots.js +14 -17
  334. package/dist/serverExtensionReservedRoots.js.map +1 -1
  335. package/dist/serverRoleConfigUnits.d.ts +29 -0
  336. package/dist/serverRoleConfigUnits.d.ts.map +1 -0
  337. package/dist/serverRoleConfigUnits.js +33 -0
  338. package/dist/serverRoleConfigUnits.js.map +1 -0
  339. package/dist/services/MJStorageBlobStore.d.ts +8 -1
  340. package/dist/services/MJStorageBlobStore.d.ts.map +1 -1
  341. package/dist/services/MJStorageBlobStore.js +25 -19
  342. package/dist/services/MJStorageBlobStore.js.map +1 -1
  343. package/dist/services/StartTaskGraphDispatcher.js +2 -2
  344. package/dist/services/StartTaskGraphDispatcher.js.map +1 -1
  345. package/dist/services/TaskGraphActionRunner.d.ts +5 -3
  346. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  347. package/dist/services/TaskGraphActionRunner.js +27 -5
  348. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  349. package/dist/services/TaskGraphAgentRunner.d.ts +14 -2
  350. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
  351. package/dist/services/TaskGraphAgentRunner.js +157 -9
  352. package/dist/services/TaskGraphAgentRunner.js.map +1 -1
  353. package/dist/services/TaskGraphContinuationDeliverer.d.ts +59 -2
  354. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  355. package/dist/services/TaskGraphContinuationDeliverer.js +626 -16
  356. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  357. package/dist/sharedCache.d.ts.map +1 -1
  358. package/dist/sharedCache.js +3 -0
  359. package/dist/sharedCache.js.map +1 -1
  360. package/dist/types.d.ts +23 -1
  361. package/dist/types.d.ts.map +1 -1
  362. package/dist/types.js.map +1 -1
  363. package/package.json +99 -98
  364. package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
  365. package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
  366. package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
  367. package/src/__tests__/AgentSessionResolver.ownership.test.ts +137 -0
  368. package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
  369. package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
  370. package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
  371. package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
  372. package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
  373. package/src/__tests__/FetchEntityVectorsResolver.test.ts +369 -18
  374. package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
  375. package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
  376. package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
  377. package/src/__tests__/ListOperationsResolver.adhocScreen.test.ts +137 -0
  378. package/src/__tests__/LoginScreenEngine.test.ts +86 -0
  379. package/src/__tests__/MJStorageBlobStore.storageGate.test.ts +63 -0
  380. package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
  381. package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
  382. package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
  383. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
  384. package/src/__tests__/RealtimeClientSessionResolver.test.ts +324 -46
  385. package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
  386. package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +98 -0
  387. package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
  388. package/src/__tests__/ResolverBase.balancedClause.test.ts +155 -0
  389. package/src/__tests__/ResolverBase.clauseUnscopedRead.test.ts +127 -0
  390. package/src/__tests__/ResolverBase.clientOldValues.test.ts +243 -7
  391. package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
  392. package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +176 -0
  393. package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
  394. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +23 -1
  395. package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
  396. package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
  397. package/src/__tests__/RunAIAgentResolver.branch.test.ts +69 -13
  398. package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
  399. package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
  400. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +20 -28
  401. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +264 -0
  402. package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
  403. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +4 -1
  404. package/src/__tests__/RunTemplateResolver.test.ts +35 -2
  405. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
  406. package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
  407. package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
  408. package/src/__tests__/SessionJanitor.test.ts +365 -10
  409. package/src/__tests__/SessionManager.test.ts +122 -0
  410. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
  411. package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
  412. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +468 -23
  413. package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
  414. package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
  415. package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
  416. package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
  417. package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
  418. package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
  419. package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
  420. package/src/__tests__/ViewOperationsHandler.test.ts +7 -2
  421. package/src/__tests__/WidgetSessionService.test.ts +583 -4
  422. package/src/__tests__/agent-run-data-guard.test.ts +130 -0
  423. package/src/__tests__/apiRootBoot.test.ts +202 -0
  424. package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
  425. package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
  426. package/src/__tests__/cacheInvalidationRecordData.test.ts +109 -0
  427. package/src/__tests__/conversationRunEvents.test.ts +56 -14
  428. package/src/__tests__/fieldSecurityFixtures.ts +91 -0
  429. package/src/__tests__/globalCors.test.ts +217 -0
  430. package/src/__tests__/localDevAuth.test.ts +196 -0
  431. package/src/__tests__/multiTenancy.postgresRewrite.test.ts +181 -0
  432. package/src/__tests__/multiTenancy.security.test.ts +51 -0
  433. package/src/__tests__/multiTenancy.test.ts +1 -1
  434. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
  435. package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
  436. package/src/__tests__/pushStatusResolver.filter.test.ts +64 -1
  437. package/src/__tests__/realtimeRecordingHandler.test.ts +669 -0
  438. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
  439. package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
  440. package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
  441. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +146 -7
  442. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
  443. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
  444. package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
  445. package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
  446. package/src/__tests__/resolverBase.fls.test.ts +146 -97
  447. package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
  448. package/src/__tests__/runParamsTimeZone.test.ts +179 -0
  449. package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
  450. package/src/__tests__/runViewProperties.test.ts +114 -0
  451. package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
  452. package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
  453. package/src/__tests__/serverExtensionHostOverlay.test.ts +66 -0
  454. package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -98
  455. package/src/__tests__/sessionUserClone.test.ts +5 -1
  456. package/src/__tests__/sharedCache.test.ts +5 -3
  457. package/src/__tests__/startupSweepOrder.test.ts +40 -0
  458. package/src/__tests__/unifiedAuth.test.ts +28 -0
  459. package/src/__tests__/widgetGuestElevation.test.ts +2 -0
  460. package/src/agentSessions/SessionJanitor.ts +369 -93
  461. package/src/agentSessions/SessionManager.ts +45 -10
  462. package/src/apiRoot.ts +78 -0
  463. package/src/auth/AuthProviderCatalogRouter.ts +29 -0
  464. package/src/auth/LoginScreenEngine.ts +50 -0
  465. package/src/auth/index.ts +57 -12
  466. package/src/auth/initializeProviders.ts +43 -1
  467. package/src/auth/localDevAuth.ts +528 -0
  468. package/src/auth/magicLink/MagicLinkKeys.ts +2 -2
  469. package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
  470. package/src/auth/magicLink/types.ts +10 -0
  471. package/src/auth/sessionUserClone.ts +3 -2
  472. package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
  473. package/src/broadcast/index.ts +5 -0
  474. package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
  475. package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
  476. package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
  477. package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
  478. package/src/cache.ts +2 -1
  479. package/src/config.ts +115 -5
  480. package/src/context.ts +32 -8
  481. package/src/coreRoutes.ts +181 -0
  482. package/src/generated/graphql-schemas/__mj.ts +3684 -284
  483. package/src/generic/CacheInvalidationResolver.ts +172 -60
  484. package/src/generic/OrphanedConversationDetailReconciler.ts +4 -2
  485. package/src/generic/PubSubManager.ts +54 -1
  486. package/src/generic/PushStatusResolver.ts +109 -12
  487. package/src/generic/ResolverBase.ts +540 -431
  488. package/src/generic/RunViewResolver.ts +97 -15
  489. package/src/generic/actionOutputFieldSecurity.ts +75 -0
  490. package/src/generic/fieldSecurityTransport.ts +62 -0
  491. package/src/globalCors.ts +71 -0
  492. package/src/index.ts +239 -238
  493. package/src/integration/CustomColumnPromoter.ts +6 -1
  494. package/src/logging/variablesLoggingMiddleware.ts +59 -3
  495. package/src/multiTenancy/index.ts +24 -2
  496. package/src/realtimeSessions/README.md +7 -3
  497. package/src/realtimeSessions/RealtimeSessionVerificationService.ts +2 -1
  498. package/src/realtimeSessions/RealtimeVerifyRouter.ts +2 -1
  499. package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
  500. package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
  501. package/src/realtimeSessions/index.ts +2 -0
  502. package/src/realtimeSessions/ownedRealtimeSession.ts +69 -0
  503. package/src/realtimeSessions/sessionAccess.ts +183 -23
  504. package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
  505. package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
  506. package/src/realtimeSessions/verificationWorkflow.ts +3 -1
  507. package/src/realtimeWidget/WidgetRouter.ts +22 -4
  508. package/src/realtimeWidget/WidgetSessionService.ts +252 -17
  509. package/src/realtimeWidget/host-identity.ts +1 -1
  510. package/src/realtimeWidget/widgetCore.ts +30 -1
  511. package/src/realtimeWidget/widgetGuestElevation.ts +2 -1
  512. package/src/resolvers/ActionResolver.ts +78 -15
  513. package/src/resolvers/AdhocQueryResolver.ts +1 -0
  514. package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
  515. package/src/resolvers/AgentSessionResolver.ts +46 -18
  516. package/src/resolvers/ArtifactFileResolver.ts +9 -8
  517. package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
  518. package/src/resolvers/DatasetResolver.ts +70 -10
  519. package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
  520. package/src/resolvers/EntityRecordNameResolver.ts +3 -2
  521. package/src/resolvers/FetchEntityVectorsResolver.ts +248 -55
  522. package/src/resolvers/FileCategoryResolver.ts +1 -0
  523. package/src/resolvers/FileResolver.ts +334 -109
  524. package/src/resolvers/GetDataContextDataResolver.ts +139 -41
  525. package/src/resolvers/GetDataResolver.ts +6 -3
  526. package/src/resolvers/IntegrationDiscoveryResolver.ts +53 -9
  527. package/src/resolvers/MergeRecordsResolver.ts +23 -2
  528. package/src/resolvers/PipelineProgressResolver.ts +12 -3
  529. package/src/resolvers/QueryResolver.ts +31 -6
  530. package/src/resolvers/QuerySystemUserResolver.ts +15 -6
  531. package/src/resolvers/RSUResolver.ts +12 -0
  532. package/src/resolvers/RealtimeClientSessionResolver.ts +114 -66
  533. package/src/resolvers/RemoteBrowserActionResolver.ts +15 -10
  534. package/src/resolvers/RunAIAgentResolver.ts +296 -85
  535. package/src/resolvers/RunTemplateResolver.ts +6 -4
  536. package/src/resolvers/RunTestResolver.ts +3 -1
  537. package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
  538. package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
  539. package/src/resolvers/SyncDataResolver.ts +4 -0
  540. package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
  541. package/src/resolvers/TestQuerySQLResolver.ts +69 -13
  542. package/src/resolvers/TransactionGroupResolver.ts +185 -30
  543. package/src/resolvers/UserViewResolver.ts +2 -1
  544. package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
  545. package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
  546. package/src/resolvers/agent-run-data-guard.ts +89 -0
  547. package/src/rest/EntityCRUDHandler.ts +22 -5
  548. package/src/rest/RESTEndpointHandler.ts +8 -5
  549. package/src/rest/RealtimeRecordingHandler.ts +467 -0
  550. package/src/rest/ViewOperationsHandler.ts +52 -18
  551. package/src/rest/setupRESTEndpoints.ts +6 -0
  552. package/src/serverExtensionReservedRoots.ts +14 -17
  553. package/src/serverRoleConfigUnits.ts +48 -0
  554. package/src/services/MJStorageBlobStore.ts +31 -30
  555. package/src/services/StartTaskGraphDispatcher.ts +2 -2
  556. package/src/services/TaskGraphActionRunner.ts +25 -5
  557. package/src/services/TaskGraphAgentRunner.ts +188 -11
  558. package/src/services/TaskGraphContinuationDeliverer.ts +738 -16
  559. package/src/sharedCache.ts +3 -0
  560. package/src/types.ts +23 -1
@@ -0,0 +1,180 @@
1
+ import { createHash, createHmac } from 'node:crypto';
2
+ import { RegisterClass } from '@memberjunction/global';
3
+ import { UserInfo } from '@memberjunction/core';
4
+ import {
5
+ BaseCacheInvalidationBroadcastProvider,
6
+ CacheBroadcastNegotiationResult,
7
+ CacheInvalidationBroadcastTopology,
8
+ } from '../BaseCacheInvalidationBroadcastProvider.js';
9
+ import type {
10
+ CacheInvalidationNotification,
11
+ CacheInvalidationPayload,
12
+ } from '../../generic/CacheInvalidationResolver.js';
13
+
14
+ /**
15
+ * Envelope published to an AWS IoT Core MQTT role topic.
16
+ */
17
+ export interface AWSIoTCoreTopicMessage {
18
+ Topic: string;
19
+ QoS: 0 | 1;
20
+ Event: CacheInvalidationNotification;
21
+ }
22
+
23
+ /**
24
+ * Transport callback used by {@link AWSIoTCoreBroadcastProvider} to publish a shaped
25
+ * invalidation notification to an AWS IoT Core MQTT topic.
26
+ */
27
+ export type AWSIoTCoreTopicPublisher = (message: AWSIoTCoreTopicMessage) => Promise<void>;
28
+
29
+ /**
30
+ * Topology 3 Cloud Multiplexer Provider for **AWS IoT Core MQTT over WebSockets** (`'AWSIoTCore'`).
31
+ *
32
+ * Offloads per-client WebSocket connection management and message fan-out from MJServer
33
+ * to AWS IoT Core's managed MQTT message broker:
34
+ * - Each authenticated browser client calls `NegotiateCacheBroadcastConnection` to obtain
35
+ * a SigV4-presigned `wss://<endpoint>/mqtt` URL and its authorized MQTT topic list
36
+ * (`<topicPrefix>/roles/<RoleID>`).
37
+ * - When an entity mutation occurs, MJServer shapes the invalidation payload once per
38
+ * authorized role on the entity and publishes to `<topicPrefix>/roles/<RoleID>`.
39
+ */
40
+ @RegisterClass(BaseCacheInvalidationBroadcastProvider, 'AWSIoTCore')
41
+ export class AWSIoTCoreBroadcastProvider extends BaseCacheInvalidationBroadcastProvider {
42
+ private _topicPublisher: AWSIoTCoreTopicPublisher | null = null;
43
+
44
+ public override get Topology(): CacheInvalidationBroadcastTopology {
45
+ return 'AWSIoTCore';
46
+ }
47
+
48
+ /**
49
+ * Installs a custom MQTT topic publisher (e.g., AWS SDK `IoTDataPlaneClient` adapter or test spy).
50
+ */
51
+ public SetTopicPublisher(publisher: AWSIoTCoreTopicPublisher | null): void {
52
+ this._topicPublisher = publisher;
53
+ }
54
+
55
+ /**
56
+ * Computes the MQTT topic filters (`<topicPrefix>/roles/<roleId>`) for a user's roles.
57
+ */
58
+ public GetAuthorizedTopicsForUser(user: UserInfo): string[] {
59
+ const prefix = (this._config.awsIoTCore?.topicPrefix || 'mj/cache').replace(/\/+$/, '');
60
+ const roles = user.UserRoles ?? [];
61
+ const topics: string[] = [];
62
+ for (const r of roles) {
63
+ const roleId = (r.RoleID ?? '').trim().toLowerCase();
64
+ if (roleId.length > 0) {
65
+ topics.push(`${prefix}/roles/${roleId}`);
66
+ }
67
+ }
68
+ topics.sort();
69
+ return topics;
70
+ }
71
+
72
+ protected override async OnInvalidationRecorded(payload: CacheInvalidationPayload): Promise<void> {
73
+ const prefix = (this._config.awsIoTCore?.topicPrefix || 'mj/cache').replace(/\/+$/, '');
74
+ const entity = this.ResolveEntityForPayload(payload);
75
+ if (!entity) {
76
+ return;
77
+ }
78
+
79
+ for (const perm of entity.Permissions) {
80
+ if (!perm.CanRead) continue;
81
+ const roleId = (perm.RoleID ?? '').trim().toLowerCase();
82
+ if (!roleId) continue;
83
+
84
+ const syntheticRoleHolder = { UserRoles: [{ RoleID: roleId }] };
85
+ const shaped = this.ShapeEventForSubscriber(payload, syntheticRoleHolder, entity);
86
+ const message: AWSIoTCoreTopicMessage = {
87
+ Topic: `${prefix}/roles/${roleId}`,
88
+ QoS: 1,
89
+ Event: shaped,
90
+ };
91
+
92
+ if (this._topicPublisher) {
93
+ await this._topicPublisher(message);
94
+ }
95
+ }
96
+ }
97
+
98
+ public override async NegotiateClientConnection(
99
+ user: UserInfo,
100
+ defaultGraphQLWsUrl = '/graphql'
101
+ ): Promise<CacheBroadcastNegotiationResult> {
102
+ const endpoint = (this._config.awsIoTCore?.endpoint ?? '').replace(/^https?:\/\//i, '').replace(/\/+$/, '');
103
+ const region = this._config.awsIoTCore?.region || 'us-east-1';
104
+ const ttlSeconds = this._config.awsIoTCore?.tokenTtlSeconds ?? 3600;
105
+ const expiresAtMs = Date.now() + ttlSeconds * 1000;
106
+ const topics = this.GetAuthorizedTopicsForUser(user);
107
+
108
+ if (!endpoint) {
109
+ return {
110
+ Provider: this.Topology,
111
+ Url: defaultGraphQLWsUrl,
112
+ Groups: topics,
113
+ ExpiresAt: new Date(expiresAtMs).toISOString(),
114
+ ServerProcessID: this.ServerProcessID,
115
+ CurrentSequence: this.CurrentSequence,
116
+ };
117
+ }
118
+
119
+ const accessKeyId = this._config.awsIoTCore?.accessKeyId;
120
+ const secretAccessKey = this._config.awsIoTCore?.secretAccessKey;
121
+ const presignedUrl =
122
+ accessKeyId && secretAccessKey
123
+ ? this.buildSigV4PresignedMqttUrl(endpoint, region, accessKeyId, secretAccessKey, ttlSeconds)
124
+ : `wss://${endpoint}/mqtt`;
125
+
126
+ return {
127
+ Provider: this.Topology,
128
+ Url: presignedUrl,
129
+ Groups: topics,
130
+ ExpiresAt: new Date(expiresAtMs).toISOString(),
131
+ ServerProcessID: this.ServerProcessID,
132
+ CurrentSequence: this.CurrentSequence,
133
+ };
134
+ }
135
+
136
+ private buildSigV4PresignedMqttUrl(
137
+ host: string,
138
+ region: string,
139
+ accessKeyId: string,
140
+ secretAccessKey: string,
141
+ expiresSeconds: number
142
+ ): string {
143
+ const now = new Date();
144
+ const amzDate = now.toISOString().replace(/[:-]|\.\d{3}/g, '');
145
+ const dateStamp = amzDate.slice(0, 8);
146
+ const service = 'iotdevicegateway';
147
+ const credentialScope = `${dateStamp}/${region}/${service}/aws4_request`;
148
+ const queryParams = [
149
+ `X-Amz-Algorithm=AWS4-HMAC-SHA256`,
150
+ `X-Amz-Credential=${encodeURIComponent(`${accessKeyId}/${credentialScope}`)}`,
151
+ `X-Amz-Date=${amzDate}`,
152
+ `X-Amz-Expires=${expiresSeconds}`,
153
+ `X-Amz-SignedHeaders=host`,
154
+ ].join('&');
155
+
156
+ const canonicalRequest = [
157
+ 'GET',
158
+ '/mqtt',
159
+ queryParams,
160
+ `host:${host}\n`,
161
+ 'host',
162
+ createHash('sha256').update('').digest('hex'),
163
+ ].join('\n');
164
+
165
+ const stringToSign = [
166
+ 'AWS4-HMAC-SHA256',
167
+ amzDate,
168
+ credentialScope,
169
+ createHash('sha256').update(canonicalRequest).digest('hex'),
170
+ ].join('\n');
171
+
172
+ const kDate = createHmac('sha256', `AWS4${secretAccessKey}`).update(dateStamp).digest();
173
+ const kRegion = createHmac('sha256', kDate).update(region).digest();
174
+ const kService = createHmac('sha256', kRegion).update(service).digest();
175
+ const kSigning = createHmac('sha256', kService).update('aws4_request').digest();
176
+ const signature = createHmac('sha256', kSigning).update(stringToSign).digest('hex');
177
+
178
+ return `wss://${host}/mqtt?${queryParams}&X-Amz-Signature=${signature}`;
179
+ }
180
+ }
@@ -0,0 +1,182 @@
1
+ import { createHmac } from 'node:crypto';
2
+ import { RegisterClass } from '@memberjunction/global';
3
+ import { UserInfo } from '@memberjunction/core';
4
+ import {
5
+ BaseCacheInvalidationBroadcastProvider,
6
+ CacheBroadcastNegotiationResult,
7
+ CacheInvalidationBroadcastTopology,
8
+ } from '../BaseCacheInvalidationBroadcastProvider.js';
9
+ import type {
10
+ CacheInvalidationNotification,
11
+ CacheInvalidationPayload,
12
+ } from '../../generic/CacheInvalidationResolver.js';
13
+
14
+ /**
15
+ * Envelope published to an Azure Web PubSub role group.
16
+ */
17
+ export interface AzureWebPubSubGroupMessage {
18
+ HubName: string;
19
+ GroupName: string;
20
+ Event: CacheInvalidationNotification;
21
+ }
22
+
23
+ /**
24
+ * Transport callback used by {@link AzureWebPubSubBroadcastProvider} to deliver a shaped
25
+ * invalidation notification to an Azure Web PubSub group.
26
+ */
27
+ export type AzureWebPubSubGroupPublisher = (message: AzureWebPubSubGroupMessage) => Promise<void>;
28
+
29
+ /**
30
+ * Topology 3 Cloud Multiplexer Provider for **Azure Web PubSub** (`'AzureWebPubSub'`).
31
+ *
32
+ * Offloads per-client WebSocket connection management and message fan-out from MJServer
33
+ * to Azure Web PubSub:
34
+ * - Each authenticated browser client calls `NegotiateCacheBroadcastConnection` to receive
35
+ * a short-lived, HMAC-signed JWT access token scoped to its authorized role groups (`mj-role-<RoleID>`).
36
+ * - When an entity mutation occurs, MJServer shapes the invalidation payload once per
37
+ * authorized role group on the entity and publishes a single group broadcast to Azure Web PubSub,
38
+ * which fans the message out to thousands of connected browsers in C++ edge infrastructure.
39
+ */
40
+ @RegisterClass(BaseCacheInvalidationBroadcastProvider, 'AzureWebPubSub')
41
+ export class AzureWebPubSubBroadcastProvider extends BaseCacheInvalidationBroadcastProvider {
42
+ private _groupPublisher: AzureWebPubSubGroupPublisher | null = null;
43
+
44
+ public override get Topology(): CacheInvalidationBroadcastTopology {
45
+ return 'AzureWebPubSub';
46
+ }
47
+
48
+ /**
49
+ * Installs a custom group publisher (e.g., Azure WebPubSubServiceClient adapter or test spy).
50
+ * When unset and an HTTP endpoint + accessKey are configured, defaults to the Azure Web PubSub
51
+ * REST Data Plane API (`POST /api/hubs/{hub}/groups/{group}/:send`).
52
+ */
53
+ public SetGroupPublisher(publisher: AzureWebPubSubGroupPublisher | null): void {
54
+ this._groupPublisher = publisher;
55
+ }
56
+
57
+ /**
58
+ * Computes the Azure Web PubSub group names (`mj-role-<roleId>`) for a user's roles.
59
+ */
60
+ public GetAuthorizedGroupsForUser(user: UserInfo): string[] {
61
+ const roles = user.UserRoles ?? [];
62
+ const groups: string[] = [];
63
+ for (const r of roles) {
64
+ const roleId = (r.RoleID ?? '').trim().toLowerCase();
65
+ if (roleId.length > 0) {
66
+ groups.push(`mj-role-${roleId}`);
67
+ }
68
+ }
69
+ groups.sort();
70
+ return groups;
71
+ }
72
+
73
+ protected override async OnInvalidationRecorded(payload: CacheInvalidationPayload): Promise<void> {
74
+ const hubName = this._config.azureWebPubSub?.hubName || 'mj_cache_hub';
75
+ const entity = this.ResolveEntityForPayload(payload);
76
+ if (!entity) {
77
+ return;
78
+ }
79
+
80
+ // Group entity permissions by RoleID and shape once per authorized role
81
+ for (const perm of entity.Permissions) {
82
+ if (!perm.CanRead) continue;
83
+ const roleId = (perm.RoleID ?? '').trim().toLowerCase();
84
+ if (!roleId) continue;
85
+
86
+ const syntheticRoleHolder = { UserRoles: [{ RoleID: roleId }] };
87
+ const shaped = this.ShapeEventForSubscriber(payload, syntheticRoleHolder, entity);
88
+ const message: AzureWebPubSubGroupMessage = {
89
+ HubName: hubName,
90
+ GroupName: `mj-role-${roleId}`,
91
+ Event: shaped,
92
+ };
93
+
94
+ if (this._groupPublisher) {
95
+ await this._groupPublisher(message);
96
+ } else if (this._config.azureWebPubSub?.endpoint && this._config.azureWebPubSub?.accessKey) {
97
+ await this.publishViaRestApi(message);
98
+ }
99
+ }
100
+ }
101
+
102
+ public override async NegotiateClientConnection(
103
+ user: UserInfo,
104
+ defaultGraphQLWsUrl = '/graphql'
105
+ ): Promise<CacheBroadcastNegotiationResult> {
106
+ const endpoint = (this._config.azureWebPubSub?.endpoint ?? '').replace(/\/+$/, '');
107
+ const hubName = this._config.azureWebPubSub?.hubName || 'mj_cache_hub';
108
+ const accessKey = this._config.azureWebPubSub?.accessKey || '';
109
+ const ttlMinutes = this._config.azureWebPubSub?.tokenTtlMinutes ?? 60;
110
+ const expiresAtMs = Date.now() + ttlMinutes * 60 * 1000;
111
+ const groups = this.GetAuthorizedGroupsForUser(user);
112
+
113
+ if (!endpoint) {
114
+ return {
115
+ Provider: this.Topology,
116
+ Url: defaultGraphQLWsUrl,
117
+ Groups: groups,
118
+ ExpiresAt: new Date(expiresAtMs).toISOString(),
119
+ ServerProcessID: this.ServerProcessID,
120
+ CurrentSequence: this.CurrentSequence,
121
+ };
122
+ }
123
+
124
+ const wsEndpoint = endpoint.replace(/^http:/i, 'ws:').replace(/^https:/i, 'wss:');
125
+ const audience = `${endpoint}/client/hubs/${hubName}`;
126
+ const token = accessKey
127
+ ? this.mintJwtToken(audience, user.ID, groups, Math.floor(expiresAtMs / 1000), accessKey)
128
+ : undefined;
129
+ const url = token
130
+ ? `${wsEndpoint}/client/hubs/${hubName}?access_token=${encodeURIComponent(token)}`
131
+ : `${wsEndpoint}/client/hubs/${hubName}`;
132
+
133
+ return {
134
+ Provider: this.Topology,
135
+ Url: url,
136
+ Token: token,
137
+ Groups: groups,
138
+ ExpiresAt: new Date(expiresAtMs).toISOString(),
139
+ ServerProcessID: this.ServerProcessID,
140
+ CurrentSequence: this.CurrentSequence,
141
+ };
142
+ }
143
+
144
+ private mintJwtToken(
145
+ audience: string,
146
+ subject: string,
147
+ groups: string[],
148
+ expSeconds: number,
149
+ secret: string
150
+ ): string {
151
+ const header = Buffer.from(JSON.stringify({ alg: 'HS256', typ: 'JWT' })).toString('base64url');
152
+ const claims = Buffer.from(
153
+ JSON.stringify({
154
+ aud: audience,
155
+ sub: subject,
156
+ iat: Math.floor(Date.now() / 1000),
157
+ exp: expSeconds,
158
+ role: groups.map((g) => `webpubsub.joinLeaveGroup.${g}`),
159
+ })
160
+ ).toString('base64url');
161
+ const signingInput = `${header}.${claims}`;
162
+ const signature = createHmac('sha256', secret).update(signingInput).digest('base64url');
163
+ return `${signingInput}.${signature}`;
164
+ }
165
+
166
+ private async publishViaRestApi(message: AzureWebPubSubGroupMessage): Promise<void> {
167
+ const endpoint = (this._config.azureWebPubSub?.endpoint ?? '').replace(/\/+$/, '');
168
+ const accessKey = this._config.azureWebPubSub?.accessKey ?? '';
169
+ if (!endpoint || !accessKey) return;
170
+
171
+ const targetUrl = `${endpoint}/api/hubs/${encodeURIComponent(message.HubName)}/groups/${encodeURIComponent(message.GroupName)}/:send?api-version=2024-01-01`;
172
+ const token = this.mintJwtToken(targetUrl, 'mj-server', [], Math.floor(Date.now() / 1000) + 300, accessKey);
173
+ await fetch(targetUrl, {
174
+ method: 'POST',
175
+ headers: {
176
+ Authorization: `Bearer ${token}`,
177
+ 'Content-Type': 'application/json',
178
+ },
179
+ body: JSON.stringify(message.Event),
180
+ });
181
+ }
182
+ }
@@ -0,0 +1,169 @@
1
+ import { createHmac } from 'node:crypto';
2
+ import { RegisterClass } from '@memberjunction/global';
3
+ import { UserInfo } from '@memberjunction/core';
4
+ import {
5
+ BaseCacheInvalidationBroadcastProvider,
6
+ CacheBroadcastNegotiationResult,
7
+ CacheInvalidationBroadcastTopology,
8
+ } from '../BaseCacheInvalidationBroadcastProvider.js';
9
+ import type {
10
+ CacheInvalidationNotification,
11
+ CacheInvalidationPayload,
12
+ } from '../../generic/CacheInvalidationResolver.js';
13
+
14
+ /**
15
+ * Envelope published to a Google Cloud Pub/Sub role topic.
16
+ */
17
+ export interface GCPPubSubTopicMessage {
18
+ ProjectId: string;
19
+ TopicName: string;
20
+ Attributes: {
21
+ roleId: string;
22
+ entityName: string;
23
+ action: string;
24
+ sequence: string;
25
+ };
26
+ Event: CacheInvalidationNotification;
27
+ }
28
+
29
+ /**
30
+ * Transport callback used by {@link GCPPubSubBroadcastProvider} to publish a shaped
31
+ * invalidation notification to Google Cloud Pub/Sub.
32
+ */
33
+ export type GCPPubSubTopicPublisher = (message: GCPPubSubTopicMessage) => Promise<void>;
34
+
35
+ /**
36
+ * Topology 3 Cloud Multiplexer Provider for **Google Cloud Pub/Sub + Cloud Run WebSockets** (`'GCPPubSub'`).
37
+ *
38
+ * Offloads per-client WebSocket connection management and message fan-out from MJServer
39
+ * to a Google Cloud Pub/Sub + Cloud Run WebSocket fan-out gateway:
40
+ * - Each authenticated browser client calls `NegotiateCacheBroadcastConnection` to obtain
41
+ * a signed gateway token and its authorized Pub/Sub role subscription attributes
42
+ * (`projects/<projectId>/topics/<topicPrefix>-role-<RoleID>`).
43
+ * - When an entity mutation occurs, MJServer shapes the invalidation payload once per
44
+ * authorized role on the entity and publishes a message with Pub/Sub filtering attributes.
45
+ */
46
+ @RegisterClass(BaseCacheInvalidationBroadcastProvider, 'GCPPubSub')
47
+ export class GCPPubSubBroadcastProvider extends BaseCacheInvalidationBroadcastProvider {
48
+ private _topicPublisher: GCPPubSubTopicPublisher | null = null;
49
+
50
+ public override get Topology(): CacheInvalidationBroadcastTopology {
51
+ return 'GCPPubSub';
52
+ }
53
+
54
+ /**
55
+ * Installs a custom Google Cloud Pub/Sub topic publisher (e.g., `@google-cloud/pubsub` adapter or test spy).
56
+ */
57
+ public SetTopicPublisher(publisher: GCPPubSubTopicPublisher | null): void {
58
+ this._topicPublisher = publisher;
59
+ }
60
+
61
+ /**
62
+ * Computes the fully-qualified GCP Pub/Sub topic names for a user's roles.
63
+ */
64
+ public GetAuthorizedTopicsForUser(user: UserInfo): string[] {
65
+ const projectId = this._config.gcpPubSub?.projectId || 'mj-default-project';
66
+ const prefix = this._config.gcpPubSub?.topicPrefix || 'mj-cache';
67
+ const roles = user.UserRoles ?? [];
68
+ const topics: string[] = [];
69
+ for (const r of roles) {
70
+ const roleId = (r.RoleID ?? '').trim().toLowerCase();
71
+ if (roleId.length > 0) {
72
+ topics.push(`projects/${projectId}/topics/${prefix}-role-${roleId}`);
73
+ }
74
+ }
75
+ topics.sort();
76
+ return topics;
77
+ }
78
+
79
+ protected override async OnInvalidationRecorded(payload: CacheInvalidationPayload): Promise<void> {
80
+ const projectId = this._config.gcpPubSub?.projectId || 'mj-default-project';
81
+ const prefix = this._config.gcpPubSub?.topicPrefix || 'mj-cache';
82
+ const entity = this.ResolveEntityForPayload(payload);
83
+ if (!entity) {
84
+ return;
85
+ }
86
+
87
+ for (const perm of entity.Permissions) {
88
+ if (!perm.CanRead) continue;
89
+ const roleId = (perm.RoleID ?? '').trim().toLowerCase();
90
+ if (!roleId) continue;
91
+
92
+ const syntheticRoleHolder = { UserRoles: [{ RoleID: roleId }] };
93
+ const shaped = this.ShapeEventForSubscriber(payload, syntheticRoleHolder, entity);
94
+ const message: GCPPubSubTopicMessage = {
95
+ ProjectId: projectId,
96
+ TopicName: `projects/${projectId}/topics/${prefix}-role-${roleId}`,
97
+ Attributes: {
98
+ roleId,
99
+ entityName: payload.entityName,
100
+ action: payload.action,
101
+ sequence: String(payload.sequence ?? 0),
102
+ },
103
+ Event: shaped,
104
+ };
105
+
106
+ if (this._topicPublisher) {
107
+ await this._topicPublisher(message);
108
+ }
109
+ }
110
+ }
111
+
112
+ public override async NegotiateClientConnection(
113
+ user: UserInfo,
114
+ defaultGraphQLWsUrl = '/graphql'
115
+ ): Promise<CacheBroadcastNegotiationResult> {
116
+ const gatewayUrl = (this._config.gcpPubSub?.gatewayUrl ?? '').replace(/\/+$/, '');
117
+ const signingSecret = this._config.gcpPubSub?.signingSecret || '';
118
+ const ttlSeconds = this._config.gcpPubSub?.tokenTtlSeconds ?? 3600;
119
+ const expiresAtMs = Date.now() + ttlSeconds * 1000;
120
+ const topics = this.GetAuthorizedTopicsForUser(user);
121
+
122
+ if (!gatewayUrl) {
123
+ return {
124
+ Provider: this.Topology,
125
+ Url: defaultGraphQLWsUrl,
126
+ Groups: topics,
127
+ ExpiresAt: new Date(expiresAtMs).toISOString(),
128
+ ServerProcessID: this.ServerProcessID,
129
+ CurrentSequence: this.CurrentSequence,
130
+ };
131
+ }
132
+
133
+ const wsGatewayUrl = gatewayUrl.replace(/^http:/i, 'ws:').replace(/^https:/i, 'wss:');
134
+ const token = signingSecret
135
+ ? this.mintGatewayToken(user.ID, topics, Math.floor(expiresAtMs / 1000), signingSecret)
136
+ : undefined;
137
+ const url = token ? `${wsGatewayUrl}?token=${encodeURIComponent(token)}` : wsGatewayUrl;
138
+
139
+ return {
140
+ Provider: this.Topology,
141
+ Url: url,
142
+ Token: token,
143
+ Groups: topics,
144
+ ExpiresAt: new Date(expiresAtMs).toISOString(),
145
+ ServerProcessID: this.ServerProcessID,
146
+ CurrentSequence: this.CurrentSequence,
147
+ };
148
+ }
149
+
150
+ private mintGatewayToken(
151
+ subject: string,
152
+ topics: string[],
153
+ expSeconds: number,
154
+ secret: string
155
+ ): string {
156
+ const header = Buffer.from(JSON.stringify({ alg: 'HS256', typ: 'JWT' })).toString('base64url');
157
+ const claims = Buffer.from(
158
+ JSON.stringify({
159
+ sub: subject,
160
+ iat: Math.floor(Date.now() / 1000),
161
+ exp: expSeconds,
162
+ topics,
163
+ })
164
+ ).toString('base64url');
165
+ const signingInput = `${header}.${claims}`;
166
+ const signature = createHmac('sha256', secret).update(signingInput).digest('base64url');
167
+ return `${signingInput}.${signature}`;
168
+ }
169
+ }
@@ -0,0 +1,57 @@
1
+ import { RegisterClass } from '@memberjunction/global';
2
+ import { UserInfo } from '@memberjunction/core';
3
+ import {
4
+ BaseCacheInvalidationBroadcastProvider,
5
+ CacheBroadcastNegotiationResult,
6
+ CacheInvalidationBroadcastManager,
7
+ CacheInvalidationBroadcastTopology,
8
+ } from '../BaseCacheInvalidationBroadcastProvider.js';
9
+ import type { CacheInvalidationPayload } from '../../generic/CacheInvalidationResolver.js';
10
+
11
+ /**
12
+ * Default MemberJunction cache invalidation broadcast provider (`'SequencedRoleBucket'`).
13
+ *
14
+ * Combines:
15
+ * - **Topology 1 (Monotonic Sequence Ring Buffer + HTTP Header Piggybacking)**:
16
+ * Every mutation assigns a monotonic `Sequence` integer, stores the event in a bounded ring buffer,
17
+ * and piggybacks `X-MJ-Cache-Seq` and `X-MJ-Server-ID` onto GraphQL HTTP responses so clients can
18
+ * detect and recover missed invalidations via `GetCacheInvalidationsSince` in a single delta query.
19
+ * - **Topology 2 (Role-Fingerprint $O(\text{Roles})$ Evaluation & Shaping Memoizer)**:
20
+ * Memoizes entity-level read permission (`CanRead`) and row-level security key-withholding
21
+ * (`ReadIsRowFiltered`) once per unique role fingerprint (`RoleID` set) per event instead of
22
+ * re-evaluating permissions $N$ times across all connected WebSocket clients.
23
+ *
24
+ * Zero external cloud infrastructure is required.
25
+ */
26
+ @RegisterClass(BaseCacheInvalidationBroadcastProvider, 'SequencedRoleBucket')
27
+ export class SequencedRoleBucketBroadcastProvider extends BaseCacheInvalidationBroadcastProvider {
28
+ public override get Topology(): CacheInvalidationBroadcastTopology {
29
+ return 'SequencedRoleBucket';
30
+ }
31
+
32
+ protected override async OnInvalidationRecorded(_payload: CacheInvalidationPayload): Promise<void> {
33
+ // In-process GraphQL WebSocket subscriptions read directly from PubSub + role-bucket memoizer;
34
+ // no external cloud multiplexer dispatch is needed in SequencedRoleBucket mode.
35
+ }
36
+
37
+ public override async NegotiateClientConnection(
38
+ user: UserInfo,
39
+ defaultGraphQLWsUrl = '/graphql'
40
+ ): Promise<CacheBroadcastNegotiationResult> {
41
+ const fingerprint = this.GetRoleFingerprint(user);
42
+ const expiresAt = new Date(Date.now() + 60 * 60 * 1000).toISOString();
43
+ return {
44
+ Provider: this.Topology,
45
+ Url: defaultGraphQLWsUrl,
46
+ Groups: [fingerprint],
47
+ ExpiresAt: expiresAt,
48
+ ServerProcessID: this.ServerProcessID,
49
+ CurrentSequence: this.CurrentSequence,
50
+ };
51
+ }
52
+ }
53
+
54
+ // Ensure the default provider factory is always registered even if ClassFactory lookup happens early.
55
+ CacheInvalidationBroadcastManager.Instance.RegisterDefaultProviderFactory(
56
+ () => new SequencedRoleBucketBroadcastProvider()
57
+ );
package/src/cache.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import { LRUCache } from 'lru-cache';
2
+ import type jwt from 'jsonwebtoken';
2
3
 
3
4
  const oneHourMs = 60 * 60 * 1000;
4
5
 
5
- export const AuthCache = new LRUCache({
6
+ export const AuthCache = new LRUCache<string, jwt.JwtPayload | boolean>({
6
7
  max: 50000,
7
8
  ttl: oneHourMs,
8
9
  ttlAutopurge: false,