@taujs/server 0.3.4 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build.js +70 -70
- package/dist/index.js +70 -70
- package/dist/security/csp.js +10 -1
- package/package.json +1 -1
package/dist/build.js
CHANGED
|
@@ -267,64 +267,6 @@ function createAuthHook(routes, isDebug) {
|
|
|
267
267
|
|
|
268
268
|
// src/security/csp.ts
|
|
269
269
|
import crypto from "crypto";
|
|
270
|
-
var defaultGenerateCSP = (directives, nonce) => {
|
|
271
|
-
const merged = { ...directives };
|
|
272
|
-
merged["script-src"] = merged["script-src"] || ["'self'"];
|
|
273
|
-
if (!merged["script-src"].some((v) => v.startsWith("'nonce-"))) merged["script-src"].push(`'nonce-${nonce}'`);
|
|
274
|
-
if (process.env.NODE_ENV !== "production") {
|
|
275
|
-
const connect = merged["connect-src"] || ["'self'"];
|
|
276
|
-
if (!connect.includes("ws:")) connect.push("ws:");
|
|
277
|
-
if (!connect.includes("http:")) connect.push("http:");
|
|
278
|
-
merged["connect-src"] = connect;
|
|
279
|
-
const style = merged["style-src"] || ["'self'"];
|
|
280
|
-
if (!style.includes("'unsafe-inline'")) style.push("'unsafe-inline'");
|
|
281
|
-
merged["style-src"] = style;
|
|
282
|
-
}
|
|
283
|
-
return Object.entries(merged).map(([key, values]) => `${key} ${values.join(" ")}`).join("; ");
|
|
284
|
-
};
|
|
285
|
-
var generateNonce = () => crypto.randomBytes(16).toString("base64");
|
|
286
|
-
var createCSPHook = (options = {}) => (req, reply, done) => {
|
|
287
|
-
const nonce = generateNonce();
|
|
288
|
-
const directives = options.directives ?? DEV_CSP_DIRECTIVES;
|
|
289
|
-
const generate = options.generateCSP ?? defaultGenerateCSP;
|
|
290
|
-
const cspHeader = generate(directives, nonce);
|
|
291
|
-
reply.header("Content-Security-Policy", cspHeader);
|
|
292
|
-
if (typeof options.exposeNonce === "function") {
|
|
293
|
-
options.exposeNonce(req, nonce);
|
|
294
|
-
} else {
|
|
295
|
-
req.nonce = nonce;
|
|
296
|
-
}
|
|
297
|
-
done();
|
|
298
|
-
};
|
|
299
|
-
var applyCSP = (security, reply) => {
|
|
300
|
-
const nonce = generateNonce();
|
|
301
|
-
const directives = security?.csp?.directives ?? DEV_CSP_DIRECTIVES;
|
|
302
|
-
const generate = security?.csp?.generateCSP ?? defaultGenerateCSP;
|
|
303
|
-
const header = generate(directives, nonce);
|
|
304
|
-
reply.header("Content-Security-Policy", header);
|
|
305
|
-
reply.request.nonce = nonce;
|
|
306
|
-
return nonce;
|
|
307
|
-
};
|
|
308
|
-
|
|
309
|
-
// src/security/verifyMiddleware.ts
|
|
310
|
-
var isAuthRequired = (r) => r.attr?.middleware?.auth?.required === true;
|
|
311
|
-
var hasAuthenticate = (app) => typeof app.authenticate === "function";
|
|
312
|
-
var verifyContracts = (app, routes, contracts, isDebug) => {
|
|
313
|
-
const logger = createLogger(Boolean(isDebug));
|
|
314
|
-
for (const contract of contracts) {
|
|
315
|
-
const isUsed = routes.some(contract.required);
|
|
316
|
-
if (!isUsed) {
|
|
317
|
-
debugLog(logger, `Middleware "${contract.key}" not used in any routes`);
|
|
318
|
-
continue;
|
|
319
|
-
}
|
|
320
|
-
if (!contract.verify(app)) {
|
|
321
|
-
const error = new Error(`[\u03C4js] ${contract.errorMessage}`);
|
|
322
|
-
logger.error(error.message);
|
|
323
|
-
throw error;
|
|
324
|
-
}
|
|
325
|
-
debugLog(logger, `Middleware "${contract.key}" verified \u2713`);
|
|
326
|
-
}
|
|
327
|
-
};
|
|
328
270
|
|
|
329
271
|
// src/utils/Utils.ts
|
|
330
272
|
import { dirname, join } from "path";
|
|
@@ -412,19 +354,17 @@ var isServiceDescriptor = (obj) => {
|
|
|
412
354
|
return typeof maybe.serviceName === "string" && typeof maybe.serviceMethod === "string";
|
|
413
355
|
};
|
|
414
356
|
var fetchInitialData = async (attr, params, serviceRegistry, ctx = { headers: {} }, callServiceMethodImpl = callServiceMethod) => {
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
return
|
|
357
|
+
const dataHandler = attr?.data;
|
|
358
|
+
if (!dataHandler || typeof dataHandler !== "function") return Promise.resolve({});
|
|
359
|
+
return dataHandler(params, ctx).then(async (result) => {
|
|
360
|
+
if (isServiceDescriptor(result)) {
|
|
361
|
+
const { serviceName, serviceMethod, args } = result;
|
|
362
|
+
if (serviceRegistry[serviceName]?.[serviceMethod]) return callServiceMethodImpl(serviceRegistry, serviceName, serviceMethod, args ?? {});
|
|
363
|
+
throw new Error(`Invalid service: serviceName=${String(serviceName)}, method=${String(serviceMethod)}`);
|
|
421
364
|
}
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
return result;
|
|
426
|
-
}
|
|
427
|
-
throw new Error("Invalid result from attr.data");
|
|
365
|
+
if (typeof result === "object" && result !== null) return result;
|
|
366
|
+
throw new Error("Invalid result from attr.data");
|
|
367
|
+
});
|
|
428
368
|
};
|
|
429
369
|
var matchRoute = (url, renderRoutes) => {
|
|
430
370
|
for (const route of renderRoutes) {
|
|
@@ -464,6 +404,66 @@ var ensureNonNull = (value, errorMessage) => {
|
|
|
464
404
|
return value;
|
|
465
405
|
};
|
|
466
406
|
|
|
407
|
+
// src/security/csp.ts
|
|
408
|
+
var defaultGenerateCSP = (directives, nonce) => {
|
|
409
|
+
const merged = { ...directives };
|
|
410
|
+
merged["script-src"] = merged["script-src"] || ["'self'"];
|
|
411
|
+
if (!merged["script-src"].some((v) => v.startsWith("'nonce-"))) merged["script-src"].push(`'nonce-${nonce}'`);
|
|
412
|
+
if (isDevelopment) {
|
|
413
|
+
const connect = merged["connect-src"] || ["'self'"];
|
|
414
|
+
if (!connect.includes("ws:")) connect.push("ws:");
|
|
415
|
+
if (!connect.includes("http:")) connect.push("http:");
|
|
416
|
+
merged["connect-src"] = connect;
|
|
417
|
+
const style = merged["style-src"] || ["'self'"];
|
|
418
|
+
if (!style.includes("'unsafe-inline'")) style.push("'unsafe-inline'");
|
|
419
|
+
merged["style-src"] = style;
|
|
420
|
+
}
|
|
421
|
+
return Object.entries(merged).map(([key, values]) => `${key} ${values.join(" ")}`).join("; ");
|
|
422
|
+
};
|
|
423
|
+
var generateNonce = () => crypto.randomBytes(16).toString("base64");
|
|
424
|
+
var createCSPHook = (options = {}) => (req, reply, done) => {
|
|
425
|
+
const nonce = generateNonce();
|
|
426
|
+
const directives = options.directives ?? DEV_CSP_DIRECTIVES;
|
|
427
|
+
const generate = options.generateCSP ?? defaultGenerateCSP;
|
|
428
|
+
const cspHeader = generate(directives, nonce);
|
|
429
|
+
reply.header("Content-Security-Policy", cspHeader);
|
|
430
|
+
if (typeof options.exposeNonce === "function") {
|
|
431
|
+
options.exposeNonce(req, nonce);
|
|
432
|
+
} else {
|
|
433
|
+
req.nonce = nonce;
|
|
434
|
+
}
|
|
435
|
+
done();
|
|
436
|
+
};
|
|
437
|
+
var applyCSP = (security, reply) => {
|
|
438
|
+
const nonce = generateNonce();
|
|
439
|
+
const directives = security?.csp?.directives ?? DEV_CSP_DIRECTIVES;
|
|
440
|
+
const generate = security?.csp?.generateCSP ?? defaultGenerateCSP;
|
|
441
|
+
const header = generate(directives, nonce);
|
|
442
|
+
reply.header("Content-Security-Policy", header);
|
|
443
|
+
reply.request.nonce = nonce;
|
|
444
|
+
return nonce;
|
|
445
|
+
};
|
|
446
|
+
|
|
447
|
+
// src/security/verifyMiddleware.ts
|
|
448
|
+
var isAuthRequired = (r) => r.attr?.middleware?.auth?.required === true;
|
|
449
|
+
var hasAuthenticate = (app) => typeof app.authenticate === "function";
|
|
450
|
+
var verifyContracts = (app, routes, contracts, isDebug) => {
|
|
451
|
+
const logger = createLogger(Boolean(isDebug));
|
|
452
|
+
for (const contract of contracts) {
|
|
453
|
+
const isUsed = routes.some(contract.required);
|
|
454
|
+
if (!isUsed) {
|
|
455
|
+
debugLog(logger, `Middleware "${contract.key}" not used in any routes`);
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
458
|
+
if (!contract.verify(app)) {
|
|
459
|
+
const error = new Error(`[\u03C4js] ${contract.errorMessage}`);
|
|
460
|
+
logger.error(error.message);
|
|
461
|
+
throw error;
|
|
462
|
+
}
|
|
463
|
+
debugLog(logger, `Middleware "${contract.key}" verified \u2713`);
|
|
464
|
+
}
|
|
465
|
+
};
|
|
466
|
+
|
|
467
467
|
// src/SSRServer.ts
|
|
468
468
|
var createMaps = () => {
|
|
469
469
|
return {
|
package/dist/index.js
CHANGED
|
@@ -265,64 +265,6 @@ function createAuthHook(routes, isDebug) {
|
|
|
265
265
|
|
|
266
266
|
// src/security/csp.ts
|
|
267
267
|
import crypto from "crypto";
|
|
268
|
-
var defaultGenerateCSP = (directives, nonce) => {
|
|
269
|
-
const merged = { ...directives };
|
|
270
|
-
merged["script-src"] = merged["script-src"] || ["'self'"];
|
|
271
|
-
if (!merged["script-src"].some((v) => v.startsWith("'nonce-"))) merged["script-src"].push(`'nonce-${nonce}'`);
|
|
272
|
-
if (process.env.NODE_ENV !== "production") {
|
|
273
|
-
const connect = merged["connect-src"] || ["'self'"];
|
|
274
|
-
if (!connect.includes("ws:")) connect.push("ws:");
|
|
275
|
-
if (!connect.includes("http:")) connect.push("http:");
|
|
276
|
-
merged["connect-src"] = connect;
|
|
277
|
-
const style = merged["style-src"] || ["'self'"];
|
|
278
|
-
if (!style.includes("'unsafe-inline'")) style.push("'unsafe-inline'");
|
|
279
|
-
merged["style-src"] = style;
|
|
280
|
-
}
|
|
281
|
-
return Object.entries(merged).map(([key, values]) => `${key} ${values.join(" ")}`).join("; ");
|
|
282
|
-
};
|
|
283
|
-
var generateNonce = () => crypto.randomBytes(16).toString("base64");
|
|
284
|
-
var createCSPHook = (options = {}) => (req, reply, done) => {
|
|
285
|
-
const nonce = generateNonce();
|
|
286
|
-
const directives = options.directives ?? DEV_CSP_DIRECTIVES;
|
|
287
|
-
const generate = options.generateCSP ?? defaultGenerateCSP;
|
|
288
|
-
const cspHeader = generate(directives, nonce);
|
|
289
|
-
reply.header("Content-Security-Policy", cspHeader);
|
|
290
|
-
if (typeof options.exposeNonce === "function") {
|
|
291
|
-
options.exposeNonce(req, nonce);
|
|
292
|
-
} else {
|
|
293
|
-
req.nonce = nonce;
|
|
294
|
-
}
|
|
295
|
-
done();
|
|
296
|
-
};
|
|
297
|
-
var applyCSP = (security, reply) => {
|
|
298
|
-
const nonce = generateNonce();
|
|
299
|
-
const directives = security?.csp?.directives ?? DEV_CSP_DIRECTIVES;
|
|
300
|
-
const generate = security?.csp?.generateCSP ?? defaultGenerateCSP;
|
|
301
|
-
const header = generate(directives, nonce);
|
|
302
|
-
reply.header("Content-Security-Policy", header);
|
|
303
|
-
reply.request.nonce = nonce;
|
|
304
|
-
return nonce;
|
|
305
|
-
};
|
|
306
|
-
|
|
307
|
-
// src/security/verifyMiddleware.ts
|
|
308
|
-
var isAuthRequired = (r) => r.attr?.middleware?.auth?.required === true;
|
|
309
|
-
var hasAuthenticate = (app) => typeof app.authenticate === "function";
|
|
310
|
-
var verifyContracts = (app, routes, contracts, isDebug) => {
|
|
311
|
-
const logger = createLogger(Boolean(isDebug));
|
|
312
|
-
for (const contract of contracts) {
|
|
313
|
-
const isUsed = routes.some(contract.required);
|
|
314
|
-
if (!isUsed) {
|
|
315
|
-
debugLog(logger, `Middleware "${contract.key}" not used in any routes`);
|
|
316
|
-
continue;
|
|
317
|
-
}
|
|
318
|
-
if (!contract.verify(app)) {
|
|
319
|
-
const error = new Error(`[\u03C4js] ${contract.errorMessage}`);
|
|
320
|
-
logger.error(error.message);
|
|
321
|
-
throw error;
|
|
322
|
-
}
|
|
323
|
-
debugLog(logger, `Middleware "${contract.key}" verified \u2713`);
|
|
324
|
-
}
|
|
325
|
-
};
|
|
326
268
|
|
|
327
269
|
// src/utils/Utils.ts
|
|
328
270
|
import { dirname, join } from "path";
|
|
@@ -410,19 +352,17 @@ var isServiceDescriptor = (obj) => {
|
|
|
410
352
|
return typeof maybe.serviceName === "string" && typeof maybe.serviceMethod === "string";
|
|
411
353
|
};
|
|
412
354
|
var fetchInitialData = async (attr, params, serviceRegistry, ctx = { headers: {} }, callServiceMethodImpl = callServiceMethod) => {
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
return
|
|
355
|
+
const dataHandler = attr?.data;
|
|
356
|
+
if (!dataHandler || typeof dataHandler !== "function") return Promise.resolve({});
|
|
357
|
+
return dataHandler(params, ctx).then(async (result) => {
|
|
358
|
+
if (isServiceDescriptor(result)) {
|
|
359
|
+
const { serviceName, serviceMethod, args } = result;
|
|
360
|
+
if (serviceRegistry[serviceName]?.[serviceMethod]) return callServiceMethodImpl(serviceRegistry, serviceName, serviceMethod, args ?? {});
|
|
361
|
+
throw new Error(`Invalid service: serviceName=${String(serviceName)}, method=${String(serviceMethod)}`);
|
|
419
362
|
}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
return result;
|
|
424
|
-
}
|
|
425
|
-
throw new Error("Invalid result from attr.data");
|
|
363
|
+
if (typeof result === "object" && result !== null) return result;
|
|
364
|
+
throw new Error("Invalid result from attr.data");
|
|
365
|
+
});
|
|
426
366
|
};
|
|
427
367
|
var matchRoute = (url, renderRoutes) => {
|
|
428
368
|
for (const route of renderRoutes) {
|
|
@@ -462,6 +402,66 @@ var ensureNonNull = (value, errorMessage) => {
|
|
|
462
402
|
return value;
|
|
463
403
|
};
|
|
464
404
|
|
|
405
|
+
// src/security/csp.ts
|
|
406
|
+
var defaultGenerateCSP = (directives, nonce) => {
|
|
407
|
+
const merged = { ...directives };
|
|
408
|
+
merged["script-src"] = merged["script-src"] || ["'self'"];
|
|
409
|
+
if (!merged["script-src"].some((v) => v.startsWith("'nonce-"))) merged["script-src"].push(`'nonce-${nonce}'`);
|
|
410
|
+
if (isDevelopment) {
|
|
411
|
+
const connect = merged["connect-src"] || ["'self'"];
|
|
412
|
+
if (!connect.includes("ws:")) connect.push("ws:");
|
|
413
|
+
if (!connect.includes("http:")) connect.push("http:");
|
|
414
|
+
merged["connect-src"] = connect;
|
|
415
|
+
const style = merged["style-src"] || ["'self'"];
|
|
416
|
+
if (!style.includes("'unsafe-inline'")) style.push("'unsafe-inline'");
|
|
417
|
+
merged["style-src"] = style;
|
|
418
|
+
}
|
|
419
|
+
return Object.entries(merged).map(([key, values]) => `${key} ${values.join(" ")}`).join("; ");
|
|
420
|
+
};
|
|
421
|
+
var generateNonce = () => crypto.randomBytes(16).toString("base64");
|
|
422
|
+
var createCSPHook = (options = {}) => (req, reply, done) => {
|
|
423
|
+
const nonce = generateNonce();
|
|
424
|
+
const directives = options.directives ?? DEV_CSP_DIRECTIVES;
|
|
425
|
+
const generate = options.generateCSP ?? defaultGenerateCSP;
|
|
426
|
+
const cspHeader = generate(directives, nonce);
|
|
427
|
+
reply.header("Content-Security-Policy", cspHeader);
|
|
428
|
+
if (typeof options.exposeNonce === "function") {
|
|
429
|
+
options.exposeNonce(req, nonce);
|
|
430
|
+
} else {
|
|
431
|
+
req.nonce = nonce;
|
|
432
|
+
}
|
|
433
|
+
done();
|
|
434
|
+
};
|
|
435
|
+
var applyCSP = (security, reply) => {
|
|
436
|
+
const nonce = generateNonce();
|
|
437
|
+
const directives = security?.csp?.directives ?? DEV_CSP_DIRECTIVES;
|
|
438
|
+
const generate = security?.csp?.generateCSP ?? defaultGenerateCSP;
|
|
439
|
+
const header = generate(directives, nonce);
|
|
440
|
+
reply.header("Content-Security-Policy", header);
|
|
441
|
+
reply.request.nonce = nonce;
|
|
442
|
+
return nonce;
|
|
443
|
+
};
|
|
444
|
+
|
|
445
|
+
// src/security/verifyMiddleware.ts
|
|
446
|
+
var isAuthRequired = (r) => r.attr?.middleware?.auth?.required === true;
|
|
447
|
+
var hasAuthenticate = (app) => typeof app.authenticate === "function";
|
|
448
|
+
var verifyContracts = (app, routes, contracts, isDebug) => {
|
|
449
|
+
const logger = createLogger(Boolean(isDebug));
|
|
450
|
+
for (const contract of contracts) {
|
|
451
|
+
const isUsed = routes.some(contract.required);
|
|
452
|
+
if (!isUsed) {
|
|
453
|
+
debugLog(logger, `Middleware "${contract.key}" not used in any routes`);
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
if (!contract.verify(app)) {
|
|
457
|
+
const error = new Error(`[\u03C4js] ${contract.errorMessage}`);
|
|
458
|
+
logger.error(error.message);
|
|
459
|
+
throw error;
|
|
460
|
+
}
|
|
461
|
+
debugLog(logger, `Middleware "${contract.key}" verified \u2713`);
|
|
462
|
+
}
|
|
463
|
+
};
|
|
464
|
+
|
|
465
465
|
// src/SSRServer.ts
|
|
466
466
|
var createMaps = () => {
|
|
467
467
|
return {
|
package/dist/security/csp.js
CHANGED
|
@@ -9,12 +9,21 @@ var DEV_CSP_DIRECTIVES = {
|
|
|
9
9
|
"img-src": ["'self'", "data:"]
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
+
// src/utils/Utils.ts
|
|
13
|
+
import { dirname, join } from "path";
|
|
14
|
+
import "path";
|
|
15
|
+
import { fileURLToPath } from "url";
|
|
16
|
+
import { match } from "path-to-regexp";
|
|
17
|
+
var isDevelopment = process.env.NODE_ENV === "development";
|
|
18
|
+
var __filename = fileURLToPath(import.meta.url);
|
|
19
|
+
var __dirname = join(dirname(__filename), !isDevelopment ? "./" : "..");
|
|
20
|
+
|
|
12
21
|
// src/security/csp.ts
|
|
13
22
|
var defaultGenerateCSP = (directives, nonce) => {
|
|
14
23
|
const merged = { ...directives };
|
|
15
24
|
merged["script-src"] = merged["script-src"] || ["'self'"];
|
|
16
25
|
if (!merged["script-src"].some((v) => v.startsWith("'nonce-"))) merged["script-src"].push(`'nonce-${nonce}'`);
|
|
17
|
-
if (
|
|
26
|
+
if (isDevelopment) {
|
|
18
27
|
const connect = merged["connect-src"] || ["'self'"];
|
|
19
28
|
if (!connect.includes("ws:")) connect.push("ws:");
|
|
20
29
|
if (!connect.includes("http:")) connect.push("http:");
|