@memberjunction/server-extensions-core 6.1.0-edge.6 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,26 +1,34 @@
1
1
  # @memberjunction/server-extensions-core
2
2
 
3
- Plugin architecture for MJServer that enables auto-discovery and lifecycle management of extension modules. Extensions register Express routes, handle their own authentication, and participate in health checks and graceful shutdown — all without modifying MJServer source code.
3
+ Plugin architecture for MJServer that enables auto-discovery and lifecycle management of server extension modules. Extensions register Express routes, background workers, or WebSocket services, handle their own or MJ-managed authentication, publish and consume typed services, and participate in health checks and graceful shutdown — all without modifying MJServer source code.
4
+
5
+ For complete architectural patterns and guidelines, see the **[Server Extensions Guide](../../guides/SERVER_EXTENSIONS_GUIDE.md)**.
4
6
 
5
7
  ## Overview
6
8
 
7
- This package provides two main exports:
9
+ This package provides the core contracts and loader for server extensions:
8
10
 
9
- - **`BaseServerExtension`** — Abstract base class that all extensions implement. Defines the `Initialize`, `Shutdown`, and `HealthCheck` lifecycle methods.
10
- - **`ServerExtensionLoader`** — Discovers registered extension classes via MJ's `ClassFactory`, matches them to config entries, and manages their lifecycle.
11
+ - **`BaseServerExtension`** — Abstract base class that all extensions implement. Defines `DefaultPhase`, `Initialize`, `OnAllExtensionsMounted`, `Shutdown`, and `HealthCheck` lifecycle methods.
12
+ - **`ServerExtensionLoader`** — Discovers registered extension classes via MJ's `ClassFactory`, matches them to config entries, enforces phased mounting (`pre-auth` vs. `post-auth`), maintains the shared `ServerExtensionServiceRegistry`, and manages extension lifecycle.
13
+ - **`ServerExtensionServiceRegistry`** — Typed registry facilitating decoupled cross-extension service discovery and telemetry sharing.
14
+ - **`ServerExtensionInitContext`** — Unified context passed to extension `Initialize` and `OnAllExtensionsMounted` methods.
11
15
 
12
16
  Extensions are discovered automatically using MemberJunction's standard `@RegisterClass` + `ClassFactory` pattern.
13
17
 
18
+ ### Open App & Dynamic Package Discovery
14
19
  **Open App packages** listed in the host `mj.config.cjs` `dynamicPackages.server[]` declare the extensions they need:
15
-
16
20
  1. Named export `MJ_SERVER_EXTENSIONS` on the server package (preferred; read after the package is imported).
17
21
  2. Fallback: `package.json` → `memberjunction.serverExtensions`.
18
22
 
19
- `@memberjunction/server-bootstrap` collects those declarations and `serve()` merges them with the host `serverExtensions[]`. Host `DriverClass` wins (`Enabled`, `RootPath`, per-key `Settings`). A host entry with `Enabled: false` disables a discovered extension. Host-only extensions (Slack, Teams) stay in the host config.
23
+ `@memberjunction/server-bootstrap` collects those declarations and `serve()` merges them with the host `serverExtensions[]`. Host `DriverClass` wins (`Enabled`, `RootPath`, per-key `Settings`, `Phase`). A host entry with `Enabled: false` disables a discovered extension.
20
24
 
21
- **Pre-auth.** Extension routes mount *before* MJServer's auth middleware. Boot logs every collected and merged extension as `PRE-AUTH` with its `DriverClass` and `RootPath` so an operator who installed an Open App for its entities can see the HTTP surface. To suppress one, add the same `DriverClass` to host `serverExtensions[]` with `Enabled: false`. Invalid `RootPath` values (`/`, `/graphql`, `/auth`, `/oauth`, `/health`, `/magic-link`, wildcards) are dropped fail-closed rather than mounted. Matching is **case-insensitive** (Express routing is) and `serve()` also passes the process's real mounts (`graphqlRootPath`, `/healthcheck`, `/esignature`, `/media`, widget, telephony, …) so a custom GraphQL root or a core path not in the static baseline cannot be claimed. Overlapping enabled roots (including case variants) are logged.
25
+ ### Lifecycle Phases (G1)
26
+ Extensions declare their execution phase or inherit their class default:
27
+ - **`'pre-auth'`** (Default): Mounted **before** MJServer authentication middleware. Used for external webhooks that carry provider signatures (Slack HMAC, Teams Bot Framework JWT, Twilio signatures, WebRTC SDP brokers).
28
+ - **`'post-auth'`**: Mounted **after** MJServer authentication middleware (`createUnifiedAuthMiddleware`). Guaranteed to have authenticated `req.user` context.
22
29
 
23
- Open Apps therefore do **not** require the operator to copy extension blocks into the host `mj.config.cjs`. The host file is the override layer plus host-only extensions.
30
+ ### Reserved Root Path Safety (G2)
31
+ Core system paths cannot be claimed by server extensions: `/`, `/graphql`, `/auth`, `/oauth`, `/health`, `/magic-link`, `/schema`, `/media`, `/mcp`. Configured roots matching these reserved paths fail closed and are dropped with an error.
24
32
 
25
33
  ## Installation
26
34
 
@@ -33,30 +41,46 @@ npm install @memberjunction/server-extensions-core
33
41
  ### 1. Create an Extension
34
42
 
35
43
  ```typescript
36
- import { Application } from 'express';
44
+ import { Router } from 'express';
37
45
  import { RegisterClass } from '@memberjunction/global';
38
46
  import {
39
47
  BaseServerExtension,
40
- ServerExtensionConfig,
48
+ ServerExtensionInitContext,
49
+ ServerExtensionPhase,
41
50
  ExtensionInitResult,
42
51
  ExtensionHealthResult
43
52
  } from '@memberjunction/server-extensions-core';
44
53
 
45
54
  @RegisterClass(BaseServerExtension, 'MyCustomExtension')
46
55
  export class MyCustomExtension extends BaseServerExtension {
47
- async Initialize(app: Application, config: ServerExtensionConfig): Promise<ExtensionInitResult> {
48
- // Register your Express routes
49
- app.get(config.RootPath + '/hello', (_req, res) => {
56
+ /** Declare lifecycle phase */
57
+ public override get DefaultPhase(): ServerExtensionPhase {
58
+ return 'pre-auth';
59
+ }
60
+
61
+ async Initialize(context: ServerExtensionInitContext): Promise<ExtensionInitResult> {
62
+ const { app, config, services } = context;
63
+
64
+ const router = Router();
65
+ router.get('/hello', (_req, res) => {
50
66
  res.json({ message: 'Hello from my extension!' });
51
67
  });
52
68
 
69
+ app.use(config.RootPath, router);
70
+
53
71
  return {
54
72
  Success: true,
55
73
  Message: 'Custom extension loaded',
56
- RegisteredRoutes: [`GET ${config.RootPath}/hello`]
74
+ RegisteredRoutes: [`GET ${config.RootPath}/hello`],
75
+ Service: { ping: () => 'pong' } // Auto-registered into ServerExtensionServiceRegistry
57
76
  };
58
77
  }
59
78
 
79
+ async OnAllExtensionsMounted(context: ServerExtensionInitContext): Promise<void> {
80
+ // Cross-extension service wiring
81
+ const telephony = context.services.GetService('TwilioTelephonyService');
82
+ }
83
+
60
84
  async Shutdown(): Promise<void> {
61
85
  // Clean up connections, drain requests, release resources
62
86
  }
@@ -67,38 +91,17 @@ export class MyCustomExtension extends BaseServerExtension {
67
91
  }
68
92
  ```
69
93
 
70
- ### 2. Declare the extension (Open App **or** host)
71
-
72
- An Open App server package publishes the default config (so installing the app is enough):
73
-
74
- ```typescript
75
- // packages/Server/src/index.ts
76
- export const MJ_SERVER_EXTENSIONS = [
77
- { Enabled: true, DriverClass: 'MyCustomExtension', RootPath: '/api/my-extension', Settings: {} },
78
- ];
79
- ```
80
-
81
- ```json
82
- // packages/Server/package.json
83
- {
84
- "memberjunction": {
85
- "serverExtensions": [
86
- { "Enabled": true, "DriverClass": "MyCustomExtension", "RootPath": "/api/my-extension", "Settings": {} }
87
- ]
88
- }
89
- }
90
- ```
91
-
92
- A **host** `mj.config.cjs` is only needed to override that default, to disable it, or to load a host-only extension (not shipped by an Open App):
94
+ ### 2. Configure in `mj.config.cjs`
93
95
 
94
96
  ```javascript
95
97
  module.exports = {
96
- // ... other MJServer config ...
97
98
  serverExtensions: [
98
99
  {
100
+ Name: 'MyExtension',
99
101
  Enabled: true,
100
102
  DriverClass: 'MyCustomExtension',
101
103
  RootPath: '/api/my-extension',
104
+ Phase: 'pre-auth',
102
105
  Settings: {
103
106
  apiKey: process.env.MY_EXTENSION_API_KEY,
104
107
  }
@@ -107,101 +110,65 @@ module.exports = {
107
110
  };
108
111
  ```
109
112
 
110
- ### 3. Import Your Extension Package
111
-
112
- Ensure your extension package is imported in your application so the `@RegisterClass` decorator fires at module load time. Add it as a dependency in your MJAPI project.
113
-
114
113
  ## API Reference
115
114
 
116
115
  ### `BaseServerExtension`
117
116
 
118
- Abstract base class for all server extensions.
119
-
120
- | Method | Description |
121
- |--------|-------------|
122
- | `Initialize(app, config)` | Called once at MJServer startup. Register routes, open connections. |
123
- | `Shutdown()` | Called during graceful shutdown (SIGTERM/SIGINT). Clean up resources. |
117
+ | Member | Description |
118
+ |---|---|
119
+ | `DefaultPhase` | Getter returning default lifecycle phase (`'pre-auth'` or `'post-auth'`). Default is `'pre-auth'`. |
120
+ | `Initialize(context)` | Called once at MJServer startup. Receives `ServerExtensionInitContext`. |
121
+ | `OnAllExtensionsMounted?(context)` | Optional hook called after all extensions across both phases have mounted. Ideal for service wiring. |
122
+ | `Shutdown()` | Called during graceful shutdown (SIGTERM/SIGINT). |
124
123
  | `HealthCheck()` | Called periodically. Return health status quickly (< 100ms). |
125
- | `OnConfigurationChange?(config)` | Optional. Called when config changes at runtime. |
124
+ | `OnConfigurationChange?(config)` | Optional. Called when configuration changes at runtime. |
126
125
 
127
126
  ### `ServerExtensionLoader`
128
127
 
129
- Manages the extension lifecycle.
130
-
131
- | Method | Description |
132
- |--------|-------------|
133
- | `LoadExtensions(app, configs)` | Discover and initialize all enabled extensions from config. |
134
- | `HealthCheckAll()` | Run health checks on all loaded extensions. |
128
+ | Member | Description |
129
+ |---|---|
130
+ | `Services` | Access the unified `ServerExtensionServiceRegistry`. |
131
+ | `LoadExtensions(app, configs, options?)` | Discover and initialize extensions filtered by phase (`pre-auth` or `post-auth`). |
132
+ | `NotifyAllExtensionsMounted(options?)` | Invoke `OnAllExtensionsMounted` on all loaded extensions. |
133
+ | `HealthCheckAll()` | Run health checks across all loaded extensions. |
135
134
  | `ShutdownAll()` | Shut down all extensions in reverse order (LIFO). |
136
135
  | `Extensions` | Read-only array of loaded extension instances. |
137
- | `ExtensionCount` | Number of currently loaded extensions. |
138
136
 
139
137
  ### Type Interfaces
140
138
 
141
- #### `ServerExtensionConfig`
142
-
143
139
  ```typescript
144
- interface ServerExtensionConfig {
145
- Enabled: boolean; // Skip loading if false
146
- DriverClass: string; // Must match @RegisterClass key
147
- RootPath: string; // URL prefix for extension routes
148
- Settings: Record<string, unknown>; // Extension-specific config
140
+ export type ServerExtensionPhase = 'pre-auth' | 'post-auth';
141
+
142
+ export interface ServerExtensionConfig {
143
+ Name?: string;
144
+ DriverClass: string;
145
+ RootPath: string;
146
+ Enabled: boolean;
147
+ Phase?: ServerExtensionPhase;
148
+ Settings?: Record<string, unknown>;
149
+ PackagePath?: string;
149
150
  }
150
- ```
151
151
 
152
- #### `ExtensionInitResult`
152
+ export interface ServerExtensionInitContext {
153
+ app: Application;
154
+ httpServer?: Server;
155
+ config: ServerExtensionConfig;
156
+ publicUrl?: string;
157
+ services: ServerExtensionServiceRegistry;
158
+ phase: ServerExtensionPhase;
159
+ }
153
160
 
154
- ```typescript
155
- interface ExtensionInitResult {
161
+ export interface ExtensionInitResult {
156
162
  Success: boolean;
157
163
  Message: string;
158
164
  RegisteredRoutes?: string[];
165
+ Service?: object;
166
+ Skipped?: boolean;
159
167
  }
160
168
  ```
161
169
 
162
- #### `ExtensionHealthResult`
163
-
164
- ```typescript
165
- interface ExtensionHealthResult {
166
- Healthy: boolean;
167
- Name: string;
168
- Details?: Record<string, unknown>;
169
- }
170
- ```
171
-
172
- ## Lifecycle
173
-
174
- 1. MJServer merges Open App–discovered `serverExtensions[]` with the host `mj.config.cjs` list (host `DriverClass` wins)
175
- 2. For each enabled entry, `ServerExtensionLoader` uses `ClassFactory.CreateInstance(BaseServerExtension, driverClass)` to find the registered class
176
- 3. Creates an instance and calls `Initialize(app, config)`
177
- 4. Extension registers its Express routes under `config.RootPath`
178
- 5. MJServer exposes `GET /health/extensions` for aggregate health checks
179
- 6. On SIGTERM/SIGINT, `ShutdownAll()` calls each extension's `Shutdown()` in reverse order
180
-
181
- ## Error Handling
182
-
183
- - Extensions that fail to initialize are logged and skipped — they don't prevent other extensions from loading
184
- - Health check exceptions are caught and reported as unhealthy
185
- - Shutdown exceptions are logged but don't prevent other extensions from shutting down
186
-
187
- ## Authentication
188
-
189
- Extensions handle their own authentication by default. Common patterns:
190
-
191
- - **Platform-specific auth** (Slack HMAC signatures, Teams Bot Framework JWT)
192
- - **MJServer auth middleware** — import from `@memberjunction/server` if you want to reuse MJServer's built-in auth
193
- - **Custom auth** — API keys, OAuth, etc.
194
-
195
- This is opt-in — extensions are not forced to use MJServer's auth middleware.
196
-
197
- ## Testing
198
-
199
- ```bash
200
- npm run test # Run all tests
201
- npm run test:watch # Watch mode
202
- ```
203
-
204
170
  ## Related Packages
205
171
 
206
172
  - [`@memberjunction/messaging-adapters`](../MessagingAdapters/) — Slack and Teams adapters built on this framework
207
- - [`@memberjunction/server`](../MJServer/) — MJServer that loads and manages extensions
173
+ - [`@memberjunction/server`](../MJServer/) — Core server hosting the extension lifecycle
174
+ - [`guides/SERVER_EXTENSIONS_GUIDE.md`](../../guides/SERVER_EXTENSIONS_GUIDE.md) — Comprehensive developer guide
@@ -3,7 +3,7 @@
3
3
  * @description Abstract base class for MJServer extensions.
4
4
  */
5
5
  import { Application } from 'express';
6
- import { ServerExtensionConfig, ExtensionInitResult, ExtensionHealthResult } from './types.js';
6
+ import { ServerExtensionConfig, ServerExtensionPhase, ServerExtensionInitContext, ExtensionInitResult, ExtensionHealthResult } from './types.js';
7
7
  /**
8
8
  * Abstract base class for MJServer extensions.
9
9
  *
@@ -18,62 +18,32 @@ import { ServerExtensionConfig, ExtensionInitResult, ExtensionHealthResult } fro
18
18
  * 1. MJServer loads the merged `serverExtensions[]` (Open App packages + host overlay)
19
19
  * 2. For each enabled entry, looks up `@RegisterClass(BaseServerExtension, driverClass)`
20
20
  * 3. Creates instance via `ClassFactory.CreateInstance()`
21
- * 4. Calls `Initialize(app, config)` — extension registers routes
22
- * 5. Periodic `HealthCheck()` calls for monitoring
23
- * 6. On server shutdown, calls `Shutdown()` for cleanup
24
- *
25
- * ## Usage
26
- *
27
- * ```typescript
28
- * import { RegisterClass } from '@memberjunction/global';
29
- * import { BaseServerExtension, ServerExtensionConfig, ExtensionInitResult } from '@memberjunction/server-extensions-core';
30
- *
31
- * @RegisterClass(BaseServerExtension, 'MyCustomExtension')
32
- * export class MyCustomExtension extends BaseServerExtension {
33
- * async Initialize(app: Application, config: ServerExtensionConfig): Promise<ExtensionInitResult> {
34
- * app.get(config.RootPath + '/hello', (_req, res) => {
35
- * res.json({ message: 'Hello from my extension!' });
36
- * });
37
- * return { Success: true, Message: 'Custom extension loaded', RegisteredRoutes: [`GET ${config.RootPath}/hello`] };
38
- * }
39
- *
40
- * async Shutdown(): Promise<void> {
41
- * // Clean up resources
42
- * }
43
- *
44
- * async HealthCheck(): Promise<ExtensionHealthResult> {
45
- * return { Healthy: true, Name: 'MyCustomExtension' };
46
- * }
47
- * }
48
- * ```
49
- *
50
- * ## Auth Middleware
51
- *
52
- * Extensions handle their own authentication by default. If you want to leverage
53
- * MJServer's built-in auth middleware, import it from `@memberjunction/server`:
54
- *
55
- * ```typescript
56
- * import { getSystemUser, verifyUserRecord } from '@memberjunction/server';
57
- * ```
58
- *
59
- * This is opt-in — extensions like Slack/Teams use platform-specific auth
60
- * (signature verification, Bot Framework JWT) instead.
21
+ * 4. Calls `Initialize(context)` (or legacy `Initialize(app, config)`) — extension registers routes
22
+ * 5. After all extensions across both pre-auth and post-auth phases are mounted,
23
+ * calls `OnAllExtensionsMounted(context)` if implemented
24
+ * 6. Periodic `HealthCheck()` calls for monitoring
25
+ * 7. On server shutdown, calls `Shutdown()` for cleanup
61
26
  */
62
27
  export declare abstract class BaseServerExtension {
28
+ /**
29
+ * Default lifecycle phase for this extension when unspecified in configuration.
30
+ * Defaults to `'pre-auth'` for backwards compatibility.
31
+ */
32
+ get DefaultPhase(): ServerExtensionPhase;
63
33
  /**
64
34
  * Initialize the extension. Called once during MJServer startup.
65
35
  *
66
- * Use this to register Express routes, set up WebSocket handlers,
67
- * initialize connections, and prepare the extension for operation.
68
- *
69
- * @param app - The Express application instance to register routes on.
70
- * Routes should be registered under `config.RootPath`.
71
- * @param config - Extension-specific configuration from `mj.config.cjs`.
72
- * The `Settings` object contains extension-specific config.
73
- * @returns A result indicating whether initialization succeeded.
74
- * On failure, the extension is skipped but other extensions still load.
36
+ * Supports both modern context-based signature:
37
+ * `Initialize(context: ServerExtensionInitContext): Promise<ExtensionInitResult>`
38
+ * and legacy 2-argument signature:
39
+ * `Initialize(app: Application, config: ServerExtensionConfig): Promise<ExtensionInitResult>`
40
+ */
41
+ abstract Initialize(contextOrApp: ServerExtensionInitContext | Application, config?: ServerExtensionConfig): Promise<ExtensionInitResult>;
42
+ /**
43
+ * Optional lifecycle hook called after ALL extensions have been mounted across all phases.
44
+ * Ideal for cross-extension service wiring (e.g. connecting a webhook router to a telephony service).
75
45
  */
76
- abstract Initialize(app: Application, config: ServerExtensionConfig): Promise<ExtensionInitResult>;
46
+ OnAllExtensionsMounted?(context: ServerExtensionInitContext): Promise<void>;
77
47
  /**
78
48
  * Graceful shutdown. Called when MJServer is shutting down (SIGTERM/SIGINT).
79
49
  *
@@ -1 +1 @@
1
- {"version":3,"file":"BaseServerExtension.d.ts","sourceRoot":"","sources":["../src/BaseServerExtension.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAE/F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,8BAAsB,mBAAmB;IACrC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAElG;;;;;;;;OAQG;IACH,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAElC;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAEtD;;;;;;;;OAQG;IACH,qBAAqB,CAAC,CAAC,SAAS,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAC1E"}
1
+ {"version":3,"file":"BaseServerExtension.d.ts","sourceRoot":"","sources":["../src/BaseServerExtension.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EACH,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACxB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,8BAAsB,mBAAmB;IACrC;;;OAGG;IACH,IAAW,YAAY,IAAI,oBAAoB,CAE9C;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,CACf,YAAY,EAAE,0BAA0B,GAAG,WAAW,EACtD,MAAM,CAAC,EAAE,qBAAqB,GAC/B,OAAO,CAAC,mBAAmB,CAAC;IAE/B;;;OAGG;IACH,sBAAsB,CAAC,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IAE3E;;;;;;;;OAQG;IACH,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAElC;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAEtD;;;;;;;;OAQG;IACH,qBAAqB,CAAC,CAAC,SAAS,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAC1E"}
@@ -16,47 +16,19 @@
16
16
  * 1. MJServer loads the merged `serverExtensions[]` (Open App packages + host overlay)
17
17
  * 2. For each enabled entry, looks up `@RegisterClass(BaseServerExtension, driverClass)`
18
18
  * 3. Creates instance via `ClassFactory.CreateInstance()`
19
- * 4. Calls `Initialize(app, config)` — extension registers routes
20
- * 5. Periodic `HealthCheck()` calls for monitoring
21
- * 6. On server shutdown, calls `Shutdown()` for cleanup
22
- *
23
- * ## Usage
24
- *
25
- * ```typescript
26
- * import { RegisterClass } from '@memberjunction/global';
27
- * import { BaseServerExtension, ServerExtensionConfig, ExtensionInitResult } from '@memberjunction/server-extensions-core';
28
- *
29
- * @RegisterClass(BaseServerExtension, 'MyCustomExtension')
30
- * export class MyCustomExtension extends BaseServerExtension {
31
- * async Initialize(app: Application, config: ServerExtensionConfig): Promise<ExtensionInitResult> {
32
- * app.get(config.RootPath + '/hello', (_req, res) => {
33
- * res.json({ message: 'Hello from my extension!' });
34
- * });
35
- * return { Success: true, Message: 'Custom extension loaded', RegisteredRoutes: [`GET ${config.RootPath}/hello`] };
36
- * }
37
- *
38
- * async Shutdown(): Promise<void> {
39
- * // Clean up resources
40
- * }
41
- *
42
- * async HealthCheck(): Promise<ExtensionHealthResult> {
43
- * return { Healthy: true, Name: 'MyCustomExtension' };
44
- * }
45
- * }
46
- * ```
47
- *
48
- * ## Auth Middleware
49
- *
50
- * Extensions handle their own authentication by default. If you want to leverage
51
- * MJServer's built-in auth middleware, import it from `@memberjunction/server`:
52
- *
53
- * ```typescript
54
- * import { getSystemUser, verifyUserRecord } from '@memberjunction/server';
55
- * ```
56
- *
57
- * This is opt-in — extensions like Slack/Teams use platform-specific auth
58
- * (signature verification, Bot Framework JWT) instead.
19
+ * 4. Calls `Initialize(context)` (or legacy `Initialize(app, config)`) — extension registers routes
20
+ * 5. After all extensions across both pre-auth and post-auth phases are mounted,
21
+ * calls `OnAllExtensionsMounted(context)` if implemented
22
+ * 6. Periodic `HealthCheck()` calls for monitoring
23
+ * 7. On server shutdown, calls `Shutdown()` for cleanup
59
24
  */
60
25
  export class BaseServerExtension {
26
+ /**
27
+ * Default lifecycle phase for this extension when unspecified in configuration.
28
+ * Defaults to `'pre-auth'` for backwards compatibility.
29
+ */
30
+ get DefaultPhase() {
31
+ return 'pre-auth';
32
+ }
61
33
  }
62
34
  //# sourceMappingURL=BaseServerExtension.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseServerExtension.js","sourceRoot":"","sources":["../src/BaseServerExtension.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,MAAM,OAAgB,mBAAmB;CA+CxC"}
1
+ {"version":3,"file":"BaseServerExtension.js","sourceRoot":"","sources":["../src/BaseServerExtension.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAgB,mBAAmB;IACrC;;;OAGG;IACH,IAAW,YAAY;QACnB,OAAO,UAAU,CAAC;IACtB,CAAC;CAoDJ"}
@@ -1,10 +1,34 @@
1
- /**
2
- * @module @memberjunction/server-extensions-core
3
- * @description Discovers, initializes, and manages server extensions.
4
- */
5
1
  import { Application } from 'express';
2
+ import type { Server as HttpServer } from 'http';
6
3
  import { BaseServerExtension } from './BaseServerExtension.js';
7
- import { ServerExtensionConfig, ExtensionHealthResult } from './types.js';
4
+ import { ServerExtensionConfig, ServerExtensionPhase, ServerExtensionServiceRegistry, ExtensionHealthResult } from './types.js';
5
+ /**
6
+ * In-memory implementation of the ServerExtensionServiceRegistry.
7
+ */
8
+ export declare class DefaultServerExtensionServiceRegistry implements ServerExtensionServiceRegistry {
9
+ private _services;
10
+ RegisterService<T extends object>(key: string, service: T): void;
11
+ GetService<T extends object>(key: string): T | undefined;
12
+ HasService(key: string): boolean;
13
+ GetAllServices(): ReadonlyMap<string, object>;
14
+ }
15
+ /**
16
+ * Options passed to `ServerExtensionLoader.LoadExtensions()`.
17
+ */
18
+ export interface LoadExtensionsOptions {
19
+ /**
20
+ * Optional filter for lifecycle phase.
21
+ * When provided, only extensions matching this phase are initialized.
22
+ * An extension's phase is `config.Phase ?? instance.DefaultPhase`.
23
+ */
24
+ phase?: ServerExtensionPhase;
25
+ /** Node HTTP/HTTPS server instance (for WebSockets, media streaming, etc.). */
26
+ httpServer?: HttpServer;
27
+ /** Canonical public base URL of the MJ server. */
28
+ publicUrl?: string;
29
+ /** Custom service registry if not using the loader's default. */
30
+ services?: ServerExtensionServiceRegistry;
31
+ }
8
32
  /**
9
33
  * Discovers, initializes, and manages the lifecycle of server extensions.
10
34
  *
@@ -13,30 +37,16 @@ import { ServerExtensionConfig, ExtensionHealthResult } from './types.js';
13
37
  * `mj.config.cjs` `serverExtensions[]`), uses MJ's `ClassFactory` to find
14
38
  * registered extension classes, and calls `Initialize()` on each.
15
39
  *
16
- * ## Discovery Flow
17
- *
18
- * 1. Receives the merged `serverExtensions[]` (discovered Open App packages + host overlay)
19
- * 2. For each enabled entry, uses `ClassFactory.CreateInstance(BaseServerExtension, driverClass)`
20
- * 3. Creates an instance and calls `Initialize(app, config)`
21
- * 4. Tracks all loaded extensions for health checks and shutdown
22
- *
23
- * ## Usage
24
- *
25
- * ```typescript
26
- * import { ServerExtensionLoader } from '@memberjunction/server-extensions-core';
27
- *
28
- * const loader = new ServerExtensionLoader();
29
- * await loader.LoadExtensions(app, configInfo.serverExtensions);
30
- *
31
- * // Health check
32
- * const health = await loader.HealthCheckAll();
33
- *
34
- * // Graceful shutdown
35
- * await loader.ShutdownAll();
36
- * ```
40
+ * Supports phased loading (pre-auth ahead of JWT middleware, post-auth behind it)
41
+ * and cross-extension service lookup and registration.
37
42
  */
38
43
  export declare class ServerExtensionLoader {
39
44
  private _loadedExtensions;
45
+ private _services;
46
+ /**
47
+ * The shared service registry for cross-extension service lookup and registration.
48
+ */
49
+ get Services(): ServerExtensionServiceRegistry;
40
50
  /**
41
51
  * Load and initialize all enabled extensions from config.
42
52
  *
@@ -46,8 +56,17 @@ export declare class ServerExtensionLoader {
46
56
  *
47
57
  * @param app - Express application for route registration.
48
58
  * @param extensionConfigs - Array of extension configs from `mj.config.cjs`.
59
+ * @param options - Phased loading, HTTP server, and URL options.
60
+ */
61
+ LoadExtensions(app: Application, extensionConfigs: ServerExtensionConfig[], options?: LoadExtensionsOptions): Promise<void>;
62
+ /**
63
+ * Notify all loaded extensions across all phases that all extensions have been mounted.
64
+ * Calls `OnAllExtensionsMounted(context)` on each extension that implements it.
49
65
  */
50
- LoadExtensions(app: Application, extensionConfigs: ServerExtensionConfig[]): Promise<void>;
66
+ NotifyAllExtensionsMounted(options?: {
67
+ httpServer?: HttpServer;
68
+ publicUrl?: string;
69
+ }): Promise<void>;
51
70
  /**
52
71
  * Run health checks on all loaded extensions.
53
72
  *
@@ -73,6 +92,7 @@ export declare class ServerExtensionLoader {
73
92
  get Extensions(): ReadonlyArray<{
74
93
  Instance: BaseServerExtension;
75
94
  DriverClass: string;
95
+ Config: ServerExtensionConfig;
76
96
  }>;
77
97
  /**
78
98
  * Get the number of currently loaded extensions.
@@ -1 +1 @@
1
- {"version":3,"file":"ServerExtensionLoader.d.ts","sourceRoot":"","sources":["../src/ServerExtensionLoader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACH,qBAAqB,EACrB,qBAAqB,EACxB,MAAM,YAAY,CAAC;AAgBpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,iBAAiB,CAAyB;IAElD;;;;;;;;;OASG;IACU,cAAc,CACvB,GAAG,EAAE,WAAW,EAChB,gBAAgB,EAAE,qBAAqB,EAAE,GAC1C,OAAO,CAAC,IAAI,CAAC;IAsBhB;;;;;;;OAOG;IACU,cAAc,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAmB/D;;;;;;OAMG;IACU,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAczC;;;;OAIG;IACH,IAAW,UAAU,IAAI,aAAa,CAAC;QAAE,QAAQ,EAAE,mBAAmB,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAE7F;IAED;;OAEG;IACH,IAAW,cAAc,IAAI,MAAM,CAElC;IAED;;;;;;OAMG;YACW,mBAAmB;CA+CpC"}
1
+ {"version":3,"file":"ServerExtensionLoader.d.ts","sourceRoot":"","sources":["../src/ServerExtensionLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAGjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACH,qBAAqB,EACrB,oBAAoB,EACpB,8BAA8B,EAG9B,qBAAqB,EACxB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,qCAAsC,YAAW,8BAA8B;IACxF,OAAO,CAAC,SAAS,CAA6B;IAEvC,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAWhE,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIxD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhC,cAAc,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;CAGvD;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC;;;;OAIG;IACH,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAE7B,+EAA+E;IAC/E,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,8BAA8B,CAAC;CAC7C;AAmBD;;;;;;;;;;GAUG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,SAAS,CAA+E;IAEhG;;OAEG;IACH,IAAW,QAAQ,IAAI,8BAA8B,CAEpD;IAED;;;;;;;;;;OAUG;IACU,cAAc,CACvB,GAAG,EAAE,WAAW,EAChB,gBAAgB,EAAE,qBAAqB,EAAE,EACzC,OAAO,CAAC,EAAE,qBAAqB,GAChC,OAAO,CAAC,IAAI,CAAC;IAyBhB;;;OAGG;IACU,0BAA0B,CAAC,OAAO,CAAC,EAAE;QAC9C,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBjB;;;;;;;OAOG;IACU,cAAc,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAmB/D;;;;;;OAMG;IACU,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAczC;;;;OAIG;IACH,IAAW,UAAU,IAAI,aAAa,CAAC;QAAE,QAAQ,EAAE,mBAAmB,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,qBAAqB,CAAA;KAAE,CAAC,CAE5H;IAED;;OAEG;IACH,IAAW,cAAc,IAAI,MAAM,CAElC;IAED;;;;;;OAMG;YACW,mBAAmB;CAuFpC"}
@@ -1,10 +1,33 @@
1
- /**
2
- * @module @memberjunction/server-extensions-core
3
- * @description Discovers, initializes, and manages server extensions.
4
- */
5
1
  import { MJGlobal } from '@memberjunction/global';
6
2
  import { LogError, LogStatus, LogStatusEx } from '@memberjunction/core';
7
3
  import { BaseServerExtension } from './BaseServerExtension.js';
4
+ /**
5
+ * In-memory implementation of the ServerExtensionServiceRegistry.
6
+ */
7
+ export class DefaultServerExtensionServiceRegistry {
8
+ constructor() {
9
+ this._services = new Map();
10
+ }
11
+ RegisterService(key, service) {
12
+ const trimmed = key.trim();
13
+ if (!trimmed) {
14
+ throw new Error('Service key cannot be empty');
15
+ }
16
+ if (this._services.has(trimmed)) {
17
+ LogStatus(`Service '${trimmed}' is already registered in ServerExtensionServiceRegistry; replacing with new instance`);
18
+ }
19
+ this._services.set(trimmed, service);
20
+ }
21
+ GetService(key) {
22
+ return this._services.get(key.trim());
23
+ }
24
+ HasService(key) {
25
+ return this._services.has(key.trim());
26
+ }
27
+ GetAllServices() {
28
+ return this._services;
29
+ }
30
+ }
8
31
  /**
9
32
  * Discovers, initializes, and manages the lifecycle of server extensions.
10
33
  *
@@ -13,31 +36,19 @@ import { BaseServerExtension } from './BaseServerExtension.js';
13
36
  * `mj.config.cjs` `serverExtensions[]`), uses MJ's `ClassFactory` to find
14
37
  * registered extension classes, and calls `Initialize()` on each.
15
38
  *
16
- * ## Discovery Flow
17
- *
18
- * 1. Receives the merged `serverExtensions[]` (discovered Open App packages + host overlay)
19
- * 2. For each enabled entry, uses `ClassFactory.CreateInstance(BaseServerExtension, driverClass)`
20
- * 3. Creates an instance and calls `Initialize(app, config)`
21
- * 4. Tracks all loaded extensions for health checks and shutdown
22
- *
23
- * ## Usage
24
- *
25
- * ```typescript
26
- * import { ServerExtensionLoader } from '@memberjunction/server-extensions-core';
27
- *
28
- * const loader = new ServerExtensionLoader();
29
- * await loader.LoadExtensions(app, configInfo.serverExtensions);
30
- *
31
- * // Health check
32
- * const health = await loader.HealthCheckAll();
33
- *
34
- * // Graceful shutdown
35
- * await loader.ShutdownAll();
36
- * ```
39
+ * Supports phased loading (pre-auth ahead of JWT middleware, post-auth behind it)
40
+ * and cross-extension service lookup and registration.
37
41
  */
38
42
  export class ServerExtensionLoader {
39
43
  constructor() {
40
44
  this._loadedExtensions = [];
45
+ this._services = new DefaultServerExtensionServiceRegistry();
46
+ }
47
+ /**
48
+ * The shared service registry for cross-extension service lookup and registration.
49
+ */
50
+ get Services() {
51
+ return this._services;
41
52
  }
42
53
  /**
43
54
  * Load and initialize all enabled extensions from config.
@@ -48,23 +59,51 @@ export class ServerExtensionLoader {
48
59
  *
49
60
  * @param app - Express application for route registration.
50
61
  * @param extensionConfigs - Array of extension configs from `mj.config.cjs`.
62
+ * @param options - Phased loading, HTTP server, and URL options.
51
63
  */
52
- async LoadExtensions(app, extensionConfigs) {
64
+ async LoadExtensions(app, extensionConfigs, options) {
53
65
  if (!extensionConfigs || extensionConfigs.length === 0) {
54
- // Nothing configured — stay silent (the "Loaded 0 server extension(s)"
55
- // / "No server extensions configured" chatter was pure noise).
56
66
  return;
57
67
  }
68
+ let loadedCountThisPass = 0;
58
69
  for (const config of extensionConfigs) {
59
70
  if (!config.Enabled) {
60
71
  LogStatus(`Server extension '${config.DriverClass}' is disabled, skipping`);
61
72
  continue;
62
73
  }
63
- await this.loadSingleExtension(app, config);
74
+ const loaded = await this.loadSingleExtension(app, config, options);
75
+ if (loaded) {
76
+ loadedCountThisPass++;
77
+ }
64
78
  }
65
- // Only announce when something was actually loaded.
66
- if (this._loadedExtensions.length > 0) {
67
- LogStatus(`Loaded ${this._loadedExtensions.length} server extension(s)`);
79
+ if (loadedCountThisPass > 0) {
80
+ const phaseLabel = options?.phase ? ` (${options.phase})` : '';
81
+ LogStatus(`Loaded ${loadedCountThisPass} server extension(s)${phaseLabel}`);
82
+ }
83
+ }
84
+ /**
85
+ * Notify all loaded extensions across all phases that all extensions have been mounted.
86
+ * Calls `OnAllExtensionsMounted(context)` on each extension that implements it.
87
+ */
88
+ async NotifyAllExtensionsMounted(options) {
89
+ for (const ext of this._loadedExtensions) {
90
+ if (typeof ext.Instance.OnAllExtensionsMounted === 'function') {
91
+ try {
92
+ const context = {
93
+ app: ext.Context.app,
94
+ httpServer: options?.httpServer ?? ext.Context.httpServer,
95
+ config: ext.Config,
96
+ publicUrl: options?.publicUrl ?? ext.Context.publicUrl,
97
+ services: this._services,
98
+ phase: ext.Config.Phase ?? ext.Instance.DefaultPhase ?? 'pre-auth',
99
+ };
100
+ await ext.Instance.OnAllExtensionsMounted(context);
101
+ LogStatus(`Server extension '${ext.DriverClass}' OnAllExtensionsMounted completed`);
102
+ }
103
+ catch (error) {
104
+ LogError(`Error in OnAllExtensionsMounted for extension '${ext.DriverClass}':`, undefined, error);
105
+ }
106
+ }
68
107
  }
69
108
  }
70
109
  /**
@@ -134,11 +173,15 @@ export class ServerExtensionLoader {
134
173
  * creates an instance, and calls `Initialize()`. On failure, logs the error and
135
174
  * continues without throwing.
136
175
  */
137
- async loadSingleExtension(app, config) {
176
+ async loadSingleExtension(app, config, options) {
138
177
  const driverClass = config.DriverClass;
139
178
  if (!driverClass) {
140
179
  LogError('Server extension config missing DriverClass, skipping');
141
- return;
180
+ return false;
181
+ }
182
+ // Avoid re-loading an extension that was already loaded in a previous phase
183
+ if (this._loadedExtensions.some((e) => e.DriverClass === driverClass)) {
184
+ return false;
142
185
  }
143
186
  try {
144
187
  // Use MJ's ClassFactory to find the registered extension class
@@ -147,28 +190,60 @@ export class ServerExtensionLoader {
147
190
  LogError(`Server extension '${driverClass}' not found in ClassFactory. ` +
148
191
  `Ensure the package is imported and the class uses ` +
149
192
  `@RegisterClass(BaseServerExtension, '${driverClass}')`);
150
- return;
193
+ return false;
194
+ }
195
+ const effectivePhase = config.Phase ?? instance.DefaultPhase ?? 'pre-auth';
196
+ // If a specific phase filter is requested and this extension doesn't match, skip for now
197
+ if (options?.phase && options.phase !== effectivePhase) {
198
+ return false;
199
+ }
200
+ const services = options?.services ?? this._services;
201
+ const context = {
202
+ app,
203
+ httpServer: options?.httpServer,
204
+ config: { ...config, Phase: effectivePhase },
205
+ publicUrl: options?.publicUrl,
206
+ services,
207
+ phase: effectivePhase,
208
+ };
209
+ let result;
210
+ if (instance.Initialize.length >= 2) {
211
+ result = await instance.Initialize(app, config);
212
+ }
213
+ else {
214
+ result = await instance.Initialize(context);
151
215
  }
152
- const result = await instance.Initialize(app, config);
153
216
  if (result.Success) {
154
- this._loadedExtensions.push({ Instance: instance, Config: config, DriverClass: driverClass });
155
- LogStatus(`Server extension '${driverClass}' initialized: ${result.Message}`);
217
+ if (result.Service) {
218
+ services.RegisterService(driverClass, result.Service);
219
+ }
220
+ this._loadedExtensions.push({
221
+ Instance: instance,
222
+ Config: { ...config, Phase: effectivePhase },
223
+ DriverClass: driverClass,
224
+ Context: context,
225
+ });
226
+ LogStatus(`Server extension '${driverClass}' initialized (${effectivePhase}): ${result.Message}`);
156
227
  if (result.RegisteredRoutes && result.RegisteredRoutes.length > 0) {
157
228
  LogStatus(` Routes: ${result.RegisteredRoutes.join(', ')}`);
158
229
  }
230
+ return true;
159
231
  }
160
232
  else if (result.Skipped) {
161
233
  LogStatusEx({
162
234
  message: `Server extension '${driverClass}' skipped: ${result.Message}`,
163
235
  verboseOnly: true
164
236
  });
237
+ return false;
165
238
  }
166
239
  else {
167
240
  LogError(`Server extension '${driverClass}' failed to initialize: ${result.Message}`);
241
+ return false;
168
242
  }
169
243
  }
170
244
  catch (error) {
171
245
  LogError(`Error loading server extension '${driverClass}':`, undefined, error);
246
+ return false;
172
247
  }
173
248
  }
174
249
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ServerExtensionLoader.js","sourceRoot":"","sources":["../src/ServerExtensionLoader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ServerExtensionLoader.js","sourceRoot":"","sources":["../src/ServerExtensionLoader.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../src/collect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,oFAAoF;AACpF,eAAO,MAAM,2BAA2B,yBAAyB,CAAC;AAElE,iFAAiF;AACjF,eAAO,MAAM,sCAAsC,oCAAoC,CAAC;AAExF,MAAM,WAAW,+BAA+B;IAC5C,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAeD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC3C,GAAG,EAAE,OAAO,EACZ,OAAO,CAAC,EAAE,+BAA+B,GAC1C,qBAAqB,EAAE,CAwDzB;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAC7C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EAC/C,OAAO,CAAC,EAAE,+BAA+B,GAC1C,qBAAqB,EAAE,CAQzB;AAED;;GAEG;AACH,wBAAgB,sCAAsC,CAClD,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,+BAA+B,GAC1C,qBAAqB,EAAE,CAYzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CACvC,UAAU,EAAE,SAAS,qBAAqB,EAAE,GAAG,IAAI,GAAG,SAAS,EAC/D,IAAI,EAAE,SAAS,qBAAqB,EAAE,GAAG,IAAI,GAAG,SAAS,GAC1D,qBAAqB,EAAE,CAuCzB;AAED,+GAA+G;AAC/G,eAAO,MAAM,+BAA+B,EAAE,SAAS,MAAM,EAAU,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,uCAAuC,EAAE,SAAS,MAAM,EAMpE,CAAC;AAEF,eAAO,MAAM,qCAAqC,MAAM,CAAC;AAezD;;;;;;;;;;;GAWG;AACH,wBAAgB,+BAA+B,CAC3C,QAAQ,EAAE,MAAM,EAChB,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,GACvC,MAAM,GAAG,IAAI,CAkCf;AAED,6FAA6F;AAC7F,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAOzE;AAED,MAAM,WAAW,6BAA8B,SAAQ,+BAA+B;IAClF,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CACzC,OAAO,EAAE,SAAS,qBAAqB,EAAE,GAAG,IAAI,GAAG,SAAS,EAC5D,OAAO,CAAC,EAAE,6BAA6B,GACxC,qBAAqB,EAAE,CAsBzB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAGlF"}
1
+ {"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../src/collect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,oFAAoF;AACpF,eAAO,MAAM,2BAA2B,yBAAyB,CAAC;AAElE,iFAAiF;AACjF,eAAO,MAAM,sCAAsC,oCAAoC,CAAC;AAExF,MAAM,WAAW,+BAA+B;IAC5C,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAgBD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC3C,GAAG,EAAE,OAAO,EACZ,OAAO,CAAC,EAAE,+BAA+B,GAC1C,qBAAqB,EAAE,CAiEzB;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAC7C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EAC/C,OAAO,CAAC,EAAE,+BAA+B,GAC1C,qBAAqB,EAAE,CAQzB;AAED;;GAEG;AACH,wBAAgB,sCAAsC,CAClD,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,+BAA+B,GAC1C,qBAAqB,EAAE,CAYzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CACvC,UAAU,EAAE,SAAS,qBAAqB,EAAE,GAAG,IAAI,GAAG,SAAS,EAC/D,IAAI,EAAE,SAAS,qBAAqB,EAAE,GAAG,IAAI,GAAG,SAAS,GAC1D,qBAAqB,EAAE,CAwCzB;AAED,+GAA+G;AAC/G,eAAO,MAAM,+BAA+B,EAAE,SAAS,MAAM,EAAU,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,uCAAuC,EAAE,SAAS,MAAM,EAMpE,CAAC;AAEF,eAAO,MAAM,qCAAqC,MAAM,CAAC;AAezD;;;;;;;;;;;GAWG;AACH,wBAAgB,+BAA+B,CAC3C,QAAQ,EAAE,MAAM,EAChB,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,GACvC,MAAM,GAAG,IAAI,CAkCf;AAED,6FAA6F;AAC7F,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAOzE;AAED,MAAM,WAAW,6BAA8B,SAAQ,+BAA+B;IAClF,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CACzC,OAAO,EAAE,SAAS,qBAAqB,EAAE,GAAG,IAAI,GAAG,SAAS,EAC5D,OAAO,CAAC,EAAE,6BAA6B,GACxC,qBAAqB,EAAE,CAsBzB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAIlF"}
package/dist/collect.js CHANGED
@@ -17,6 +17,7 @@ function cloneConfig(config) {
17
17
  Enabled: config.Enabled,
18
18
  DriverClass: config.DriverClass,
19
19
  RootPath: config.RootPath,
20
+ Phase: config.Phase,
20
21
  Settings: { ...(config.Settings ?? {}) },
21
22
  };
22
23
  }
@@ -68,6 +69,15 @@ export function normalizeServerExtensionConfigs(raw, options) {
68
69
  }
69
70
  enabled = rec.Enabled;
70
71
  }
72
+ let phase = undefined;
73
+ if (rec.Phase !== undefined) {
74
+ if (rec.Phase === 'pre-auth' || rec.Phase === 'post-auth') {
75
+ phase = rec.Phase;
76
+ }
77
+ else {
78
+ invalid(options, `serverExtensions[${i}] ('${driverClass}') Phase must be 'pre-auth' or 'post-auth'${source}`);
79
+ }
80
+ }
71
81
  const settings = rec.Settings != null && typeof rec.Settings === 'object' && !Array.isArray(rec.Settings)
72
82
  ? { ...rec.Settings }
73
83
  : {};
@@ -78,6 +88,7 @@ export function normalizeServerExtensionConfigs(raw, options) {
78
88
  Enabled: enabled,
79
89
  DriverClass: driverClass,
80
90
  RootPath: rootPath,
91
+ Phase: phase,
81
92
  Settings: settings,
82
93
  });
83
94
  }
@@ -150,6 +161,7 @@ export function mergeServerExtensionConfigs(discovered, host) {
150
161
  Enabled: entry.Enabled ?? existing.Enabled,
151
162
  DriverClass: key,
152
163
  RootPath: hostRoot || existing.RootPath,
164
+ Phase: entry.Phase ?? existing.Phase,
153
165
  Settings: { ...(existing.Settings ?? {}), ...(entry.Settings ?? {}) },
154
166
  });
155
167
  }
@@ -269,6 +281,7 @@ export function prepareServerExtensionConfigs(configs, options) {
269
281
  */
270
282
  export function describeServerExtensionMount(config) {
271
283
  const state = config.Enabled ? 'enabled' : 'disabled';
272
- return `${config.DriverClass} at ${config.RootPath} (${state}, PRE-AUTH; host mj.config.cjs serverExtensions[] can set Enabled: false to suppress)`;
284
+ const phase = (config.Phase ?? 'pre-auth').toUpperCase();
285
+ return `${config.DriverClass} at ${config.RootPath} (${state}, ${phase}; host mj.config.cjs serverExtensions[] can set Enabled: false to suppress)`;
273
286
  }
274
287
  //# sourceMappingURL=collect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"collect.js","sourceRoot":"","sources":["../src/collect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../src/collect.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -30,8 +30,10 @@
30
30
  * @see {@link ServerExtensionLoader} for the discovery and lifecycle manager
31
31
  */
32
32
  export { BaseServerExtension } from './BaseServerExtension.js';
33
- export { ServerExtensionLoader } from './ServerExtensionLoader.js';
34
- export { ServerExtensionConfig, ExtensionInitResult, ExtensionHealthResult, } from './types.js';
33
+ export { ServerExtensionLoader, DefaultServerExtensionServiceRegistry } from './ServerExtensionLoader.js';
34
+ export type { LoadExtensionsOptions } from './ServerExtensionLoader.js';
35
+ export { ServerExtensionConfig, ServerExtensionPhase, ServerExtensionServiceRegistry, ServerExtensionInitContext, ExtensionInitResult, ExtensionHealthResult, } from './types.js';
35
36
  export { MJ_SERVER_EXTENSIONS_EXPORT, MJ_SERVER_EXTENSIONS_PACKAGE_JSON_PATH, MAX_SERVER_EXTENSION_ROOT_PATH_LENGTH, RESERVED_SERVER_EXTENSION_ROOTS, RESERVED_SERVER_EXTENSION_ROOT_PREFIXES, describeServerExtensionMount, extractServerExtensionsFromModule, extractServerExtensionsFromPackageJson, mergeServerExtensionConfigs, normalizeServerExtensionConfigs, prepareServerExtensionConfigs, serverExtensionRootsOverlap, validateServerExtensionRootPath, } from './collect.js';
36
37
  export type { NormalizeServerExtensionOptions, PrepareServerExtensionOptions } from './collect.js';
38
+ export { RegisterMediaUpgradeRoute, InstallMediaUpgradeDispatcher, IsGraphQLWsPath, type IWebSocketUpgradeTarget, } from './mediaUpgradeRouter.js';
37
39
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EACH,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACH,2BAA2B,EAC3B,sCAAsC,EACtC,qCAAqC,EACrC,+BAA+B,EAC/B,uCAAuC,EACvC,4BAA4B,EAC5B,iCAAiC,EACjC,sCAAsC,EACtC,2BAA2B,EAC3B,+BAA+B,EAC/B,6BAA6B,EAC7B,2BAA2B,EAC3B,+BAA+B,GAClC,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,+BAA+B,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,qCAAqC,EAAE,MAAM,4BAA4B,CAAC;AAC1G,YAAY,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EACH,qBAAqB,EACrB,oBAAoB,EACpB,8BAA8B,EAC9B,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACH,2BAA2B,EAC3B,sCAAsC,EACtC,qCAAqC,EACrC,+BAA+B,EAC/B,uCAAuC,EACvC,4BAA4B,EAC5B,iCAAiC,EACjC,sCAAsC,EACtC,2BAA2B,EAC3B,+BAA+B,EAC/B,6BAA6B,EAC7B,2BAA2B,EAC3B,+BAA+B,GAClC,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,+BAA+B,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AACnG,OAAO,EACH,yBAAyB,EACzB,6BAA6B,EAC7B,eAAe,EACf,KAAK,uBAAuB,GAC/B,MAAM,yBAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -30,6 +30,7 @@
30
30
  * @see {@link ServerExtensionLoader} for the discovery and lifecycle manager
31
31
  */
32
32
  export { BaseServerExtension } from './BaseServerExtension.js';
33
- export { ServerExtensionLoader } from './ServerExtensionLoader.js';
33
+ export { ServerExtensionLoader, DefaultServerExtensionServiceRegistry } from './ServerExtensionLoader.js';
34
34
  export { MJ_SERVER_EXTENSIONS_EXPORT, MJ_SERVER_EXTENSIONS_PACKAGE_JSON_PATH, MAX_SERVER_EXTENSION_ROOT_PATH_LENGTH, RESERVED_SERVER_EXTENSION_ROOTS, RESERVED_SERVER_EXTENSION_ROOT_PREFIXES, describeServerExtensionMount, extractServerExtensionsFromModule, extractServerExtensionsFromPackageJson, mergeServerExtensionConfigs, normalizeServerExtensionConfigs, prepareServerExtensionConfigs, serverExtensionRootsOverlap, validateServerExtensionRootPath, } from './collect.js';
35
+ export { RegisterMediaUpgradeRoute, InstallMediaUpgradeDispatcher, IsGraphQLWsPath, } from './mediaUpgradeRouter.js';
35
36
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAMnE,OAAO,EACH,2BAA2B,EAC3B,sCAAsC,EACtC,qCAAqC,EACrC,+BAA+B,EAC/B,uCAAuC,EACvC,4BAA4B,EAC5B,iCAAiC,EACjC,sCAAsC,EACtC,2BAA2B,EAC3B,+BAA+B,EAC/B,6BAA6B,EAC7B,2BAA2B,EAC3B,+BAA+B,GAClC,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,qCAAqC,EAAE,MAAM,4BAA4B,CAAC;AAU1G,OAAO,EACH,2BAA2B,EAC3B,sCAAsC,EACtC,qCAAqC,EACrC,+BAA+B,EAC/B,uCAAuC,EACvC,4BAA4B,EAC5B,iCAAiC,EACjC,sCAAsC,EACtC,2BAA2B,EAC3B,+BAA+B,EAC/B,6BAA6B,EAC7B,2BAA2B,EAC3B,+BAA+B,GAClC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACH,yBAAyB,EACzB,6BAA6B,EAC7B,eAAe,GAElB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @fileoverview Single WebSocket-upgrade dispatcher for the shared HTTP server.
3
+ *
4
+ * Why this exists: in `ws` 8.x, every `new WebSocketServer({ server })` attaches its OWN `upgrade`
5
+ * listener that calls `handleUpgrade` UNCONDITIONALLY, and `handleUpgrade` does `abortHandshake(400)` for
6
+ * any request whose path it doesn't own. So two `{server}`-bound servers on one HTTP server (e.g. the
7
+ * GraphQL subscriptions socket on `/` AND a server extension WebSocket socket) fight on every upgrade —
8
+ * the non-owning server 400s the request.
9
+ *
10
+ * The fix: extension WebSocket servers are created with `{ noServer: true }` (no auto-listener) and
11
+ * register their path here; at boot we strip the auto-listeners and install ONE `upgrade` listener that
12
+ * routes by path — GraphQL on its root path, each extension socket on its own. When no extension routes are
13
+ * registered, we leave the GraphQL server's own listener untouched (zero change).
14
+ *
15
+ * @module @memberjunction/server-extensions-core
16
+ */
17
+ import type { IncomingMessage, Server as HttpServer } from 'node:http';
18
+ import type { Duplex } from 'node:stream';
19
+ /**
20
+ * Structural interface representing a WebSocketServer target for upgrade handling.
21
+ * Duck-typed so callers don't need a direct dependency on the `ws` package.
22
+ */
23
+ export interface IWebSocketUpgradeTarget {
24
+ handleUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer, callback: (ws: unknown) => void): void;
25
+ emit(event: string, ...args: unknown[]): boolean;
26
+ }
27
+ /** Registers a media/extension WebSocket route. Called by extension routers during setup. */
28
+ export declare function RegisterMediaUpgradeRoute(path: string, wss: IWebSocketUpgradeTarget): void;
29
+ /**
30
+ * Whether an upgrade request's pathname should be routed to the GraphQL subscriptions socket.
31
+ */
32
+ export declare function IsGraphQLWsPath(pathname: string, graphqlPath: string): boolean;
33
+ /**
34
+ * Installs the single path-routing `upgrade` dispatcher. No-op when no extension routes are registered, so
35
+ * the GraphQL server keeps its own listener untouched. Otherwise it removes the auto-attached listeners
36
+ * (GraphQL's included) and dispatches every upgrade by pathname — GraphQL on `graphqlPath`, each extension
37
+ * socket on its registered path; unknown paths are destroyed.
38
+ *
39
+ * @param httpServer the shared HTTP server.
40
+ * @param graphqlWss the GraphQL subscriptions WebSocket server (kept, re-dispatched on its path).
41
+ * @param graphqlPath the GraphQL root path (the path GraphQL's socket listens on).
42
+ * @param preUpgradeHandler optional handler to try before routing to GraphQL or extension sockets.
43
+ */
44
+ export declare function InstallMediaUpgradeDispatcher(httpServer: HttpServer, graphqlWss: IWebSocketUpgradeTarget, graphqlPath: string, preUpgradeHandler?: (req: IncomingMessage, socket: Duplex, head: Buffer) => boolean): void;
45
+ //# sourceMappingURL=mediaUpgradeRouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaUpgradeRouter.d.ts","sourceRoot":"","sources":["../src/mediaUpgradeRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACpC,aAAa,CACT,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,GAChC,IAAI,CAAC;IACR,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;CACpD;AAKD,6FAA6F;AAC7F,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,uBAAuB,GAAG,IAAI,CAE1F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAE9E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CACzC,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,uBAAuB,EACnC,WAAW,EAAE,MAAM,EACnB,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,GACpF,IAAI,CAwBN"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @fileoverview Single WebSocket-upgrade dispatcher for the shared HTTP server.
3
+ *
4
+ * Why this exists: in `ws` 8.x, every `new WebSocketServer({ server })` attaches its OWN `upgrade`
5
+ * listener that calls `handleUpgrade` UNCONDITIONALLY, and `handleUpgrade` does `abortHandshake(400)` for
6
+ * any request whose path it doesn't own. So two `{server}`-bound servers on one HTTP server (e.g. the
7
+ * GraphQL subscriptions socket on `/` AND a server extension WebSocket socket) fight on every upgrade —
8
+ * the non-owning server 400s the request.
9
+ *
10
+ * The fix: extension WebSocket servers are created with `{ noServer: true }` (no auto-listener) and
11
+ * register their path here; at boot we strip the auto-listeners and install ONE `upgrade` listener that
12
+ * routes by path — GraphQL on its root path, each extension socket on its own. When no extension routes are
13
+ * registered, we leave the GraphQL server's own listener untouched (zero change).
14
+ *
15
+ * @module @memberjunction/server-extensions-core
16
+ */
17
+ /** path → the `{ noServer:true }` WebSocket server that owns it. */
18
+ const mediaRoutes = new Map();
19
+ /** Registers a media/extension WebSocket route. Called by extension routers during setup. */
20
+ export function RegisterMediaUpgradeRoute(path, wss) {
21
+ mediaRoutes.set(path, wss);
22
+ }
23
+ /**
24
+ * Whether an upgrade request's pathname should be routed to the GraphQL subscriptions socket.
25
+ */
26
+ export function IsGraphQLWsPath(pathname, graphqlPath) {
27
+ return pathname === graphqlPath || (graphqlPath === '/' && pathname === '/graphql');
28
+ }
29
+ /**
30
+ * Installs the single path-routing `upgrade` dispatcher. No-op when no extension routes are registered, so
31
+ * the GraphQL server keeps its own listener untouched. Otherwise it removes the auto-attached listeners
32
+ * (GraphQL's included) and dispatches every upgrade by pathname — GraphQL on `graphqlPath`, each extension
33
+ * socket on its registered path; unknown paths are destroyed.
34
+ *
35
+ * @param httpServer the shared HTTP server.
36
+ * @param graphqlWss the GraphQL subscriptions WebSocket server (kept, re-dispatched on its path).
37
+ * @param graphqlPath the GraphQL root path (the path GraphQL's socket listens on).
38
+ * @param preUpgradeHandler optional handler to try before routing to GraphQL or extension sockets.
39
+ */
40
+ export function InstallMediaUpgradeDispatcher(httpServer, graphqlWss, graphqlPath, preUpgradeHandler) {
41
+ if (mediaRoutes.size === 0) {
42
+ return;
43
+ }
44
+ httpServer.removeAllListeners('upgrade');
45
+ const dispatch = (wss, req, socket, head) => {
46
+ wss.handleUpgrade(req, socket, head, (ws) => wss.emit('connection', ws, req));
47
+ };
48
+ httpServer.on('upgrade', (req, socket, head) => {
49
+ if (preUpgradeHandler && preUpgradeHandler(req, socket, head)) {
50
+ return;
51
+ }
52
+ const pathname = (req.url ?? '').split('?')[0];
53
+ if (IsGraphQLWsPath(pathname, graphqlPath)) {
54
+ dispatch(graphqlWss, req, socket, head);
55
+ return;
56
+ }
57
+ const wss = mediaRoutes.get(pathname);
58
+ if (wss) {
59
+ dispatch(wss, req, socket, head);
60
+ return;
61
+ }
62
+ socket.destroy();
63
+ });
64
+ }
65
+ //# sourceMappingURL=mediaUpgradeRouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaUpgradeRouter.js","sourceRoot":"","sources":["../src/mediaUpgradeRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAmBH,oEAAoE;AACpE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAmC,CAAC;AAE/D,6FAA6F;AAC7F,MAAM,UAAU,yBAAyB,CAAC,IAAY,EAAE,GAA4B;IAChF,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,WAAmB;IACjE,OAAO,QAAQ,KAAK,WAAW,IAAI,CAAC,WAAW,KAAK,GAAG,IAAI,QAAQ,KAAK,UAAU,CAAC,CAAC;AACxF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,6BAA6B,CACzC,UAAsB,EACtB,UAAmC,EACnC,WAAmB,EACnB,iBAAmF;IAEnF,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;IACX,CAAC;IACD,UAAU,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,CAAC,GAA4B,EAAE,GAAoB,EAAE,MAAc,EAAE,IAAY,EAAQ,EAAE;QACxG,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAClF,CAAC,CAAC;IACF,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAoB,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE;QAC5E,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YAC5D,OAAO;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;YACzC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YACxC,OAAO;QACX,CAAC;QACD,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,GAAG,EAAE,CAAC;YACN,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YACjC,OAAO;QACX,CAAC;QACD,MAAM,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,7 +1,12 @@
1
+ import type { Application } from 'express';
2
+ import type { Server as HttpServer } from 'http';
1
3
  /**
2
- * @module @memberjunction/server-extensions-core
3
- * @description Core types for the MJServer extension framework.
4
+ * Lifecycle phase for a server extension.
5
+ * - 'pre-auth': Mounted before JWT authentication middleware. Used for webhooks,
6
+ * health checks, media stream endpoints, SSO handshakes, etc.
7
+ * - 'post-auth': Mounted after JWT authentication middleware. Protected by default.
4
8
  */
9
+ export type ServerExtensionPhase = 'pre-auth' | 'post-auth';
5
10
  /**
6
11
  * Configuration for a server extension instance.
7
12
  *
@@ -22,6 +27,7 @@
22
27
  * Enabled: true,
23
28
  * DriverClass: 'SlackMessagingExtension',
24
29
  * RootPath: '/webhook/slack',
30
+ * Phase: 'pre-auth',
25
31
  * Settings: {
26
32
  * AgentID: '...',
27
33
  * BotToken: process.env.SLACK_BOT_TOKEN,
@@ -44,6 +50,11 @@ export interface ServerExtensionConfig {
44
50
  * The extension registers its routes under this prefix on the Express app.
45
51
  */
46
52
  RootPath: string;
53
+ /**
54
+ * Lifecycle phase for this extension. Defaults to the extension class's `DefaultPhase`
55
+ * (usually `'pre-auth'`) when not specified.
56
+ */
57
+ Phase?: ServerExtensionPhase;
47
58
  /**
48
59
  * Extension-specific configuration. The shape varies by extension type.
49
60
  * For messaging adapters, this contains `AgentID`, `BotToken`, etc.
@@ -51,6 +62,47 @@ export interface ServerExtensionConfig {
51
62
  */
52
63
  Settings: Record<string, unknown>;
53
64
  }
65
+ /**
66
+ * Service registry shared among server extensions, enabling cross-extension
67
+ * service registration and consumption.
68
+ */
69
+ export interface ServerExtensionServiceRegistry {
70
+ /**
71
+ * Register a service instance under a unique key.
72
+ * Throws or logs if a service with the same key is already registered.
73
+ */
74
+ RegisterService<T extends object>(key: string, service: T): void;
75
+ /**
76
+ * Retrieve a registered service instance by key.
77
+ * Returns undefined if no service is registered under that key.
78
+ */
79
+ GetService<T extends object>(key: string): T | undefined;
80
+ /**
81
+ * Check if a service is registered under the given key.
82
+ */
83
+ HasService(key: string): boolean;
84
+ /**
85
+ * Optional accessor returning all registered services as a read-only map.
86
+ */
87
+ GetAllServices?(): ReadonlyMap<string, object>;
88
+ }
89
+ /**
90
+ * Context passed to `BaseServerExtension.Initialize()` and `OnAllExtensionsMounted()`.
91
+ */
92
+ export interface ServerExtensionInitContext {
93
+ /** Express application instance to mount routes on. */
94
+ app: Application;
95
+ /** Node HTTP/HTTPS server instance, if available (e.g. for WebSocket attachment). */
96
+ httpServer?: HttpServer;
97
+ /** Extension configuration from mj.config.cjs or Open App metadata. */
98
+ config: ServerExtensionConfig;
99
+ /** Canonical public base URL of the MJ server (e.g. 'https://api.example.com'). */
100
+ publicUrl?: string;
101
+ /** Shared service registry for cross-extension service lookup and registration. */
102
+ services: ServerExtensionServiceRegistry;
103
+ /** Current lifecycle phase being mounted ('pre-auth' | 'post-auth'). */
104
+ phase: ServerExtensionPhase;
105
+ }
54
106
  /**
55
107
  * Result returned from extension initialization.
56
108
  * Extensions report whether startup succeeded and what routes they registered.
@@ -73,6 +125,11 @@ export interface ExtensionInitResult {
73
125
  * `MJ_VERBOSE` is enabled). Implies `Success: false`.
74
126
  */
75
127
  Skipped?: boolean;
128
+ /**
129
+ * Optional service instance provided by this extension to be registered in the shared
130
+ * service registry (under `config.DriverClass` and/or a custom key).
131
+ */
132
+ Service?: object;
76
133
  }
77
134
  /**
78
135
  * Health check result for a single extension.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,WAAW,qBAAqB;IAClC,yFAAyF;IACzF,OAAO,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAChC,iFAAiF;IACjF,OAAO,EAAE,OAAO,CAAC;IAEjB,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IAClC,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IAEjB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IAEb,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,WAAW,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,WAAW,qBAAqB;IAClC,yFAAyF;IACzF,OAAO,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAE7B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,8BAA8B;IAC3C;;;OAGG;IACH,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAEjE;;;OAGG;IACH,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAEzD;;OAEG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAEjC;;OAEG;IACH,cAAc,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClD;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACvC,uDAAuD;IACvD,GAAG,EAAE,WAAW,CAAC;IAEjB,qFAAqF;IACrF,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,uEAAuE;IACvE,MAAM,EAAE,qBAAqB,CAAC;IAE9B,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,mFAAmF;IACnF,QAAQ,EAAE,8BAA8B,CAAC;IAEzC,wEAAwE;IACxE,KAAK,EAAE,oBAAoB,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAChC,iFAAiF;IACjF,OAAO,EAAE,OAAO,CAAC;IAEjB,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IAClC,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IAEjB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IAEb,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC"}
package/dist/types.js CHANGED
@@ -1,6 +1,2 @@
1
- /**
2
- * @module @memberjunction/server-extensions-core
3
- * @description Core types for the MJServer extension framework.
4
- */
5
1
  export {};
6
2
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/server-extensions-core",
3
- "version": "6.1.0-edge.6",
3
+ "version": "6.1.0",
4
4
  "description": "MemberJunction: Server Extension framework - plugin architecture for MJServer that enables auto-discovery and lifecycle management of extension modules",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -11,8 +11,8 @@
11
11
  "author": "MemberJunction.com",
12
12
  "license": "BUSL-1.1",
13
13
  "dependencies": {
14
- "@memberjunction/global": "6.1.0-edge.6",
15
- "@memberjunction/core": "6.1.0-edge.6",
14
+ "@memberjunction/global": "6.1.0",
15
+ "@memberjunction/core": "6.1.0",
16
16
  "express": "^5.2.1"
17
17
  },
18
18
  "devDependencies": {