rlz-engine 1.0.54 → 1.0.56
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 +225 -0
- package/dist/back/auth/admin-secret.d.ts +4 -0
- package/dist/back/auth/admin-secret.js +86 -0
- package/dist/back/auth/admin-secret.js.map +1 -0
- package/dist/back/auth/cookies.d.ts +12 -0
- package/dist/back/auth/cookies.js +20 -0
- package/dist/back/auth/cookies.js.map +1 -0
- package/dist/back/auth/csrf.d.ts +8 -0
- package/dist/back/auth/csrf.js +47 -0
- package/dist/back/auth/csrf.js.map +1 -0
- package/dist/back/auth/model.d.ts +7 -3
- package/dist/back/auth/module.d.ts +14 -0
- package/dist/back/auth/module.js +121 -0
- package/dist/back/auth/module.js.map +1 -0
- package/dist/back/auth/rate-limit.d.ts +11 -0
- package/dist/back/auth/rate-limit.js +59 -0
- package/dist/back/auth/rate-limit.js.map +1 -0
- package/dist/back/auth/session.d.ts +22 -0
- package/dist/back/auth/session.js +55 -0
- package/dist/back/auth/session.js.map +1 -0
- package/dist/back/auth/storage.d.ts +9 -9
- package/dist/back/auth/storage.js +39 -36
- package/dist/back/auth/storage.js.map +1 -1
- package/dist/back/auth/utils.d.ts +10 -8
- package/dist/back/auth/utils.js +43 -56
- package/dist/back/auth/utils.js.map +1 -1
- package/dist/back/certificate/adm-rpc.d.ts +5 -0
- package/dist/back/certificate/adm-rpc.js +52 -0
- package/dist/back/certificate/adm-rpc.js.map +1 -0
- package/dist/back/certificate/module.d.ts +13 -0
- package/dist/back/certificate/module.js +19 -0
- package/dist/back/certificate/module.js.map +1 -0
- package/dist/back/cli/cli-engine.d.ts +25 -0
- package/dist/back/cli/cli-engine.js +68 -0
- package/dist/back/cli/cli-engine.js.map +1 -0
- package/dist/back/http/ajv-formats.d.ts +2 -0
- package/dist/back/http/ajv-formats.js +14 -0
- package/dist/back/http/ajv-formats.js.map +1 -0
- package/dist/back/http/module.d.ts +7 -0
- package/dist/back/http/module.js +34 -0
- package/dist/back/http/module.js.map +1 -0
- package/dist/back/http/server.d.ts +22 -0
- package/dist/back/http/server.js +118 -0
- package/dist/back/http/server.js.map +1 -0
- package/dist/back/logger/adm-rpc.d.ts +2 -0
- package/dist/back/logger/adm-rpc.js +50 -0
- package/dist/back/logger/adm-rpc.js.map +1 -0
- package/dist/back/logger/audit-logger.d.ts +97 -0
- package/dist/back/logger/audit-logger.js +155 -0
- package/dist/back/logger/audit-logger.js.map +1 -0
- package/dist/back/logger/cli.d.ts +2 -0
- package/dist/back/logger/cli.js +43 -0
- package/dist/back/logger/cli.js.map +1 -0
- package/dist/back/logger/format.d.ts +3 -0
- package/dist/back/logger/format.js +27 -0
- package/dist/back/logger/format.js.map +1 -0
- package/dist/back/logger/module.d.ts +14 -0
- package/dist/back/logger/module.js +24 -0
- package/dist/back/logger/module.js.map +1 -0
- package/dist/back/logger/sqlite-storage.d.ts +27 -0
- package/dist/back/logger/sqlite-storage.js +169 -0
- package/dist/back/logger/sqlite-storage.js.map +1 -0
- package/dist/back/logger/system-logger.d.ts +27 -0
- package/dist/back/logger/system-logger.js +82 -0
- package/dist/back/logger/system-logger.js.map +1 -0
- package/dist/back/module/composer.d.ts +34 -0
- package/dist/back/module/composer.js +57 -0
- package/dist/back/module/composer.js.map +1 -0
- package/dist/back/rpc/gen.d.ts +2 -1
- package/dist/back/rpc/gen.js +38 -17
- package/dist/back/rpc/gen.js.map +1 -1
- package/dist/back/rpc/module.d.ts +14 -0
- package/dist/back/rpc/module.js +43 -0
- package/dist/back/rpc/module.js.map +1 -0
- package/dist/back/rpc/rpc.d.ts +53 -6
- package/dist/back/rpc/rpc.js +72 -29
- package/dist/back/rpc/rpc.js.map +1 -1
- package/dist/back/storage/db.js +5 -3
- package/dist/back/storage/db.js.map +1 -1
- package/dist/back/storage/model.d.ts +2 -2
- package/dist/back/storage/model.js +2 -2
- package/dist/back/storage/model.js.map +1 -1
- package/dist/back/storage/sync.d.ts +5 -2
- package/dist/back/storage/sync.js +1 -3
- package/dist/back/storage/sync.js.map +1 -1
- package/dist/client/adm/admin.d.ts +17 -0
- package/dist/client/adm/admin.js +62 -0
- package/dist/client/adm/admin.js.map +1 -0
- package/dist/client/adm/audit-logs.d.ts +5 -0
- package/dist/client/adm/audit-logs.js +68 -0
- package/dist/client/adm/audit-logs.js.map +1 -0
- package/dist/client/adm/certificate.d.ts +5 -0
- package/dist/client/adm/certificate.js +48 -0
- package/dist/client/adm/certificate.js.map +1 -0
- package/dist/client/config.d.ts +2 -0
- package/dist/client/config.js +7 -0
- package/dist/client/config.js.map +1 -1
- package/dist/client/rpc.d.ts +4 -4
- package/dist/client/rpc.js +19 -7
- package/dist/client/rpc.js.map +1 -1
- package/dist/client/screens/404.js.map +1 -1
- package/dist/client/screens/SignupSigninScreen.d.ts +13 -1
- package/dist/client/screens/SignupSigninScreen.js +41 -37
- package/dist/client/screens/SignupSigninScreen.js.map +1 -1
- package/dist/client/state/auth.d.ts +13 -7
- package/dist/client/state/auth.js +24 -19
- package/dist/client/state/auth.js.map +1 -1
- package/dist/client/sync.d.ts +7 -2
- package/dist/client/sync.js +5 -3
- package/dist/client/sync.js.map +1 -1
- package/dist/client/widgets/ItemsSelect.js +15 -8
- package/dist/client/widgets/ItemsSelect.js.map +1 -1
- package/package.json +87 -77
- package/dist/back/auth/controllers.d.ts +0 -7
- package/dist/back/auth/controllers.js +0 -39
- package/dist/back/auth/controllers.js.map +0 -1
- package/dist/back/esbuild-plugin-pino.d.ts +0 -6
- package/dist/back/esbuild-plugin-pino.js +0 -87
- package/dist/back/esbuild-plugin-pino.js.map +0 -1
- package/dist/back/logger.d.ts +0 -7
- package/dist/back/logger.js +0 -43
- package/dist/back/logger.js.map +0 -1
- package/dist/back/server.d.ts +0 -17
- package/dist/back/server.js +0 -94
- package/dist/back/server.js.map +0 -1
- package/dist/client/api/api.d.ts +0 -22
- package/dist/client/api/api.js +0 -87
- package/dist/client/api/api.js.map +0 -1
- package/dist/client/api/auth.d.ts +0 -5
- package/dist/client/api/auth.js +0 -22
- package/dist/client/api/auth.js.map +0 -1
- package/dist/shared/api/auth.d.ts +0 -19
- package/dist/shared/api/auth.js +0 -17
- package/dist/shared/api/auth.js.map +0 -1
- package/dist/shared/api/sync.d.ts +0 -21
- package/dist/shared/api/sync.js +0 -22
- package/dist/shared/api/sync.js.map +0 -1
package/dist/back/rpc/gen.js
CHANGED
|
@@ -2,41 +2,62 @@ import ts, { NewLineKind, ScriptKind, ScriptTarget } from 'typescript';
|
|
|
2
2
|
import { createAuxiliaryTypeStore, zodToTs } from 'zod-to-ts';
|
|
3
3
|
const F = ts.factory;
|
|
4
4
|
export function generateClient(fileName, ...rpcBuilders) {
|
|
5
|
+
return generateTypedClient(fileName, rpcBuilders, {
|
|
6
|
+
callFunction: 'rpcCall',
|
|
7
|
+
clientName: 'RPC_CLIENT',
|
|
8
|
+
importNames: ['rpcCall'],
|
|
9
|
+
endpointInfo: (builder) => builder.endpoints,
|
|
10
|
+
authParams: () => []
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export function generateAdmClient(fileName, ...rpcBuilders) {
|
|
14
|
+
return generateTypedClient(fileName, rpcBuilders, {
|
|
15
|
+
callFunction: 'admRpcCall',
|
|
16
|
+
clientName: 'ADM_RPC_CLIENT',
|
|
17
|
+
importNames: ['AdmAuthParam', 'admRpcCall'],
|
|
18
|
+
endpointInfo: (builder) => builder.endpoints,
|
|
19
|
+
authParams: () => [{ name: 'auth', type: 'AdmAuthParam' }],
|
|
20
|
+
authArgument: () => F.createIdentifier('auth')
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function generateTypedClient(fileName, rpcBuilders, options) {
|
|
5
24
|
const sourceFile = ts.createSourceFile(fileName, '', ScriptTarget.Latest, false, ScriptKind.TS);
|
|
6
25
|
const printer = ts.createPrinter({ newLine: NewLineKind.CarriageReturnLineFeed });
|
|
7
26
|
const p = (node) => {
|
|
8
27
|
return printer.printNode(ts.EmitHint.Unspecified, node, sourceFile);
|
|
9
28
|
};
|
|
10
29
|
const fileContent = [];
|
|
11
|
-
fileContent.push(p(F.createImportDeclaration(undefined, F.createImportClause(
|
|
12
|
-
F.createImportSpecifier(false, undefined, F.createIdentifier('AuthParam')),
|
|
13
|
-
F.createImportSpecifier(false, undefined, F.createIdentifier('rpcCall'))
|
|
14
|
-
])), F.createStringLiteral('rlz-engine/client/rpc.js'), undefined)));
|
|
30
|
+
fileContent.push(p(F.createImportDeclaration(undefined, F.createImportClause(undefined, undefined, F.createNamedImports(options.importNames.map((name) => F.createImportSpecifier(false, undefined, F.createIdentifier(name))))), F.createStringLiteral('rlz-engine/client/rpc.js'), undefined)));
|
|
15
31
|
for (const b of rpcBuilders) {
|
|
16
|
-
for (const e of b
|
|
32
|
+
for (const e of options.endpointInfo(b)) {
|
|
17
33
|
fileContent.push(...generateTypes(b.name, e, p));
|
|
18
34
|
}
|
|
19
35
|
}
|
|
20
36
|
const props = rpcBuilders.map((b) => {
|
|
21
|
-
const calls = b.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
37
|
+
const calls = options.endpointInfo(b).map((e) => {
|
|
38
|
+
const parameters = [
|
|
39
|
+
...options
|
|
40
|
+
.authParams(e)
|
|
41
|
+
.map(({ name, type }) => F.createParameterDeclaration(undefined, undefined, F.createIdentifier(name), undefined, F.createTypeReferenceNode(F.createIdentifier(type), undefined), undefined)),
|
|
42
|
+
F.createParameterDeclaration(undefined, undefined, F.createIdentifier('body'), undefined, F.createTypeReferenceNode(F.createIdentifier(createBodyTypeName(b.name, e)), undefined), undefined)
|
|
43
|
+
];
|
|
44
|
+
return F.createPropertyAssignment(F.createIdentifier(kebabToPascalCase(e.name)), F.createArrowFunction([F.createToken(ts.SyntaxKind.AsyncKeyword)], undefined, parameters, F.createTypeReferenceNode(F.createIdentifier('Promise'), [
|
|
45
|
+
F.createTypeReferenceNode(F.createIdentifier(createRespTypeName(b.name, e)), undefined)
|
|
46
|
+
]), F.createToken(ts.SyntaxKind.EqualsGreaterThanToken), F.createBlock([
|
|
47
|
+
F.createReturnStatement(F.createAwaitExpression(F.createCallExpression(F.createIdentifier(options.callFunction), undefined, [
|
|
48
|
+
...(options.authArgument === undefined ? [] : [options.authArgument(e)]),
|
|
31
49
|
F.createStringLiteral(b.name),
|
|
32
50
|
F.createStringLiteral(e.name),
|
|
33
51
|
F.createNumericLiteral(e.v),
|
|
34
52
|
F.createIdentifier('body')
|
|
35
|
-
])))
|
|
53
|
+
])))
|
|
54
|
+
], true)));
|
|
36
55
|
});
|
|
37
56
|
return F.createPropertyAssignment(F.createIdentifier(kebabToPascalCase(b.name)), F.createObjectLiteralExpression(calls, false));
|
|
38
57
|
});
|
|
39
|
-
const rpcClientNode = F.createVariableStatement([F.createToken(ts.SyntaxKind.ExportKeyword)], F.createVariableDeclarationList([
|
|
58
|
+
const rpcClientNode = F.createVariableStatement([F.createToken(ts.SyntaxKind.ExportKeyword)], F.createVariableDeclarationList([
|
|
59
|
+
F.createVariableDeclaration(F.createIdentifier(options.clientName), undefined, undefined, F.createObjectLiteralExpression(props, false))
|
|
60
|
+
], ts.NodeFlags.Const));
|
|
40
61
|
fileContent.push(p(rpcClientNode));
|
|
41
62
|
return fileContent.join('\n');
|
|
42
63
|
}
|
package/dist/back/rpc/gen.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gen.js","sourceRoot":"","sources":["../../../src/back/rpc/gen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACtE,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAI7D,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAA;AAEpB,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,GAAG,WAAwC;IACxF,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,EAAE,EAAE,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,CAAA;IAC/F,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,sBAAsB,EAAE,CAAC,CAAA;IACjF,MAAM,CAAC,GAAG,CAAC,IAAa,EAAE,EAAE;QACxB,OAAO,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;IACvE,CAAC,CAAA;IAED,MAAM,WAAW,GAAa,EAAE,CAAA;IAEhC,WAAW,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"gen.js","sourceRoot":"","sources":["../../../src/back/rpc/gen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CliModule } from '../cli/cli-engine.js';
|
|
2
|
+
import { AdmRpcPluginBuilder, RpcPluginBuilder } from './rpc.js';
|
|
3
|
+
/** Builders and output paths consumed by `RPC_MODULE.makeDevCli()`. */
|
|
4
|
+
export interface RpcClientCliModuleOptions {
|
|
5
|
+
rpcBuilders?: readonly RpcPluginBuilder[];
|
|
6
|
+
admRpcBuilders?: readonly AdmRpcPluginBuilder[];
|
|
7
|
+
rpcOutput?: string;
|
|
8
|
+
admRpcOutput?: string;
|
|
9
|
+
}
|
|
10
|
+
/** Development integration for generating typed clients from endpoint builders. */
|
|
11
|
+
export declare const RPC_MODULE: {
|
|
12
|
+
/** Create the development-only `rpc generate-client` command. */
|
|
13
|
+
makeDevCli(options: RpcClientCliModuleOptions): CliModule;
|
|
14
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { generateAdmClient, generateClient } from './gen.js';
|
|
4
|
+
/** Development integration for generating typed clients from endpoint builders. */
|
|
5
|
+
export const RPC_MODULE = {
|
|
6
|
+
/** Create the development-only `rpc generate-client` command. */
|
|
7
|
+
makeDevCli(options) {
|
|
8
|
+
const rpcBuilders = options.rpcBuilders ?? [];
|
|
9
|
+
const admRpcBuilders = options.admRpcBuilders ?? [];
|
|
10
|
+
if (rpcBuilders.length === 0 && admRpcBuilders.length === 0) {
|
|
11
|
+
throw new Error('RPC client generation requires at least one user or administrative RPC builder.');
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
name: 'rpc',
|
|
15
|
+
description: 'Development tools for generated RPC clients.',
|
|
16
|
+
commands: {
|
|
17
|
+
'generate-client': {
|
|
18
|
+
description: 'Generate typed RPC clients from the registered endpoint schemas.',
|
|
19
|
+
handler: async () => {
|
|
20
|
+
if (rpcBuilders.length > 0) {
|
|
21
|
+
if (options.rpcOutput === undefined) {
|
|
22
|
+
throw new Error('rpcOutput is required when user RPC builders are configured.');
|
|
23
|
+
}
|
|
24
|
+
await writeGeneratedFile(options.rpcOutput, generateClient(options.rpcOutput, ...rpcBuilders));
|
|
25
|
+
}
|
|
26
|
+
if (admRpcBuilders.length > 0) {
|
|
27
|
+
if (options.admRpcOutput === undefined) {
|
|
28
|
+
throw new Error('admRpcOutput is required when administrative RPC builders are configured.');
|
|
29
|
+
}
|
|
30
|
+
await writeGeneratedFile(options.admRpcOutput, generateAdmClient(options.admRpcOutput, ...admRpcBuilders));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
async function writeGeneratedFile(filePath, contents) {
|
|
39
|
+
const absolutePath = resolve(filePath);
|
|
40
|
+
await mkdir(dirname(absolutePath), { recursive: true });
|
|
41
|
+
await writeFile(absolutePath, `${contents}\n`, 'utf8');
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../../src/back/rpc/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAG5C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAW5D,mFAAmF;AACnF,MAAM,CAAC,MAAM,UAAU,GAAG;IACtB,iEAAiE;IACjE,UAAU,CAAC,OAAkC;QACzC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAA;QAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,EAAE,CAAA;QACnD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAA;QACtG,CAAC;QAED,OAAO;YACH,IAAI,EAAE,KAAK;YACX,WAAW,EAAE,8CAA8C;YAC3D,QAAQ,EAAE;gBACN,iBAAiB,EAAE;oBACf,WAAW,EAAE,kEAAkE;oBAC/E,OAAO,EAAE,KAAK,IAAI,EAAE;wBAChB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACzB,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gCAClC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;4BACnF,CAAC;4BACD,MAAM,kBAAkB,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,WAAW,CAAC,CAAC,CAAA;wBAClG,CAAC;wBACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC5B,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gCACrC,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAA;4BAChG,CAAC;4BACD,MAAM,kBAAkB,CAAC,OAAO,CAAC,YAAY,EAAE,iBAAiB,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,cAAc,CAAC,CAAC,CAAA;wBAC9G,CAAC;oBACL,CAAC;iBACJ;aACJ;SACJ,CAAA;IACL,CAAC;CACJ,CAAA;AAED,KAAK,UAAU,kBAAkB,CAAC,QAAgB,EAAE,QAAgB;IAChE,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACtC,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACvD,MAAM,SAAS,CAAC,YAAY,EAAE,GAAG,QAAQ,IAAI,EAAE,MAAM,CAAC,CAAA;AAC1D,CAAC"}
|
package/dist/back/rpc/rpc.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FastifyInstance, FastifyPluginOptions, RawServerBase } from 'fastify';
|
|
1
|
+
import { FastifyInstance, FastifyPluginOptions, FastifyReply, FastifyRequest, RawServerBase } from 'fastify';
|
|
2
2
|
import z from 'zod';
|
|
3
3
|
interface RpcEndpointCommon<BodyT extends object, RespT extends object> {
|
|
4
4
|
readonly v: number;
|
|
@@ -6,44 +6,91 @@ interface RpcEndpointCommon<BodyT extends object, RespT extends object> {
|
|
|
6
6
|
readonly bodySchema: z.Schema<BodyT>;
|
|
7
7
|
readonly respSchema: z.Schema<RespT>;
|
|
8
8
|
}
|
|
9
|
+
export interface RpcRequestContext {
|
|
10
|
+
request: Pick<FastifyRequest, 'headers' | 'cookies' | 'protocol' | 'ip'>;
|
|
11
|
+
reply: {
|
|
12
|
+
setCookie: (...args: Parameters<FastifyReply['setCookie']>) => void;
|
|
13
|
+
clearCookie: (...args: Parameters<FastifyReply['clearCookie']>) => void;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
9
16
|
interface RpcEndpointAnon<BodyT extends object = object, RespT extends object = object, OptsT = never> extends RpcEndpointCommon<BodyT, RespT> {
|
|
10
17
|
readonly anonimous: true;
|
|
11
18
|
readonly action: (body: {
|
|
12
19
|
[k in keyof BodyT]: BodyT[k];
|
|
13
|
-
}, opts: OptsT) => {
|
|
20
|
+
}, opts: OptsT, context: RpcRequestContext) => {
|
|
14
21
|
[k in keyof RespT]: RespT[k];
|
|
15
22
|
} | Promise<{
|
|
16
23
|
[k in keyof RespT]: RespT[k];
|
|
17
24
|
}>;
|
|
18
25
|
}
|
|
19
|
-
interface
|
|
26
|
+
interface RpcEndpointCookieAuth<BodyT extends object = object, RespT extends object = object, OptsT = never, UserT = never> extends RpcEndpointCommon<BodyT, RespT> {
|
|
20
27
|
readonly anonimous?: false;
|
|
21
|
-
|
|
28
|
+
/** Cookie authentication must include a CSRF verifier; it runs after session lookup and before the action. */
|
|
29
|
+
readonly cookieAuth: {
|
|
30
|
+
authenticate: (context: RpcRequestContext, opts: OptsT) => UserT | Promise<UserT>;
|
|
31
|
+
verifyCsrf: (context: RpcRequestContext, user: UserT, opts: OptsT) => void | Promise<void>;
|
|
32
|
+
};
|
|
22
33
|
readonly action: (user: UserT, body: {
|
|
23
34
|
[k in keyof BodyT]: BodyT[k];
|
|
24
|
-
}, opts: OptsT) => {
|
|
35
|
+
}, opts: OptsT, context: RpcRequestContext) => {
|
|
25
36
|
[k in keyof RespT]: RespT[k];
|
|
26
37
|
} | Promise<{
|
|
27
38
|
[k in keyof RespT]: RespT[k];
|
|
28
39
|
}>;
|
|
29
40
|
}
|
|
30
|
-
export type RpcEndpoint<BodyT extends object = object, RespT extends object = object, OptsT = never, UserT = never> = RpcEndpointAnon<BodyT, RespT, OptsT> |
|
|
41
|
+
export type RpcEndpoint<BodyT extends object = object, RespT extends object = object, OptsT = never, UserT = never> = RpcEndpointAnon<BodyT, RespT, OptsT> | RpcEndpointCookieAuth<BodyT, RespT, OptsT, UserT>;
|
|
31
42
|
export interface RpcEndpointInfo {
|
|
32
43
|
v: number;
|
|
33
44
|
name: string;
|
|
34
45
|
anonimous: boolean;
|
|
46
|
+
cookieAuth: boolean;
|
|
35
47
|
bodySchema: z.Schema;
|
|
36
48
|
respSchema: z.Schema;
|
|
37
49
|
}
|
|
38
50
|
interface InnerRpcEndpoint<OptsT> extends RpcEndpointInfo {
|
|
39
51
|
reg: <T extends RawServerBase>(app: FastifyInstance<T>, opts: OptsT) => void;
|
|
40
52
|
}
|
|
53
|
+
/** Collects user RPC endpoints and creates the Fastify plugin that serves them. */
|
|
41
54
|
export declare class RpcPluginBuilder<OptsT extends FastifyPluginOptions = never> {
|
|
42
55
|
readonly name: string;
|
|
43
56
|
readonly endpoints: InnerRpcEndpoint<OptsT>[];
|
|
44
57
|
constructor(name: string);
|
|
58
|
+
/** Add an endpoint; its name and version form part of the public route. */
|
|
45
59
|
add<BodyT extends object, RespT extends object, UserT>(endpoint: RpcEndpoint<BodyT, RespT, OptsT, UserT>): this;
|
|
60
|
+
/** Create a Fastify plugin that registers every endpoint currently in this builder. */
|
|
46
61
|
makeFastifyPlugin(): <T extends RawServerBase>(app: FastifyInstance<T>, opts: OptsT) => void;
|
|
47
62
|
}
|
|
48
63
|
export declare function rpc<OptsT extends FastifyPluginOptions>(name: string): RpcPluginBuilder<OptsT>;
|
|
64
|
+
export interface AdmRpcPluginOptions extends FastifyPluginOptions {
|
|
65
|
+
workingDirectory?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface AdmRpcEndpoint<BodyT extends object = object, RespT extends object = object, OptsT = never> {
|
|
68
|
+
readonly v: number;
|
|
69
|
+
readonly name: string;
|
|
70
|
+
readonly bodySchema: z.Schema<BodyT>;
|
|
71
|
+
readonly respSchema: z.Schema<RespT>;
|
|
72
|
+
readonly action: (body: {
|
|
73
|
+
[k in keyof BodyT]: BodyT[k];
|
|
74
|
+
}, opts: OptsT) => {
|
|
75
|
+
[k in keyof RespT]: RespT[k];
|
|
76
|
+
} | Promise<{
|
|
77
|
+
[k in keyof RespT]: RespT[k];
|
|
78
|
+
}>;
|
|
79
|
+
}
|
|
80
|
+
export interface AdmRpcEndpointInfo {
|
|
81
|
+
v: number;
|
|
82
|
+
name: string;
|
|
83
|
+
bodySchema: z.ZodType;
|
|
84
|
+
respSchema: z.ZodType;
|
|
85
|
+
}
|
|
86
|
+
/** Collects admin-secret-protected RPC endpoints, separate from user RPC. */
|
|
87
|
+
export declare class AdmRpcPluginBuilder<OptsT extends AdmRpcPluginOptions = AdmRpcPluginOptions> {
|
|
88
|
+
readonly name: string;
|
|
89
|
+
readonly endpoints: AdmRpcEndpoint<object, object, OptsT>[];
|
|
90
|
+
constructor(name: string);
|
|
91
|
+
/** Add an endpoint served under `/.adm/rpc/`. */
|
|
92
|
+
add<BodyT extends object, RespT extends object>(endpoint: AdmRpcEndpoint<BodyT, RespT, OptsT>): this;
|
|
93
|
+
makeFastifyPlugin(): <T extends RawServerBase>(app: FastifyInstance<T>, opts: OptsT) => void;
|
|
94
|
+
}
|
|
95
|
+
export declare function admRpc<OptsT extends AdmRpcPluginOptions = AdmRpcPluginOptions>(name: string): AdmRpcPluginBuilder<OptsT>;
|
|
49
96
|
export {};
|
package/dist/back/rpc/rpc.js
CHANGED
|
@@ -1,66 +1,65 @@
|
|
|
1
1
|
import { httpErrors } from '@fastify/sensible';
|
|
2
2
|
import fastifyPlugin from 'fastify-plugin';
|
|
3
|
+
import { verifyAdminSecret } from '../auth/admin-secret.js';
|
|
3
4
|
function makeReg(pluginName, endpoint) {
|
|
4
5
|
return {
|
|
5
6
|
v: endpoint.v,
|
|
6
7
|
name: endpoint.name,
|
|
7
8
|
anonimous: endpoint.anonimous ?? false,
|
|
9
|
+
cookieAuth: 'cookieAuth' in endpoint,
|
|
8
10
|
bodySchema: endpoint.bodySchema,
|
|
9
11
|
respSchema: endpoint.respSchema,
|
|
10
12
|
reg(app, opts) {
|
|
11
13
|
app.post(`/rpc/${pluginName}_${this.name}_v${this.v}`, {
|
|
12
14
|
schema: {
|
|
13
15
|
body: this.bodySchema.toJSONSchema({
|
|
14
|
-
target: 'draft-07'
|
|
15
|
-
// TODO: remove when https://github.com/colinhacks/zod/issues/5491 get resolved
|
|
16
|
-
override(ctx) {
|
|
17
|
-
if (ctx.path.at(-2) === 'allOf' && ctx.jsonSchema.type === 'object') {
|
|
18
|
-
delete ctx.jsonSchema.additionalProperties;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
16
|
+
target: 'draft-07'
|
|
21
17
|
}),
|
|
22
18
|
response: {
|
|
23
19
|
200: this.respSchema.toJSONSchema({
|
|
24
|
-
target: 'draft-07'
|
|
25
|
-
// TODO: remove when https://github.com/colinhacks/zod/issues/5491 get resolved
|
|
26
|
-
override(ctx) {
|
|
27
|
-
if (ctx.path.at(-2) === 'allOf' && ctx.jsonSchema.type === 'object') {
|
|
28
|
-
delete ctx.jsonSchema.additionalProperties;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
20
|
+
target: 'draft-07'
|
|
31
21
|
})
|
|
32
22
|
}
|
|
33
23
|
}
|
|
34
|
-
},
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
24
|
+
}, async (req, resp) => {
|
|
25
|
+
const context = {
|
|
26
|
+
request: req,
|
|
27
|
+
reply: {
|
|
28
|
+
setCookie: (...args) => {
|
|
29
|
+
resp.setCookie(...args);
|
|
30
|
+
},
|
|
31
|
+
clearCookie: (...args) => {
|
|
32
|
+
resp.clearCookie(...args);
|
|
33
|
+
}
|
|
44
34
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const respBody = await endpoint.action(
|
|
35
|
+
};
|
|
36
|
+
const body = req.body;
|
|
37
|
+
if (endpoint.anonimous === true) {
|
|
38
|
+
const respBody = await endpoint.action(body, opts, context);
|
|
49
39
|
await resp.send(respBody);
|
|
50
|
-
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const user = await endpoint.cookieAuth.authenticate(context, opts);
|
|
43
|
+
await endpoint.cookieAuth.verifyCsrf(context, user, opts);
|
|
44
|
+
const respBody = await endpoint.action(user, body, opts, context);
|
|
45
|
+
await resp.send(respBody);
|
|
46
|
+
});
|
|
51
47
|
}
|
|
52
48
|
};
|
|
53
49
|
}
|
|
50
|
+
/** Collects user RPC endpoints and creates the Fastify plugin that serves them. */
|
|
54
51
|
export class RpcPluginBuilder {
|
|
55
52
|
name;
|
|
56
53
|
endpoints = [];
|
|
57
54
|
constructor(name) {
|
|
58
55
|
this.name = name;
|
|
59
56
|
}
|
|
57
|
+
/** Add an endpoint; its name and version form part of the public route. */
|
|
60
58
|
add(endpoint) {
|
|
61
59
|
this.endpoints.push(makeReg(this.name, endpoint));
|
|
62
60
|
return this;
|
|
63
61
|
}
|
|
62
|
+
/** Create a Fastify plugin that registers every endpoint currently in this builder. */
|
|
64
63
|
makeFastifyPlugin() {
|
|
65
64
|
const endpoints = this.endpoints;
|
|
66
65
|
return fastifyPlugin(function makeRpcPlugin(app, opts) {
|
|
@@ -73,4 +72,48 @@ export class RpcPluginBuilder {
|
|
|
73
72
|
export function rpc(name) {
|
|
74
73
|
return new RpcPluginBuilder(name);
|
|
75
74
|
}
|
|
75
|
+
/** Collects admin-secret-protected RPC endpoints, separate from user RPC. */
|
|
76
|
+
export class AdmRpcPluginBuilder {
|
|
77
|
+
name;
|
|
78
|
+
endpoints = [];
|
|
79
|
+
constructor(name) {
|
|
80
|
+
this.name = name;
|
|
81
|
+
}
|
|
82
|
+
/** Add an endpoint served under `/.adm/rpc/`. */
|
|
83
|
+
add(endpoint) {
|
|
84
|
+
this.endpoints.push(endpoint);
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
87
|
+
makeFastifyPlugin() {
|
|
88
|
+
const endpoints = this.endpoints;
|
|
89
|
+
const pluginName = this.name;
|
|
90
|
+
return fastifyPlugin(function makeAdmRpcPlugin(app, opts) {
|
|
91
|
+
for (const endpoint of endpoints) {
|
|
92
|
+
app.post(`/.adm/rpc/${pluginName}_${endpoint.name}_v${endpoint.v}`, {
|
|
93
|
+
schema: {
|
|
94
|
+
body: endpoint.bodySchema.toJSONSchema({
|
|
95
|
+
target: 'draft-07'
|
|
96
|
+
}),
|
|
97
|
+
response: {
|
|
98
|
+
200: endpoint.respSchema.toJSONSchema({
|
|
99
|
+
target: 'draft-07'
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}, async (req, resp) => {
|
|
104
|
+
const authHeader = req.headers.authorization;
|
|
105
|
+
const match = authHeader === undefined ? null : /^Bearer\s+(.+)$/i.exec(authHeader);
|
|
106
|
+
if (match === null || !(await verifyAdminSecret(match[1], opts.workingDirectory))) {
|
|
107
|
+
throw httpErrors.forbidden();
|
|
108
|
+
}
|
|
109
|
+
const response = await endpoint.action(req.body, opts);
|
|
110
|
+
await resp.send(response);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export function admRpc(name) {
|
|
117
|
+
return new AdmRpcPluginBuilder(name);
|
|
118
|
+
}
|
|
76
119
|
//# sourceMappingURL=rpc.js.map
|
package/dist/back/rpc/rpc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../src/back/rpc/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,aAAa,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../src/back/rpc/rpc.ts"],"names":[],"mappings":"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"}
|
package/dist/back/storage/db.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { MongoClient } from 'mongodb';
|
|
2
|
-
import {
|
|
2
|
+
import { getSystemLogger } from '../logger/system-logger.js';
|
|
3
3
|
export class MongoStorage {
|
|
4
4
|
logger;
|
|
5
5
|
client;
|
|
6
6
|
dbName;
|
|
7
7
|
constructor(db) {
|
|
8
|
-
this.logger =
|
|
8
|
+
this.logger = getSystemLogger('MongoStorage');
|
|
9
9
|
this.dbName = db;
|
|
10
10
|
this.client = new MongoClient('mongodb://localhost');
|
|
11
11
|
}
|
|
@@ -16,10 +16,12 @@ export class MongoStorage {
|
|
|
16
16
|
await this.db.createCollection(name);
|
|
17
17
|
}
|
|
18
18
|
async createIndexes(collection, indexes) {
|
|
19
|
-
this.logger.info({ indexes: indexes?.map(i => i.name) ?? null, collection: collection.collectionName }, 'Configured indexes');
|
|
19
|
+
this.logger.info({ indexes: indexes?.map((i) => i.name) ?? null, collection: collection.collectionName }, 'Configured indexes');
|
|
20
20
|
const knownIndexes = await this.listIndexes(collection);
|
|
21
21
|
this.logger.info({ indexes: Array.from(knownIndexes), collection: collection.collectionName }, 'Known indexes');
|
|
22
22
|
knownIndexes.delete('_id_');
|
|
23
|
+
// The configured list is the desired state: stale application indexes are removed,
|
|
24
|
+
// then missing indexes are created below.
|
|
23
25
|
const indexesToCreate = [];
|
|
24
26
|
for (const index of indexes) {
|
|
25
27
|
if (knownIndexes.has(index.name)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/back/storage/db.ts"],"names":[],"mappings":"AACA,OAAO,EAA8C,WAAW,EAAE,MAAM,SAAS,CAAA;AAEjF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/back/storage/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,9 +6,9 @@ export interface MongoObject<T> {
|
|
|
6
6
|
data: T;
|
|
7
7
|
}
|
|
8
8
|
export declare const SYNC_OBJECT_SCHEMA: z.ZodObject<{
|
|
9
|
-
_id: z.
|
|
9
|
+
_id: z.ZodUUID;
|
|
10
10
|
data: z.ZodObject<{
|
|
11
|
-
lastModified: z.
|
|
11
|
+
lastModified: z.ZodISODateTime;
|
|
12
12
|
}, z.core.$strip>;
|
|
13
13
|
}, z.core.$strip>;
|
|
14
14
|
export interface SyncObject<T> {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/back/storage/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AASvB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,GAAG,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/back/storage/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AASvB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE;IACb,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACX,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;KACjC,CAAC;CACL,CAAC,CAAA"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { DateTime } from 'luxon';
|
|
2
2
|
import { Collection } from 'mongodb';
|
|
3
|
-
import { ApiComparisonObjectV0 } from '../../shared/api/sync.js';
|
|
4
3
|
import { SyncObject } from './model.js';
|
|
5
|
-
export
|
|
4
|
+
export interface SyncComparisonObject {
|
|
5
|
+
id: string;
|
|
6
|
+
lastModified: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function getAll<T>(c: Collection<SyncObject<T>>, ownerId: string, syncAfter?: DateTime<true>): Promise<SyncComparisonObject[]>;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { SYNC_OBJECT_SCHEMA } from './model.js';
|
|
2
2
|
export async function getAll(c, ownerId, syncAfter) {
|
|
3
3
|
const items = [];
|
|
4
|
-
const query = syncAfter === undefined
|
|
5
|
-
? { ownerId }
|
|
6
|
-
: { ownerId, syncDate: { $gt: syncAfter.toJSDate() } };
|
|
4
|
+
const query = syncAfter === undefined ? { ownerId } : { ownerId, syncDate: { $gt: syncAfter.toJSDate() } };
|
|
7
5
|
const cursor = c.find(query).project({ 'data.lastModified': 1 });
|
|
8
6
|
for await (const op of cursor) {
|
|
9
7
|
const parsed = SYNC_OBJECT_SCHEMA.parse(op);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/back/storage/sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/back/storage/sync.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAc,MAAM,YAAY,CAAA;AAO3D,MAAM,CAAC,KAAK,UAAU,MAAM,CACxB,CAA4B,EAC5B,OAAe,EACf,SAA0B;IAE1B,MAAM,KAAK,GAA2B,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAA;IAC1G,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC,CAAA;IAChE,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAC3C,KAAK,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,MAAM,CAAC,GAAG;YACd,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY;SACzC,CAAC,CAAA;IACN,CAAC;IACD,OAAO,KAAK,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React, { type ComponentType, type ReactNode } from 'react';
|
|
2
|
+
import type { AdmAuthParam } from '../rpc.js';
|
|
3
|
+
export interface AdmModule {
|
|
4
|
+
/** Stable unique name used for navigation. */
|
|
5
|
+
name: string;
|
|
6
|
+
title: string;
|
|
7
|
+
component: ComponentType<{
|
|
8
|
+
auth: AdmAuthParam;
|
|
9
|
+
}>;
|
|
10
|
+
verify: (auth: AdmAuthParam) => Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare function AdminApp({ modules }: {
|
|
13
|
+
modules: readonly AdmModule[];
|
|
14
|
+
}): React.JSX.Element;
|
|
15
|
+
export declare function AdmPanel({ children }: {
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
}): React.JSX.Element;
|