@procedures/server 0.4.0 → 0.6.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/CHANGELOG.md +40 -0
- package/README.md +26 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +53 -1
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/run.d.ts +5 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +43 -1
- package/dist/run.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -5
- package/src/config.ts +52 -1
- package/src/index.ts +1 -1
- package/src/run.ts +47 -1
- package/src/types.ts +7 -0
package/dist/config.d.ts
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
* Parses command line arguments for the server.
|
|
5
5
|
*/
|
|
6
6
|
import type { ServerConfig } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* This function gives the topic patterns of an `--events` value: comma-separated exact names
|
|
9
|
+
* (`orders.created`), prefixes (`orders.*`) or `*` (`documentation/EVENTS.md`). A `*` is
|
|
10
|
+
* permitted only at the end of a pattern. The patterns are the topic rule of `topicMatcher()`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseTopicPatterns(value: string): string[];
|
|
7
13
|
/**
|
|
8
14
|
* Parse command line arguments into server configuration.
|
|
9
15
|
*
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,YAAY,CAAC;AAmBhE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAa1D;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAsHxD"}
|
package/dist/config.js
CHANGED
|
@@ -15,6 +15,29 @@ function parsePort(value) {
|
|
|
15
15
|
}
|
|
16
16
|
return port;
|
|
17
17
|
}
|
|
18
|
+
/** The number of characters of a topic name (`MAX_TOPIC_LENGTH` of the core). */
|
|
19
|
+
const MAX_TOPIC_LENGTH = 256;
|
|
20
|
+
/**
|
|
21
|
+
* This function gives the topic patterns of an `--events` value: comma-separated exact names
|
|
22
|
+
* (`orders.created`), prefixes (`orders.*`) or `*` (`documentation/EVENTS.md`). A `*` is
|
|
23
|
+
* permitted only at the end of a pattern. The patterns are the topic rule of `topicMatcher()`.
|
|
24
|
+
*/
|
|
25
|
+
export function parseTopicPatterns(value) {
|
|
26
|
+
const patterns = value
|
|
27
|
+
.split(",")
|
|
28
|
+
.map((pattern) => pattern.trim())
|
|
29
|
+
.filter((pattern) => pattern.length > 0);
|
|
30
|
+
if (patterns.length === 0)
|
|
31
|
+
throw new Error("--events needs a topic pattern: an exact name, a prefix such as orders.*, or *");
|
|
32
|
+
for (const pattern of patterns) {
|
|
33
|
+
if (pattern.length > MAX_TOPIC_LENGTH)
|
|
34
|
+
throw new Error(`The topic pattern "${pattern.slice(0, 40)}..." has more than ${MAX_TOPIC_LENGTH} characters`);
|
|
35
|
+
if (pattern.slice(0, -1).includes("*")) {
|
|
36
|
+
throw new Error(`Invalid topic pattern: "${pattern}". A * is permitted only at the end (orders.* or *).`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return patterns;
|
|
40
|
+
}
|
|
18
41
|
/**
|
|
19
42
|
* Parse command line arguments into server configuration.
|
|
20
43
|
*
|
|
@@ -35,6 +58,8 @@ export function parseConfig(argv) {
|
|
|
35
58
|
let verbose = false;
|
|
36
59
|
let serverToken;
|
|
37
60
|
const expose = [];
|
|
61
|
+
const events = [];
|
|
62
|
+
let fsRoot;
|
|
38
63
|
for (let i = 0; i < argv.length; i++) {
|
|
39
64
|
const token = argv[i];
|
|
40
65
|
const eq = token.startsWith("--") ? token.indexOf("=") : -1;
|
|
@@ -92,6 +117,16 @@ export function parseConfig(argv) {
|
|
|
92
117
|
case "-e":
|
|
93
118
|
expose.push(...value().split(",").map((p) => p.trim()).filter((p) => p.length > 0));
|
|
94
119
|
break;
|
|
120
|
+
case "--events":
|
|
121
|
+
// Repeatable: each value adds its patterns to the topic rule
|
|
122
|
+
for (const pattern of parseTopicPatterns(value())) {
|
|
123
|
+
if (!events.includes(pattern))
|
|
124
|
+
events.push(pattern);
|
|
125
|
+
}
|
|
126
|
+
break;
|
|
127
|
+
case "--fs-root":
|
|
128
|
+
fsRoot = value();
|
|
129
|
+
break;
|
|
95
130
|
case "--verbose":
|
|
96
131
|
case "-v":
|
|
97
132
|
verbose = true;
|
|
@@ -127,7 +162,7 @@ export function parseConfig(argv) {
|
|
|
127
162
|
}
|
|
128
163
|
return { type };
|
|
129
164
|
});
|
|
130
|
-
return { procedures, transports, verbose, token: serverToken, expose };
|
|
165
|
+
return { procedures, transports, verbose, token: serverToken, expose, events, ...(fsRoot !== undefined ? { fsRoot } : {}) };
|
|
131
166
|
}
|
|
132
167
|
function printHelp() {
|
|
133
168
|
console.log(`
|
|
@@ -166,6 +201,17 @@ OPTIONS:
|
|
|
166
201
|
(git.status) or prefixes (git.*)
|
|
167
202
|
Default: every loaded procedure
|
|
168
203
|
|
|
204
|
+
--events <patterns> The topics of the event bus that a peer can
|
|
205
|
+
subscribe to with events.subscribe: exact names
|
|
206
|
+
(orders.created), prefixes (orders.*) or *.
|
|
207
|
+
Repeatable, or comma-separated.
|
|
208
|
+
Default: no topics (TOPIC_NOT_FOUND)
|
|
209
|
+
|
|
210
|
+
--fs-root <folder> Confine each path of the fs.* procedures to this
|
|
211
|
+
folder, also the paths of their nested calls
|
|
212
|
+
from other procedures. A path outside gives
|
|
213
|
+
FORBIDDEN (outside-root). Default: no root
|
|
214
|
+
|
|
169
215
|
--verbose, -v Verbose output
|
|
170
216
|
|
|
171
217
|
--help, -h Show this help
|
|
@@ -179,6 +225,12 @@ EXAMPLES:
|
|
|
179
225
|
|
|
180
226
|
# Start with both HTTP and WebSocket
|
|
181
227
|
procedure-server -p @procedures/mongo/register -t http,websocket
|
|
228
|
+
|
|
229
|
+
# Serve the topics orders.* to subscribers over WebSocket
|
|
230
|
+
procedure-server -p ./my-procedures.js -t websocket --events "orders.*"
|
|
231
|
+
|
|
232
|
+
# Confine the file procedures to one folder
|
|
233
|
+
procedure-server -p @procedures/fs --fs-root ./data
|
|
182
234
|
`);
|
|
183
235
|
}
|
|
184
236
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAU,CAAC;AAEhE;;;GAGG;AACH,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,mCAAmC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,KAAK,GAA8B,EAAE,CAAC;IAC5C,IAAI,IAAwB,CAAC;IAC7B,IAAI,IAAwB,CAAC;IAC7B,IAAI,QAA4B,CAAC;IACjC,IAAI,IAAyB,CAAC;IAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,WAAsC,CAAC;IAC3C,MAAM,MAAM,GAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAU,CAAC;AAEhE;;;GAGG;AACH,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,mCAAmC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AACjF,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,QAAQ,GAAG,KAAK;SACnB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;SAChC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;IAC7H,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,GAAG,gBAAgB;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,gBAAgB,aAAa,CAAC,CAAC;QACtJ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,sDAAsD,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,KAAK,GAA8B,EAAE,CAAC;IAC5C,IAAI,IAAwB,CAAC;IAC7B,IAAI,IAAwB,CAAC;IAC7B,IAAI,QAA4B,CAAC;IACjC,IAAI,IAAyB,CAAC;IAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,WAAsC,CAAC;IAC3C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,MAA0B,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,GAAW,EAAE;YACzB,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,gBAAgB,CAAC,CAAC;YAC1C,CAAC;YACD,CAAC,EAAE,CAAC;YACJ,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,cAAc,CAAC;YACpB,KAAK,IAAI;gBACP,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBACxF,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC1B,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,GAAG,KAAK,EAAE,CAAC;gBACf,MAAM;YACR,KAAK,aAAa,CAAC;YACnB,KAAK,IAAI;gBACP,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;oBAC3D,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;oBAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,WAAW,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACvF,CAAC;oBACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACpB,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,GAAG,IAAI,CAAC;gBACZ,MAAM;YACR,KAAK,WAAW;gBACd,IAAI,GAAG,KAAK,CAAC;gBACb,MAAM;YACR,KAAK,aAAa;gBAChB,QAAQ,GAAG,KAAK,EAAE,CAAC;gBACnB,MAAM;YACR,KAAK,SAAS;gBACZ,WAAW,GAAG,KAAK,EAAE,CAAC;gBACtB,MAAM;YACR,KAAK,YAAY;gBACf,WAAW,GAAG,IAAI,CAAC;gBACnB,MAAM;YACR,KAAK,UAAU,CAAC;YAChB,KAAK,IAAI;gBACP,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBACpF,MAAM;YACR,KAAK,UAAU;gBACb,6DAA6D;gBAC7D,KAAK,MAAM,OAAO,IAAI,kBAAkB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;oBAClD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;wBAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtD,CAAC;gBACD,MAAM;YACR,KAAK,WAAW;gBACd,MAAM,GAAG,KAAK,EAAE,CAAC;gBACjB,MAAM;YACR,KAAK,WAAW,CAAC;YACjB,KAAK,IAAI;gBACP,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM;YACR,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,SAAS,EAAE,CAAC;gBACZ,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB;gBACE,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,kDAAkD,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,2FAA2F;IAC3F,uEAAuE;IACvE,6DAA6D;IAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAED,uFAAuF;IACvF,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAmB,EAAE;QAC5D,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO;gBACL,IAAI;gBACJ,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI;gBACxC,IAAI,EAAE,IAAI,IAAI,WAAW;gBACzB,QAAQ,EAAE,QAAQ,IAAI,MAAM;gBAC5B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxC,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACpG,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC9H,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkEb,CAAC,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* starts nothing: `runServer(argv)` is the CLI (`server` and `mark serve`), and `startServer()`
|
|
6
6
|
* starts a server from a parsed configuration.
|
|
7
7
|
*/
|
|
8
|
-
export { parseConfig } from "./config.js";
|
|
8
|
+
export { parseConfig, parseTopicPatterns } from "./config.js";
|
|
9
9
|
export { runServer, startServer, loadProcedureModule, type RunningServer, type ServerRunOptions } from "./run.js";
|
|
10
10
|
export type { ServerConfig, TransportConfig, ServerCreateResult, ServerStartInput, ServerStartOutput, ServerStopInput, ServerStopOutput, ServerStatusInput, ServerStatusOutput, } from "./types.js";
|
|
11
11
|
export * from "./module.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAClH,YAAY,EACV,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAIpB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* starts nothing: `runServer(argv)` is the CLI (`server` and `mark serve`), and `startServer()`
|
|
6
6
|
* starts a server from a parsed configuration.
|
|
7
7
|
*/
|
|
8
|
-
export { parseConfig } from "./config.js";
|
|
8
|
+
export { parseConfig, parseTopicPatterns } from "./config.js";
|
|
9
9
|
export { runServer, startServer, loadProcedureModule } from "./run.js";
|
|
10
10
|
// server.start, server.stop and server.status (from @procedures/peer). The root registers
|
|
11
11
|
// nothing: import "@procedures/server/register", or give the module to createRegistry().
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAA6C,MAAM,UAAU,CAAC;AAalH,0FAA0F;AAC1F,yFAAyF;AACzF,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,cAAc,CAAC"}
|
package/dist/run.d.ts
CHANGED
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
* the host policy of the core (`hostPolicy()`): the token, the `--expose` list and the browser
|
|
7
7
|
* checks. A package without a module entry still works: the server imports it and takes the
|
|
8
8
|
* procedures that the import added to the global registry.
|
|
9
|
+
*
|
|
10
|
+
* The server always serves `events.subscribe` (`documentation/EVENTS.md`). Its topic rule is the
|
|
11
|
+
* `--events` patterns, and no topic without them. `--fs-root` confines the `fs.*` procedures.
|
|
9
12
|
*/
|
|
10
13
|
import { type HostPolicy, type ProcedureModule, type ProcedureRegistry } from "@procedures/client";
|
|
11
14
|
import { type Peer, type PeerEndpoint } from "@procedures/peer";
|
|
@@ -26,6 +29,8 @@ export interface RunningServer {
|
|
|
26
29
|
token: string | undefined;
|
|
27
30
|
/** True when the token is random, for this run */
|
|
28
31
|
generatedToken: boolean;
|
|
32
|
+
/** The absolute path of the root of the `fs.*` procedures (`--fs-root`), or undefined. */
|
|
33
|
+
fsRoot?: string | undefined;
|
|
29
34
|
}
|
|
30
35
|
/** The options of `startServer()` and `runServer()`. */
|
|
31
36
|
export interface ServerRunOptions {
|
package/dist/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAML,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAc,KAAK,IAAI,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAI5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA+C/C;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,SAAS,MAAM,EAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAclI;AA8BD,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,kDAAkD;IAClD,cAAc,EAAE,OAAO,CAAC;IACxB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAWD,wDAAwD;AACxD,MAAM,WAAW,gBAAgB;IAC/B,4GAA4G;IAC5G,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC7C;AAED,iGAAiG;AACjG,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,GAAG,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkB,EACzC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,aAAa,CAAC,CA8CxB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyD7F"}
|
package/dist/run.js
CHANGED
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
* the host policy of the core (`hostPolicy()`): the token, the `--expose` list and the browser
|
|
7
7
|
* checks. A package without a module entry still works: the server imports it and takes the
|
|
8
8
|
* procedures that the import added to the global registry.
|
|
9
|
+
*
|
|
10
|
+
* The server always serves `events.subscribe` (`documentation/EVENTS.md`). Its topic rule is the
|
|
11
|
+
* `--events` patterns, and no topic without them. `--fs-root` confines the `fs.*` procedures.
|
|
9
12
|
*/
|
|
10
13
|
import { randomBytes } from "node:crypto";
|
|
11
14
|
import { existsSync, readFileSync } from "node:fs";
|
|
@@ -91,6 +94,24 @@ async function importedModule(name, target) {
|
|
|
91
94
|
const added = PROCEDURE_REGISTRY.getAll().filter((procedure) => !before.has(pathToKey(procedure.path)));
|
|
92
95
|
return { name, procedures: added };
|
|
93
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* This function confines the `fs.*` procedures of the registry to the root of `--fs-root`, with
|
|
99
|
+
* `confineFsProcedures()` of `@procedures/fs` (roadmap R33). The package resolves from the
|
|
100
|
+
* folders of `resolveFrom`, then from this package. Without it, the server does not start.
|
|
101
|
+
*/
|
|
102
|
+
async function confineFs(registry, root, resolveFrom) {
|
|
103
|
+
const target = importTarget("@procedures/fs", "./module", resolveFrom) ?? "@procedures/fs/module";
|
|
104
|
+
let confine;
|
|
105
|
+
try {
|
|
106
|
+
confine = (await import(target)).confineFsProcedures;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
throw new Error(`--fs-root needs the package @procedures/fs: ${error instanceof Error ? error.message : String(error)}`);
|
|
110
|
+
}
|
|
111
|
+
if (typeof confine !== "function")
|
|
112
|
+
throw new Error("--fs-root needs @procedures/fs 0.5.0 or later (confineFsProcedures)");
|
|
113
|
+
return confine(registry, root);
|
|
114
|
+
}
|
|
94
115
|
/** The token of a configuration: `--token`, else `SERVER_TOKEN`, else a random one. `--no-token`: none. */
|
|
95
116
|
function tokenOf(config) {
|
|
96
117
|
const envToken = process.env["SERVER_TOKEN"] || undefined;
|
|
@@ -120,12 +141,20 @@ export async function startServer(config, log = console.log, options = {}) {
|
|
|
120
141
|
const registry = createRegistry(...modules);
|
|
121
142
|
if (config.verbose)
|
|
122
143
|
log(` Registered procedures: ${registry.getAll().length}`);
|
|
144
|
+
// --fs-root: each fs.* procedure of the registry confines its paths, also for a nested call
|
|
145
|
+
const confined = config.fsRoot === undefined ? undefined : await confineFs(registry, config.fsRoot, options.resolveFrom ?? [process.cwd()]);
|
|
146
|
+
if (confined && config.verbose)
|
|
147
|
+
log(` Confined to ${confined.root}: ${confined.procedures.length} fs procedures`);
|
|
123
148
|
// A token by default: the server serves every procedure it loads, and any local program
|
|
124
149
|
// could call it. `--no-token` turns this off on purpose.
|
|
125
150
|
const { token, generated } = tokenOf(config);
|
|
126
151
|
const policy = hostPolicy({
|
|
127
152
|
...(config.expose.length > 0 ? { expose: config.expose } : {}),
|
|
128
153
|
...(token !== undefined ? { token } : {}),
|
|
154
|
+
// The remote events (EVENTS.md): the server always pins events.subscribe. Without --events,
|
|
155
|
+
// the topic rule is empty, so each subscription gets TOPIC_NOT_FOUND. The bus is the global
|
|
156
|
+
// bus, which is also the ctx.bus of the procedures.
|
|
157
|
+
events: { topics: config.events ?? [] },
|
|
129
158
|
});
|
|
130
159
|
const peer = await createPeer({
|
|
131
160
|
id: `peer-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
@@ -134,7 +163,15 @@ export async function startServer(config, log = console.log, options = {}) {
|
|
|
134
163
|
policy,
|
|
135
164
|
});
|
|
136
165
|
await peer.start();
|
|
137
|
-
return {
|
|
166
|
+
return {
|
|
167
|
+
peer,
|
|
168
|
+
registry,
|
|
169
|
+
policy,
|
|
170
|
+
endpoints: peer.getEndpoints(),
|
|
171
|
+
token,
|
|
172
|
+
generatedToken: generated,
|
|
173
|
+
...(confined ? { fsRoot: confined.root } : {}),
|
|
174
|
+
};
|
|
138
175
|
}
|
|
139
176
|
/**
|
|
140
177
|
* The `server` CLI: parse the options, start the server, print where it listens, and keep the
|
|
@@ -165,6 +202,11 @@ export async function runServer(argv, options = {}) {
|
|
|
165
202
|
if (config.expose.length > 0) {
|
|
166
203
|
console.log(`Serves only: ${config.expose.join(", ")}`);
|
|
167
204
|
}
|
|
205
|
+
const events = config.events ?? [];
|
|
206
|
+
console.log(events.length > 0 ? `Event topics (events.subscribe): ${events.join(", ")}` : "Event topics: none (--events adds them)");
|
|
207
|
+
if (running.fsRoot !== undefined) {
|
|
208
|
+
console.log(`File root: ${running.fsRoot} (fs.* refuses each path outside it)`);
|
|
209
|
+
}
|
|
168
210
|
console.log("\nPress Ctrl+C to stop the server.");
|
|
169
211
|
// The peer stops before the process exits, with a limit of 10 seconds. A failed stop exits
|
|
170
212
|
// with 1, and a second signal exits at once (roadmap R5).
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -21,6 +21,13 @@ export interface ServerConfig {
|
|
|
21
21
|
token: string | null | undefined;
|
|
22
22
|
/** The procedures to serve (`--expose`): exact keys or `prefix.*`. Empty: every procedure. */
|
|
23
23
|
expose: string[];
|
|
24
|
+
/**
|
|
25
|
+
* The topic patterns of the remote events (`--events`): exact names, prefixes (`orders.*`) or
|
|
26
|
+
* `*`. Empty: the server serves no topic, and each subscription gets `TOPIC_NOT_FOUND`.
|
|
27
|
+
*/
|
|
28
|
+
events?: string[] | undefined;
|
|
29
|
+
/** The folder that confines each path of the `fs.*` procedures (`--fs-root`). Undefined: no root. */
|
|
30
|
+
fsRoot?: string | undefined;
|
|
24
31
|
}
|
|
25
32
|
export interface ServerCreateResult {
|
|
26
33
|
serverId: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,8FAA8F;IAC9F,MAAM,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package",
|
|
3
3
|
"name": "@procedures/server",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.6.0",
|
|
5
5
|
"description": "A standalone procedure server: load procedure packages and serve them over HTTP and WebSocket with a token and an expose list. Its procedures server.start, server.stop and server.status manage the background server of the mark CLI.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"server",
|
|
@@ -60,14 +60,15 @@
|
|
|
60
60
|
"provenance": true
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
|
-
"@procedures/client": "0.
|
|
64
|
-
"@procedures/peer": "0.
|
|
63
|
+
"@procedures/client": "0.6.0",
|
|
64
|
+
"@procedures/peer": "0.6.0",
|
|
65
65
|
"zod": "^4.6.5"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
|
-
"typescript": "^7.0.2",
|
|
69
|
-
"@types/node": "^22.0.0",
|
|
70
68
|
"@mark1russell7/cue": "^1.0.0",
|
|
69
|
+
"@procedures/fs": "0.6.0",
|
|
70
|
+
"@types/node": "^22.0.0",
|
|
71
|
+
"typescript": "^7.0.2",
|
|
71
72
|
"vitest": "^5.0.3"
|
|
72
73
|
},
|
|
73
74
|
"client": {
|
package/src/config.ts
CHANGED
|
@@ -20,6 +20,29 @@ function parsePort(value: string): number {
|
|
|
20
20
|
return port;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
/** The number of characters of a topic name (`MAX_TOPIC_LENGTH` of the core). */
|
|
24
|
+
const MAX_TOPIC_LENGTH = 256;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* This function gives the topic patterns of an `--events` value: comma-separated exact names
|
|
28
|
+
* (`orders.created`), prefixes (`orders.*`) or `*` (`documentation/EVENTS.md`). A `*` is
|
|
29
|
+
* permitted only at the end of a pattern. The patterns are the topic rule of `topicMatcher()`.
|
|
30
|
+
*/
|
|
31
|
+
export function parseTopicPatterns(value: string): string[] {
|
|
32
|
+
const patterns = value
|
|
33
|
+
.split(",")
|
|
34
|
+
.map((pattern) => pattern.trim())
|
|
35
|
+
.filter((pattern) => pattern.length > 0);
|
|
36
|
+
if (patterns.length === 0) throw new Error("--events needs a topic pattern: an exact name, a prefix such as orders.*, or *");
|
|
37
|
+
for (const pattern of patterns) {
|
|
38
|
+
if (pattern.length > MAX_TOPIC_LENGTH) throw new Error(`The topic pattern "${pattern.slice(0, 40)}..." has more than ${MAX_TOPIC_LENGTH} characters`);
|
|
39
|
+
if (pattern.slice(0, -1).includes("*")) {
|
|
40
|
+
throw new Error(`Invalid topic pattern: "${pattern}". A * is permitted only at the end (orders.* or *).`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return patterns;
|
|
44
|
+
}
|
|
45
|
+
|
|
23
46
|
/**
|
|
24
47
|
* Parse command line arguments into server configuration.
|
|
25
48
|
*
|
|
@@ -40,6 +63,8 @@ export function parseConfig(argv: string[]): ServerConfig {
|
|
|
40
63
|
let verbose = false;
|
|
41
64
|
let serverToken: string | null | undefined;
|
|
42
65
|
const expose: string[] = [];
|
|
66
|
+
const events: string[] = [];
|
|
67
|
+
let fsRoot: string | undefined;
|
|
43
68
|
|
|
44
69
|
for (let i = 0; i < argv.length; i++) {
|
|
45
70
|
const token = argv[i]!;
|
|
@@ -98,6 +123,15 @@ export function parseConfig(argv: string[]): ServerConfig {
|
|
|
98
123
|
case "-e":
|
|
99
124
|
expose.push(...value().split(",").map((p) => p.trim()).filter((p) => p.length > 0));
|
|
100
125
|
break;
|
|
126
|
+
case "--events":
|
|
127
|
+
// Repeatable: each value adds its patterns to the topic rule
|
|
128
|
+
for (const pattern of parseTopicPatterns(value())) {
|
|
129
|
+
if (!events.includes(pattern)) events.push(pattern);
|
|
130
|
+
}
|
|
131
|
+
break;
|
|
132
|
+
case "--fs-root":
|
|
133
|
+
fsRoot = value();
|
|
134
|
+
break;
|
|
101
135
|
case "--verbose":
|
|
102
136
|
case "-v":
|
|
103
137
|
verbose = true;
|
|
@@ -136,7 +170,7 @@ export function parseConfig(argv: string[]): ServerConfig {
|
|
|
136
170
|
return { type };
|
|
137
171
|
});
|
|
138
172
|
|
|
139
|
-
return { procedures, transports, verbose, token: serverToken, expose };
|
|
173
|
+
return { procedures, transports, verbose, token: serverToken, expose, events, ...(fsRoot !== undefined ? { fsRoot } : {}) };
|
|
140
174
|
}
|
|
141
175
|
|
|
142
176
|
function printHelp(): void {
|
|
@@ -176,6 +210,17 @@ OPTIONS:
|
|
|
176
210
|
(git.status) or prefixes (git.*)
|
|
177
211
|
Default: every loaded procedure
|
|
178
212
|
|
|
213
|
+
--events <patterns> The topics of the event bus that a peer can
|
|
214
|
+
subscribe to with events.subscribe: exact names
|
|
215
|
+
(orders.created), prefixes (orders.*) or *.
|
|
216
|
+
Repeatable, or comma-separated.
|
|
217
|
+
Default: no topics (TOPIC_NOT_FOUND)
|
|
218
|
+
|
|
219
|
+
--fs-root <folder> Confine each path of the fs.* procedures to this
|
|
220
|
+
folder, also the paths of their nested calls
|
|
221
|
+
from other procedures. A path outside gives
|
|
222
|
+
FORBIDDEN (outside-root). Default: no root
|
|
223
|
+
|
|
179
224
|
--verbose, -v Verbose output
|
|
180
225
|
|
|
181
226
|
--help, -h Show this help
|
|
@@ -189,5 +234,11 @@ EXAMPLES:
|
|
|
189
234
|
|
|
190
235
|
# Start with both HTTP and WebSocket
|
|
191
236
|
procedure-server -p @procedures/mongo/register -t http,websocket
|
|
237
|
+
|
|
238
|
+
# Serve the topics orders.* to subscribers over WebSocket
|
|
239
|
+
procedure-server -p ./my-procedures.js -t websocket --events "orders.*"
|
|
240
|
+
|
|
241
|
+
# Confine the file procedures to one folder
|
|
242
|
+
procedure-server -p @procedures/fs --fs-root ./data
|
|
192
243
|
`);
|
|
193
244
|
}
|
package/src/index.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* starts a server from a parsed configuration.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
export { parseConfig } from "./config.js";
|
|
9
|
+
export { parseConfig, parseTopicPatterns } from "./config.js";
|
|
10
10
|
export { runServer, startServer, loadProcedureModule, type RunningServer, type ServerRunOptions } from "./run.js";
|
|
11
11
|
export type {
|
|
12
12
|
ServerConfig,
|
package/src/run.ts
CHANGED
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
* the host policy of the core (`hostPolicy()`): the token, the `--expose` list and the browser
|
|
7
7
|
* checks. A package without a module entry still works: the server imports it and takes the
|
|
8
8
|
* procedures that the import added to the global registry.
|
|
9
|
+
*
|
|
10
|
+
* The server always serves `events.subscribe` (`documentation/EVENTS.md`). Its topic rule is the
|
|
11
|
+
* `--events` patterns, and no topic without them. `--fs-root` confines the `fs.*` procedures.
|
|
9
12
|
*/
|
|
10
13
|
|
|
11
14
|
import { randomBytes } from "node:crypto";
|
|
@@ -103,6 +106,26 @@ async function importedModule(name: string, target: string): Promise<ProcedureMo
|
|
|
103
106
|
return { name, procedures: added };
|
|
104
107
|
}
|
|
105
108
|
|
|
109
|
+
/** The function of `@procedures/fs` that confines the `fs.*` procedures of a registry to a root. */
|
|
110
|
+
type ConfineFs = (registry: ProcedureRegistry, root: string) => { root: string; procedures: string[] };
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* This function confines the `fs.*` procedures of the registry to the root of `--fs-root`, with
|
|
114
|
+
* `confineFsProcedures()` of `@procedures/fs` (roadmap R33). The package resolves from the
|
|
115
|
+
* folders of `resolveFrom`, then from this package. Without it, the server does not start.
|
|
116
|
+
*/
|
|
117
|
+
async function confineFs(registry: ProcedureRegistry, root: string, resolveFrom: readonly string[]): Promise<{ root: string; procedures: string[] }> {
|
|
118
|
+
const target = importTarget("@procedures/fs", "./module", resolveFrom) ?? "@procedures/fs/module";
|
|
119
|
+
let confine: ConfineFs | undefined;
|
|
120
|
+
try {
|
|
121
|
+
confine = ((await import(target)) as { confineFsProcedures?: ConfineFs }).confineFsProcedures;
|
|
122
|
+
} catch (error) {
|
|
123
|
+
throw new Error(`--fs-root needs the package @procedures/fs: ${error instanceof Error ? error.message : String(error)}`);
|
|
124
|
+
}
|
|
125
|
+
if (typeof confine !== "function") throw new Error("--fs-root needs @procedures/fs 0.5.0 or later (confineFsProcedures)");
|
|
126
|
+
return confine(registry, root);
|
|
127
|
+
}
|
|
128
|
+
|
|
106
129
|
/** The server that `runServer()` started. */
|
|
107
130
|
export interface RunningServer {
|
|
108
131
|
peer: Peer;
|
|
@@ -112,6 +135,8 @@ export interface RunningServer {
|
|
|
112
135
|
token: string | undefined;
|
|
113
136
|
/** True when the token is random, for this run */
|
|
114
137
|
generatedToken: boolean;
|
|
138
|
+
/** The absolute path of the root of the `fs.*` procedures (`--fs-root`), or undefined. */
|
|
139
|
+
fsRoot?: string | undefined;
|
|
115
140
|
}
|
|
116
141
|
|
|
117
142
|
/** The token of a configuration: `--token`, else `SERVER_TOKEN`, else a random one. `--no-token`: none. */
|
|
@@ -149,12 +174,20 @@ export async function startServer(
|
|
|
149
174
|
const registry = createRegistry(...modules);
|
|
150
175
|
if (config.verbose) log(` Registered procedures: ${registry.getAll().length}`);
|
|
151
176
|
|
|
177
|
+
// --fs-root: each fs.* procedure of the registry confines its paths, also for a nested call
|
|
178
|
+
const confined = config.fsRoot === undefined ? undefined : await confineFs(registry, config.fsRoot, options.resolveFrom ?? [process.cwd()]);
|
|
179
|
+
if (confined && config.verbose) log(` Confined to ${confined.root}: ${confined.procedures.length} fs procedures`);
|
|
180
|
+
|
|
152
181
|
// A token by default: the server serves every procedure it loads, and any local program
|
|
153
182
|
// could call it. `--no-token` turns this off on purpose.
|
|
154
183
|
const { token, generated } = tokenOf(config);
|
|
155
184
|
const policy = hostPolicy({
|
|
156
185
|
...(config.expose.length > 0 ? { expose: config.expose } : {}),
|
|
157
186
|
...(token !== undefined ? { token } : {}),
|
|
187
|
+
// The remote events (EVENTS.md): the server always pins events.subscribe. Without --events,
|
|
188
|
+
// the topic rule is empty, so each subscription gets TOPIC_NOT_FOUND. The bus is the global
|
|
189
|
+
// bus, which is also the ctx.bus of the procedures.
|
|
190
|
+
events: { topics: config.events ?? [] },
|
|
158
191
|
});
|
|
159
192
|
const peer = await createPeer({
|
|
160
193
|
id: `peer-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
@@ -163,7 +196,15 @@ export async function startServer(
|
|
|
163
196
|
policy,
|
|
164
197
|
});
|
|
165
198
|
await peer.start();
|
|
166
|
-
return {
|
|
199
|
+
return {
|
|
200
|
+
peer,
|
|
201
|
+
registry,
|
|
202
|
+
policy,
|
|
203
|
+
endpoints: peer.getEndpoints(),
|
|
204
|
+
token,
|
|
205
|
+
generatedToken: generated,
|
|
206
|
+
...(confined ? { fsRoot: confined.root } : {}),
|
|
207
|
+
};
|
|
167
208
|
}
|
|
168
209
|
|
|
169
210
|
/**
|
|
@@ -196,6 +237,11 @@ export async function runServer(argv: string[], options: ServerRunOptions = {}):
|
|
|
196
237
|
if (config.expose.length > 0) {
|
|
197
238
|
console.log(`Serves only: ${config.expose.join(", ")}`);
|
|
198
239
|
}
|
|
240
|
+
const events = config.events ?? [];
|
|
241
|
+
console.log(events.length > 0 ? `Event topics (events.subscribe): ${events.join(", ")}` : "Event topics: none (--events adds them)");
|
|
242
|
+
if (running.fsRoot !== undefined) {
|
|
243
|
+
console.log(`File root: ${running.fsRoot} (fs.* refuses each path outside it)`);
|
|
244
|
+
}
|
|
199
245
|
console.log("\nPress Ctrl+C to stop the server.");
|
|
200
246
|
|
|
201
247
|
// The peer stops before the process exits, with a limit of 10 seconds. A failed stop exits
|
package/src/types.ts
CHANGED
|
@@ -23,6 +23,13 @@ export interface ServerConfig {
|
|
|
23
23
|
token: string | null | undefined;
|
|
24
24
|
/** The procedures to serve (`--expose`): exact keys or `prefix.*`. Empty: every procedure. */
|
|
25
25
|
expose: string[];
|
|
26
|
+
/**
|
|
27
|
+
* The topic patterns of the remote events (`--events`): exact names, prefixes (`orders.*`) or
|
|
28
|
+
* `*`. Empty: the server serves no topic, and each subscription gets `TOPIC_NOT_FOUND`.
|
|
29
|
+
*/
|
|
30
|
+
events?: string[] | undefined;
|
|
31
|
+
/** The folder that confines each path of the `fs.*` procedures (`--fs-root`). Undefined: no root. */
|
|
32
|
+
fsRoot?: string | undefined;
|
|
26
33
|
}
|
|
27
34
|
|
|
28
35
|
export interface ServerCreateResult {
|