viyv-db-server 0.1.0 → 0.2.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/dist/dev-server-cli.js +8 -2
- package/dist/dev-server-cli.js.map +1 -1
- package/dist/dev-server.d.ts +1 -0
- package/dist/dev-server.d.ts.map +1 -1
- package/dist/dev-server.js +20 -6
- package/dist/dev-server.js.map +1 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -8
- package/dist/index.js.map +1 -1
- package/dist/sliding-window-rate-limiter.d.ts +19 -0
- package/dist/sliding-window-rate-limiter.d.ts.map +1 -0
- package/dist/sliding-window-rate-limiter.js +60 -0
- package/dist/sliding-window-rate-limiter.js.map +1 -0
- package/dist/tenant-pool.d.ts +13 -0
- package/dist/tenant-pool.d.ts.map +1 -1
- package/dist/tenant-pool.js +67 -3
- package/dist/tenant-pool.js.map +1 -1
- package/package.json +41 -38
- package/LICENSE +0 -21
package/dist/dev-server-cli.js
CHANGED
|
@@ -5,6 +5,7 @@ let postgresUrl;
|
|
|
5
5
|
let port;
|
|
6
6
|
let embeddingEnabled = false;
|
|
7
7
|
let embeddingModel;
|
|
8
|
+
let maxBodySizeBytes;
|
|
8
9
|
for (let i = 0; i < args.length; i++) {
|
|
9
10
|
if (args[i] === '--postgres-url')
|
|
10
11
|
postgresUrl = args[++i];
|
|
@@ -14,10 +15,15 @@ for (let i = 0; i < args.length; i++) {
|
|
|
14
15
|
embeddingEnabled = true;
|
|
15
16
|
if (args[i] === '--embedding-model')
|
|
16
17
|
embeddingModel = args[++i];
|
|
18
|
+
if (args[i] === '--max-body-size')
|
|
19
|
+
maxBodySizeBytes = Number(args[++i]);
|
|
17
20
|
}
|
|
18
21
|
postgresUrl ??= process.env.VIYV_DB_POSTGRES_URL;
|
|
22
|
+
if (!maxBodySizeBytes && process.env.VIYV_DB_MAX_BODY_SIZE) {
|
|
23
|
+
maxBodySizeBytes = Number(process.env.VIYV_DB_MAX_BODY_SIZE);
|
|
24
|
+
}
|
|
19
25
|
if (!postgresUrl) {
|
|
20
|
-
process.stderr.write('Usage: dev-server --postgres-url <url> [--port <port>] [--embedding] [--embedding-model <model>]\n');
|
|
26
|
+
process.stderr.write('Usage: dev-server --postgres-url <url> [--port <port>] [--embedding] [--embedding-model <model>] [--max-body-size <bytes>]\n');
|
|
21
27
|
process.exit(1);
|
|
22
28
|
}
|
|
23
29
|
let embeddingProvider;
|
|
@@ -25,5 +31,5 @@ if (embeddingEnabled) {
|
|
|
25
31
|
const { TransformersEmbeddingProvider } = await import('viyv-db-embedding');
|
|
26
32
|
embeddingProvider = await TransformersEmbeddingProvider.create(embeddingModel);
|
|
27
33
|
}
|
|
28
|
-
startDevServer({ postgresUrl, port, embeddingProvider });
|
|
34
|
+
startDevServer({ postgresUrl, port, embeddingProvider, maxBodySizeBytes });
|
|
29
35
|
//# sourceMappingURL=dev-server-cli.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server-cli.js","sourceRoot":"","sources":["../src/dev-server-cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,WAA+B,CAAC;AACpC,IAAI,IAAwB,CAAC;AAC7B,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAC7B,IAAI,cAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"dev-server-cli.js","sourceRoot":"","sources":["../src/dev-server-cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,WAA+B,CAAC;AACpC,IAAI,IAAwB,CAAC;AAC7B,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAC7B,IAAI,cAAkC,CAAC;AACvC,IAAI,gBAAoC,CAAC;AAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;IACtC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,gBAAgB;QAAE,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;QAAE,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa;QAAE,gBAAgB,GAAG,IAAI,CAAC;IACvD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,mBAAmB;QAAE,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,iBAAiB;QAAE,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,WAAW,KAAK,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;AACjD,IAAI,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;IAC5D,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAC9D,CAAC;AAED,IAAI,CAAC,WAAW,EAAE,CAAC;IAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,8HAA8H,CAC9H,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,IAAI,iBAAiD,CAAC;AACtD,IAAI,gBAAgB,EAAE,CAAC;IACtB,MAAM,EAAE,6BAA6B,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC5E,iBAAiB,GAAG,MAAM,6BAA6B,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAChF,CAAC;AAED,cAAc,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC,CAAC"}
|
package/dist/dev-server.d.ts
CHANGED
package/dist/dev-server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../src/dev-server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../src/dev-server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAoCvD,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,IAAI,CA+DP"}
|
package/dist/dev-server.js
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import { createServer } from 'node:http';
|
|
2
|
-
import { createViyvHandler } from './index.js';
|
|
3
|
-
function readBody(req) {
|
|
2
|
+
import { DEFAULT_MAX_BODY_SIZE_BYTES, createViyvHandler } from './index.js';
|
|
3
|
+
function readBody(req, maxBytes) {
|
|
4
4
|
return new Promise((resolve, reject) => {
|
|
5
5
|
const chunks = [];
|
|
6
|
-
|
|
6
|
+
let totalBytes = 0;
|
|
7
|
+
req.on('data', (chunk) => {
|
|
8
|
+
totalBytes += chunk.length;
|
|
9
|
+
if (totalBytes > maxBytes) {
|
|
10
|
+
req.destroy();
|
|
11
|
+
reject(new Error(`Request body exceeds ${maxBytes} bytes`));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
chunks.push(chunk);
|
|
15
|
+
});
|
|
7
16
|
req.on('end', () => resolve(Buffer.concat(chunks).toString()));
|
|
8
17
|
req.on('error', reject);
|
|
9
18
|
});
|
|
@@ -23,10 +32,12 @@ function toWebRequest(req, body) {
|
|
|
23
32
|
});
|
|
24
33
|
}
|
|
25
34
|
export function startDevServer(config) {
|
|
35
|
+
const maxBodySize = config.maxBodySizeBytes ?? DEFAULT_MAX_BODY_SIZE_BYTES;
|
|
26
36
|
const { handler, close } = createViyvHandler({
|
|
27
37
|
postgresUrl: config.postgresUrl,
|
|
28
38
|
resolveAuth: async () => ({ userId: 'dev', accessLevel: 'schema' }),
|
|
29
39
|
embeddingProvider: config.embeddingProvider,
|
|
40
|
+
maxBodySizeBytes: maxBodySize,
|
|
30
41
|
});
|
|
31
42
|
const port = config.port ?? 3001;
|
|
32
43
|
const server = createServer(async (req, res) => {
|
|
@@ -45,7 +56,7 @@ export function startDevServer(config) {
|
|
|
45
56
|
return;
|
|
46
57
|
}
|
|
47
58
|
try {
|
|
48
|
-
const body = await readBody(req);
|
|
59
|
+
const body = await readBody(req, maxBodySize);
|
|
49
60
|
const webReq = toWebRequest(req, body);
|
|
50
61
|
const webRes = await handler(webReq);
|
|
51
62
|
const resHeaders = {};
|
|
@@ -56,8 +67,11 @@ export function startDevServer(config) {
|
|
|
56
67
|
res.end(await webRes.text());
|
|
57
68
|
}
|
|
58
69
|
catch (error) {
|
|
59
|
-
|
|
60
|
-
|
|
70
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
71
|
+
const isPayloadTooLarge = message.includes('Request body exceeds');
|
|
72
|
+
const status = isPayloadTooLarge ? 413 : 500;
|
|
73
|
+
res.writeHead(status, { 'Content-Type': 'application/json' });
|
|
74
|
+
res.end(JSON.stringify({ error: message }));
|
|
61
75
|
}
|
|
62
76
|
});
|
|
63
77
|
server.listen(port, () => {
|
package/dist/dev-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../src/dev-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../src/dev-server.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IAccessPolicy, IAuthProvider, IEmbeddingProvider, ITenantResolver } from 'viyv-db-core';
|
|
1
|
+
import type { IAccessPolicy, IAuthProvider, IEmbeddingProvider, IRateLimiter, ITenantResolver } from 'viyv-db-core';
|
|
2
2
|
import type { ResolvedAuth } from './auth-adapter.js';
|
|
3
3
|
export { TenantPool } from './tenant-pool.js';
|
|
4
4
|
export type { TenantPoolConfig } from './tenant-pool.js';
|
|
@@ -7,6 +7,8 @@ export { serializeError } from './error-serializer.js';
|
|
|
7
7
|
export { startDevServer } from './dev-server.js';
|
|
8
8
|
export { extractCredentials, toAuthContext } from './auth-adapter.js';
|
|
9
9
|
export type { ResolvedAuth } from './auth-adapter.js';
|
|
10
|
+
export { SlidingWindowRateLimiter } from './sliding-window-rate-limiter.js';
|
|
11
|
+
export type { SlidingWindowRateLimiterConfig } from './sliding-window-rate-limiter.js';
|
|
10
12
|
export interface ViyvHandlerConfig {
|
|
11
13
|
postgresUrl: string;
|
|
12
14
|
resolveAuth: (req: Request) => Promise<ResolvedAuth>;
|
|
@@ -18,7 +20,14 @@ export interface ViyvHandlerConfig {
|
|
|
18
20
|
tenantResolver?: ITenantResolver;
|
|
19
21
|
accessPolicy?: IAccessPolicy;
|
|
20
22
|
embeddingProvider?: IEmbeddingProvider;
|
|
23
|
+
schemaIsolation?: boolean;
|
|
24
|
+
maxBodySizeBytes?: number;
|
|
25
|
+
poolMin?: number;
|
|
26
|
+
poolMax?: number;
|
|
27
|
+
embeddingDimensions?: number;
|
|
28
|
+
rateLimiter?: IRateLimiter;
|
|
21
29
|
}
|
|
30
|
+
export declare const DEFAULT_MAX_BODY_SIZE_BYTES: number;
|
|
22
31
|
export interface ViyvHandlerResult {
|
|
23
32
|
handler: (req: Request) => Promise<Response>;
|
|
24
33
|
close: () => Promise<void>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIX,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,MAAM,cAAc,CAAC;AAStB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIX,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,MAAM,cAAc,CAAC;AAStB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,YAAY,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAqBvF,MAAM,WAAW,iBAAiB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,YAAY,CAAC;CAC3B;AAED,eAAO,MAAM,2BAA2B,QAAmB,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAYD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAkH9E"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,7 @@ export { handleRpc } from './handler.js';
|
|
|
7
7
|
export { serializeError } from './error-serializer.js';
|
|
8
8
|
export { startDevServer } from './dev-server.js';
|
|
9
9
|
export { extractCredentials, toAuthContext } from './auth-adapter.js';
|
|
10
|
+
export { SlidingWindowRateLimiter } from './sliding-window-rate-limiter.js';
|
|
10
11
|
/** RPC method → required access level mapping */
|
|
11
12
|
const METHOD_ACCESS = {
|
|
12
13
|
getSchema: 'read',
|
|
@@ -25,8 +26,9 @@ const METHOD_ACCESS = {
|
|
|
25
26
|
importCsv: 'schema',
|
|
26
27
|
semanticSearch: 'read',
|
|
27
28
|
};
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
export const DEFAULT_MAX_BODY_SIZE_BYTES = 10 * 1024 * 1024; // 10MB
|
|
30
|
+
function errorResponse(code, message, name, status, headers) {
|
|
31
|
+
return Response.json({ ok: false, error: { code, message, name } }, { status, headers });
|
|
30
32
|
}
|
|
31
33
|
/**
|
|
32
34
|
* Creates a Web API standard handler (Request → Response) for viyv-db RPC.
|
|
@@ -42,13 +44,24 @@ export function createViyvHandler(config) {
|
|
|
42
44
|
maxTenants: config.maxTenants,
|
|
43
45
|
maxIdleMs: config.maxIdleMs,
|
|
44
46
|
embeddingProvider: config.embeddingProvider,
|
|
47
|
+
schemaIsolation: config.schemaIsolation,
|
|
48
|
+
poolMin: config.poolMin,
|
|
49
|
+
poolMax: config.poolMax,
|
|
50
|
+
embeddingDimensions: config.embeddingDimensions,
|
|
45
51
|
});
|
|
46
52
|
pool.startCleanup();
|
|
47
53
|
const tenantResolver = config.tenantResolver ?? new UserTenantResolver();
|
|
48
54
|
const accessPolicy = config.accessPolicy ?? new StaticAccessPolicy('schema');
|
|
55
|
+
const maxBodySize = config.maxBodySizeBytes ?? DEFAULT_MAX_BODY_SIZE_BYTES;
|
|
56
|
+
const rateLimiter = config.rateLimiter;
|
|
49
57
|
const handler = async (req) => {
|
|
50
58
|
try {
|
|
51
|
-
// 1.
|
|
59
|
+
// 1. Body size check (Content-Length ヘッダによる事前拒否)
|
|
60
|
+
const contentLength = req.headers.get('content-length');
|
|
61
|
+
if (contentLength && Number.parseInt(contentLength, 10) > maxBodySize) {
|
|
62
|
+
return errorResponse('PAYLOAD_TOO_LARGE', `Request body exceeds ${maxBodySize} bytes`, 'PayloadTooLargeError', 413);
|
|
63
|
+
}
|
|
64
|
+
// 2. Resolve auth via callback or custom provider
|
|
52
65
|
let authContext;
|
|
53
66
|
if (config.authProvider) {
|
|
54
67
|
const credentials = extractCredentials(req);
|
|
@@ -64,9 +77,16 @@ export function createViyvHandler(config) {
|
|
|
64
77
|
}
|
|
65
78
|
authContext = toAuthContext(resolvedAuth);
|
|
66
79
|
}
|
|
67
|
-
//
|
|
80
|
+
// 3. Resolve tenant
|
|
68
81
|
const tenantId = tenantResolver.resolve(authContext);
|
|
69
|
-
//
|
|
82
|
+
// 4. Rate limit check (per-tenant)
|
|
83
|
+
if (rateLimiter) {
|
|
84
|
+
const rlDecision = await rateLimiter.check(tenantId);
|
|
85
|
+
if (!rlDecision.allowed) {
|
|
86
|
+
return errorResponse('RATE_LIMIT_EXCEEDED', `Rate limit exceeded (limit: ${rlDecision.limit} requests/window). Retry after ${rlDecision.retryAfterMs}ms`, 'RateLimitError', 429, { 'Retry-After': String(Math.ceil(rlDecision.retryAfterMs / 1000)) });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// 5. Parse RPC request
|
|
70
90
|
let body;
|
|
71
91
|
try {
|
|
72
92
|
body = (await req.json());
|
|
@@ -74,7 +94,7 @@ export function createViyvHandler(config) {
|
|
|
74
94
|
catch {
|
|
75
95
|
return errorResponse('INVALID_REQUEST', 'Invalid JSON body', 'Error', 400);
|
|
76
96
|
}
|
|
77
|
-
//
|
|
97
|
+
// 6. Access policy check
|
|
78
98
|
const requiredAccess = METHOD_ACCESS[body.method] ?? 'schema';
|
|
79
99
|
const decision = accessPolicy.check(authContext, {
|
|
80
100
|
name: body.method,
|
|
@@ -83,7 +103,7 @@ export function createViyvHandler(config) {
|
|
|
83
103
|
if (!decision.allowed) {
|
|
84
104
|
return errorResponse('AUTHORIZATION_DENIED', decision.reason, 'AuthorizationError', 403);
|
|
85
105
|
}
|
|
86
|
-
//
|
|
106
|
+
// 7. Get tenant service and dispatch
|
|
87
107
|
const service = await pool.forTenant(tenantId);
|
|
88
108
|
const result = await handleRpc(service, body);
|
|
89
109
|
return Response.json(result, { status: result.ok ? 200 : 400 });
|
|
@@ -99,6 +119,14 @@ export function createViyvHandler(config) {
|
|
|
99
119
|
return errorResponse('INTERNAL_ERROR', message, 'Error', 500);
|
|
100
120
|
}
|
|
101
121
|
};
|
|
102
|
-
|
|
122
|
+
const close = async () => {
|
|
123
|
+
if (rateLimiter &&
|
|
124
|
+
'close' in rateLimiter &&
|
|
125
|
+
typeof rateLimiter.close === 'function') {
|
|
126
|
+
rateLimiter.close();
|
|
127
|
+
}
|
|
128
|
+
await pool.close();
|
|
129
|
+
};
|
|
130
|
+
return { handler, close };
|
|
103
131
|
}
|
|
104
132
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { IRateLimiter, RateLimitDecision } from 'viyv-db-core';
|
|
2
|
+
export interface SlidingWindowRateLimiterConfig {
|
|
3
|
+
/** Maximum requests per window */
|
|
4
|
+
maxRequests: number;
|
|
5
|
+
/** Window size in milliseconds */
|
|
6
|
+
windowMs: number;
|
|
7
|
+
/** Cleanup interval in milliseconds (default: 60000) */
|
|
8
|
+
cleanupIntervalMs?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class SlidingWindowRateLimiter implements IRateLimiter {
|
|
11
|
+
private readonly config;
|
|
12
|
+
private readonly windows;
|
|
13
|
+
private readonly cleanupTimer;
|
|
14
|
+
constructor(config: SlidingWindowRateLimiterConfig);
|
|
15
|
+
check(key: string): Promise<RateLimitDecision>;
|
|
16
|
+
close(): void;
|
|
17
|
+
private cleanup;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=sliding-window-rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sliding-window-rate-limiter.d.ts","sourceRoot":"","sources":["../src/sliding-window-rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,WAAW,8BAA8B;IAC9C,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,wBAAyB,YAAW,YAAY;IAIhD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiC;gBAEjC,MAAM,EAAE,8BAA8B;IAS7D,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkCpD,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,OAAO;CAaf"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export class SlidingWindowRateLimiter {
|
|
2
|
+
config;
|
|
3
|
+
windows = new Map();
|
|
4
|
+
cleanupTimer;
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.config = config;
|
|
7
|
+
this.cleanupTimer = setInterval(() => {
|
|
8
|
+
this.cleanup();
|
|
9
|
+
}, config.cleanupIntervalMs ?? 60_000);
|
|
10
|
+
if (this.cleanupTimer.unref) {
|
|
11
|
+
this.cleanupTimer.unref();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
async check(key) {
|
|
15
|
+
const now = Date.now();
|
|
16
|
+
const windowStart = now - this.config.windowMs;
|
|
17
|
+
let timestamps = this.windows.get(key);
|
|
18
|
+
if (!timestamps) {
|
|
19
|
+
timestamps = [];
|
|
20
|
+
this.windows.set(key, timestamps);
|
|
21
|
+
}
|
|
22
|
+
// Prune timestamps outside the window
|
|
23
|
+
const filtered = timestamps.filter((t) => t > windowStart);
|
|
24
|
+
this.windows.set(key, filtered);
|
|
25
|
+
if (filtered.length >= this.config.maxRequests) {
|
|
26
|
+
const retryAfterMs = filtered[0] + this.config.windowMs - now;
|
|
27
|
+
return {
|
|
28
|
+
allowed: false,
|
|
29
|
+
retryAfterMs: Math.max(retryAfterMs, 1),
|
|
30
|
+
limit: this.config.maxRequests,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
filtered.push(now);
|
|
34
|
+
const remaining = this.config.maxRequests - filtered.length;
|
|
35
|
+
const resetMs = filtered[0] + this.config.windowMs - now;
|
|
36
|
+
return {
|
|
37
|
+
allowed: true,
|
|
38
|
+
remaining,
|
|
39
|
+
resetMs: Math.max(resetMs, 0),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
close() {
|
|
43
|
+
clearInterval(this.cleanupTimer);
|
|
44
|
+
this.windows.clear();
|
|
45
|
+
}
|
|
46
|
+
cleanup() {
|
|
47
|
+
const now = Date.now();
|
|
48
|
+
const windowStart = now - this.config.windowMs;
|
|
49
|
+
for (const [key, timestamps] of this.windows) {
|
|
50
|
+
const filtered = timestamps.filter((t) => t > windowStart);
|
|
51
|
+
if (filtered.length === 0) {
|
|
52
|
+
this.windows.delete(key);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this.windows.set(key, filtered);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=sliding-window-rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sliding-window-rate-limiter.js","sourceRoot":"","sources":["../src/sliding-window-rate-limiter.ts"],"names":[],"mappings":"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"}
|
package/dist/tenant-pool.d.ts
CHANGED
|
@@ -6,6 +6,10 @@ export interface TenantPoolConfig {
|
|
|
6
6
|
maxTenants?: number;
|
|
7
7
|
maxIdleMs?: number;
|
|
8
8
|
embeddingProvider?: IEmbeddingProvider;
|
|
9
|
+
schemaIsolation?: boolean;
|
|
10
|
+
poolMin?: number;
|
|
11
|
+
poolMax?: number;
|
|
12
|
+
embeddingDimensions?: number;
|
|
9
13
|
}
|
|
10
14
|
export declare class TenantPool implements IDatabaseServiceFactory {
|
|
11
15
|
private readonly config;
|
|
@@ -14,8 +18,17 @@ export declare class TenantPool implements IDatabaseServiceFactory {
|
|
|
14
18
|
private readonly maxTenants;
|
|
15
19
|
private readonly maxIdleMs;
|
|
16
20
|
private cleanupTimer;
|
|
21
|
+
private shared;
|
|
22
|
+
private initPromise;
|
|
23
|
+
private notifier;
|
|
17
24
|
constructor(config: TenantPoolConfig);
|
|
18
25
|
forTenant(tenantId: string): Promise<IDatabaseService>;
|
|
26
|
+
/**
|
|
27
|
+
* Lazily initialize the shared pool. Uses Promise caching to ensure
|
|
28
|
+
* concurrent calls only create one pool and run global init once.
|
|
29
|
+
*/
|
|
30
|
+
private ensureSharedPool;
|
|
31
|
+
private initSharedPool;
|
|
19
32
|
private createService;
|
|
20
33
|
close(): Promise<void>;
|
|
21
34
|
startCleanup(intervalMs?: number): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-pool.d.ts","sourceRoot":"","sources":["../src/tenant-pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"tenant-pool.d.ts","sourceRoot":"","sources":["../src/tenant-pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAclG,MAAM,WAAW,gBAAgB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAOD,qBAAa,UAAW,YAAW,uBAAuB;IAY7C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAXnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IACxE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,YAAY,CAA+C;IAGnE,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,WAAW,CAA6C;IAChE,OAAO,CAAC,QAAQ,CAA+B;gBAElB,MAAM,EAAE,gBAAgB;IAK/C,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwB5D;;;OAGG;IACH,OAAO,CAAC,gBAAgB;YAWV,cAAc;YA6Bd,aAAa;IAsCrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B,YAAY,CAAC,UAAU,SAAS,GAAG,IAAI;YAUzB,QAAQ;YAcR,SAAS;CAavB"}
|
package/dist/tenant-pool.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { createPostgresService } from 'viyv-db-postgres';
|
|
2
|
-
const DEFAULT_MAX_TENANTS =
|
|
1
|
+
import { SchemaNotifier, createDb, createPostgresService, initializeGlobalSchema, } from 'viyv-db-postgres';
|
|
2
|
+
const DEFAULT_MAX_TENANTS = 500;
|
|
3
3
|
const DEFAULT_MAX_IDLE_MS = 10 * 60 * 1000; // 10 minutes
|
|
4
|
+
const DEFAULT_POOL_MIN = 2;
|
|
5
|
+
const DEFAULT_POOL_MAX = 20;
|
|
4
6
|
export class TenantPool {
|
|
5
7
|
config;
|
|
6
8
|
cache = new Map();
|
|
@@ -8,6 +10,10 @@ export class TenantPool {
|
|
|
8
10
|
maxTenants;
|
|
9
11
|
maxIdleMs;
|
|
10
12
|
cleanupTimer = null;
|
|
13
|
+
// Shared pool resources (for schemaIsolation=false)
|
|
14
|
+
shared = null;
|
|
15
|
+
initPromise = null;
|
|
16
|
+
notifier = null;
|
|
11
17
|
constructor(config) {
|
|
12
18
|
this.config = config;
|
|
13
19
|
this.maxTenants = config.maxTenants ?? DEFAULT_MAX_TENANTS;
|
|
@@ -34,6 +40,42 @@ export class TenantPool {
|
|
|
34
40
|
this.pending.delete(tenantId);
|
|
35
41
|
}
|
|
36
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Lazily initialize the shared pool. Uses Promise caching to ensure
|
|
45
|
+
* concurrent calls only create one pool and run global init once.
|
|
46
|
+
*/
|
|
47
|
+
ensureSharedPool() {
|
|
48
|
+
if (!this.initPromise) {
|
|
49
|
+
this.initPromise = this.initSharedPool().catch((err) => {
|
|
50
|
+
// Reset so next call retries instead of permanently failing
|
|
51
|
+
this.initPromise = null;
|
|
52
|
+
throw err;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return this.initPromise;
|
|
56
|
+
}
|
|
57
|
+
async initSharedPool() {
|
|
58
|
+
const { db, pool } = createDb(this.config.postgresUrl, this.config.poolMin ?? DEFAULT_POOL_MIN, this.config.poolMax ?? DEFAULT_POOL_MAX);
|
|
59
|
+
await initializeGlobalSchema(db, {
|
|
60
|
+
embeddingDimensions: this.config.embeddingProvider
|
|
61
|
+
? (this.config.embeddingDimensions ?? 384)
|
|
62
|
+
: undefined,
|
|
63
|
+
});
|
|
64
|
+
this.shared = { pool, db };
|
|
65
|
+
// Start cross-process schema change listener (non-blocking — failure is not fatal)
|
|
66
|
+
this.notifier = new SchemaNotifier(this.config.postgresUrl);
|
|
67
|
+
this.notifier
|
|
68
|
+
.start((tenantId) => {
|
|
69
|
+
const entry = this.cache.get(tenantId);
|
|
70
|
+
if (entry && 'invalidateCache' in entry.service) {
|
|
71
|
+
entry.service.invalidateCache();
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
.catch(() => {
|
|
75
|
+
// LISTEN connection failed — cooldown-based refresh remains as fallback
|
|
76
|
+
});
|
|
77
|
+
return this.shared;
|
|
78
|
+
}
|
|
37
79
|
async createService(tenantId) {
|
|
38
80
|
// Evict LRU if at capacity
|
|
39
81
|
if (this.cache.size >= this.maxTenants) {
|
|
@@ -49,8 +91,19 @@ export class TenantPool {
|
|
|
49
91
|
poolMin: 1,
|
|
50
92
|
poolMax: 3,
|
|
51
93
|
insertBatchSize: 2000,
|
|
94
|
+
schemaIsolation: this.config.schemaIsolation ?? false,
|
|
52
95
|
};
|
|
53
|
-
|
|
96
|
+
let service;
|
|
97
|
+
if (this.config.schemaIsolation) {
|
|
98
|
+
// schemaIsolation=true: per-tenant pool (existing behavior)
|
|
99
|
+
// Each tenant schema has its own system tables; shared pool not applicable
|
|
100
|
+
service = await createPostgresService(pgConfig, this.config.embeddingProvider);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// schemaIsolation=false: shared pool
|
|
104
|
+
const shared = await this.ensureSharedPool();
|
|
105
|
+
service = await createPostgresService(pgConfig, this.config.embeddingProvider, shared);
|
|
106
|
+
}
|
|
54
107
|
this.cache.set(tenantId, {
|
|
55
108
|
service,
|
|
56
109
|
lastUsedAt: Date.now(),
|
|
@@ -62,9 +115,20 @@ export class TenantPool {
|
|
|
62
115
|
clearInterval(this.cleanupTimer);
|
|
63
116
|
this.cleanupTimer = null;
|
|
64
117
|
}
|
|
118
|
+
// Close schema change listener
|
|
119
|
+
if (this.notifier) {
|
|
120
|
+
await this.notifier.close();
|
|
121
|
+
this.notifier = null;
|
|
122
|
+
}
|
|
65
123
|
const closing = Array.from(this.cache.values()).map((entry) => entry.service.close());
|
|
66
124
|
this.cache.clear();
|
|
67
125
|
await Promise.all(closing);
|
|
126
|
+
// Close the shared pool (pool owner responsibility)
|
|
127
|
+
if (this.shared) {
|
|
128
|
+
await this.shared.pool.end();
|
|
129
|
+
this.shared = null;
|
|
130
|
+
this.initPromise = null;
|
|
131
|
+
}
|
|
68
132
|
}
|
|
69
133
|
startCleanup(intervalMs = 60_000) {
|
|
70
134
|
this.cleanupTimer = setInterval(() => {
|
package/dist/tenant-pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-pool.js","sourceRoot":"","sources":["../src/tenant-pool.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"tenant-pool.js","sourceRoot":"","sources":["../src/tenant-pool.ts"],"names":[],"mappings":"AACA,OAAO,EACN,cAAc,EACd,QAAQ,EACR,qBAAqB,EACrB,sBAAsB,GACtB,MAAM,kBAAkB,CAAC;AAqB1B,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AACzD,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,MAAM,OAAO,UAAU;IAYO;IAXZ,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IACrC,OAAO,GAAG,IAAI,GAAG,EAAqC,CAAC;IACvD,UAAU,CAAS;IACnB,SAAS,CAAS;IAC3B,YAAY,GAA0C,IAAI,CAAC;IAEnE,oDAAoD;IAC5C,MAAM,GAA+B,IAAI,CAAC;IAC1C,WAAW,GAAwC,IAAI,CAAC;IACxD,QAAQ,GAA0B,IAAI,CAAC;IAE/C,YAA6B,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;QACpD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,mBAAmB,CAAC;QAC3D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,mBAAmB,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC/B,YAAY;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAC,OAAO,CAAC;QACzB,CAAC;QAED,wDAAwD;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,QAAQ,EAAE,CAAC;YACd,OAAO,QAAQ,CAAC;QACjB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEpC,IAAI,CAAC;YACJ,OAAO,MAAM,OAAO,CAAC;QACtB,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;IACF,CAAC;IAED;;;OAGG;IACK,gBAAgB;QACvB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACtD,4DAA4D;gBAC5D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBACxB,MAAM,GAAG,CAAC;YACX,CAAC,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,cAAc;QAC3B,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,QAAQ,CAC5B,IAAI,CAAC,MAAM,CAAC,WAAW,EACvB,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,gBAAgB,EACvC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,gBAAgB,CACvC,CAAC;QACF,MAAM,sBAAsB,CAAC,EAAE,EAAE;YAChC,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;gBACjD,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,GAAG,CAAC;gBAC1C,CAAC,CAAC,SAAS;SACZ,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAE3B,mFAAmF;QACnF,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ;aACX,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,KAAK,IAAI,iBAAiB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChD,KAAK,CAAC,OAA2C,CAAC,eAAe,EAAE,CAAC;YACtE,CAAC;QACF,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACX,wEAAwE;QACzE,CAAC,CAAC,CAAC;QAEJ,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,QAAgB;QAC3C,2BAA2B;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvB,CAAC;QAED,MAAM,QAAQ,GAAmB;YAChC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,QAAQ;YACR,WAAW,EAAE,QAAQ;YACrB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI;YACtC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM;YACpD,cAAc,EAAE,IAAI;YACpB,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,KAAK;SACrD,CAAC;QAEF,IAAI,OAAyB,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YACjC,4DAA4D;YAC5D,2EAA2E;YAC3E,OAAO,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACP,qCAAqC;YACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC7C,OAAO,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QACxF,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;YACxB,OAAO;YACP,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,KAAK;QACV,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,+BAA+B;QAC/B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACtF,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE3B,oDAAoD;QACpD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACzB,CAAC;IACF,CAAC;IAED,YAAY,CAAC,UAAU,GAAG,MAAM;QAC/B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;YACpC,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,CAAC,EAAE,UAAU,CAAC,CAAC;QACf,2BAA2B;QAC3B,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,QAAQ;QACrB,IAAI,MAAM,GAAyC,IAAI,CAAC;QACxD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC/C,MAAM,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;YAC1C,CAAC;QACF,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAC9B,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,SAAS;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAoB,EAAE,CAAC;QAEpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,GAAG,GAAG,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC7C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACrC,CAAC;QACF,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;CACD"}
|
package/package.json
CHANGED
|
@@ -1,39 +1,42 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
2
|
+
"name": "viyv-db-server",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Server library for hosting viyv-db as an HTTP endpoint",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "viyv",
|
|
8
|
+
"engines": { "node": ">=20" },
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"types": "dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"development": "./src/index.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"default": "./dist/index.js"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": ["dist", "!dist/__tests__"],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"clean": "rm -rf dist"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"viyv-db-core": "workspace:*",
|
|
34
|
+
"viyv-db-postgres": "workspace:*",
|
|
35
|
+
"zod": "^3.23.0"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"typescript": "^5.7.0",
|
|
39
|
+
"vitest": "^2.1.0",
|
|
40
|
+
"viyv-db-embedding": "workspace:*"
|
|
41
|
+
}
|
|
42
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 viyv
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|