@memberjunction/server-extensions-core 6.1.0-edge.6 → 6.1.0-edge.7
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 +77 -110
- package/dist/BaseServerExtension.d.ts +21 -51
- package/dist/BaseServerExtension.d.ts.map +1 -1
- package/dist/BaseServerExtension.js +12 -40
- package/dist/BaseServerExtension.js.map +1 -1
- package/dist/ServerExtensionLoader.d.ts +47 -27
- package/dist/ServerExtensionLoader.d.ts.map +1 -1
- package/dist/ServerExtensionLoader.js +113 -38
- package/dist/ServerExtensionLoader.js.map +1 -1
- package/dist/collect.d.ts.map +1 -1
- package/dist/collect.js +14 -1
- package/dist/collect.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/mediaUpgradeRouter.d.ts +45 -0
- package/dist/mediaUpgradeRouter.d.ts.map +1 -0
- package/dist/mediaUpgradeRouter.js +65 -0
- package/dist/mediaUpgradeRouter.js.map +1 -0
- package/dist/types.d.ts +59 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -4
- package/dist/types.js.map +1 -1
- package/package.json +3 -3
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
|
|
9
|
+
This package provides the core contracts and loader for server extensions:
|
|
8
10
|
|
|
9
|
-
- **`BaseServerExtension`** — Abstract base class that all extensions implement. Defines
|
|
10
|
-
- **`ServerExtensionLoader`** — Discovers registered extension classes via MJ's `ClassFactory`, matches them to config entries, and manages
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
44
|
+
import { Router } from 'express';
|
|
37
45
|
import { RegisterClass } from '@memberjunction/global';
|
|
38
46
|
import {
|
|
39
47
|
BaseServerExtension,
|
|
40
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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.
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
|
121
|
-
|
|
122
|
-
| `
|
|
123
|
-
| `Shutdown()` | Called during graceful shutdown (SIGTERM/SIGINT).
|
|
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
|
|
124
|
+
| `OnConfigurationChange?(config)` | Optional. Called when configuration changes at runtime. |
|
|
126
125
|
|
|
127
126
|
### `ServerExtensionLoader`
|
|
128
127
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
|
132
|
-
|
|
133
|
-
| `
|
|
134
|
-
| `HealthCheckAll()` | Run health checks
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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/) —
|
|
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.
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
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
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
*
|
|
74
|
-
*
|
|
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
|
-
|
|
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,
|
|
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.
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
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;
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
-
*
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
LogStatus(`Loaded ${
|
|
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
|
-
|
|
155
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"ServerExtensionLoader.js","sourceRoot":"","sources":["../src/ServerExtensionLoader.ts"],"names":[],"mappings":"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"}
|
package/dist/collect.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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
|
package/dist/collect.js.map
CHANGED
|
@@ -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 {
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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
|
-
*
|
|
3
|
-
*
|
|
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.
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA
|
|
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
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
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.
|
|
3
|
+
"version": "6.1.0-edge.7",
|
|
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.
|
|
15
|
-
"@memberjunction/core": "6.1.0-edge.
|
|
14
|
+
"@memberjunction/global": "6.1.0-edge.7",
|
|
15
|
+
"@memberjunction/core": "6.1.0-edge.7",
|
|
16
16
|
"express": "^5.2.1"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|