@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,91 @@
1
+ /**
2
+ * Shared field-security fixtures for the transport tests: an `Employees` entity whose `Salary`
3
+ * and `Base Salary` only the HR role may read, plus users holding either role.
4
+ *
5
+ * Built from real `EntityInfo` / `UserInfo` objects so the denied sets come from the same
6
+ * aggregation production uses, not from a stub.
7
+ */
8
+ import { EntityInfo, FieldSecurityClientInputMessage, UserInfo, UserRoleInfo } from '@memberjunction/core';
9
+
10
+ export const HR_ROLE_ID = 'A0000000-0000-0000-0000-000000000001';
11
+ export const INTERN_ROLE_ID = 'A0000000-0000-0000-0000-000000000003';
12
+ export const EMPLOYEES_ENTITY_ID = 'entity-employees';
13
+ export const EMPLOYEES_ENTITY_NAME = 'Employees';
14
+
15
+ /** The salary an HR user may read and an intern may not. Distinctive so a leak is easy to spot. */
16
+ export const SECRET_SALARY = 987654.32;
17
+
18
+ function openTo(fieldId: string, roles: string[] = [HR_ROLE_ID, INTERN_ROLE_ID]): Record<string, unknown>[] {
19
+ return roles.map((roleId, i) => ({
20
+ ID: `${fieldId}-open-${i}`,
21
+ EntityFieldID: fieldId,
22
+ RoleID: roleId,
23
+ ReadAccess: 'Allow',
24
+ UpdateAccess: 'Allow',
25
+ CreateAccess: 'Allow',
26
+ }));
27
+ }
28
+
29
+ /** Init data for the `Employees` entity. `withFls: false` switches field security off entirely. */
30
+ export function EmployeeEntityInit(withFls = true): Record<string, unknown> {
31
+ const field = (id: string, sequence: number, name: string, type: string, extra: Record<string, unknown> = {}) => ({
32
+ ID: id, EntityID: EMPLOYEES_ENTITY_ID, Sequence: sequence, Name: name, Entity: EMPLOYEES_ENTITY_NAME, Type: type, ...extra,
33
+ });
34
+ return {
35
+ ID: EMPLOYEES_ENTITY_ID,
36
+ Name: EMPLOYEES_ENTITY_NAME,
37
+ SchemaName: 'dbo',
38
+ BaseTable: 'Employee',
39
+ BaseView: 'vwEmployees',
40
+ IncludeInAPI: true,
41
+ AllowCreateAPI: true,
42
+ AllowUpdateAPI: true,
43
+ AllowDeleteAPI: true,
44
+ EnableFieldLevelSecurity: withFls,
45
+ Permissions: [
46
+ { EntityID: EMPLOYEES_ENTITY_ID, RoleID: HR_ROLE_ID, CanCreate: true, CanRead: true, CanUpdate: true, CanDelete: true },
47
+ { EntityID: EMPLOYEES_ENTITY_ID, RoleID: INTERN_ROLE_ID, CanCreate: true, CanRead: true, CanUpdate: true, CanDelete: true },
48
+ ],
49
+ Fields: [
50
+ field('f-id', 1, 'ID', 'uniqueidentifier', { IsPrimaryKey: true }),
51
+ field('f-name', 2, 'Name', 'nvarchar', { EntityFieldPermissions: openTo('f-name') }),
52
+ field('f-salary', 3, 'Salary', 'money', { EntityFieldPermissions: openTo('f-salary', [HR_ROLE_ID]) }),
53
+ field('f-base-salary', 4, 'Base Salary', 'money', { EntityFieldPermissions: openTo('f-base-salary', [HR_ROLE_ID]) }),
54
+ field('f-notes', 5, 'Notes', 'nvarchar', { EntityFieldPermissions: openTo('f-notes') }),
55
+ ],
56
+ };
57
+ }
58
+
59
+ export function EmployeeEntity(withFls = true): EntityInfo {
60
+ return new EntityInfo(EmployeeEntityInit(withFls));
61
+ }
62
+
63
+ export function BuildUser(roleIds: string[], id = 'user-1'): UserInfo {
64
+ const u = new UserInfo();
65
+ u.ID = id;
66
+ u.Name = 'Test User';
67
+ u.Email = `${id}@test.com`;
68
+ u.IsActive = true;
69
+ (u as unknown as Record<string, unknown>)['_UserRoles'] =
70
+ roleIds.map(rid => new UserRoleInfo({ UserID: id, RoleID: rid, Role: `Role-${rid}` }));
71
+ return u;
72
+ }
73
+
74
+ export const Intern = (): UserInfo => BuildUser([INTERN_ROLE_ID], 'intern-1');
75
+ export const HRUser = (): UserInfo => BuildUser([HR_ROLE_ID], 'hr-1');
76
+
77
+ /** A full-width employee row: what a system-identity load, or a save's re-read, returns. */
78
+ export function FullWidthEmployeeRow(): Record<string, unknown> {
79
+ return { ID: 'emp-1', Name: 'Ada', Salary: SECRET_SALARY, 'Base Salary': SECRET_SALARY, Notes: 'n' };
80
+ }
81
+
82
+ /** The refusal text for a key, identical whether the key is denied or names no field. */
83
+ export function RefusalFor(key: string): string {
84
+ return FieldSecurityClientInputMessage(key, EMPLOYEES_ENTITY_NAME);
85
+ }
86
+
87
+ /** A metadata source the projection accepts; Record Changes resolution is never reached for Employees. */
88
+ export const NoRecordChangesMetadata = {
89
+ Entities: [] as EntityInfo[],
90
+ EntityByID: (): EntityInfo | undefined => undefined,
91
+ };
@@ -0,0 +1,217 @@
1
+ /**
2
+ * MJServer's global CORS middleware vs. server extensions that own their CORS policy.
3
+ *
4
+ * Reproduces the BizApps Voting ballot-edge failure: the global middleware ran ahead of the
5
+ * extension, reflected any origin onto the extension's refusals, and answered every preflight
6
+ * with 204 so the extension's own OPTIONS handler never ran. Runs a real Express app on an
7
+ * ephemeral port so the preflight is Express's and `cors`'s own behavior, not a mock.
8
+ */
9
+ import { describe, it, expect, afterEach } from 'vitest';
10
+ import express, { type Application } from 'express';
11
+ import type { Server } from 'node:http';
12
+ import type { AddressInfo } from 'node:net';
13
+ import { readFileSync } from 'node:fs';
14
+ import { GetCorsOwningServerExtensionRoots, type ServerExtensionConfig } from '@memberjunction/server-extensions-core';
15
+ import cors from 'cors';
16
+ import { CreateExtensionOwnedPreflightFallback, CreateGlobalCorsMiddleware } from '../globalCors.js';
17
+
18
+ const ALLOWED_BALLOT_ORIGIN = 'https://vote.example.org';
19
+ const OTHER_ORIGIN = 'https://evil.example.com';
20
+
21
+ /** A ballot-style edge: its own per-resource origin policy and its own preflight answer. */
22
+ function mountBallotExtension(app: Application): void {
23
+ const router = express.Router();
24
+ router.use((req, res, next) => {
25
+ const origin = req.headers.origin;
26
+ if (origin && origin !== ALLOWED_BALLOT_ORIGIN) {
27
+ res.status(403).json({ error: 'origin not allowed for this ballot' });
28
+ return;
29
+ }
30
+ if (origin) {
31
+ res.setHeader('Access-Control-Allow-Origin', origin);
32
+ res.setHeader('Vary', 'Origin');
33
+ }
34
+ if (req.method === 'OPTIONS') {
35
+ res.setHeader('Access-Control-Allow-Methods', 'POST');
36
+ res.setHeader('X-Ballot-Preflight', 'extension');
37
+ res.status(200).end();
38
+ return;
39
+ }
40
+ next();
41
+ });
42
+ router.post('/cast', (_req, res) => { res.json({ ok: true }); });
43
+ app.use('/ballot', router);
44
+ }
45
+
46
+ let server: Server | undefined;
47
+
48
+ afterEach(async () => {
49
+ if (server) {
50
+ await new Promise<void>((resolve) => server!.close(() => resolve()));
51
+ server = undefined;
52
+ }
53
+ });
54
+
55
+ async function startApp(extensions: ServerExtensionConfig[]): Promise<string> {
56
+ const app = express();
57
+ app.disable('x-powered-by');
58
+ app.use(CreateGlobalCorsMiddleware({ allowedOrigins: ['*'] }, GetCorsOwningServerExtensionRoots(extensions)));
59
+ mountBallotExtension(app);
60
+ app.get('/core', (_req, res) => { res.json({ ok: true }); });
61
+ server = app.listen(0, '127.0.0.1');
62
+ await new Promise<void>((resolve) => server!.once('listening', () => resolve()));
63
+ return `http://127.0.0.1:${(server.address() as AddressInfo).port}`;
64
+ }
65
+
66
+ const ballotConfig = (ownsCors: boolean | undefined): ServerExtensionConfig => ({
67
+ Enabled: true,
68
+ DriverClass: 'BallotEdge',
69
+ RootPath: '/ballot',
70
+ Phase: 'pre-auth',
71
+ ...(ownsCors === undefined ? {} : { OwnsCORS: ownsCors }),
72
+ Settings: {},
73
+ });
74
+
75
+ describe('CreateGlobalCorsMiddleware', () => {
76
+ it('without OwnsCORS, global CORS answers the preflight and the extension never sees it (the bug)', async () => {
77
+ const base = await startApp([ballotConfig(undefined)]);
78
+ const res = await fetch(`${base}/ballot/cast`, {
79
+ method: 'OPTIONS',
80
+ headers: { Origin: OTHER_ORIGIN, 'Access-Control-Request-Method': 'POST' },
81
+ });
82
+ expect(res.status).toBe(204);
83
+ expect(res.headers.get('access-control-allow-origin')).toBe(OTHER_ORIGIN);
84
+ expect(res.headers.get('x-ballot-preflight')).toBeNull();
85
+ });
86
+
87
+ it('with OwnsCORS, the preflight reaches the extension, which refuses a foreign origin without CORS headers', async () => {
88
+ const base = await startApp([ballotConfig(true)]);
89
+ const res = await fetch(`${base}/ballot/cast`, {
90
+ method: 'OPTIONS',
91
+ headers: { Origin: OTHER_ORIGIN, 'Access-Control-Request-Method': 'POST' },
92
+ });
93
+ expect(res.status).toBe(403);
94
+ expect(res.headers.get('access-control-allow-origin')).toBeNull();
95
+ });
96
+
97
+ it('with OwnsCORS, the extension answers its own preflight for its allowed origin', async () => {
98
+ const base = await startApp([ballotConfig(true)]);
99
+ const res = await fetch(`${base}/ballot/cast`, {
100
+ method: 'OPTIONS',
101
+ headers: { Origin: ALLOWED_BALLOT_ORIGIN, 'Access-Control-Request-Method': 'POST' },
102
+ });
103
+ expect(res.status).toBe(200);
104
+ expect(res.headers.get('x-ballot-preflight')).toBe('extension');
105
+ expect(res.headers.get('access-control-allow-origin')).toBe(ALLOWED_BALLOT_ORIGIN);
106
+ // The global policy's max-age would only be there if global CORS had run.
107
+ expect(res.headers.get('access-control-max-age')).toBeNull();
108
+ });
109
+
110
+ it('with OwnsCORS, a foreign-origin refusal on a normal request carries no reflected origin', async () => {
111
+ const base = await startApp([ballotConfig(true)]);
112
+ const res = await fetch(`${base}/ballot/cast`, { method: 'POST', headers: { Origin: OTHER_ORIGIN } });
113
+ expect(res.status).toBe(403);
114
+ expect(res.headers.get('access-control-allow-origin')).toBeNull();
115
+ });
116
+
117
+ it('keeps global CORS on every path the extension does not own', async () => {
118
+ const base = await startApp([ballotConfig(true)]);
119
+ const res = await fetch(`${base}/core`, {
120
+ method: 'OPTIONS',
121
+ headers: { Origin: OTHER_ORIGIN, 'Access-Control-Request-Method': 'GET' },
122
+ });
123
+ expect(res.status).toBe(204);
124
+ expect(res.headers.get('access-control-allow-origin')).toBe(OTHER_ORIGIN);
125
+ expect(res.headers.get('access-control-max-age')).toBe('86400');
126
+ });
127
+
128
+ it('ignores OwnsCORS on a disabled extension', async () => {
129
+ const base = await startApp([{ ...ballotConfig(true), Enabled: false }]);
130
+ const res = await fetch(`${base}/ballot/cast`, {
131
+ method: 'OPTIONS',
132
+ headers: { Origin: OTHER_ORIGIN, 'Access-Control-Request-Method': 'POST' },
133
+ });
134
+ expect(res.status).toBe(204);
135
+ });
136
+
137
+ it('never sends credentials under the wildcard, even when allowCredentials is true', async () => {
138
+ const app = express();
139
+ app.use(CreateGlobalCorsMiddleware({ allowedOrigins: ['*'], allowCredentials: true }));
140
+ app.get('/core', (_req, res) => { res.json({ ok: true }); });
141
+ server = app.listen(0, '127.0.0.1');
142
+ await new Promise<void>((resolve) => server!.once('listening', () => resolve()));
143
+ const base = `http://127.0.0.1:${(server.address() as AddressInfo).port}`;
144
+ const res = await fetch(`${base}/core`, { headers: { Origin: OTHER_ORIGIN } });
145
+ expect(res.headers.get('access-control-allow-credentials')).toBeNull();
146
+ });
147
+ });
148
+
149
+ /**
150
+ * The real mount order: global CORS → extensions → (fallback) → the GraphQL mount at `/`, whose own
151
+ * `cors()` approves every origin. The webhook extension owns its CORS but has no OPTIONS handler.
152
+ */
153
+ async function startAppWithGraphQLMount(withFallback: boolean): Promise<string> {
154
+ const extensions: ServerExtensionConfig[] = [
155
+ ballotConfig(true),
156
+ { Enabled: true, DriverClass: 'Webhook', RootPath: '/webhook', Phase: 'pre-auth', OwnsCORS: true, Settings: {} },
157
+ ];
158
+ const ownedRoots = GetCorsOwningServerExtensionRoots(extensions);
159
+ const app = express();
160
+ app.use(CreateGlobalCorsMiddleware({ allowedOrigins: ['*'] }, ownedRoots));
161
+ mountBallotExtension(app);
162
+ app.post('/webhook/events', (_req, res) => { res.json({ received: true }); });
163
+ if (withFallback) {
164
+ app.use(CreateExtensionOwnedPreflightFallback(ownedRoots));
165
+ }
166
+ app.use('/', cors(), (_req, res) => { res.json({ graphql: true }); });
167
+ server = app.listen(0, '127.0.0.1');
168
+ await new Promise<void>((resolve) => server!.once('listening', () => resolve()));
169
+ return `http://127.0.0.1:${(server.address() as AddressInfo).port}`;
170
+ }
171
+
172
+ async function preflight(url: string, origin: string): Promise<Response> {
173
+ return fetch(url, { method: 'OPTIONS', headers: { Origin: origin, 'Access-Control-Request-Method': 'POST' } });
174
+ }
175
+
176
+ describe('CreateExtensionOwnedPreflightFallback', () => {
177
+ it('without it, an unanswered preflight under an owned root falls through to the GraphQL cors() and is approved for any origin (the bug)', async () => {
178
+ const base = await startAppWithGraphQLMount(false);
179
+ const res = await preflight(`${base}/webhook/events`, OTHER_ORIGIN);
180
+ expect(res.status).toBe(204);
181
+ expect(res.headers.get('access-control-allow-origin')).toBe('*');
182
+ });
183
+
184
+ it('refuses an unanswered preflight under an owned root with a bare 404', async () => {
185
+ const base = await startAppWithGraphQLMount(true);
186
+ for (const path of ['/webhook/events', '/WEBHOOK/Events', '/webhook/', '/webhook/no-such-route']) {
187
+ const res = await preflight(`${base}${path}`, OTHER_ORIGIN);
188
+ expect(res.status, path).toBe(404);
189
+ expect(res.headers.get('access-control-allow-origin'), path).toBeNull();
190
+ }
191
+ });
192
+
193
+ it('leaves an extension that answers its own preflight in charge', async () => {
194
+ const base = await startAppWithGraphQLMount(true);
195
+ const res = await preflight(`${base}/ballot/cast`, ALLOWED_BALLOT_ORIGIN);
196
+ expect(res.status).toBe(200);
197
+ expect(res.headers.get('x-ballot-preflight')).toBe('extension');
198
+ });
199
+
200
+ it('touches neither non-preflight requests under an owned root nor preflights elsewhere', async () => {
201
+ const base = await startAppWithGraphQLMount(true);
202
+ const post = await fetch(`${base}/webhook/events`, { method: 'POST', headers: { Origin: OTHER_ORIGIN } });
203
+ expect(post.status).toBe(200);
204
+ const sibling = await preflight(`${base}/webhookx/events`, OTHER_ORIGIN);
205
+ expect(sibling.status).toBe(204);
206
+ expect(sibling.headers.get('access-control-allow-origin')).toBe(OTHER_ORIGIN);
207
+ });
208
+ });
209
+
210
+ describe('X-Powered-By', () => {
211
+ it('CreateApp and Serve() both disable X-Powered-By', () => {
212
+ // Read as text so this test never loads config.ts / the full server graph.
213
+ const src = readFileSync(new URL('../index.ts', import.meta.url), 'utf8');
214
+ // Both the default app factory and Serve() (for host-supplied apps) disable the header.
215
+ expect(src.match(/app\.disable\('x-powered-by'\)/g)?.length ?? 0).toBeGreaterThanOrEqual(2);
216
+ });
217
+ });
@@ -0,0 +1,196 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import type { Request } from 'express';
3
+ import jwt from 'jsonwebtoken';
4
+ import { AuthProviderFactory } from '@memberjunction/auth-providers';
5
+ import { UserInfo } from '@memberjunction/core';
6
+
7
+ vi.mock('../config.js', () => ({
8
+ configInfo: {
9
+ devAuth: { enabled: false },
10
+ magicLink: {},
11
+ authProviders: [],
12
+ },
13
+ }));
14
+
15
+ import {
16
+ AssertLocalDevAuthAllowed,
17
+ IsLocalDevAuthEnabled,
18
+ IsLoopbackAddress,
19
+ MintLocalDevJwt,
20
+ RegisterLocalDevAuthProvider,
21
+ VerifyLocalhostRequest,
22
+ } from '../auth/localDevAuth.js';
23
+ import { MagicLinkKeyManager } from '../auth/magicLink/MagicLinkKeys.js';
24
+
25
+ function createMockRequest(overrides: {
26
+ remoteAddress?: string;
27
+ host?: string;
28
+ origin?: string;
29
+ referer?: string;
30
+ xff?: string;
31
+ }): Request {
32
+ const headers: Record<string, string | undefined> = {
33
+ host: overrides.host ?? 'localhost:4000',
34
+ origin: overrides.origin,
35
+ referer: overrides.referer,
36
+ 'x-forwarded-for': overrides.xff,
37
+ };
38
+ return {
39
+ headers,
40
+ hostname: (overrides.host ?? 'localhost:4000').split(':')[0],
41
+ ip: overrides.remoteAddress ?? '127.0.0.1',
42
+ socket: {
43
+ remoteAddress: overrides.remoteAddress ?? '127.0.0.1',
44
+ },
45
+ } as unknown as Request;
46
+ }
47
+
48
+ describe('localDevAuth security invariants', () => {
49
+ beforeEach(() => {
50
+ AuthProviderFactory.Instance.clear();
51
+ });
52
+
53
+ it('IsLocalDevAuthEnabled detects MJ_DEV_AUTH_ENABLED=true or 1', () => {
54
+ expect(IsLocalDevAuthEnabled({})).toBe(false);
55
+ expect(IsLocalDevAuthEnabled({ MJ_DEV_AUTH_ENABLED: 'false' })).toBe(false);
56
+ expect(IsLocalDevAuthEnabled({ MJ_DEV_AUTH_ENABLED: 'true' })).toBe(true);
57
+ expect(IsLocalDevAuthEnabled({ MJ_DEV_AUTH_ENABLED: '1' })).toBe(true);
58
+ });
59
+
60
+ it('AssertLocalDevAuthAllowed fails loudly when NODE_ENV=production', () => {
61
+ expect(() =>
62
+ AssertLocalDevAuthAllowed({
63
+ MJ_DEV_AUTH_ENABLED: 'true',
64
+ NODE_ENV: 'development',
65
+ })
66
+ ).not.toThrow();
67
+
68
+ expect(() =>
69
+ AssertLocalDevAuthAllowed({
70
+ MJ_DEV_AUTH_ENABLED: 'true',
71
+ NODE_ENV: 'production',
72
+ })
73
+ ).toThrow(/strictly forbidden when NODE_ENV=production/);
74
+ });
75
+
76
+ it('IsLoopbackAddress accepts loopback and conditional Docker local bridge IPs', () => {
77
+ expect(IsLoopbackAddress('127.0.0.1', false)).toBe(true);
78
+ expect(IsLoopbackAddress('::1', false)).toBe(true);
79
+ expect(IsLoopbackAddress('::ffff:127.0.0.1', false)).toBe(true);
80
+ expect(IsLoopbackAddress('192.168.65.1', false)).toBe(false);
81
+ expect(IsLoopbackAddress('192.168.65.1', true)).toBe(true);
82
+ expect(IsLoopbackAddress('172.18.0.1', true)).toBe(true);
83
+ expect(IsLoopbackAddress('192.168.1.42', true)).toBe(false);
84
+ expect(IsLoopbackAddress('203.0.113.10', true)).toBe(false);
85
+ });
86
+
87
+ it('VerifyLocalhostRequest allows genuine localhost requests and blocks non-localhost vectors', () => {
88
+ // 1. Standard localhost IPv4 and IPv6
89
+ expect(
90
+ VerifyLocalhostRequest(
91
+ createMockRequest({ remoteAddress: '127.0.0.1', host: 'localhost:4000', origin: 'http://localhost:4202' }),
92
+ { NODE_ENV: 'development' }
93
+ ).Allowed
94
+ ).toBe(true);
95
+
96
+ expect(
97
+ VerifyLocalhostRequest(
98
+ createMockRequest({ remoteAddress: '::1', host: '127.0.0.1:4000', origin: 'http://127.0.0.1:4202' }),
99
+ { NODE_ENV: 'development' }
100
+ ).Allowed
101
+ ).toBe(true);
102
+
103
+ // 2. Docker Desktop host-gateway when Host is localhost, inside container, and no XFF is present
104
+ expect(
105
+ VerifyLocalhostRequest(
106
+ createMockRequest({ remoteAddress: '::ffff:192.168.65.1', host: 'localhost:4000' }),
107
+ { NODE_ENV: 'development', MJ_DEV_AUTH_ALLOW_DOCKER_BRIDGE: 'true' }
108
+ ).Allowed
109
+ ).toBe(true);
110
+
111
+ // 2b. Rejects Docker bridge IPs when NOT running inside a container
112
+ expect(
113
+ VerifyLocalhostRequest(
114
+ createMockRequest({ remoteAddress: '172.18.0.1', host: 'localhost:4000' }),
115
+ { NODE_ENV: 'development', MJ_DEV_AUTH_ALLOW_DOCKER_BRIDGE: 'false' }
116
+ ).Allowed
117
+ ).toBe(false);
118
+
119
+ // 2c. Rejects non-gateway RFC1918 172.16.0.0/12 addresses even inside a container
120
+ expect(IsLoopbackAddress('172.20.10.5', true)).toBe(false);
121
+
122
+ // 3. Rejects in production even from 127.0.0.1
123
+ expect(
124
+ VerifyLocalhostRequest(
125
+ createMockRequest({ remoteAddress: '127.0.0.1', host: 'localhost:4000' }),
126
+ { NODE_ENV: 'production' }
127
+ ).Allowed
128
+ ).toBe(false);
129
+
130
+ // 4. Rejects LAN IP on socket
131
+ expect(
132
+ VerifyLocalhostRequest(
133
+ createMockRequest({ remoteAddress: '192.168.1.50', host: 'localhost:4000' }),
134
+ { NODE_ENV: 'development' }
135
+ ).Allowed
136
+ ).toBe(false);
137
+
138
+ // 5. Rejects non-localhost Host header
139
+ expect(
140
+ VerifyLocalhostRequest(
141
+ createMockRequest({ remoteAddress: '127.0.0.1', host: '192.168.1.50:4000' }),
142
+ { NODE_ENV: 'development' }
143
+ ).Allowed
144
+ ).toBe(false);
145
+
146
+ // 6. Rejects external X-Forwarded-For
147
+ expect(
148
+ VerifyLocalhostRequest(
149
+ createMockRequest({ remoteAddress: '127.0.0.1', host: 'localhost:4000', xff: '203.0.113.5' }),
150
+ { NODE_ENV: 'development' }
151
+ ).Allowed
152
+ ).toBe(false);
153
+
154
+ // 7. Rejects external Origin
155
+ expect(
156
+ VerifyLocalhostRequest(
157
+ createMockRequest({
158
+ remoteAddress: '127.0.0.1',
159
+ host: 'localhost:4000',
160
+ origin: 'https://attacker.example.com',
161
+ }),
162
+ { NODE_ENV: 'development' }
163
+ ).Allowed
164
+ ).toBe(false);
165
+ });
166
+
167
+ it('MintLocalDevJwt mints an RS256 token verifiable by the registered LocalDevProvider', () => {
168
+ MagicLinkKeyManager.Instance.Initialize();
169
+ RegisterLocalDevAuthProvider('http://localhost:4000');
170
+
171
+ const mockUser = new UserInfo(undefined, {
172
+ ID: '11111111-2222-3333-4444-555555555555',
173
+ Name: 'Admin User',
174
+ Email: 'admin@memberjunction.org',
175
+ FirstName: 'Admin',
176
+ LastName: 'User',
177
+ IsActive: true,
178
+ Type: 'Owner',
179
+ UserRoles: [],
180
+ });
181
+
182
+ const { token, claims } = MintLocalDevJwt(mockUser, 'http://localhost:4000');
183
+ expect(claims.iss).toBe('http://localhost:4000/local-dev');
184
+ expect(claims.aud).toBe('mj-local-dev');
185
+ expect(claims.email).toBe('admin@memberjunction.org');
186
+ expect(claims['mj_magic_link']).toBeUndefined();
187
+
188
+ const provider = AuthProviderFactory.Instance.getByIssuer('http://localhost:4000/local-dev');
189
+ expect(provider).toBeDefined();
190
+ const decoded = jwt.decode(token) as jwt.JwtPayload;
191
+ const userInfo = provider!.extractUserInfo(decoded);
192
+ expect(userInfo.email).toBe('admin@memberjunction.org');
193
+ expect(userInfo.firstName).toBe('Admin');
194
+ expect(userInfo.lastName).toBe('User');
195
+ });
196
+ });