@undefineds.co/xpod 0.2.5 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/cloud.json +1 -1
- package/dist/api/chatkit/ai-provider.js +4 -3
- package/dist/api/chatkit/ai-provider.js.map +1 -1
- package/dist/api/chatkit/default-agent.js +8 -7
- package/dist/api/chatkit/default-agent.js.map +1 -1
- package/dist/api/chatkit/runtime/PtyThreadRuntime.js +2 -1
- package/dist/api/chatkit/runtime/PtyThreadRuntime.js.map +1 -1
- package/dist/api/handlers/AdminHandler.js +1 -1
- package/dist/api/handlers/AdminHandler.js.map +1 -1
- package/dist/api/handlers/EdgeNodeSignalHandler.js +2 -27
- package/dist/api/handlers/EdgeNodeSignalHandler.js.map +1 -1
- package/dist/api/handlers/NodeHandler.js +17 -158
- package/dist/api/handlers/NodeHandler.js.map +1 -1
- package/dist/api/service/VercelChatService.js +23 -23
- package/dist/api/service/VercelChatService.js.map +1 -1
- package/dist/api/service/platform-ai-config.d.ts +8 -0
- package/dist/api/service/platform-ai-config.js +64 -0
- package/dist/api/service/platform-ai-config.js.map +1 -0
- package/dist/cli/commands/start.js +1 -2
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/components/context.jsonld +3 -0
- package/dist/http/TracingHandler.js +2 -0
- package/dist/http/TracingHandler.js.map +1 -1
- package/dist/identity/drizzle/DrizzleIndexedStorage.d.ts +10 -1
- package/dist/identity/drizzle/DrizzleIndexedStorage.js +99 -6
- package/dist/identity/drizzle/DrizzleIndexedStorage.js.map +1 -1
- package/dist/identity/drizzle/DrizzleIndexedStorage.jsonld +36 -0
- package/dist/identity/drizzle/EdgeNodeRepository.d.ts +3 -4
- package/dist/identity/drizzle/EdgeNodeRepository.js +10 -37
- package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -1
- package/dist/identity/drizzle/db.js +13 -2
- package/dist/identity/drizzle/db.js.map +1 -1
- package/dist/identity/drizzle/schema.pg.js +0 -1
- package/dist/identity/drizzle/schema.pg.js.map +1 -1
- package/dist/identity/drizzle/schema.sqlite.d.ts +0 -19
- package/dist/identity/drizzle/schema.sqlite.js +0 -1
- package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
- package/dist/main.js +1 -2
- package/dist/main.js.map +1 -1
- package/dist/provision/ProvisionPodCreator.d.ts +1 -0
- package/dist/provision/ProvisionPodCreator.js +25 -2
- package/dist/provision/ProvisionPodCreator.js.map +1 -1
- package/dist/provision/ProvisionPodCreator.jsonld +4 -0
- package/dist/runtime/bootstrap.js +4 -4
- package/dist/runtime/bootstrap.js.map +1 -1
- package/dist/storage/MetadataRequestContext.d.ts +13 -0
- package/dist/storage/MetadataRequestContext.js +6 -0
- package/dist/storage/MetadataRequestContext.js.map +1 -0
- package/dist/storage/NodeSqliteDrizzle.js +19 -5
- package/dist/storage/NodeSqliteDrizzle.js.map +1 -1
- package/dist/storage/accessors/MinioDataAccessor.d.ts +1 -0
- package/dist/storage/accessors/MinioDataAccessor.js +25 -2
- package/dist/storage/accessors/MinioDataAccessor.js.map +1 -1
- package/dist/storage/accessors/MinioDataAccessor.jsonld +4 -0
- package/dist/storage/accessors/MixDataAccessor.d.ts +3 -1
- package/dist/storage/accessors/MixDataAccessor.js +61 -23
- package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
- package/dist/storage/accessors/MixDataAccessor.jsonld +23 -0
- package/dist/supervisor/Supervisor.js +1 -1
- package/dist/supervisor/Supervisor.js.map +1 -1
- package/package.json +1 -1
- package/static/app/assets/index.css +1 -1
- package/static/app/assets/main.js +50 -10
- package/static/dashboard/assets/{dashboard-BfmT5Vc8.js → dashboard-CTk9cn1-.js} +8 -8
- package/static/dashboard/assets/dashboard-VQRsvXx9.css +1 -0
- package/static/dashboard/dashboard.html +2 -2
- package/static/dashboard/assets/dashboard-DkZOr7bV.css +0 -1
|
@@ -22,8 +22,7 @@ class ProvisionPodCreator extends community_server_1.BasePodCreator {
|
|
|
22
22
|
async handle(input) {
|
|
23
23
|
const provisionCode = input.settings?.provisionCode;
|
|
24
24
|
if (!provisionCode) {
|
|
25
|
-
|
|
26
|
-
return super.handle(input);
|
|
25
|
+
return this.handleStandardPodCreate(input);
|
|
27
26
|
}
|
|
28
27
|
// SP 模式:解码 provisionCode,回调远端 SP
|
|
29
28
|
const payload = this.codec.decode(provisionCode);
|
|
@@ -79,6 +78,30 @@ class ProvisionPodCreator extends community_server_1.BasePodCreator {
|
|
|
79
78
|
webIdLink,
|
|
80
79
|
};
|
|
81
80
|
}
|
|
81
|
+
async handleStandardPodCreate(input) {
|
|
82
|
+
const totalStarted = Date.now();
|
|
83
|
+
const baseIdentifier = this.generateBaseIdentifier(input.name);
|
|
84
|
+
const webId = input.webId ?? `${baseIdentifier.path}${this.relativeWebIdPath}`;
|
|
85
|
+
const podSettings = {
|
|
86
|
+
...input.settings,
|
|
87
|
+
base: baseIdentifier,
|
|
88
|
+
webId,
|
|
89
|
+
};
|
|
90
|
+
const webIdStarted = Date.now();
|
|
91
|
+
const webIdLink = await this.handleWebId(!input.webId, webId, input.accountId, podSettings);
|
|
92
|
+
const webIdElapsed = Date.now() - webIdStarted;
|
|
93
|
+
const podStarted = Date.now();
|
|
94
|
+
const podId = await this.createPod(input.accountId, podSettings, !input.name, webIdLink);
|
|
95
|
+
const podElapsed = Date.now() - podStarted;
|
|
96
|
+
const totalElapsed = Date.now() - totalStarted;
|
|
97
|
+
this.provisionLogger.info(`[timing] ProvisionPodCreator.standard account=${input.accountId} pod=${baseIdentifier.path} handleWebId=${webIdElapsed}ms createPod=${podElapsed}ms total=${totalElapsed}ms`);
|
|
98
|
+
return {
|
|
99
|
+
podUrl: baseIdentifier.path,
|
|
100
|
+
webId,
|
|
101
|
+
podId,
|
|
102
|
+
webIdLink,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
82
105
|
}
|
|
83
106
|
exports.ProvisionPodCreator = ProvisionPodCreator;
|
|
84
107
|
//# sourceMappingURL=ProvisionPodCreator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProvisionPodCreator.js","sourceRoot":"","sources":["../../src/provision/ProvisionPodCreator.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,iEAAqD;AACrD,8DAKiC;AACjC,6DAA0D;AAO1D,MAAa,mBAAoB,SAAQ,iCAAc;IAIrD,YAAmB,IAA6B;QAC9C,KAAK,CAAC,IAAI,CAAC,CAAC;QAJG,oBAAe,GAAG,IAAA,oCAAY,EAAC,IAAI,CAAC,CAAC;QAKpD,IAAI,CAAC,KAAK,GAAG,IAAI,uCAAkB,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7E,CAAC;IAEe,KAAK,CAAC,MAAM,CAAC,KAAsB;QACjD,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,EAAE,aAAmC,CAAC;QAE1E,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,
|
|
1
|
+
{"version":3,"file":"ProvisionPodCreator.js","sourceRoot":"","sources":["../../src/provision/ProvisionPodCreator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ProvisionPodCreator\n *\n * 等位替换 CSS 的 BasePodCreator。\n *\n * 检查 settings 里有没有 provisionCode:\n * - 有 → 解码 JWT,回调远端 SP 的 /provision/pods 创建 Pod\n * - 没有 → 委托给原始 BasePodCreator(标准本地创建)\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport {\n BasePodCreator,\n type PodCreatorInput,\n type PodCreatorOutput,\n type BasePodCreatorArgs,\n} from '@solid/community-server';\nimport { ProvisionCodeCodec } from './ProvisionCodeCodec';\n\nexport interface ProvisionPodCreatorArgs extends BasePodCreatorArgs {\n /** 与 ProvisionHandler 使用相同的 baseUrl 派生签名密钥 */\n provisionBaseUrl?: string;\n}\n\nexport class ProvisionPodCreator extends BasePodCreator {\n private readonly provisionLogger = getLoggerFor(this);\n private readonly codec: ProvisionCodeCodec;\n\n public constructor(args: ProvisionPodCreatorArgs) {\n super(args);\n this.codec = new ProvisionCodeCodec(args.provisionBaseUrl ?? args.baseUrl);\n }\n\n public override async handle(input: PodCreatorInput): Promise<PodCreatorOutput> {\n const provisionCode = input.settings?.provisionCode as string | undefined;\n\n if (!provisionCode) {\n return this.handleStandardPodCreate(input);\n }\n\n // SP 模式:解码 provisionCode,回调远端 SP\n const payload = this.codec.decode(provisionCode);\n if (!payload) {\n throw new Error('Invalid or expired provisionCode');\n }\n\n this.provisionLogger.info(`Provisioning pod on remote SP: ${payload.spUrl}`);\n\n // 1. 确定 podName\n const podName = input.name;\n if (!podName) {\n throw new Error('Pod name is required for remote provisioning');\n }\n\n // 2. 回调 SP 创建 Pod\n const callbackUrl = `${payload.spUrl.replace(/\\/$/, '')}/provision/pods`;\n const spResponse = await fetch(callbackUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${payload.serviceToken}`,\n },\n body: JSON.stringify({ podName }),\n });\n\n if (!spResponse.ok) {\n const errBody = await spResponse.text();\n this.provisionLogger.error(`SP callback failed: ${spResponse.status} ${errBody}`);\n throw new Error(`Failed to create pod on SP: ${spResponse.status}`);\n }\n\n const spResult = await spResponse.json() as { podUrl?: string };\n\n // storage URL 优先用 Cloud 分配的子域名,回调用实际地址\n const storageBase = payload.spDomain\n ? `https://${payload.spDomain}`\n : payload.spUrl.replace(/\\/$/, '');\n const podUrl = spResult.podUrl || `${storageBase}/${podName}/`;\n\n // 3. 生成 WebID(指向 Cloud,storage 指向 SP)\n const webId = input.webId ?? `${this.baseUrl}${podName}/profile/card#me`;\n\n // 4. 链接 WebID 到账户 + 在本地 PodStore 记录\n // base.path 必须在 Cloud 的 identifier space 内(CSS PodStore 会检查),\n // 所以用 Cloud 本地路径;真实的 SP storage URL 通过 podUrl 返回。\n const localBase = this.identifierGenerator.generate(podName);\n const podSettings = {\n ...input.settings,\n base: localBase,\n webId,\n oidcIssuer: this.baseUrl,\n };\n\n const webIdLink = await this.handleWebId(!input.webId, webId, input.accountId, podSettings);\n const podId = await this.createPod(input.accountId, podSettings, !input.name, webIdLink);\n\n this.provisionLogger.info(`Provisioned pod ${podName} on SP ${payload.spUrl}, podUrl: ${podUrl}`);\n\n return {\n podUrl,\n webId,\n podId,\n webIdLink,\n };\n }\n\n private async handleStandardPodCreate(input: PodCreatorInput): Promise<PodCreatorOutput> {\n const totalStarted = Date.now();\n const baseIdentifier = this.generateBaseIdentifier(input.name);\n const webId = input.webId ?? `${baseIdentifier.path}${this.relativeWebIdPath}`;\n const podSettings = {\n ...input.settings,\n base: baseIdentifier,\n webId,\n };\n\n const webIdStarted = Date.now();\n const webIdLink = await this.handleWebId(!input.webId, webId, input.accountId, podSettings);\n const webIdElapsed = Date.now() - webIdStarted;\n\n const podStarted = Date.now();\n const podId = await this.createPod(input.accountId, podSettings, !input.name, webIdLink);\n const podElapsed = Date.now() - podStarted;\n const totalElapsed = Date.now() - totalStarted;\n\n this.provisionLogger.info(\n `[timing] ProvisionPodCreator.standard account=${input.accountId} pod=${baseIdentifier.path} handleWebId=${webIdElapsed}ms createPod=${podElapsed}ms total=${totalElapsed}ms`,\n );\n\n return {\n podUrl: baseIdentifier.path,\n webId,\n podId,\n webIdLink,\n };\n }\n}\n"]}
|
|
@@ -68,6 +68,10 @@
|
|
|
68
68
|
{
|
|
69
69
|
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator__member_handle",
|
|
70
70
|
"memberFieldName": "handle"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"@id": "undefineds:dist/provision/ProvisionPodCreator.jsonld#ProvisionPodCreator__member_handleStandardPodCreate",
|
|
74
|
+
"memberFieldName": "handleStandardPodCreate"
|
|
71
75
|
}
|
|
72
76
|
],
|
|
73
77
|
"constructorArguments": [
|
|
@@ -156,10 +156,10 @@ function buildRuntimeShorthand(runtimeEnv, options, state, baseEnv = NodeRuntime
|
|
|
156
156
|
['redisClient', envValue('CSS_REDIS_CLIENT')],
|
|
157
157
|
['redisUsername', envValue('CSS_REDIS_USERNAME')],
|
|
158
158
|
['redisPassword', envValue('CSS_REDIS_PASSWORD')],
|
|
159
|
-
['emailConfigHost', envValue('CSS_EMAIL_CONFIG_HOST')],
|
|
160
|
-
['emailConfigPort', envValue('CSS_EMAIL_CONFIG_PORT')],
|
|
161
|
-
['emailConfigAuthUser', envValue('CSS_EMAIL_CONFIG_AUTH_USER')],
|
|
162
|
-
['emailConfigAuthPass', envValue('CSS_EMAIL_CONFIG_AUTH_PASS')],
|
|
159
|
+
['emailConfigHost', envValue('CSS_EMAIL_CONFIG_HOST') ?? ''],
|
|
160
|
+
['emailConfigPort', envValue('CSS_EMAIL_CONFIG_PORT') ?? '587'],
|
|
161
|
+
['emailConfigAuthUser', envValue('CSS_EMAIL_CONFIG_AUTH_USER') ?? ''],
|
|
162
|
+
['emailConfigAuthPass', envValue('CSS_EMAIL_CONFIG_AUTH_PASS') ?? ''],
|
|
163
163
|
['idpUrl', envValue('CSS_IDP_URL') ?? envValue('XPOD_CLOUD_API_ENDPOINT')],
|
|
164
164
|
['allowedHosts', envValue('CSS_ALLOWED_HOSTS')],
|
|
165
165
|
['nodeId', envValue('XPOD_NODE_ID')],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/runtime/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["import { setGlobalLoggerFactory } from 'global-logger-factory';\nimport path from 'node:path';\nimport { ConfigurableLoggerFactory } from '../logging/ConfigurableLoggerFactory';\nimport { PACKAGE_ROOT } from './package-root';\nimport type { RuntimeHost } from './host/types';\nimport { nodeRuntimePlatform } from './platform/node/NodeRuntimePlatform';\nimport type { RuntimePlatform } from './platform/types';\nimport type { XpodRuntimeOptions, XpodRuntimePorts, XpodRuntimeSockets } from './runtime-types';\n\nexport interface RuntimeBootstrapState {\n id: string;\n host: RuntimeHost;\n mode: 'local' | 'cloud';\n transport: 'socket' | 'port';\n bindHost: string;\n runtimeRoot: string;\n rootFilePath: string;\n sparqlEndpoint: string;\n identityDbUrl: string;\n usageDbUrl: string;\n cssAuthMode: 'acp' | 'acl' | 'allow-all';\n apiOpen: boolean;\n logLevel: string;\n baseUrl: string;\n envFilePath?: string;\n ports: XpodRuntimePorts;\n sockets: XpodRuntimeSockets;\n}\n\nfunction ensureTrailingSlash(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n}\n\nfunction normalizeWindowsAbsolutePath(filePath: string): string {\n return filePath.replace(/^[\\\\/]+(?=[A-Za-z]:[\\\\/])/, '');\n}\n\nfunction isWindowsAbsolutePath(filePath: string): boolean {\n return /^[A-Za-z]:[\\\\/]/.test(normalizeWindowsAbsolutePath(filePath));\n}\n\nfunction getWindowsDriveRoot(filePath: string): string | undefined {\n const normalizedPath = normalizeWindowsAbsolutePath(filePath);\n return isWindowsAbsolutePath(normalizedPath) ? path.win32.parse(normalizedPath).root.toLowerCase() : undefined;\n}\n\nfunction arePathsOnDifferentWindowsDrives(firstPath: string, secondPath: string): boolean {\n const firstRoot = getWindowsDriveRoot(firstPath);\n const secondRoot = getWindowsDriveRoot(secondPath);\n return Boolean(firstRoot && secondRoot && firstRoot !== secondRoot);\n}\n\nfunction toWindowsFileUrl(filePath: string): string {\n const normalizedPath = normalizeWindowsAbsolutePath(filePath).replace(/\\\\/g, '/');\n return new URL(`file:///${normalizedPath}`).href;\n}\n\nfunction toConfigImportSpecifier(fromFilePath: string, toFilePath: string): string {\n const normalizedFromPath = normalizeWindowsAbsolutePath(fromFilePath);\n const normalizedToPath = normalizeWindowsAbsolutePath(toFilePath);\n const useWindowsPaths = isWindowsAbsolutePath(normalizedFromPath) || isWindowsAbsolutePath(normalizedToPath);\n const pathApi = useWindowsPaths ? path.win32 : path.posix;\n const fromDirectoryPath = pathApi.dirname(useWindowsPaths ? normalizedFromPath : fromFilePath);\n const targetPath = useWindowsPaths ? normalizedToPath : toFilePath;\n\n if (useWindowsPaths && arePathsOnDifferentWindowsDrives(fromDirectoryPath, targetPath)) {\n return toWindowsFileUrl(targetPath);\n }\n\n const relativePath = pathApi.relative(fromDirectoryPath, targetPath).replace(/\\\\/g, '/');\n if (relativePath.startsWith('./') || relativePath.startsWith('../')) {\n return relativePath;\n }\n return `./${relativePath}`;\n}\n\nfunction withDefinedEntries(entries: Array<[string, string | number | boolean | undefined]>): Record<string, string | number | boolean> {\n const result: Record<string, string | number | boolean> = {};\n for (const [key, value] of entries) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction normalizeDatabaseUrl(\n value: string,\n platform: Pick<RuntimePlatform, 'resolvePath'> = nodeRuntimePlatform,\n): string {\n if (\n value.startsWith('sqlite:') ||\n value.startsWith('postgres://') ||\n value.startsWith('postgresql://') ||\n value.startsWith('mysql://')\n ) {\n return value;\n }\n return `sqlite:${platform.resolvePath(value)}`;\n}\n\nexport async function resolveRuntimeBootstrap(\n id: string,\n options: XpodRuntimeOptions,\n host: RuntimeHost,\n platform: RuntimePlatform = nodeRuntimePlatform,\n): Promise<RuntimeBootstrapState> {\n const mode = options.mode ?? 'local';\n const transport = host.resolveTransport(options.transport);\n const bindHost = options.bindHost ?? '127.0.0.1';\n const runtimeRoot = platform.resolvePath(options.runtimeRoot ?? platform.joinPath(platform.cwd(), '.test-data', 'xpod-runtime', id));\n const rootFilePath = platform.resolvePath(options.rootFilePath ?? platform.joinPath(runtimeRoot, 'data'));\n const sparqlEndpoint = normalizeDatabaseUrl(options.sparqlEndpoint ?? platform.joinPath(runtimeRoot, 'quadstore.sqlite'), platform);\n const identityDbUrl = normalizeDatabaseUrl(options.identityDbUrl ?? platform.joinPath(runtimeRoot, 'identity.sqlite'), platform);\n const usageDbUrl = normalizeDatabaseUrl(options.usageDbUrl ?? platform.joinPath(runtimeRoot, 'usage.sqlite'), platform);\n const cssAuthMode = options.authMode ?? (options.open ? 'allow-all' : 'acp');\n const apiOpen = options.apiOpen ?? options.open ?? false;\n const logLevel = options.logLevel ?? platform.getEnv('CSS_LOGGING_LEVEL') ?? 'warn';\n\n platform.ensureDir(runtimeRoot);\n platform.ensureDir(rootFilePath);\n\n const socketsRoot = platform.joinPath(runtimeRoot, 'sockets');\n if (transport === 'socket') {\n platform.ensureDir(socketsRoot);\n }\n const ports: XpodRuntimePorts = transport === 'port'\n ? await host.allocatePorts({\n gatewayPort: options.gatewayPort,\n cssPort: options.cssPort,\n apiPort: options.apiPort,\n basePort: 5600,\n })\n : {};\n const sockets: XpodRuntimeSockets = {};\n\n if (transport === 'socket') {\n sockets.gateway = platform.resolvePath(options.gatewaySocketPath ?? platform.joinPath(socketsRoot, 'gateway.sock'));\n sockets.css = platform.resolvePath(options.cssSocketPath ?? platform.joinPath(socketsRoot, 'css.sock'));\n sockets.api = platform.resolvePath(options.apiSocketPath ?? platform.joinPath(socketsRoot, 'api.sock'));\n }\n\n const baseUrl = ensureTrailingSlash(\n options.baseUrl ?? (transport === 'socket'\n ? 'http://localhost'\n : `http://${bindHost}:${ports.gateway}`),\n );\n\n return {\n id,\n host,\n mode,\n transport,\n bindHost,\n runtimeRoot,\n rootFilePath,\n sparqlEndpoint,\n identityDbUrl,\n usageDbUrl,\n cssAuthMode,\n apiOpen,\n logLevel,\n baseUrl,\n envFilePath: options.envFile ? platform.resolvePath(options.envFile) : undefined,\n ports,\n sockets,\n };\n}\n\nexport function buildRuntimeEnv(\n state: RuntimeBootstrapState,\n options: XpodRuntimeOptions,\n envFromFile: Record<string, string | undefined> = {},\n): Record<string, string | undefined> {\n return {\n ...envFromFile,\n ...options.env,\n XPOD_ENV_PATH: state.envFilePath,\n XPOD_EDITION: state.mode,\n CSS_BASE_URL: state.baseUrl,\n CSS_TOKEN_ENDPOINT: `${state.baseUrl}.oidc/token`,\n CSS_ROOT_FILE_PATH: state.rootFilePath,\n CSS_IDENTITY_DB_URL: state.identityDbUrl,\n DATABASE_URL: state.identityDbUrl,\n CSS_PORT: state.ports.css !== undefined ? String(state.ports.css) : undefined,\n API_PORT: state.ports.api !== undefined ? String(state.ports.api) : undefined,\n API_HOST: state.bindHost,\n API_SOCKET_PATH: state.sockets.api,\n XPOD_MAIN_PORT: state.ports.gateway !== undefined ? String(state.ports.gateway) : undefined,\n CORS_ORIGINS: new URL(state.baseUrl).origin,\n CSS_LOGGING_LEVEL: state.logLevel,\n };\n}\n\nexport function buildRuntimeShorthand(\n runtimeEnv: Record<string, string | undefined>,\n options: XpodRuntimeOptions,\n state: RuntimeBootstrapState,\n baseEnv: Record<string, string | undefined> = nodeRuntimePlatform.baseEnv,\n): Record<string, string | number | boolean> {\n const envValue = (key: string): string | undefined => runtimeEnv[key] ?? baseEnv[key];\n\n return {\n ...withDefinedEntries([\n ['baseStorageDomain', envValue('CSS_BASE_STORAGE_DOMAIN')],\n ['minioAccessKey', envValue('CSS_MINIO_ACCESS_KEY')],\n ['minioSecretKey', envValue('CSS_MINIO_SECRET_KEY')],\n ['minioEndpoint', envValue('CSS_MINIO_ENDPOINT')],\n ['minioBucketName', envValue('CSS_MINIO_BUCKET_NAME')],\n ['redisClient', envValue('CSS_REDIS_CLIENT')],\n ['redisUsername', envValue('CSS_REDIS_USERNAME')],\n ['redisPassword', envValue('CSS_REDIS_PASSWORD')],\n ['emailConfigHost', envValue('CSS_EMAIL_CONFIG_HOST')],\n ['emailConfigPort', envValue('CSS_EMAIL_CONFIG_PORT')],\n ['emailConfigAuthUser', envValue('CSS_EMAIL_CONFIG_AUTH_USER')],\n ['emailConfigAuthPass', envValue('CSS_EMAIL_CONFIG_AUTH_PASS')],\n ['idpUrl', envValue('CSS_IDP_URL') ?? envValue('XPOD_CLOUD_API_ENDPOINT')],\n ['allowedHosts', envValue('CSS_ALLOWED_HOSTS')],\n ['nodeId', envValue('XPOD_NODE_ID')],\n ['nodeToken', envValue('XPOD_NODE_TOKEN')],\n ['serviceToken', envValue('XPOD_SERVICE_TOKEN')],\n ]),\n baseUrl: state.baseUrl,\n rootFilePath: state.rootFilePath,\n sparqlEndpoint: state.sparqlEndpoint,\n identityDbUrl: state.identityDbUrl,\n usageDbUrl: state.usageDbUrl,\n logLevel: state.logLevel,\n authMode: state.cssAuthMode,\n edition: state.mode === 'cloud' ? 'server' : 'local',\n edgeNodesEnabled: options.edgeNodesEnabled ?? false,\n centerRegistrationEnabled: options.centerRegistrationEnabled ?? false,\n ...(options.shorthand ?? {}),\n };\n}\n\nexport function createCssRuntimeConfig(\n state: RuntimeBootstrapState,\n open: boolean,\n platform: Pick<RuntimePlatform, 'dirname' | 'ensureDir' | 'joinPath' | 'writeTextFile'> = nodeRuntimePlatform,\n): string {\n const configPath = normalizeWindowsAbsolutePath(platform.joinPath(PACKAGE_ROOT, `config/${state.mode}.json`));\n if (!open) {\n return configPath;\n }\n\n const runtimeRoot = normalizeWindowsAbsolutePath(state.runtimeRoot);\n const runtimeConfigPath = arePathsOnDifferentWindowsDrives(runtimeRoot, configPath)\n ? (() => {\n const runtimeConfigDir = normalizeWindowsAbsolutePath(platform.joinPath(\n platform.dirname(configPath),\n '..',\n '.xpod-runtime',\n state.id,\n ));\n platform.ensureDir(runtimeConfigDir);\n return normalizeWindowsAbsolutePath(platform.joinPath(runtimeConfigDir, 'css-runtime.config.json'));\n })()\n : normalizeWindowsAbsolutePath(platform.joinPath(runtimeRoot, 'css-runtime.config.json'));\n const openConfigPath = normalizeWindowsAbsolutePath(platform.joinPath(PACKAGE_ROOT, 'config/runtime-open.json'));\n platform.writeTextFile(runtimeConfigPath, JSON.stringify({\n '@context': [\n 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld',\n 'https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld',\n ],\n import: [\n toConfigImportSpecifier(runtimeConfigPath, configPath),\n toConfigImportSpecifier(runtimeConfigPath, openConfigPath),\n ],\n }, null, 2));\n\n return runtimeConfigPath;\n}\n\nexport function initRuntimeLogger(\n level: string,\n platform: Pick<RuntimePlatform, 'cwd' | 'joinPath'> = nodeRuntimePlatform,\n): void {\n const loggerFactory = new ConfigurableLoggerFactory(level, {\n fileName: platform.joinPath(platform.cwd(), 'logs/xpod-%DATE%.log'),\n showLocation: true,\n });\n setGlobalLoggerFactory(loggerFactory);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/runtime/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["import { setGlobalLoggerFactory } from 'global-logger-factory';\nimport path from 'node:path';\nimport { ConfigurableLoggerFactory } from '../logging/ConfigurableLoggerFactory';\nimport { PACKAGE_ROOT } from './package-root';\nimport type { RuntimeHost } from './host/types';\nimport { nodeRuntimePlatform } from './platform/node/NodeRuntimePlatform';\nimport type { RuntimePlatform } from './platform/types';\nimport type { XpodRuntimeOptions, XpodRuntimePorts, XpodRuntimeSockets } from './runtime-types';\n\nexport interface RuntimeBootstrapState {\n id: string;\n host: RuntimeHost;\n mode: 'local' | 'cloud';\n transport: 'socket' | 'port';\n bindHost: string;\n runtimeRoot: string;\n rootFilePath: string;\n sparqlEndpoint: string;\n identityDbUrl: string;\n usageDbUrl: string;\n cssAuthMode: 'acp' | 'acl' | 'allow-all';\n apiOpen: boolean;\n logLevel: string;\n baseUrl: string;\n envFilePath?: string;\n ports: XpodRuntimePorts;\n sockets: XpodRuntimeSockets;\n}\n\nfunction ensureTrailingSlash(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n}\n\nfunction normalizeWindowsAbsolutePath(filePath: string): string {\n return filePath.replace(/^[\\\\/]+(?=[A-Za-z]:[\\\\/])/, '');\n}\n\nfunction isWindowsAbsolutePath(filePath: string): boolean {\n return /^[A-Za-z]:[\\\\/]/.test(normalizeWindowsAbsolutePath(filePath));\n}\n\nfunction getWindowsDriveRoot(filePath: string): string | undefined {\n const normalizedPath = normalizeWindowsAbsolutePath(filePath);\n return isWindowsAbsolutePath(normalizedPath) ? path.win32.parse(normalizedPath).root.toLowerCase() : undefined;\n}\n\nfunction arePathsOnDifferentWindowsDrives(firstPath: string, secondPath: string): boolean {\n const firstRoot = getWindowsDriveRoot(firstPath);\n const secondRoot = getWindowsDriveRoot(secondPath);\n return Boolean(firstRoot && secondRoot && firstRoot !== secondRoot);\n}\n\nfunction toWindowsFileUrl(filePath: string): string {\n const normalizedPath = normalizeWindowsAbsolutePath(filePath).replace(/\\\\/g, '/');\n return new URL(`file:///${normalizedPath}`).href;\n}\n\nfunction toConfigImportSpecifier(fromFilePath: string, toFilePath: string): string {\n const normalizedFromPath = normalizeWindowsAbsolutePath(fromFilePath);\n const normalizedToPath = normalizeWindowsAbsolutePath(toFilePath);\n const useWindowsPaths = isWindowsAbsolutePath(normalizedFromPath) || isWindowsAbsolutePath(normalizedToPath);\n const pathApi = useWindowsPaths ? path.win32 : path.posix;\n const fromDirectoryPath = pathApi.dirname(useWindowsPaths ? normalizedFromPath : fromFilePath);\n const targetPath = useWindowsPaths ? normalizedToPath : toFilePath;\n\n if (useWindowsPaths && arePathsOnDifferentWindowsDrives(fromDirectoryPath, targetPath)) {\n return toWindowsFileUrl(targetPath);\n }\n\n const relativePath = pathApi.relative(fromDirectoryPath, targetPath).replace(/\\\\/g, '/');\n if (relativePath.startsWith('./') || relativePath.startsWith('../')) {\n return relativePath;\n }\n return `./${relativePath}`;\n}\n\nfunction withDefinedEntries(entries: Array<[string, string | number | boolean | undefined]>): Record<string, string | number | boolean> {\n const result: Record<string, string | number | boolean> = {};\n for (const [key, value] of entries) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction normalizeDatabaseUrl(\n value: string,\n platform: Pick<RuntimePlatform, 'resolvePath'> = nodeRuntimePlatform,\n): string {\n if (\n value.startsWith('sqlite:') ||\n value.startsWith('postgres://') ||\n value.startsWith('postgresql://') ||\n value.startsWith('mysql://')\n ) {\n return value;\n }\n return `sqlite:${platform.resolvePath(value)}`;\n}\n\nexport async function resolveRuntimeBootstrap(\n id: string,\n options: XpodRuntimeOptions,\n host: RuntimeHost,\n platform: RuntimePlatform = nodeRuntimePlatform,\n): Promise<RuntimeBootstrapState> {\n const mode = options.mode ?? 'local';\n const transport = host.resolveTransport(options.transport);\n const bindHost = options.bindHost ?? '127.0.0.1';\n const runtimeRoot = platform.resolvePath(options.runtimeRoot ?? platform.joinPath(platform.cwd(), '.test-data', 'xpod-runtime', id));\n const rootFilePath = platform.resolvePath(options.rootFilePath ?? platform.joinPath(runtimeRoot, 'data'));\n const sparqlEndpoint = normalizeDatabaseUrl(options.sparqlEndpoint ?? platform.joinPath(runtimeRoot, 'quadstore.sqlite'), platform);\n const identityDbUrl = normalizeDatabaseUrl(options.identityDbUrl ?? platform.joinPath(runtimeRoot, 'identity.sqlite'), platform);\n const usageDbUrl = normalizeDatabaseUrl(options.usageDbUrl ?? platform.joinPath(runtimeRoot, 'usage.sqlite'), platform);\n const cssAuthMode = options.authMode ?? (options.open ? 'allow-all' : 'acp');\n const apiOpen = options.apiOpen ?? options.open ?? false;\n const logLevel = options.logLevel ?? platform.getEnv('CSS_LOGGING_LEVEL') ?? 'warn';\n\n platform.ensureDir(runtimeRoot);\n platform.ensureDir(rootFilePath);\n\n const socketsRoot = platform.joinPath(runtimeRoot, 'sockets');\n if (transport === 'socket') {\n platform.ensureDir(socketsRoot);\n }\n const ports: XpodRuntimePorts = transport === 'port'\n ? await host.allocatePorts({\n gatewayPort: options.gatewayPort,\n cssPort: options.cssPort,\n apiPort: options.apiPort,\n basePort: 5600,\n })\n : {};\n const sockets: XpodRuntimeSockets = {};\n\n if (transport === 'socket') {\n sockets.gateway = platform.resolvePath(options.gatewaySocketPath ?? platform.joinPath(socketsRoot, 'gateway.sock'));\n sockets.css = platform.resolvePath(options.cssSocketPath ?? platform.joinPath(socketsRoot, 'css.sock'));\n sockets.api = platform.resolvePath(options.apiSocketPath ?? platform.joinPath(socketsRoot, 'api.sock'));\n }\n\n const baseUrl = ensureTrailingSlash(\n options.baseUrl ?? (transport === 'socket'\n ? 'http://localhost'\n : `http://${bindHost}:${ports.gateway}`),\n );\n\n return {\n id,\n host,\n mode,\n transport,\n bindHost,\n runtimeRoot,\n rootFilePath,\n sparqlEndpoint,\n identityDbUrl,\n usageDbUrl,\n cssAuthMode,\n apiOpen,\n logLevel,\n baseUrl,\n envFilePath: options.envFile ? platform.resolvePath(options.envFile) : undefined,\n ports,\n sockets,\n };\n}\n\nexport function buildRuntimeEnv(\n state: RuntimeBootstrapState,\n options: XpodRuntimeOptions,\n envFromFile: Record<string, string | undefined> = {},\n): Record<string, string | undefined> {\n return {\n ...envFromFile,\n ...options.env,\n XPOD_ENV_PATH: state.envFilePath,\n XPOD_EDITION: state.mode,\n CSS_BASE_URL: state.baseUrl,\n CSS_TOKEN_ENDPOINT: `${state.baseUrl}.oidc/token`,\n CSS_ROOT_FILE_PATH: state.rootFilePath,\n CSS_IDENTITY_DB_URL: state.identityDbUrl,\n DATABASE_URL: state.identityDbUrl,\n CSS_PORT: state.ports.css !== undefined ? String(state.ports.css) : undefined,\n API_PORT: state.ports.api !== undefined ? String(state.ports.api) : undefined,\n API_HOST: state.bindHost,\n API_SOCKET_PATH: state.sockets.api,\n XPOD_MAIN_PORT: state.ports.gateway !== undefined ? String(state.ports.gateway) : undefined,\n CORS_ORIGINS: new URL(state.baseUrl).origin,\n CSS_LOGGING_LEVEL: state.logLevel,\n };\n}\n\nexport function buildRuntimeShorthand(\n runtimeEnv: Record<string, string | undefined>,\n options: XpodRuntimeOptions,\n state: RuntimeBootstrapState,\n baseEnv: Record<string, string | undefined> = nodeRuntimePlatform.baseEnv,\n): Record<string, string | number | boolean> {\n const envValue = (key: string): string | undefined => runtimeEnv[key] ?? baseEnv[key];\n\n return {\n ...withDefinedEntries([\n ['baseStorageDomain', envValue('CSS_BASE_STORAGE_DOMAIN')],\n ['minioAccessKey', envValue('CSS_MINIO_ACCESS_KEY')],\n ['minioSecretKey', envValue('CSS_MINIO_SECRET_KEY')],\n ['minioEndpoint', envValue('CSS_MINIO_ENDPOINT')],\n ['minioBucketName', envValue('CSS_MINIO_BUCKET_NAME')],\n ['redisClient', envValue('CSS_REDIS_CLIENT')],\n ['redisUsername', envValue('CSS_REDIS_USERNAME')],\n ['redisPassword', envValue('CSS_REDIS_PASSWORD')],\n ['emailConfigHost', envValue('CSS_EMAIL_CONFIG_HOST') ?? ''],\n ['emailConfigPort', envValue('CSS_EMAIL_CONFIG_PORT') ?? '587'],\n ['emailConfigAuthUser', envValue('CSS_EMAIL_CONFIG_AUTH_USER') ?? ''],\n ['emailConfigAuthPass', envValue('CSS_EMAIL_CONFIG_AUTH_PASS') ?? ''],\n ['idpUrl', envValue('CSS_IDP_URL') ?? envValue('XPOD_CLOUD_API_ENDPOINT')],\n ['allowedHosts', envValue('CSS_ALLOWED_HOSTS')],\n ['nodeId', envValue('XPOD_NODE_ID')],\n ['nodeToken', envValue('XPOD_NODE_TOKEN')],\n ['serviceToken', envValue('XPOD_SERVICE_TOKEN')],\n ]),\n baseUrl: state.baseUrl,\n rootFilePath: state.rootFilePath,\n sparqlEndpoint: state.sparqlEndpoint,\n identityDbUrl: state.identityDbUrl,\n usageDbUrl: state.usageDbUrl,\n logLevel: state.logLevel,\n authMode: state.cssAuthMode,\n edition: state.mode === 'cloud' ? 'server' : 'local',\n edgeNodesEnabled: options.edgeNodesEnabled ?? false,\n centerRegistrationEnabled: options.centerRegistrationEnabled ?? false,\n ...(options.shorthand ?? {}),\n };\n}\n\nexport function createCssRuntimeConfig(\n state: RuntimeBootstrapState,\n open: boolean,\n platform: Pick<RuntimePlatform, 'dirname' | 'ensureDir' | 'joinPath' | 'writeTextFile'> = nodeRuntimePlatform,\n): string {\n const configPath = normalizeWindowsAbsolutePath(platform.joinPath(PACKAGE_ROOT, `config/${state.mode}.json`));\n if (!open) {\n return configPath;\n }\n\n const runtimeRoot = normalizeWindowsAbsolutePath(state.runtimeRoot);\n const runtimeConfigPath = arePathsOnDifferentWindowsDrives(runtimeRoot, configPath)\n ? (() => {\n const runtimeConfigDir = normalizeWindowsAbsolutePath(platform.joinPath(\n platform.dirname(configPath),\n '..',\n '.xpod-runtime',\n state.id,\n ));\n platform.ensureDir(runtimeConfigDir);\n return normalizeWindowsAbsolutePath(platform.joinPath(runtimeConfigDir, 'css-runtime.config.json'));\n })()\n : normalizeWindowsAbsolutePath(platform.joinPath(runtimeRoot, 'css-runtime.config.json'));\n const openConfigPath = normalizeWindowsAbsolutePath(platform.joinPath(PACKAGE_ROOT, 'config/runtime-open.json'));\n platform.writeTextFile(runtimeConfigPath, JSON.stringify({\n '@context': [\n 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld',\n 'https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld',\n ],\n import: [\n toConfigImportSpecifier(runtimeConfigPath, configPath),\n toConfigImportSpecifier(runtimeConfigPath, openConfigPath),\n ],\n }, null, 2));\n\n return runtimeConfigPath;\n}\n\nexport function initRuntimeLogger(\n level: string,\n platform: Pick<RuntimePlatform, 'cwd' | 'joinPath'> = nodeRuntimePlatform,\n): void {\n const loggerFactory = new ConfigurableLoggerFactory(level, {\n fileName: platform.joinPath(platform.cwd(), 'logs/xpod-%DATE%.log'),\n showLocation: true,\n });\n setGlobalLoggerFactory(loggerFactory);\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import type { RepresentationMetadata } from '@solid/community-server';
|
|
3
|
+
type MetadataCacheEntry = {
|
|
4
|
+
kind: 'hit';
|
|
5
|
+
metadata: RepresentationMetadata;
|
|
6
|
+
} | {
|
|
7
|
+
kind: 'miss';
|
|
8
|
+
};
|
|
9
|
+
export interface MetadataRequestState {
|
|
10
|
+
metadataCache: Map<string, MetadataCacheEntry>;
|
|
11
|
+
}
|
|
12
|
+
export declare const metadataRequestContext: AsyncLocalStorage<MetadataRequestState>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.metadataRequestContext = void 0;
|
|
4
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
5
|
+
exports.metadataRequestContext = new node_async_hooks_1.AsyncLocalStorage();
|
|
6
|
+
//# sourceMappingURL=MetadataRequestContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetadataRequestContext.js","sourceRoot":"","sources":["../../src/storage/MetadataRequestContext.ts"],"names":[],"mappings":";;;AAAA,uDAAqD;AAWxC,QAAA,sBAAsB,GAAG,IAAI,oCAAiB,EAAwB,CAAC","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { RepresentationMetadata } from '@solid/community-server';\n\ntype MetadataCacheEntry =\n | { kind: 'hit'; metadata: RepresentationMetadata }\n | { kind: 'miss' };\n\nexport interface MetadataRequestState {\n metadataCache: Map<string, MetadataCacheEntry>;\n}\n\nexport const metadataRequestContext = new AsyncLocalStorage<MetadataRequestState>();\n"]}
|
|
@@ -41,8 +41,11 @@ class NodeSqliteSession extends sqlite_core_1.SQLiteSession {
|
|
|
41
41
|
prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper) {
|
|
42
42
|
const objectStatement = this.client.prepare(query.sql);
|
|
43
43
|
const arrayStatement = this.client.prepare(query.sql);
|
|
44
|
-
arrayStatement.setReturnArrays
|
|
45
|
-
|
|
44
|
+
const supportsReturnArrays = typeof arrayStatement.setReturnArrays === 'function';
|
|
45
|
+
if (supportsReturnArrays) {
|
|
46
|
+
arrayStatement.setReturnArrays(true);
|
|
47
|
+
}
|
|
48
|
+
return new NodeSqlitePreparedQuery(objectStatement, arrayStatement, query, this.logger, fields, executeMethod, isResponseInArrayMode, supportsReturnArrays, customResultMapper);
|
|
46
49
|
}
|
|
47
50
|
transaction(transaction, config = {}) {
|
|
48
51
|
const tx = new NodeSqliteTransaction('sync', this.dialect, this, this.schema);
|
|
@@ -85,13 +88,14 @@ class NodeSqliteTransaction extends sqlite_core_1.SQLiteTransaction {
|
|
|
85
88
|
_c = entity_1.entityKind;
|
|
86
89
|
NodeSqliteTransaction[_c] = 'NodeSqliteTransaction';
|
|
87
90
|
class NodeSqlitePreparedQuery extends sqlite_core_1.SQLitePreparedQuery {
|
|
88
|
-
constructor(objectStatement, arrayStatement, query, logger, fields, executeMethod, _isResponseInArrayMode, customResultMapper) {
|
|
91
|
+
constructor(objectStatement, arrayStatement, query, logger, fields, executeMethod, _isResponseInArrayMode, supportsReturnArrays, customResultMapper) {
|
|
89
92
|
super('sync', executeMethod, query);
|
|
90
93
|
this.objectStatement = objectStatement;
|
|
91
94
|
this.arrayStatement = arrayStatement;
|
|
92
95
|
this.logger = logger;
|
|
93
96
|
this.fields = fields;
|
|
94
97
|
this._isResponseInArrayMode = _isResponseInArrayMode;
|
|
98
|
+
this.supportsReturnArrays = supportsReturnArrays;
|
|
95
99
|
this.customResultMapper = customResultMapper;
|
|
96
100
|
}
|
|
97
101
|
run(placeholderValues) {
|
|
@@ -121,7 +125,7 @@ class NodeSqlitePreparedQuery extends sqlite_core_1.SQLitePreparedQuery {
|
|
|
121
125
|
if (!fields && !customResultMapper) {
|
|
122
126
|
return objectStatement.get(...params);
|
|
123
127
|
}
|
|
124
|
-
const row = arrayStatement.get(...params);
|
|
128
|
+
const row = this.toArrayRow(arrayStatement.get(...params));
|
|
125
129
|
if (!row) {
|
|
126
130
|
return undefined;
|
|
127
131
|
}
|
|
@@ -133,11 +137,21 @@ class NodeSqlitePreparedQuery extends sqlite_core_1.SQLitePreparedQuery {
|
|
|
133
137
|
values(placeholderValues) {
|
|
134
138
|
const params = (0, sql_1.fillPlaceholders)(this.query.params, placeholderValues ?? {});
|
|
135
139
|
this.logger.logQuery(this.query.sql, params);
|
|
136
|
-
|
|
140
|
+
const rows = this.arrayStatement.all(...params);
|
|
141
|
+
return rows.map((row) => this.toArrayRow(row) ?? []);
|
|
137
142
|
}
|
|
138
143
|
isResponseInArrayMode() {
|
|
139
144
|
return this._isResponseInArrayMode;
|
|
140
145
|
}
|
|
146
|
+
toArrayRow(row) {
|
|
147
|
+
if (row === undefined) {
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
if (this.supportsReturnArrays) {
|
|
151
|
+
return row;
|
|
152
|
+
}
|
|
153
|
+
return Object.values(row);
|
|
154
|
+
}
|
|
141
155
|
}
|
|
142
156
|
_d = entity_1.entityKind;
|
|
143
157
|
NodeSqlitePreparedQuery[_d] = 'NodeSqlitePreparedQuery';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeSqliteDrizzle.js","sourceRoot":"","sources":["../../src/storage/NodeSqliteDrizzle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DatabaseSync, StatementSync } from 'node:sqlite';\nimport { entityKind } from 'drizzle-orm/entity';\nimport { DefaultLogger, NoopLogger } from 'drizzle-orm/logger';\nimport { createTableRelationsHelpers, extractTablesRelationalConfig } from 'drizzle-orm/relations';\nimport {\n BaseSQLiteDatabase,\n SQLitePreparedQuery as PreparedQueryBase,\n SQLiteSession,\n SQLiteSyncDialect,\n SQLiteTransaction,\n} from 'drizzle-orm/sqlite-core';\nimport { fillPlaceholders, sql } from 'drizzle-orm/sql/sql';\n\nconst { mapResultRow } = require('drizzle-orm/utils') as {\n mapResultRow: (fields: any, row: any, joinsNotNullableMap: any) => any;\n};\n\ntype NodeSqliteDrizzleConfig = Record<string, any>;\n\ntype NodeSqliteClientConfig = {\n source: string;\n} & Record<string, any>;\n\nfunction getDatabaseSyncCtor(): typeof DatabaseSync {\n return require('node:sqlite').DatabaseSync as typeof DatabaseSync;\n}\n\nfunction looksLikeDatabaseClient(value: unknown): boolean {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n return typeof (value as DatabaseSync).prepare === 'function';\n}\n\nfunction isDrizzleConfig(value: unknown): boolean {\n if (!value || typeof value !== 'object' || looksLikeDatabaseClient(value)) {\n return false;\n }\n\n return 'connection' in value\n || 'client' in value\n || 'schema' in value\n || 'logger' in value\n || 'casing' in value;\n}\n\nclass NodeSqliteDatabase extends BaseSQLiteDatabase<'sync', any, Record<string, never>> {\n public static override readonly [entityKind] = 'NodeSqliteDatabase';\n\n public declare $client: DatabaseSync;\n}\n\nclass NodeSqliteSession extends SQLiteSession<'sync', any, Record<string, unknown>, any> {\n public static override readonly [entityKind] = 'NodeSqliteSession';\n\n private readonly logger;\n\n public constructor(\n private readonly client: DatabaseSync,\n dialect: SQLiteSyncDialect,\n private readonly schema: any,\n options: { logger?: any } = {},\n ) {\n super(dialect);\n this.logger = options.logger ?? new NoopLogger();\n }\n\n public override prepareQuery(\n query: any,\n fields: any,\n executeMethod: any,\n isResponseInArrayMode: boolean,\n customResultMapper?: (rows: unknown[][]) => unknown,\n ): NodeSqlitePreparedQuery {\n const objectStatement = this.client.prepare(query.sql);\n const arrayStatement = this.client.prepare(query.sql);\n arrayStatement.setReturnArrays(true);\n return new NodeSqlitePreparedQuery(\n objectStatement,\n arrayStatement,\n query,\n this.logger,\n fields,\n executeMethod,\n isResponseInArrayMode,\n customResultMapper,\n );\n }\n\n public override transaction<T>(transaction: (tx: any) => T, config: { behavior?: 'deferred' | 'immediate' | 'exclusive' } = {}): T {\n const tx = new NodeSqliteTransaction('sync', (this as any).dialect, this, this.schema);\n const behavior = config.behavior ?? 'deferred';\n const beginSql = behavior === 'immediate'\n ? 'begin immediate'\n : behavior === 'exclusive'\n ? 'begin exclusive'\n : 'begin';\n this.run(sql.raw(beginSql));\n try {\n const result = transaction(tx);\n this.run(sql.raw('commit'));\n return result;\n } catch (error) {\n this.run(sql.raw('rollback'));\n throw error;\n }\n }\n}\n\nclass NodeSqliteTransaction extends SQLiteTransaction<'sync', any, Record<string, unknown>, any> {\n public static override readonly [entityKind] = 'NodeSqliteTransaction';\n\n public override transaction<T>(transaction: (tx: NodeSqliteTransaction) => T): T {\n const savepointName = `sp${(this as any).nestedIndex}`;\n const tx = new NodeSqliteTransaction('sync', (this as any).dialect, (this as any).session, (this as any).schema, (this as any).nestedIndex + 1);\n (this as any).session.run(sql.raw(`savepoint ${savepointName}`));\n try {\n const result = transaction(tx);\n (this as any).session.run(sql.raw(`release savepoint ${savepointName}`));\n return result;\n } catch (error) {\n (this as any).session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n throw error;\n }\n }\n}\n\nclass NodeSqlitePreparedQuery extends PreparedQueryBase<{\n type: 'sync';\n run: any;\n all: any;\n get: any;\n values: any;\n execute: any;\n}> {\n public static override readonly [entityKind] = 'NodeSqlitePreparedQuery';\n\n public constructor(\n private readonly objectStatement: StatementSync,\n private readonly arrayStatement: StatementSync,\n query: any,\n private readonly logger: any,\n private readonly fields: any,\n executeMethod: any,\n private readonly _isResponseInArrayMode: boolean,\n private readonly customResultMapper?: (rows: unknown[][]) => unknown,\n ) {\n super('sync', executeMethod, query);\n }\n\n public override run(placeholderValues?: Record<string, unknown>): any {\n const params = fillPlaceholders(this.query.params, placeholderValues ?? {}) as any[];\n this.logger.logQuery(this.query.sql, params);\n return this.objectStatement.run(...params);\n }\n\n public override all(placeholderValues?: Record<string, unknown>): any {\n const { fields, query, logger, objectStatement, customResultMapper } = this;\n const joinsNotNullableMap = (this as any).joinsNotNullableMap;\n if (!fields && !customResultMapper) {\n const params = fillPlaceholders(query.params, placeholderValues ?? {}) as any[];\n logger.logQuery(query.sql, params);\n return objectStatement.all(...params);\n }\n const rows = this.values(placeholderValues);\n if (customResultMapper) {\n return customResultMapper(rows);\n }\n return rows.map((row) => mapResultRow(fields, row, joinsNotNullableMap));\n }\n\n public override get(placeholderValues?: Record<string, unknown>): any {\n const params = fillPlaceholders(this.query.params, placeholderValues ?? {}) as any[];\n this.logger.logQuery(this.query.sql, params);\n const { fields, customResultMapper, objectStatement, arrayStatement } = this;\n const joinsNotNullableMap = (this as any).joinsNotNullableMap;\n if (!fields && !customResultMapper) {\n return objectStatement.get(...params);\n }\n const row = arrayStatement.get(...params) as unknown[] | undefined;\n if (!row) {\n return undefined;\n }\n if (customResultMapper) {\n return customResultMapper([ row ]);\n }\n return mapResultRow(fields, row, joinsNotNullableMap);\n }\n\n public override values(placeholderValues?: Record<string, unknown>): unknown[][] {\n const params = fillPlaceholders(this.query.params, placeholderValues ?? {}) as any[];\n this.logger.logQuery(this.query.sql, params);\n return this.arrayStatement.all(...params) as unknown as unknown[][];\n }\n\n public isResponseInArrayMode(): boolean {\n return this._isResponseInArrayMode;\n }\n}\n\nfunction constructNodeSqliteDb(client: DatabaseSync, config: NodeSqliteDrizzleConfig = {}): any {\n const dialect = new SQLiteSyncDialect();\n const logger = config.logger === true\n ? new DefaultLogger()\n : config.logger === false\n ? undefined\n : config.logger;\n\n let schema: any;\n if (config.schema) {\n const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);\n schema = {\n fullSchema: config.schema,\n schema: tablesConfig.tables,\n tableNamesMap: tablesConfig.tableNamesMap,\n };\n }\n\n const session = new NodeSqliteSession(client, dialect, schema, { logger });\n const db = new NodeSqliteDatabase('sync', dialect, session, schema) as NodeSqliteDatabase;\n db.$client = client;\n return db;\n}\n\nexport function drizzleNodeSqlite(...params: any[]): any {\n const DatabaseCtor = getDatabaseSyncCtor();\n\n if (params[0] === undefined || typeof params[0] === 'string') {\n const instance = new DatabaseCtor(params[0] ?? ':memory:');\n return constructNodeSqliteDb(instance, params[1]);\n }\n\n if (isDrizzleConfig(params[0])) {\n const { connection, client, ...drizzleConfig } = params[0];\n if (client) {\n return constructNodeSqliteDb(client, drizzleConfig);\n }\n if (connection && typeof connection === 'object') {\n const { source, ...rest } = connection as NodeSqliteClientConfig;\n const options = Object.values(rest).some((value) => value !== undefined) ? rest : undefined;\n const instance = new DatabaseCtor(source, options);\n return constructNodeSqliteDb(instance, drizzleConfig);\n }\n const instance = new DatabaseCtor(connection);\n return constructNodeSqliteDb(instance, drizzleConfig);\n }\n\n return constructNodeSqliteDb(params[0], params[1]);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"NodeSqliteDrizzle.js","sourceRoot":"","sources":["../../src/storage/NodeSqliteDrizzle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DatabaseSync, StatementSync } from 'node:sqlite';\nimport { entityKind } from 'drizzle-orm/entity';\nimport { DefaultLogger, NoopLogger } from 'drizzle-orm/logger';\nimport { createTableRelationsHelpers, extractTablesRelationalConfig } from 'drizzle-orm/relations';\nimport {\n BaseSQLiteDatabase,\n SQLitePreparedQuery as PreparedQueryBase,\n SQLiteSession,\n SQLiteSyncDialect,\n SQLiteTransaction,\n} from 'drizzle-orm/sqlite-core';\nimport { fillPlaceholders, sql } from 'drizzle-orm/sql/sql';\n\nconst { mapResultRow } = require('drizzle-orm/utils') as {\n mapResultRow: (fields: any, row: any, joinsNotNullableMap: any) => any;\n};\n\ntype NodeSqliteDrizzleConfig = Record<string, any>;\n\ntype NodeSqliteClientConfig = {\n source: string;\n} & Record<string, any>;\n\nfunction getDatabaseSyncCtor(): typeof DatabaseSync {\n return require('node:sqlite').DatabaseSync as typeof DatabaseSync;\n}\n\nfunction looksLikeDatabaseClient(value: unknown): boolean {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n return typeof (value as DatabaseSync).prepare === 'function';\n}\n\nfunction isDrizzleConfig(value: unknown): boolean {\n if (!value || typeof value !== 'object' || looksLikeDatabaseClient(value)) {\n return false;\n }\n\n return 'connection' in value\n || 'client' in value\n || 'schema' in value\n || 'logger' in value\n || 'casing' in value;\n}\n\nclass NodeSqliteDatabase extends BaseSQLiteDatabase<'sync', any, Record<string, never>> {\n public static override readonly [entityKind] = 'NodeSqliteDatabase';\n\n public declare $client: DatabaseSync;\n}\n\nclass NodeSqliteSession extends SQLiteSession<'sync', any, Record<string, unknown>, any> {\n public static override readonly [entityKind] = 'NodeSqliteSession';\n\n private readonly logger;\n\n public constructor(\n private readonly client: DatabaseSync,\n dialect: SQLiteSyncDialect,\n private readonly schema: any,\n options: { logger?: any } = {},\n ) {\n super(dialect);\n this.logger = options.logger ?? new NoopLogger();\n }\n\n public override prepareQuery(\n query: any,\n fields: any,\n executeMethod: any,\n isResponseInArrayMode: boolean,\n customResultMapper?: (rows: unknown[][]) => unknown,\n ): NodeSqlitePreparedQuery {\n const objectStatement = this.client.prepare(query.sql);\n const arrayStatement = this.client.prepare(query.sql);\n const supportsReturnArrays = typeof (arrayStatement as StatementSync & { setReturnArrays?: (enabled: boolean) => unknown }).setReturnArrays === 'function';\n if (supportsReturnArrays) {\n (arrayStatement as StatementSync & { setReturnArrays: (enabled: boolean) => unknown }).setReturnArrays(true);\n }\n return new NodeSqlitePreparedQuery(\n objectStatement,\n arrayStatement,\n query,\n this.logger,\n fields,\n executeMethod,\n isResponseInArrayMode,\n supportsReturnArrays,\n customResultMapper,\n );\n }\n\n public override transaction<T>(transaction: (tx: any) => T, config: { behavior?: 'deferred' | 'immediate' | 'exclusive' } = {}): T {\n const tx = new NodeSqliteTransaction('sync', (this as any).dialect, this, this.schema);\n const behavior = config.behavior ?? 'deferred';\n const beginSql = behavior === 'immediate'\n ? 'begin immediate'\n : behavior === 'exclusive'\n ? 'begin exclusive'\n : 'begin';\n this.run(sql.raw(beginSql));\n try {\n const result = transaction(tx);\n this.run(sql.raw('commit'));\n return result;\n } catch (error) {\n this.run(sql.raw('rollback'));\n throw error;\n }\n }\n}\n\nclass NodeSqliteTransaction extends SQLiteTransaction<'sync', any, Record<string, unknown>, any> {\n public static override readonly [entityKind] = 'NodeSqliteTransaction';\n\n public override transaction<T>(transaction: (tx: NodeSqliteTransaction) => T): T {\n const savepointName = `sp${(this as any).nestedIndex}`;\n const tx = new NodeSqliteTransaction('sync', (this as any).dialect, (this as any).session, (this as any).schema, (this as any).nestedIndex + 1);\n (this as any).session.run(sql.raw(`savepoint ${savepointName}`));\n try {\n const result = transaction(tx);\n (this as any).session.run(sql.raw(`release savepoint ${savepointName}`));\n return result;\n } catch (error) {\n (this as any).session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n throw error;\n }\n }\n}\n\nclass NodeSqlitePreparedQuery extends PreparedQueryBase<{\n type: 'sync';\n run: any;\n all: any;\n get: any;\n values: any;\n execute: any;\n}> {\n public static override readonly [entityKind] = 'NodeSqlitePreparedQuery';\n\n public constructor(\n private readonly objectStatement: StatementSync,\n private readonly arrayStatement: StatementSync,\n query: any,\n private readonly logger: any,\n private readonly fields: any,\n executeMethod: any,\n private readonly _isResponseInArrayMode: boolean,\n private readonly supportsReturnArrays: boolean,\n private readonly customResultMapper?: (rows: unknown[][]) => unknown,\n ) {\n super('sync', executeMethod, query);\n }\n\n public override run(placeholderValues?: Record<string, unknown>): any {\n const params = fillPlaceholders(this.query.params, placeholderValues ?? {}) as any[];\n this.logger.logQuery(this.query.sql, params);\n return this.objectStatement.run(...params);\n }\n\n public override all(placeholderValues?: Record<string, unknown>): any {\n const { fields, query, logger, objectStatement, customResultMapper } = this;\n const joinsNotNullableMap = (this as any).joinsNotNullableMap;\n if (!fields && !customResultMapper) {\n const params = fillPlaceholders(query.params, placeholderValues ?? {}) as any[];\n logger.logQuery(query.sql, params);\n return objectStatement.all(...params);\n }\n const rows = this.values(placeholderValues);\n if (customResultMapper) {\n return customResultMapper(rows);\n }\n return rows.map((row) => mapResultRow(fields, row, joinsNotNullableMap));\n }\n\n public override get(placeholderValues?: Record<string, unknown>): any {\n const params = fillPlaceholders(this.query.params, placeholderValues ?? {}) as any[];\n this.logger.logQuery(this.query.sql, params);\n const { fields, customResultMapper, objectStatement, arrayStatement } = this;\n const joinsNotNullableMap = (this as any).joinsNotNullableMap;\n if (!fields && !customResultMapper) {\n return objectStatement.get(...params);\n }\n const row = this.toArrayRow(arrayStatement.get(...params));\n if (!row) {\n return undefined;\n }\n if (customResultMapper) {\n return customResultMapper([ row ]);\n }\n return mapResultRow(fields, row, joinsNotNullableMap);\n }\n\n public override values(placeholderValues?: Record<string, unknown>): unknown[][] {\n const params = fillPlaceholders(this.query.params, placeholderValues ?? {}) as any[];\n this.logger.logQuery(this.query.sql, params);\n const rows = this.arrayStatement.all(...params) as unknown[];\n return rows.map((row) => this.toArrayRow(row) ?? []);\n }\n\n public isResponseInArrayMode(): boolean {\n return this._isResponseInArrayMode;\n }\n\n private toArrayRow(row: unknown): unknown[] | undefined {\n if (row === undefined) {\n return undefined;\n }\n if (this.supportsReturnArrays) {\n return row as unknown[];\n }\n return Object.values(row as Record<string, unknown>);\n }\n}\n\nfunction constructNodeSqliteDb(client: DatabaseSync, config: NodeSqliteDrizzleConfig = {}): any {\n const dialect = new SQLiteSyncDialect();\n const logger = config.logger === true\n ? new DefaultLogger()\n : config.logger === false\n ? undefined\n : config.logger;\n\n let schema: any;\n if (config.schema) {\n const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);\n schema = {\n fullSchema: config.schema,\n schema: tablesConfig.tables,\n tableNamesMap: tablesConfig.tableNamesMap,\n };\n }\n\n const session = new NodeSqliteSession(client, dialect, schema, { logger });\n const db = new NodeSqliteDatabase('sync', dialect, session, schema) as NodeSqliteDatabase;\n db.$client = client;\n return db;\n}\n\nexport function drizzleNodeSqlite(...params: any[]): any {\n const DatabaseCtor = getDatabaseSyncCtor();\n\n if (params[0] === undefined || typeof params[0] === 'string') {\n const instance = new DatabaseCtor(params[0] ?? ':memory:');\n return constructNodeSqliteDb(instance, params[1]);\n }\n\n if (isDrizzleConfig(params[0])) {\n const { connection, client, ...drizzleConfig } = params[0];\n if (client) {\n return constructNodeSqliteDb(client, drizzleConfig);\n }\n if (connection && typeof connection === 'object') {\n const { source, ...rest } = connection as NodeSqliteClientConfig;\n const options = Object.values(rest).some((value) => value !== undefined) ? rest : undefined;\n const instance = new DatabaseCtor(source, options);\n return constructNodeSqliteDb(instance, drizzleConfig);\n }\n const instance = new DatabaseCtor(connection);\n return constructNodeSqliteDb(instance, drizzleConfig);\n }\n\n return constructNodeSqliteDb(params[0], params[1]);\n}\n"]}
|
|
@@ -130,4 +130,5 @@ export declare class MinioDataAccessor implements DataAccessor {
|
|
|
130
130
|
*/
|
|
131
131
|
protected encodeMetadata(link: ResourceLink, metadata: RepresentationMetadata): object | null;
|
|
132
132
|
protected decodeMetadata(link: ResourceLink, metadata: MetadataRecord): RepresentationMetadata;
|
|
133
|
+
private logDuration;
|
|
133
134
|
}
|
|
@@ -53,8 +53,10 @@ class MinioDataAccessor {
|
|
|
53
53
|
* @param identifier - Identifier for which the data is requested.
|
|
54
54
|
*/
|
|
55
55
|
async getData(identifier) {
|
|
56
|
+
const started = Date.now();
|
|
56
57
|
const url = new URL(identifier.path);
|
|
57
58
|
const stream = await this.client.getObject(this.bucketName, url.pathname);
|
|
59
|
+
this.logDuration('getData', identifier.path, started);
|
|
58
60
|
return (0, community_server_1.guardStream)(stream);
|
|
59
61
|
}
|
|
60
62
|
/**
|
|
@@ -75,6 +77,7 @@ class MinioDataAccessor {
|
|
|
75
77
|
* @param identifier - Identifier for which the metadata is requested.
|
|
76
78
|
*/
|
|
77
79
|
async getMetadata(identifier) {
|
|
80
|
+
const started = Date.now();
|
|
78
81
|
const url = new URL(identifier.path);
|
|
79
82
|
const link = await this.resourceMapper.mapUrlToFilePath(identifier, false);
|
|
80
83
|
const isDirectory = identifier.path.endsWith('/');
|
|
@@ -87,10 +90,14 @@ class MinioDataAccessor {
|
|
|
87
90
|
throw new community_server_1.NotFoundHttpError();
|
|
88
91
|
}
|
|
89
92
|
if (!(0, community_server_1.isContainerIdentifier)(identifier) && !isDirectory) {
|
|
90
|
-
|
|
93
|
+
const metadata = await this.getFileMetadata(link, stats);
|
|
94
|
+
this.logDuration('getMetadata', identifier.path, started);
|
|
95
|
+
return metadata;
|
|
91
96
|
}
|
|
92
97
|
if ((0, community_server_1.isContainerIdentifier)(identifier) && isDirectory) {
|
|
93
|
-
|
|
98
|
+
const metadata = await this.getDirectoryMetadata(link, stats);
|
|
99
|
+
this.logDuration('getMetadata', identifier.path, started);
|
|
100
|
+
return metadata;
|
|
94
101
|
}
|
|
95
102
|
throw new community_server_1.NotFoundHttpError();
|
|
96
103
|
}
|
|
@@ -123,11 +130,13 @@ class MinioDataAccessor {
|
|
|
123
130
|
* @param metadata - Metadata to store.
|
|
124
131
|
*/
|
|
125
132
|
async writeDocument(identifier, data, metadata) {
|
|
133
|
+
const started = Date.now();
|
|
126
134
|
const url = new URL(identifier.path);
|
|
127
135
|
const link = await this.resourceMapper.mapUrlToFilePath(identifier, false);
|
|
128
136
|
const itemMetadata = this.encodeMetadata(link, metadata);
|
|
129
137
|
try {
|
|
130
138
|
await this.client.putObject(this.bucketName, url.pathname, data, metadata.contentLength, itemMetadata || undefined);
|
|
139
|
+
this.logDuration('writeDocument', identifier.path, started);
|
|
131
140
|
}
|
|
132
141
|
catch (error) {
|
|
133
142
|
this.logger.error(`Error writing document: ${identifier.path} ${error}`);
|
|
@@ -143,9 +152,11 @@ class MinioDataAccessor {
|
|
|
143
152
|
* @param metadata - Metadata to store.
|
|
144
153
|
*/
|
|
145
154
|
async writeContainer(identifier, metadata) {
|
|
155
|
+
const started = Date.now();
|
|
146
156
|
const url = new URL(identifier.path);
|
|
147
157
|
const link = await this.resourceMapper.mapUrlToFilePath(identifier, false);
|
|
148
158
|
await this.client.putObject(this.bucketName, `${url.pathname}/.container`, Buffer.from(''), metadata.contentLength, this.encodeMetadata(link, metadata) || undefined);
|
|
159
|
+
this.logDuration('writeContainer', identifier.path, started);
|
|
149
160
|
}
|
|
150
161
|
/**
|
|
151
162
|
* Writes metadata for a resource.
|
|
@@ -254,6 +265,18 @@ class MinioDataAccessor {
|
|
|
254
265
|
decodeMetadata(link, metadata) {
|
|
255
266
|
return new community_server_1.RepresentationMetadata(link.identifier, metadata);
|
|
256
267
|
}
|
|
268
|
+
logDuration(operation, identifierPath, started, slowThresholdMs = 100, warnThresholdMs = 1000) {
|
|
269
|
+
const elapsedMs = Date.now() - started;
|
|
270
|
+
if (elapsedMs < slowThresholdMs) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
const message = `[timing] MinioDataAccessor.${operation} path=${identifierPath} took=${elapsedMs}ms`;
|
|
274
|
+
if (elapsedMs >= warnThresholdMs) {
|
|
275
|
+
this.logger.warn(message);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
this.logger.info(message);
|
|
279
|
+
}
|
|
257
280
|
}
|
|
258
281
|
exports.MinioDataAccessor = MinioDataAccessor;
|
|
259
282
|
//# sourceMappingURL=MinioDataAccessor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MinioDataAccessor.js","sourceRoot":"","sources":["../../../src/storage/accessors/MinioDataAccessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Client, BucketItemStat } from 'minio';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { DataAccessor } from '@solid/community-server';\nimport type { Readable } from 'node:stream';\nimport { DataFactory } from 'n3';\nimport {\n RepresentationMetadata,\n \n NotFoundHttpError,\n guardStream,\n isContainerIdentifier,\n isContainerPath,\n joinFilePath,\n UnsupportedMediaTypeHttpError,\n CONTENT_TYPE_TERM,\n DC,\n IANA,\n LDP,\n POSIX,\n RDF,\n SOLID_META,\n XSD,\n parseQuads,\n serializeQuads,\n addResourceMetadata,\n updateModifiedDate,\n toLiteral,\n toNamedTerm,\n} from '@solid/community-server';\nimport type { Guarded } from '@solid/community-server';\nimport type { FileIdentifierMapper, ResourceLink } from '@solid/community-server';\nimport type { \n ResourceIdentifier,\n Representation,\n MetadataRecord\n} from '@solid/community-server';\n\nexport class MinioDataAccessor implements DataAccessor {\n protected readonly logger = getLoggerFor(this);\n protected readonly resourceMapper: FileIdentifierMapper;\n private readonly client: Client;\n private readonly bucketName: string;\n\n public constructor(\n resourceMapper: FileIdentifierMapper,\n accessKey: string,\n secretKey: string,\n endpoint: string,\n bucketName: string,\n ) {\n this.resourceMapper = resourceMapper;\n\n // Parse endpoint - supports both URL format (http://host:port) and simple format (host:port)\n let endPoint: string;\n let port: number | undefined;\n let useSSL = false;\n\n if (endpoint.startsWith('http://') || endpoint.startsWith('https://')) {\n const url = new URL(endpoint);\n endPoint = url.hostname;\n port = url.port ? parseInt(url.port, 10) : undefined;\n useSSL = url.protocol === 'https:';\n } else {\n const parts = endpoint.split(':');\n endPoint = parts[0];\n port = parts[1] ? parseInt(parts[1], 10) : undefined;\n }\n\n this.client = new Client({\n accessKey,\n secretKey,\n endPoint,\n port,\n useSSL,\n });\n this.bucketName = bucketName;\n this.logger.info(`MinioDataAccessor initialized with endpoint: ${endPoint}:${port} (SSL: ${useSSL})`)\n }\n\n /**\n * Should throw a NotImplementedHttpError if the DataAccessor does not support storing the given Representation.\n *\n * @param representation - Incoming Representation.\n *\n * @throws BadRequestHttpError\n * If it does not support the incoming data.\n */\n public async canHandle(representation: Representation): Promise<void> {\n if (!representation.binary) {\n throw new UnsupportedMediaTypeHttpError('Only binary data is supported.');\n }\n }\n\n /**\n * Returns a data stream stored for the given identifier.\n * It can be assumed that the incoming identifier will always correspond to a document.\n *\n * @param identifier - Identifier for which the data is requested.\n */\n public async getData(identifier: ResourceIdentifier): Promise<Guarded<Readable>> {\n const url = new URL(identifier.path)\n const stream = await this.client.getObject(this.bucketName, url.pathname);\n return guardStream(stream);\n }\n\n /**\n * Generate a presigned GET URL for the given resource.\n * @param identifier - Resource identifier.\n * @param expires - URL expiry in seconds (default 3600).\n */\n public async getPresignedUrl(identifier: ResourceIdentifier, expires = 3600): Promise<string> {\n const url = new URL(identifier.path);\n const objectKey = url.pathname.replace(/^\\//, '');\n return this.client.presignedGetObject(this.bucketName, objectKey, expires);\n }\n\n /**\n * Returns the metadata corresponding to the identifier.\n * If possible, it is suggested to add a `posix:size` triple to the metadata indicating the binary size.\n * This is necessary for range requests.\n *\n * @param identifier - Identifier for which the metadata is requested.\n */\n public async getMetadata(identifier: ResourceIdentifier): Promise<RepresentationMetadata> {\n const url = new URL(identifier.path)\n const link = await this.resourceMapper.mapUrlToFilePath(identifier, false);\n const isDirectory = identifier.path.endsWith('/');\n const objectName = isDirectory ? `${url.pathname}/.container` : url.pathname;\n let stats: BucketItemStat;\n try {\n stats = await this.client.statObject(this.bucketName, objectName);\n } catch (error) {\n throw new NotFoundHttpError();\n }\n if (!isContainerIdentifier(identifier) && !isDirectory) {\n return this.getFileMetadata(link, stats);\n }\n if (isContainerIdentifier(identifier) && isDirectory) {\n return this.getDirectoryMetadata(link, stats);\n }\n throw new NotFoundHttpError();\n }\n\n /**\n * Returns metadata for all resources in the requested container.\n * This should not be all metadata of those resources (but it can be),\n * but instead the main metadata you want to show in situations\n * where all these resources are presented simultaneously.\n * Generally this would be metadata that is present for all of these resources,\n * such as resource type or last modified date.\n *\n * It can be safely assumed that the incoming identifier will always correspond to a container.\n *\n * @param identifier - Identifier of the parent container.\n */\n public async* getChildren(identifier: ResourceIdentifier): AsyncIterableIterator<RepresentationMetadata> {\n const url = new URL(identifier.path)\n const objects = this.client.listObjectsV2(this.bucketName, url.pathname);\n for await (const object of objects) {\n const metadata = await this.getMetadata(object);\n yield metadata;\n }\n }\n\n /**\n * Writes data and metadata for a document.\n * If any data and/or metadata exist for the given identifier, it should be overwritten.\n *\n * @param identifier - Identifier of the resource.\n * @param data - Data to store.\n * @param metadata - Metadata to store.\n */\n public async writeDocument(identifier: ResourceIdentifier, data: Guarded<Readable>, metadata: RepresentationMetadata): Promise<void> {\n const url = new URL(identifier.path);\n const link = await this.resourceMapper.mapUrlToFilePath(identifier, false);\n const itemMetadata = this.encodeMetadata(link, metadata);\n try {\n await this.client.putObject(\n this.bucketName,\n url.pathname,\n data,\n metadata.contentLength,\n itemMetadata || undefined,\n );\n } catch (error) {\n this.logger.error(`Error writing document: ${identifier.path} ${error}`)\n throw error;\n }\n }\n\n /**\n * Writes metadata for a container.\n * If the container does not exist yet it should be created,\n * if it does its metadata should be overwritten, except for the containment triples.\n *\n * @param identifier - Identifier of the container.\n * @param metadata - Metadata to store.\n */\n public async writeContainer(identifier: ResourceIdentifier, metadata: RepresentationMetadata): Promise<void> {\n const url = new URL(identifier.path)\n const link = await this.resourceMapper.mapUrlToFilePath(identifier, false);\n await this.client.putObject(\n this.bucketName,\n `${url.pathname}/.container`,\n Buffer.from(''),\n metadata.contentLength,\n this.encodeMetadata(link, metadata) || undefined,\n );\n }\n\n /**\n * Writes metadata for a resource.\n * It can safely be assumed that the subject resource already exists.\n *\n * @param identifier - Identifier of the subject resource.\n * @param metadata - Metadata to store.\n */\n public async writeMetadata(identifier: ResourceIdentifier, metadata: RepresentationMetadata): Promise<void> {\n throw new Error('Minio does not support writing metadata for a resource.');\n }\n\n /**\n * Deletes the resource and its corresponding metadata.\n *\n * Solid, §5.4: \"When a contained resource is deleted, the server MUST also remove the corresponding containment\n * triple, which has the effect of removing the deleted resource from the containing container.\"\n * https://solid.github.io/specification/protocol#deleting-resources\n *\n * @param identifier - Resource to delete.\n */\n public async deleteResource(identifier: ResourceIdentifier): Promise<void> {\n const link = new URL(identifier.path)\n await this.client.removeObject(this.bucketName, link.pathname);\n }\n\n /**\n * Reads and generates all metadata relevant for the given file,\n * ingesting it into a RepresentationMetadata object.\n *\n * @param link - Path related metadata.\n * @param stats - Stats object of the corresponding file.\n */\n private async getFileMetadata(link: ResourceLink, stats: BucketItemStat): Promise<RepresentationMetadata> {\n const metadata = await this.getBaseMetadata(link, stats, false);\n // If the resource is using an unsupported contentType, the original contentType was written to the metadata file.\n // As a result, we should only set the contentType derived from the file path,\n // when no previous metadata entry for contentType is present.\n if (typeof metadata.contentType === 'undefined') {\n metadata.set(CONTENT_TYPE_TERM, link.contentType);\n }\n return metadata;\n }\n\n /**\n * Reads and generates all metadata relevant for the given directory,\n * ingesting it into a RepresentationMetadata object.\n *\n * @param link - Path related metadata.\n * @param stats - Stats object of the corresponding directory.\n */\n private async getDirectoryMetadata(link: ResourceLink, stats: BucketItemStat): Promise<RepresentationMetadata> {\n return this.getBaseMetadata(link, stats, true);\n }\n \n /**\n * Generates metadata relevant for any resources stored by this accessor.\n *\n * @param link - Path related metadata.\n * @param stats - Stats objects of the corresponding directory.\n * @param isContainer - If the path points to a container (directory) or not.\n */\n private async getBaseMetadata(link: ResourceLink, stats: BucketItemStat, isContainer: boolean): Promise<RepresentationMetadata> {\n const metadata = this.decodeMetadata(link, stats.metaData);\n addResourceMetadata(metadata, isContainer);\n this.addPosixMetadata(metadata, stats, isContainer);\n return metadata;\n }\n \n /**\n * Helper function to add file system related metadata.\n *\n * @param metadata - metadata object to add to\n * @param stats - Stats of the file/directory corresponding to the resource.\n */\n private addPosixMetadata(metadata: RepresentationMetadata, stats: BucketItemStat, isDirectory: boolean): void {\n updateModifiedDate(metadata, stats.lastModified);\n metadata.add(\n POSIX.terms.mtime,\n toLiteral(Math.floor(stats.lastModified.getTime() / 1000), XSD.terms.integer),\n SOLID_META.terms.ResponseMetadata,\n );\n if (!isDirectory) {\n metadata.add(\n POSIX.terms.size,\n toLiteral(stats.size, XSD.terms.integer),\n SOLID_META.terms.ResponseMetadata,\n );\n }\n }\n\n /**\n * encode the metadata of the resource to string.\n *\n * @param link - Path related metadata of the resource.\n * @param metadata - Metadata to write.\n *\n * @returns string of metadata.\n */\n protected encodeMetadata(link: ResourceLink, metadata: RepresentationMetadata): object | null {\n // These are stored by file system conventions\n metadata.remove(RDF.terms.type, LDP.terms.Resource);\n metadata.remove(RDF.terms.type, LDP.terms.Container);\n metadata.remove(RDF.terms.type, LDP.terms.BasicContainer);\n metadata.removeAll(DC.terms.modified);\n // When writing metadata for a document, only remove the content-type when dealing with a supported media type.\n // A media type is supported if the FileIdentifierMapper can correctly store it.\n // This allows restoring the appropriate content-type on data read (see getFileMetadata).\n if (isContainerPath(link.filePath) || typeof metadata.contentType !== 'undefined') {\n metadata.removeAll(CONTENT_TYPE_TERM);\n }\n const contentTypeObject = metadata.contentTypeObject\n if (contentTypeObject === undefined\n || Object.keys(contentTypeObject.parameters).length === 0) {\n return null;\n }\n // Write metadata to file if there are quads remaining\n return contentTypeObject.parameters;\n }\n\n protected decodeMetadata(link: ResourceLink, metadata: MetadataRecord): RepresentationMetadata {\n return new RepresentationMetadata(link.identifier, metadata);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MinioDataAccessor.js","sourceRoot":"","sources":["../../../src/storage/accessors/MinioDataAccessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Client, BucketItemStat } from 'minio';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { DataAccessor } from '@solid/community-server';\nimport type { Readable } from 'node:stream';\nimport { DataFactory } from 'n3';\nimport {\n RepresentationMetadata,\n \n NotFoundHttpError,\n guardStream,\n isContainerIdentifier,\n isContainerPath,\n joinFilePath,\n UnsupportedMediaTypeHttpError,\n CONTENT_TYPE_TERM,\n DC,\n IANA,\n LDP,\n POSIX,\n RDF,\n SOLID_META,\n XSD,\n parseQuads,\n serializeQuads,\n addResourceMetadata,\n updateModifiedDate,\n toLiteral,\n toNamedTerm,\n} from '@solid/community-server';\nimport type { Guarded } from '@solid/community-server';\nimport type { FileIdentifierMapper, ResourceLink } from '@solid/community-server';\nimport type { \n ResourceIdentifier,\n Representation,\n MetadataRecord\n} from '@solid/community-server';\n\nexport class MinioDataAccessor implements DataAccessor {\n protected readonly logger = getLoggerFor(this);\n protected readonly resourceMapper: FileIdentifierMapper;\n private readonly client: Client;\n private readonly bucketName: string;\n\n public constructor(\n resourceMapper: FileIdentifierMapper,\n accessKey: string,\n secretKey: string,\n endpoint: string,\n bucketName: string,\n ) {\n this.resourceMapper = resourceMapper;\n\n // Parse endpoint - supports both URL format (http://host:port) and simple format (host:port)\n let endPoint: string;\n let port: number | undefined;\n let useSSL = false;\n\n if (endpoint.startsWith('http://') || endpoint.startsWith('https://')) {\n const url = new URL(endpoint);\n endPoint = url.hostname;\n port = url.port ? parseInt(url.port, 10) : undefined;\n useSSL = url.protocol === 'https:';\n } else {\n const parts = endpoint.split(':');\n endPoint = parts[0];\n port = parts[1] ? parseInt(parts[1], 10) : undefined;\n }\n\n this.client = new Client({\n accessKey,\n secretKey,\n endPoint,\n port,\n useSSL,\n });\n this.bucketName = bucketName;\n this.logger.info(`MinioDataAccessor initialized with endpoint: ${endPoint}:${port} (SSL: ${useSSL})`)\n }\n\n /**\n * Should throw a NotImplementedHttpError if the DataAccessor does not support storing the given Representation.\n *\n * @param representation - Incoming Representation.\n *\n * @throws BadRequestHttpError\n * If it does not support the incoming data.\n */\n public async canHandle(representation: Representation): Promise<void> {\n if (!representation.binary) {\n throw new UnsupportedMediaTypeHttpError('Only binary data is supported.');\n }\n }\n\n /**\n * Returns a data stream stored for the given identifier.\n * It can be assumed that the incoming identifier will always correspond to a document.\n *\n * @param identifier - Identifier for which the data is requested.\n */\n public async getData(identifier: ResourceIdentifier): Promise<Guarded<Readable>> {\n const started = Date.now();\n const url = new URL(identifier.path)\n const stream = await this.client.getObject(this.bucketName, url.pathname);\n this.logDuration('getData', identifier.path, started);\n return guardStream(stream);\n }\n\n /**\n * Generate a presigned GET URL for the given resource.\n * @param identifier - Resource identifier.\n * @param expires - URL expiry in seconds (default 3600).\n */\n public async getPresignedUrl(identifier: ResourceIdentifier, expires = 3600): Promise<string> {\n const url = new URL(identifier.path);\n const objectKey = url.pathname.replace(/^\\//, '');\n return this.client.presignedGetObject(this.bucketName, objectKey, expires);\n }\n\n /**\n * Returns the metadata corresponding to the identifier.\n * If possible, it is suggested to add a `posix:size` triple to the metadata indicating the binary size.\n * This is necessary for range requests.\n *\n * @param identifier - Identifier for which the metadata is requested.\n */\n public async getMetadata(identifier: ResourceIdentifier): Promise<RepresentationMetadata> {\n const started = Date.now();\n const url = new URL(identifier.path)\n const link = await this.resourceMapper.mapUrlToFilePath(identifier, false);\n const isDirectory = identifier.path.endsWith('/');\n const objectName = isDirectory ? `${url.pathname}/.container` : url.pathname;\n let stats: BucketItemStat;\n try {\n stats = await this.client.statObject(this.bucketName, objectName);\n } catch (error) {\n throw new NotFoundHttpError();\n }\n if (!isContainerIdentifier(identifier) && !isDirectory) {\n const metadata = await this.getFileMetadata(link, stats);\n this.logDuration('getMetadata', identifier.path, started);\n return metadata;\n }\n if (isContainerIdentifier(identifier) && isDirectory) {\n const metadata = await this.getDirectoryMetadata(link, stats);\n this.logDuration('getMetadata', identifier.path, started);\n return metadata;\n }\n throw new NotFoundHttpError();\n }\n\n /**\n * Returns metadata for all resources in the requested container.\n * This should not be all metadata of those resources (but it can be),\n * but instead the main metadata you want to show in situations\n * where all these resources are presented simultaneously.\n * Generally this would be metadata that is present for all of these resources,\n * such as resource type or last modified date.\n *\n * It can be safely assumed that the incoming identifier will always correspond to a container.\n *\n * @param identifier - Identifier of the parent container.\n */\n public async* getChildren(identifier: ResourceIdentifier): AsyncIterableIterator<RepresentationMetadata> {\n const url = new URL(identifier.path)\n const objects = this.client.listObjectsV2(this.bucketName, url.pathname);\n for await (const object of objects) {\n const metadata = await this.getMetadata(object);\n yield metadata;\n }\n }\n\n /**\n * Writes data and metadata for a document.\n * If any data and/or metadata exist for the given identifier, it should be overwritten.\n *\n * @param identifier - Identifier of the resource.\n * @param data - Data to store.\n * @param metadata - Metadata to store.\n */\n public async writeDocument(identifier: ResourceIdentifier, data: Guarded<Readable>, metadata: RepresentationMetadata): Promise<void> {\n const started = Date.now();\n const url = new URL(identifier.path);\n const link = await this.resourceMapper.mapUrlToFilePath(identifier, false);\n const itemMetadata = this.encodeMetadata(link, metadata);\n try {\n await this.client.putObject(\n this.bucketName,\n url.pathname,\n data,\n metadata.contentLength,\n itemMetadata || undefined,\n );\n this.logDuration('writeDocument', identifier.path, started);\n } catch (error) {\n this.logger.error(`Error writing document: ${identifier.path} ${error}`)\n throw error;\n }\n }\n\n /**\n * Writes metadata for a container.\n * If the container does not exist yet it should be created,\n * if it does its metadata should be overwritten, except for the containment triples.\n *\n * @param identifier - Identifier of the container.\n * @param metadata - Metadata to store.\n */\n public async writeContainer(identifier: ResourceIdentifier, metadata: RepresentationMetadata): Promise<void> {\n const started = Date.now();\n const url = new URL(identifier.path)\n const link = await this.resourceMapper.mapUrlToFilePath(identifier, false);\n await this.client.putObject(\n this.bucketName,\n `${url.pathname}/.container`,\n Buffer.from(''),\n metadata.contentLength,\n this.encodeMetadata(link, metadata) || undefined,\n );\n this.logDuration('writeContainer', identifier.path, started);\n }\n\n /**\n * Writes metadata for a resource.\n * It can safely be assumed that the subject resource already exists.\n *\n * @param identifier - Identifier of the subject resource.\n * @param metadata - Metadata to store.\n */\n public async writeMetadata(identifier: ResourceIdentifier, metadata: RepresentationMetadata): Promise<void> {\n throw new Error('Minio does not support writing metadata for a resource.');\n }\n\n /**\n * Deletes the resource and its corresponding metadata.\n *\n * Solid, §5.4: \"When a contained resource is deleted, the server MUST also remove the corresponding containment\n * triple, which has the effect of removing the deleted resource from the containing container.\"\n * https://solid.github.io/specification/protocol#deleting-resources\n *\n * @param identifier - Resource to delete.\n */\n public async deleteResource(identifier: ResourceIdentifier): Promise<void> {\n const link = new URL(identifier.path)\n await this.client.removeObject(this.bucketName, link.pathname);\n }\n\n /**\n * Reads and generates all metadata relevant for the given file,\n * ingesting it into a RepresentationMetadata object.\n *\n * @param link - Path related metadata.\n * @param stats - Stats object of the corresponding file.\n */\n private async getFileMetadata(link: ResourceLink, stats: BucketItemStat): Promise<RepresentationMetadata> {\n const metadata = await this.getBaseMetadata(link, stats, false);\n // If the resource is using an unsupported contentType, the original contentType was written to the metadata file.\n // As a result, we should only set the contentType derived from the file path,\n // when no previous metadata entry for contentType is present.\n if (typeof metadata.contentType === 'undefined') {\n metadata.set(CONTENT_TYPE_TERM, link.contentType);\n }\n return metadata;\n }\n\n /**\n * Reads and generates all metadata relevant for the given directory,\n * ingesting it into a RepresentationMetadata object.\n *\n * @param link - Path related metadata.\n * @param stats - Stats object of the corresponding directory.\n */\n private async getDirectoryMetadata(link: ResourceLink, stats: BucketItemStat): Promise<RepresentationMetadata> {\n return this.getBaseMetadata(link, stats, true);\n }\n \n /**\n * Generates metadata relevant for any resources stored by this accessor.\n *\n * @param link - Path related metadata.\n * @param stats - Stats objects of the corresponding directory.\n * @param isContainer - If the path points to a container (directory) or not.\n */\n private async getBaseMetadata(link: ResourceLink, stats: BucketItemStat, isContainer: boolean): Promise<RepresentationMetadata> {\n const metadata = this.decodeMetadata(link, stats.metaData);\n addResourceMetadata(metadata, isContainer);\n this.addPosixMetadata(metadata, stats, isContainer);\n return metadata;\n }\n \n /**\n * Helper function to add file system related metadata.\n *\n * @param metadata - metadata object to add to\n * @param stats - Stats of the file/directory corresponding to the resource.\n */\n private addPosixMetadata(metadata: RepresentationMetadata, stats: BucketItemStat, isDirectory: boolean): void {\n updateModifiedDate(metadata, stats.lastModified);\n metadata.add(\n POSIX.terms.mtime,\n toLiteral(Math.floor(stats.lastModified.getTime() / 1000), XSD.terms.integer),\n SOLID_META.terms.ResponseMetadata,\n );\n if (!isDirectory) {\n metadata.add(\n POSIX.terms.size,\n toLiteral(stats.size, XSD.terms.integer),\n SOLID_META.terms.ResponseMetadata,\n );\n }\n }\n\n /**\n * encode the metadata of the resource to string.\n *\n * @param link - Path related metadata of the resource.\n * @param metadata - Metadata to write.\n *\n * @returns string of metadata.\n */\n protected encodeMetadata(link: ResourceLink, metadata: RepresentationMetadata): object | null {\n // These are stored by file system conventions\n metadata.remove(RDF.terms.type, LDP.terms.Resource);\n metadata.remove(RDF.terms.type, LDP.terms.Container);\n metadata.remove(RDF.terms.type, LDP.terms.BasicContainer);\n metadata.removeAll(DC.terms.modified);\n // When writing metadata for a document, only remove the content-type when dealing with a supported media type.\n // A media type is supported if the FileIdentifierMapper can correctly store it.\n // This allows restoring the appropriate content-type on data read (see getFileMetadata).\n if (isContainerPath(link.filePath) || typeof metadata.contentType !== 'undefined') {\n metadata.removeAll(CONTENT_TYPE_TERM);\n }\n const contentTypeObject = metadata.contentTypeObject\n if (contentTypeObject === undefined\n || Object.keys(contentTypeObject.parameters).length === 0) {\n return null;\n }\n // Write metadata to file if there are quads remaining\n return contentTypeObject.parameters;\n }\n\n protected decodeMetadata(link: ResourceLink, metadata: MetadataRecord): RepresentationMetadata {\n return new RepresentationMetadata(link.identifier, metadata);\n }\n\n private logDuration(\n operation: string,\n identifierPath: string,\n started: number,\n slowThresholdMs = 100,\n warnThresholdMs = 1000,\n ): void {\n const elapsedMs = Date.now() - started;\n if (elapsedMs < slowThresholdMs) {\n return;\n }\n\n const message = `[timing] MinioDataAccessor.${operation} path=${identifierPath} took=${elapsedMs}ms`;\n if (elapsedMs >= warnThresholdMs) {\n this.logger.warn(message);\n return;\n }\n\n this.logger.info(message);\n }\n}\n"]}
|
|
@@ -118,6 +118,10 @@
|
|
|
118
118
|
{
|
|
119
119
|
"@id": "undefineds:dist/storage/accessors/MinioDataAccessor.jsonld#MinioDataAccessor__member_decodeMetadata",
|
|
120
120
|
"memberFieldName": "decodeMetadata"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"@id": "undefineds:dist/storage/accessors/MinioDataAccessor.jsonld#MinioDataAccessor__member_logDuration",
|
|
124
|
+
"memberFieldName": "logDuration"
|
|
121
125
|
}
|
|
122
126
|
],
|
|
123
127
|
"constructorArguments": [
|
|
@@ -15,7 +15,8 @@ export declare class MixDataAccessor implements DataAccessor {
|
|
|
15
15
|
private readonly structuredDataAccessor;
|
|
16
16
|
private readonly unstructuredDataAccessor;
|
|
17
17
|
private readonly presignedRedirectEnabled;
|
|
18
|
-
|
|
18
|
+
private readonly mirrorContainersToUnstructured;
|
|
19
|
+
constructor(structuredDataAccessor: DataAccessor, unstructuredDataAccessor: DataAccessor, presignedRedirectEnabled?: boolean, mirrorContainersToUnstructured?: boolean);
|
|
19
20
|
/**
|
|
20
21
|
* This accessor supports all types of data.
|
|
21
22
|
*/
|
|
@@ -41,4 +42,5 @@ export declare class MixDataAccessor implements DataAccessor {
|
|
|
41
42
|
* then save metadata in structured accessor.
|
|
42
43
|
*/
|
|
43
44
|
private writeUnstructuredDocument;
|
|
45
|
+
private invalidateMetadataCache;
|
|
44
46
|
}
|