@gadgetinc/dateilager 0.2.9 → 0.3.1
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/cjs/binary-client.d.ts +12 -12
- package/dist/cjs/binary-client.js +12 -12
- package/dist/cjs/binary-client.js.map +1 -1
- package/dist/cjs/grpc-client.d.ts +40 -28
- package/dist/cjs/grpc-client.js +51 -27
- package/dist/cjs/grpc-client.js.map +1 -1
- package/dist/cjs/pb/fs_pb.client.d.ts +40 -0
- package/dist/cjs/pb/fs_pb.client.js +28 -0
- package/dist/cjs/pb/fs_pb.client.js.map +1 -1
- package/dist/cjs/pb/fs_pb.d.ts +188 -0
- package/dist/cjs/pb/fs_pb.js +454 -3
- package/dist/cjs/pb/fs_pb.js.map +1 -1
- package/dist/esm/binary-client.d.ts +12 -12
- package/dist/esm/binary-client.js +12 -12
- package/dist/esm/binary-client.js.map +1 -1
- package/dist/esm/grpc-client.d.ts +40 -28
- package/dist/esm/grpc-client.js +51 -27
- package/dist/esm/grpc-client.js.map +1 -1
- package/dist/esm/pb/fs_pb.client.d.ts +40 -0
- package/dist/esm/pb/fs_pb.client.js +28 -0
- package/dist/esm/pb/fs_pb.client.js.map +1 -1
- package/dist/esm/pb/fs_pb.d.ts +188 -0
- package/dist/esm/pb/fs_pb.js +453 -2
- package/dist/esm/pb/fs_pb.js.map +1 -1
- package/package.json +1 -1
|
@@ -71,17 +71,17 @@ export interface DateiLagerBinaryClientOptions {
|
|
|
71
71
|
*/
|
|
72
72
|
export declare class DateiLagerBinaryClient {
|
|
73
73
|
/**
|
|
74
|
-
* @param
|
|
74
|
+
* @param options An object with {@link DateiLagerBinaryClientOptions options}.
|
|
75
75
|
*/
|
|
76
76
|
constructor(options: DateiLagerBinaryClientOptions);
|
|
77
77
|
/**
|
|
78
78
|
* Update objects in a project based on the differences in a local directory.
|
|
79
79
|
*
|
|
80
|
-
* @param
|
|
81
|
-
* @param
|
|
82
|
-
* @param
|
|
83
|
-
* @param
|
|
84
|
-
* @returns
|
|
80
|
+
* @param project The id of the project.
|
|
81
|
+
* @param directory The path of the directory to send updates from.
|
|
82
|
+
* @param options Object of options.
|
|
83
|
+
* @param options.timeout Number of milliseconds to wait before terminating the process.
|
|
84
|
+
* @returns The latest project version or `null` if something went wrong.
|
|
85
85
|
*/
|
|
86
86
|
update(project: bigint, directory: string, options?: {
|
|
87
87
|
timeout: number;
|
|
@@ -89,12 +89,12 @@ export declare class DateiLagerBinaryClient {
|
|
|
89
89
|
/**
|
|
90
90
|
* Rebuild the local filesystem.
|
|
91
91
|
*
|
|
92
|
-
* @param
|
|
93
|
-
* @param
|
|
94
|
-
* @param
|
|
95
|
-
* @param
|
|
96
|
-
* @param
|
|
97
|
-
* @returns
|
|
92
|
+
* @param project The id of the project.
|
|
93
|
+
* @param to The version of the project to rebuild the filesystem to.
|
|
94
|
+
* @param directory The path of the directory to rebuild the filesystem at.
|
|
95
|
+
* @param options Object of options.
|
|
96
|
+
* @param options.timeout Number of milliseconds to wait before terminating the process.
|
|
97
|
+
* @returns The latest project version or `null` if something went wrong.
|
|
98
98
|
*/
|
|
99
99
|
rebuild(project: bigint, to: bigint | null, directory: string, options?: {
|
|
100
100
|
timeout: number;
|
|
@@ -16,7 +16,7 @@ const telemetry_1 = require("./internal/telemetry");
|
|
|
16
16
|
*/
|
|
17
17
|
class DateiLagerBinaryClient {
|
|
18
18
|
/**
|
|
19
|
-
* @param
|
|
19
|
+
* @param options An object with {@link DateiLagerBinaryClientOptions options}.
|
|
20
20
|
*/
|
|
21
21
|
constructor(options) {
|
|
22
22
|
/** @internal */
|
|
@@ -47,11 +47,11 @@ class DateiLagerBinaryClient {
|
|
|
47
47
|
/**
|
|
48
48
|
* Update objects in a project based on the differences in a local directory.
|
|
49
49
|
*
|
|
50
|
-
* @param
|
|
51
|
-
* @param
|
|
52
|
-
* @param
|
|
53
|
-
* @param
|
|
54
|
-
* @returns
|
|
50
|
+
* @param project The id of the project.
|
|
51
|
+
* @param directory The path of the directory to send updates from.
|
|
52
|
+
* @param options Object of options.
|
|
53
|
+
* @param options.timeout Number of milliseconds to wait before terminating the process.
|
|
54
|
+
* @returns The latest project version or `null` if something went wrong.
|
|
55
55
|
*/
|
|
56
56
|
async update(project, directory, options) {
|
|
57
57
|
return await (0, telemetry_1.trace)("dateilager-binary-client.update", {
|
|
@@ -70,12 +70,12 @@ class DateiLagerBinaryClient {
|
|
|
70
70
|
/**
|
|
71
71
|
* Rebuild the local filesystem.
|
|
72
72
|
*
|
|
73
|
-
* @param
|
|
74
|
-
* @param
|
|
75
|
-
* @param
|
|
76
|
-
* @param
|
|
77
|
-
* @param
|
|
78
|
-
* @returns
|
|
73
|
+
* @param project The id of the project.
|
|
74
|
+
* @param to The version of the project to rebuild the filesystem to.
|
|
75
|
+
* @param directory The path of the directory to rebuild the filesystem at.
|
|
76
|
+
* @param options Object of options.
|
|
77
|
+
* @param options.timeout Number of milliseconds to wait before terminating the process.
|
|
78
|
+
* @returns The latest project version or `null` if something went wrong.
|
|
79
79
|
*/
|
|
80
80
|
async rebuild(project, to, directory, options) {
|
|
81
81
|
return await (0, telemetry_1.trace)("dateilager-binary-client.rebuild", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary-client.js","sourceRoot":"","sources":["../../src/binary-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { context, propagation } from \"@opentelemetry/api\";\nimport type { ExecaReturnValue } from \"execa\";\nimport execa from \"execa\";\nimport fs from \"fs/promises\";\nimport readline from \"readline\";\nimport { trace } from \"./internal/telemetry\";\n\n/**\n * Options for {@link DateiLagerBinaryClient}.\n */\nexport interface DateiLagerBinaryClientOptions {\n /**\n * The address of the dateilager server.\n */\n server:\n | string\n | {\n /**\n * The host of the dateilager server.\n */\n host: string;\n\n /**\n * The port of the dateilager server.\n */\n port: number;\n };\n\n /**\n * The token that will be sent as authorization metadata to the dateilager server.\n */\n token: string | (() => Promise<string>);\n\n /**\n * The path to the dateilager-client executable.\n *\n * @default \"dateilager-client\"\n */\n command?: string;\n\n /**\n * The default number of milliseconds to wait before terminating any command.\n *\n * @default 0 No timeout.\n */\n timeout?:\n | number\n | {\n /**\n * The default number of milliseconds to wait before terminating the update command.\n *\n * @default 0 No timeout.\n */\n update?: number;\n\n /**\n * The default number of milliseconds to wait before terminating the rebuild command.\n *\n * @default 0 No timeout.\n */\n rebuild?: number;\n };\n\n /**\n * Whether the dateilager binary client should enable tracing.\n *\n * @default false\n */\n tracing?: boolean;\n\n /**\n * Logging configuration.\n */\n logger?: {\n /**\n * The log level to pass to the dateilager binary client.\n */\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n\n /**\n * The function that will be called when the dateilager binary client logs something.\n */\n log: (level: \"debug\" | \"info\" | \"warn\" | \"error\", msg: string, fields: Record<string, unknown>) => void;\n };\n}\n\n/**\n * A version of the DateiLager client that uses the compiled binary client instead of the Javascript one.\n *\n * Useful for working directly with a real filesystem instead of in memory objects.\n */\nexport class DateiLagerBinaryClient {\n /** @internal */\n private readonly _options;\n\n /**\n * @param options An object with {@link DateiLagerBinaryClientOptions options}.\n */\n public constructor(options: DateiLagerBinaryClientOptions) {\n this._options = {\n server: typeof options.server === \"string\" ? options.server : `${options.server.host}:${options.server.port}`,\n token: typeof options.token === \"string\" ? () => Promise.resolve(options.token as string) : options.token,\n command: options.command ?? \"dateilager-client\",\n timeout:\n typeof options.timeout === \"number\"\n ? {\n update: options.timeout,\n rebuild: options.timeout,\n }\n : {\n update: 0,\n rebuild: 0,\n ...options.timeout,\n },\n tracing: options.tracing ?? false,\n logger: options.logger,\n };\n }\n\n /**\n * Update objects in a project based on the differences in a local directory.\n *\n * @param project The id of the project.\n * @param directory The path of the directory to send updates from.\n * @param options Object of options.\n * @param options.timeout Number of milliseconds to wait before terminating the process.\n * @returns The latest project version or `null` if something went wrong.\n */\n public async update(project: bigint, directory: string, options?: { timeout: number }): Promise<bigint | null> {\n return await trace(\n \"dateilager-binary-client.update\",\n {\n attributes: {\n \"dl.project\": String(project),\n \"dl.directory\": directory,\n },\n },\n async () => {\n const result = await this._call(\"update\", project, directory, [\"--dir\", directory], options);\n\n if (result.stdout == \"-1\") {\n return null;\n }\n\n return BigInt(result.stdout);\n }\n );\n }\n\n /**\n * Rebuild the local filesystem.\n *\n * @param project The id of the project.\n * @param to The version of the project to rebuild the filesystem to.\n * @param directory The path of the directory to rebuild the filesystem at.\n * @param options Object of options.\n * @param options.timeout Number of milliseconds to wait before terminating the process.\n * @returns The latest project version or `null` if something went wrong.\n */\n public async rebuild(project: bigint, to: bigint | null, directory: string, options?: { timeout: number }): Promise<bigint | null> {\n return await trace(\n \"dateilager-binary-client.rebuild\",\n {\n attributes: {\n \"dl.project\": String(project),\n \"dl.to\": String(to),\n \"dl.directory\": directory,\n },\n },\n async () => {\n await fs.mkdir(directory, { recursive: true });\n\n const args = [\"--dir\", directory];\n if (to) {\n args.push(\"--to\", String(to));\n }\n\n const result = await this._call(\"rebuild\", project, directory, args, options);\n if (result.stdout == \"-1\") {\n return null;\n }\n\n return BigInt(result.stdout);\n }\n );\n }\n\n /** @internal */\n private async _call(\n method: \"update\" | \"rebuild\",\n project: bigint,\n cwd: string,\n args: string[],\n options?: { timeout: number }\n ): Promise<ExecaReturnValue> {\n const baseArgs = [method, \"--project\", String(project), \"--server\", this._options.server, \"--log-encoding\", \"json\"];\n\n if (this._options.logger) {\n baseArgs.push(\"--log-level\", this._options.logger.level);\n }\n\n if (this._options.tracing) {\n const carrier = {};\n propagation.inject(context.active(), carrier);\n const otelContext = JSON.stringify(carrier);\n\n baseArgs.push(\"--tracing\", \"--otel-context\", otelContext);\n }\n\n const subprocess = execa(this._options.command, baseArgs.concat(args), {\n cwd,\n timeout: options?.timeout ?? this._options.timeout[method],\n env: { DL_TOKEN: await this._options.token() },\n });\n\n if (this._options.logger && subprocess.stderr) {\n readline.createInterface(subprocess.stderr).on(\"line\", (line) => {\n try {\n // we purposefully extract and ignore the `ts` field\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { level, msg, ts, ...fields } = JSON.parse(line) as {\n [key: string]: unknown;\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n msg: string;\n ts: string | number;\n };\n\n this._options.logger?.log(level, msg, fields);\n } catch (error) {\n this._options.logger?.log(\"warn\", \"failed to log line\", { error, line });\n }\n });\n }\n\n return subprocess;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"binary-client.js","sourceRoot":"","sources":["../../src/binary-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { context, propagation } from \"@opentelemetry/api\";\nimport type { ExecaReturnValue } from \"execa\";\nimport execa from \"execa\";\nimport fs from \"fs/promises\";\nimport readline from \"readline\";\nimport { trace } from \"./internal/telemetry\";\n\n/**\n * Options for {@link DateiLagerBinaryClient}.\n */\nexport interface DateiLagerBinaryClientOptions {\n /**\n * The address of the dateilager server.\n */\n server:\n | string\n | {\n /**\n * The host of the dateilager server.\n */\n host: string;\n\n /**\n * The port of the dateilager server.\n */\n port: number;\n };\n\n /**\n * The token that will be sent as authorization metadata to the dateilager server.\n */\n token: string | (() => Promise<string>);\n\n /**\n * The path to the dateilager-client executable.\n *\n * @default \"dateilager-client\"\n */\n command?: string;\n\n /**\n * The default number of milliseconds to wait before terminating any command.\n *\n * @default 0 No timeout.\n */\n timeout?:\n | number\n | {\n /**\n * The default number of milliseconds to wait before terminating the update command.\n *\n * @default 0 No timeout.\n */\n update?: number;\n\n /**\n * The default number of milliseconds to wait before terminating the rebuild command.\n *\n * @default 0 No timeout.\n */\n rebuild?: number;\n };\n\n /**\n * Whether the dateilager binary client should enable tracing.\n *\n * @default false\n */\n tracing?: boolean;\n\n /**\n * Logging configuration.\n */\n logger?: {\n /**\n * The log level to pass to the dateilager binary client.\n */\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n\n /**\n * The function that will be called when the dateilager binary client logs something.\n */\n log: (level: \"debug\" | \"info\" | \"warn\" | \"error\", msg: string, fields: Record<string, unknown>) => void;\n };\n}\n\n/**\n * A version of the DateiLager client that uses the compiled binary client instead of the Javascript one.\n *\n * Useful for working directly with a real filesystem instead of in memory objects.\n */\nexport class DateiLagerBinaryClient {\n /** @internal */\n private readonly _options;\n\n /**\n * @param options An object with {@link DateiLagerBinaryClientOptions options}.\n */\n public constructor(options: DateiLagerBinaryClientOptions) {\n this._options = {\n server: typeof options.server === \"string\" ? options.server : `${options.server.host}:${options.server.port}`,\n token: typeof options.token === \"string\" ? () => Promise.resolve(options.token as string) : options.token,\n command: options.command ?? \"dateilager-client\",\n timeout:\n typeof options.timeout === \"number\"\n ? {\n update: options.timeout,\n rebuild: options.timeout,\n }\n : {\n update: 0,\n rebuild: 0,\n ...options.timeout,\n },\n tracing: options.tracing ?? false,\n logger: options.logger,\n };\n }\n\n /**\n * Update objects in a project based on the differences in a local directory.\n *\n * @param project The id of the project.\n * @param directory The path of the directory to send updates from.\n * @param options Object of options.\n * @param options.timeout Number of milliseconds to wait before terminating the process.\n * @returns The latest project version or `null` if something went wrong.\n */\n public async update(project: bigint, directory: string, options?: { timeout: number }): Promise<bigint | null> {\n return await trace(\n \"dateilager-binary-client.update\",\n {\n attributes: {\n \"dl.project\": String(project),\n \"dl.directory\": directory,\n },\n },\n async () => {\n const result = await this._call(\"update\", project, directory, [\"--dir\", directory], options);\n\n if (result.stdout == \"-1\") {\n return null;\n }\n\n return BigInt(result.stdout);\n }\n );\n }\n\n /**\n * Rebuild the local filesystem.\n *\n * @param project The id of the project.\n * @param to The version of the project to rebuild the filesystem to.\n * @param directory The path of the directory to rebuild the filesystem at.\n * @param options Object of options.\n * @param options.timeout Number of milliseconds to wait before terminating the process.\n * @returns The latest project version or `null` if something went wrong.\n */\n public async rebuild(project: bigint, to: bigint | null, directory: string, options?: { timeout: number }): Promise<bigint | null> {\n return await trace(\n \"dateilager-binary-client.rebuild\",\n {\n attributes: {\n \"dl.project\": String(project),\n \"dl.to\": String(to),\n \"dl.directory\": directory,\n },\n },\n async () => {\n await fs.mkdir(directory, { recursive: true });\n\n const args = [\"--dir\", directory];\n if (to) {\n args.push(\"--to\", String(to));\n }\n\n const result = await this._call(\"rebuild\", project, directory, args, options);\n if (result.stdout == \"-1\") {\n return null;\n }\n\n return BigInt(result.stdout);\n }\n );\n }\n\n /** @internal */\n private async _call(\n method: \"update\" | \"rebuild\",\n project: bigint,\n cwd: string,\n args: string[],\n options?: { timeout: number }\n ): Promise<ExecaReturnValue> {\n const baseArgs = [method, \"--project\", String(project), \"--server\", this._options.server, \"--log-encoding\", \"json\"];\n\n if (this._options.logger) {\n baseArgs.push(\"--log-level\", this._options.logger.level);\n }\n\n if (this._options.tracing) {\n const carrier = {};\n propagation.inject(context.active(), carrier);\n const otelContext = JSON.stringify(carrier);\n\n baseArgs.push(\"--tracing\", \"--otel-context\", otelContext);\n }\n\n const subprocess = execa(this._options.command, baseArgs.concat(args), {\n cwd,\n timeout: options?.timeout ?? this._options.timeout[method],\n env: { DL_TOKEN: await this._options.token() },\n });\n\n if (this._options.logger && subprocess.stderr) {\n readline.createInterface(subprocess.stderr).on(\"line\", (line) => {\n try {\n // we purposefully extract and ignore the `ts` field\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { level, msg, ts, ...fields } = JSON.parse(line) as {\n [key: string]: unknown;\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n msg: string;\n ts: string | number;\n };\n\n this._options.logger?.log(level, msg, fields);\n } catch (error) {\n this._options.logger?.log(\"warn\", \"failed to log line\", { error, line });\n }\n });\n }\n\n return subprocess;\n }\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ClientOptions } from "@grpc/grpc-js";
|
|
2
2
|
import type { Span } from "@opentelemetry/api";
|
|
3
3
|
import type { ClientStreamingCall, RpcOptions } from "@protobuf-ts/runtime-rpc";
|
|
4
|
-
import type { Objekt, Project, UpdateRequest, UpdateResponse } from "./pb/fs_pb";
|
|
4
|
+
import type { CloneToProjectResponse, Objekt, Project, UpdateRequest, UpdateResponse } from "./pb/fs_pb";
|
|
5
5
|
export type { Objekt, Project };
|
|
6
6
|
/**
|
|
7
7
|
* Options for {@link DateiLagerGrpcClient}.
|
|
@@ -48,7 +48,7 @@ export declare class DateiLagerGrpcClient {
|
|
|
48
48
|
* The library used to interact with GRPC creates connections lazily, this constructor will not
|
|
49
49
|
* raise an error even if there is no service running at {@link DateiLagerGrpcClientOptions.server server}.
|
|
50
50
|
*
|
|
51
|
-
* @param
|
|
51
|
+
* @param options Grpc client options.
|
|
52
52
|
*/
|
|
53
53
|
constructor(options: DateiLagerGrpcClientOptions);
|
|
54
54
|
/**
|
|
@@ -58,26 +58,26 @@ export declare class DateiLagerGrpcClient {
|
|
|
58
58
|
/**
|
|
59
59
|
* Create a new project.
|
|
60
60
|
*
|
|
61
|
-
* @param
|
|
62
|
-
* @param
|
|
63
|
-
* @param
|
|
61
|
+
* @param project The id of the project.
|
|
62
|
+
* @param packPatterns The paths to pack.
|
|
63
|
+
* @param template The id of the project to start from.
|
|
64
64
|
*/
|
|
65
65
|
newProject(project: bigint, packPatterns: string[], template?: bigint): Promise<void>;
|
|
66
66
|
/**
|
|
67
67
|
* Delete a project.
|
|
68
68
|
*
|
|
69
|
-
* @param
|
|
69
|
+
* @param project The id of the project.
|
|
70
70
|
*/
|
|
71
71
|
deleteProject(project: bigint): Promise<void>;
|
|
72
72
|
/**
|
|
73
73
|
* List objects.
|
|
74
74
|
*
|
|
75
|
-
* @param
|
|
76
|
-
* @param
|
|
77
|
-
* @param
|
|
78
|
-
* @param
|
|
79
|
-
* @param
|
|
80
|
-
* @returns
|
|
75
|
+
* @param project The id of the project.
|
|
76
|
+
* @param path The path to list objects under.
|
|
77
|
+
* @param ignores The paths under {@link path} to ignore.
|
|
78
|
+
* @param from The project version to start from.
|
|
79
|
+
* @param to The project version to end at.
|
|
80
|
+
* @returns A stream of objects.
|
|
81
81
|
* @yields An object from the stream.
|
|
82
82
|
* @example
|
|
83
83
|
* for await (const object of client.listObjects(1n, "")) {
|
|
@@ -89,30 +89,30 @@ export declare class DateiLagerGrpcClient {
|
|
|
89
89
|
/**
|
|
90
90
|
* Get an object.
|
|
91
91
|
*
|
|
92
|
-
* @param
|
|
93
|
-
* @param
|
|
94
|
-
* @returns
|
|
92
|
+
* @param project The id of the project.
|
|
93
|
+
* @param path The path of the object.
|
|
94
|
+
* @returns The object at the given path or undefined if it does not exist.
|
|
95
95
|
*/
|
|
96
96
|
getObject(project: bigint, path: string): Promise<Objekt | undefined>;
|
|
97
97
|
/**
|
|
98
98
|
* Update objects.
|
|
99
99
|
*
|
|
100
|
-
* @param
|
|
101
|
-
* @returns
|
|
100
|
+
* @param project The id of the project.
|
|
101
|
+
* @returns An {@link UpdateInputStream} to send objects to update.
|
|
102
102
|
*/
|
|
103
103
|
updateObjects(project: bigint): UpdateInputStream;
|
|
104
104
|
/**
|
|
105
105
|
* Update an object.
|
|
106
106
|
*
|
|
107
|
-
* @param
|
|
108
|
-
* @param
|
|
109
|
-
* @returns
|
|
107
|
+
* @param project The id of the project.
|
|
108
|
+
* @param obj The object to update.
|
|
109
|
+
* @returns The latest project version or `null` if something went wrong.
|
|
110
110
|
*/
|
|
111
111
|
updateObject(project: bigint, obj: Objekt): Promise<bigint | null>;
|
|
112
112
|
/**
|
|
113
113
|
* Snapshot the current state of the dateilager server.
|
|
114
114
|
*
|
|
115
|
-
* @returns
|
|
115
|
+
* @returns All the projects on the dateilager server.
|
|
116
116
|
* @throws If the dateilager server's DL_ENV environment variable is PROD.
|
|
117
117
|
* @see DateiLagerGrpcClient.resetToSnapshotInDevOrTests
|
|
118
118
|
*/
|
|
@@ -121,11 +121,23 @@ export declare class DateiLagerGrpcClient {
|
|
|
121
121
|
* Reset the given projects to their respective versions and delete any remaining projects.
|
|
122
122
|
* If no projects are provided, delete all projects.
|
|
123
123
|
*
|
|
124
|
-
* @param
|
|
124
|
+
* @param projects The projects to reset.
|
|
125
125
|
* @throws If the dateilager server's DL_ENV environment variable is PROD.
|
|
126
126
|
* @see DateiLagerGrpcClient.snapshotInDevOrTests
|
|
127
127
|
*/
|
|
128
128
|
resetToSnapshotInDevOrTests(projects: Project[]): Promise<void>;
|
|
129
|
+
/**
|
|
130
|
+
* Clones the `source` projects changes (from `fromVersion` up to `toVersion`) to the `target` project.
|
|
131
|
+
* This method assumes that it is always a one way clone from source to target, it does not take into account
|
|
132
|
+
* the changes that have occurred in the `target` project.
|
|
133
|
+
*
|
|
134
|
+
* @param source The source project.
|
|
135
|
+
* @param target The target project.
|
|
136
|
+
* @param fromVersion Start version of the source project.
|
|
137
|
+
* @param toVersion Stop version of the source project.
|
|
138
|
+
* @returns The new version number of the target project
|
|
139
|
+
*/
|
|
140
|
+
cloneToProject(source: bigint, target: bigint, fromVersion: bigint, toVersion: bigint): Promise<CloneToProjectResponse>;
|
|
129
141
|
}
|
|
130
142
|
/**
|
|
131
143
|
* Used to send a stream of objects to update.
|
|
@@ -137,27 +149,27 @@ declare class UpdateInputStream {
|
|
|
137
149
|
/**
|
|
138
150
|
* Send an object to update.
|
|
139
151
|
*
|
|
140
|
-
* @param
|
|
152
|
+
* @param obj The object to update.
|
|
141
153
|
*/
|
|
142
154
|
send(obj: Objekt): Promise<void>;
|
|
143
155
|
/**
|
|
144
156
|
* Complete the update request.
|
|
145
157
|
*
|
|
146
|
-
* @returns
|
|
158
|
+
* @returns The latest project version or `null` if something went wrong.
|
|
147
159
|
*/
|
|
148
160
|
complete(): Promise<bigint | null>;
|
|
149
161
|
}
|
|
150
162
|
/**
|
|
151
163
|
* Encode string object contents as an array of bytes.
|
|
152
164
|
*
|
|
153
|
-
* @param
|
|
154
|
-
* @returns
|
|
165
|
+
* @param content The string to encode.
|
|
166
|
+
* @returns The encoded content as an array of bytes.
|
|
155
167
|
*/
|
|
156
168
|
export declare function encodeContent(content: string): Uint8Array;
|
|
157
169
|
/**
|
|
158
170
|
* Decode an array of bytes as an object's string contents.
|
|
159
171
|
*
|
|
160
|
-
* @param
|
|
161
|
-
* @returns
|
|
172
|
+
* @param bytes The array of bytes to decode.
|
|
173
|
+
* @returns The bytes decoded into a string.
|
|
162
174
|
*/
|
|
163
175
|
export declare function decodeContent(bytes: Uint8Array | undefined): string;
|
package/dist/cjs/grpc-client.js
CHANGED
|
@@ -18,7 +18,7 @@ class DateiLagerGrpcClient {
|
|
|
18
18
|
* The library used to interact with GRPC creates connections lazily, this constructor will not
|
|
19
19
|
* raise an error even if there is no service running at {@link DateiLagerGrpcClientOptions.server server}.
|
|
20
20
|
*
|
|
21
|
-
* @param
|
|
21
|
+
* @param options Grpc client options.
|
|
22
22
|
*/
|
|
23
23
|
constructor(options) {
|
|
24
24
|
/** @internal */
|
|
@@ -68,9 +68,9 @@ class DateiLagerGrpcClient {
|
|
|
68
68
|
/**
|
|
69
69
|
* Create a new project.
|
|
70
70
|
*
|
|
71
|
-
* @param
|
|
72
|
-
* @param
|
|
73
|
-
* @param
|
|
71
|
+
* @param project The id of the project.
|
|
72
|
+
* @param packPatterns The paths to pack.
|
|
73
|
+
* @param template The id of the project to start from.
|
|
74
74
|
*/
|
|
75
75
|
async newProject(project, packPatterns, template) {
|
|
76
76
|
await (0, telemetry_1.trace)("dateilager-grpc-client.new-project", {
|
|
@@ -84,7 +84,7 @@ class DateiLagerGrpcClient {
|
|
|
84
84
|
/**
|
|
85
85
|
* Delete a project.
|
|
86
86
|
*
|
|
87
|
-
* @param
|
|
87
|
+
* @param project The id of the project.
|
|
88
88
|
*/
|
|
89
89
|
async deleteProject(project) {
|
|
90
90
|
await (0, telemetry_1.trace)("dateilager-grpc-client.delete-project", {
|
|
@@ -96,12 +96,12 @@ class DateiLagerGrpcClient {
|
|
|
96
96
|
/**
|
|
97
97
|
* List objects.
|
|
98
98
|
*
|
|
99
|
-
* @param
|
|
100
|
-
* @param
|
|
101
|
-
* @param
|
|
102
|
-
* @param
|
|
103
|
-
* @param
|
|
104
|
-
* @returns
|
|
99
|
+
* @param project The id of the project.
|
|
100
|
+
* @param path The path to list objects under.
|
|
101
|
+
* @param ignores The paths under {@link path} to ignore.
|
|
102
|
+
* @param from The project version to start from.
|
|
103
|
+
* @param to The project version to end at.
|
|
104
|
+
* @returns A stream of objects.
|
|
105
105
|
* @yields An object from the stream.
|
|
106
106
|
* @example
|
|
107
107
|
* for await (const object of client.listObjects(1n, "")) {
|
|
@@ -148,9 +148,9 @@ class DateiLagerGrpcClient {
|
|
|
148
148
|
/**
|
|
149
149
|
* Get an object.
|
|
150
150
|
*
|
|
151
|
-
* @param
|
|
152
|
-
* @param
|
|
153
|
-
* @returns
|
|
151
|
+
* @param project The id of the project.
|
|
152
|
+
* @param path The path of the object.
|
|
153
|
+
* @returns The object at the given path or undefined if it does not exist.
|
|
154
154
|
*/
|
|
155
155
|
async getObject(project, path) {
|
|
156
156
|
return await (0, telemetry_1.trace)("dateilager-grpc-client.get-object", {
|
|
@@ -181,8 +181,8 @@ class DateiLagerGrpcClient {
|
|
|
181
181
|
/**
|
|
182
182
|
* Update objects.
|
|
183
183
|
*
|
|
184
|
-
* @param
|
|
185
|
-
* @returns
|
|
184
|
+
* @param project The id of the project.
|
|
185
|
+
* @returns An {@link UpdateInputStream} to send objects to update.
|
|
186
186
|
*/
|
|
187
187
|
updateObjects(project) {
|
|
188
188
|
const parentContext = api_1.context.active();
|
|
@@ -197,9 +197,9 @@ class DateiLagerGrpcClient {
|
|
|
197
197
|
/**
|
|
198
198
|
* Update an object.
|
|
199
199
|
*
|
|
200
|
-
* @param
|
|
201
|
-
* @param
|
|
202
|
-
* @returns
|
|
200
|
+
* @param project The id of the project.
|
|
201
|
+
* @param obj The object to update.
|
|
202
|
+
* @returns The latest project version or `null` if something went wrong.
|
|
203
203
|
*/
|
|
204
204
|
async updateObject(project, obj) {
|
|
205
205
|
const stream = this.updateObjects(project);
|
|
@@ -209,7 +209,7 @@ class DateiLagerGrpcClient {
|
|
|
209
209
|
/**
|
|
210
210
|
* Snapshot the current state of the dateilager server.
|
|
211
211
|
*
|
|
212
|
-
* @returns
|
|
212
|
+
* @returns All the projects on the dateilager server.
|
|
213
213
|
* @throws If the dateilager server's DL_ENV environment variable is PROD.
|
|
214
214
|
* @see DateiLagerGrpcClient.resetToSnapshotInDevOrTests
|
|
215
215
|
*/
|
|
@@ -221,13 +221,37 @@ class DateiLagerGrpcClient {
|
|
|
221
221
|
* Reset the given projects to their respective versions and delete any remaining projects.
|
|
222
222
|
* If no projects are provided, delete all projects.
|
|
223
223
|
*
|
|
224
|
-
* @param
|
|
224
|
+
* @param projects The projects to reset.
|
|
225
225
|
* @throws If the dateilager server's DL_ENV environment variable is PROD.
|
|
226
226
|
* @see DateiLagerGrpcClient.snapshotInDevOrTests
|
|
227
227
|
*/
|
|
228
228
|
async resetToSnapshotInDevOrTests(projects) {
|
|
229
229
|
await this._client.reset({ projects }, this._rpcOptions());
|
|
230
230
|
}
|
|
231
|
+
/**
|
|
232
|
+
* Clones the `source` projects changes (from `fromVersion` up to `toVersion`) to the `target` project.
|
|
233
|
+
* This method assumes that it is always a one way clone from source to target, it does not take into account
|
|
234
|
+
* the changes that have occurred in the `target` project.
|
|
235
|
+
*
|
|
236
|
+
* @param source The source project.
|
|
237
|
+
* @param target The target project.
|
|
238
|
+
* @param fromVersion Start version of the source project.
|
|
239
|
+
* @param toVersion Stop version of the source project.
|
|
240
|
+
* @returns The new version number of the target project
|
|
241
|
+
*/
|
|
242
|
+
async cloneToProject(source, target, fromVersion, toVersion) {
|
|
243
|
+
return await (0, telemetry_1.trace)("dateilager-grpc-client.clone-to-project", {
|
|
244
|
+
attributes: {
|
|
245
|
+
"dl.source": String(source),
|
|
246
|
+
"dl.target": String(target),
|
|
247
|
+
"dl.fromVersion": String(fromVersion),
|
|
248
|
+
"dl.toVersion": String(toVersion),
|
|
249
|
+
},
|
|
250
|
+
}, async () => {
|
|
251
|
+
const call = await this._client.cloneToProject({ source, target, fromVersion, toVersion }, this._rpcOptions());
|
|
252
|
+
return call.response;
|
|
253
|
+
});
|
|
254
|
+
}
|
|
231
255
|
}
|
|
232
256
|
exports.DateiLagerGrpcClient = DateiLagerGrpcClient;
|
|
233
257
|
/**
|
|
@@ -265,7 +289,7 @@ class UpdateInputStream {
|
|
|
265
289
|
/**
|
|
266
290
|
* Send an object to update.
|
|
267
291
|
*
|
|
268
|
-
* @param
|
|
292
|
+
* @param obj The object to update.
|
|
269
293
|
*/
|
|
270
294
|
async send(obj) {
|
|
271
295
|
try {
|
|
@@ -282,7 +306,7 @@ class UpdateInputStream {
|
|
|
282
306
|
/**
|
|
283
307
|
* Complete the update request.
|
|
284
308
|
*
|
|
285
|
-
* @returns
|
|
309
|
+
* @returns The latest project version or `null` if something went wrong.
|
|
286
310
|
*/
|
|
287
311
|
async complete() {
|
|
288
312
|
try {
|
|
@@ -299,8 +323,8 @@ const encoder = new util_1.TextEncoder();
|
|
|
299
323
|
/**
|
|
300
324
|
* Encode string object contents as an array of bytes.
|
|
301
325
|
*
|
|
302
|
-
* @param
|
|
303
|
-
* @returns
|
|
326
|
+
* @param content The string to encode.
|
|
327
|
+
* @returns The encoded content as an array of bytes.
|
|
304
328
|
*/
|
|
305
329
|
function encodeContent(content) {
|
|
306
330
|
return encoder.encode(content);
|
|
@@ -310,8 +334,8 @@ const decoder = new util_1.TextDecoder();
|
|
|
310
334
|
/**
|
|
311
335
|
* Decode an array of bytes as an object's string contents.
|
|
312
336
|
*
|
|
313
|
-
* @param
|
|
314
|
-
* @returns
|
|
337
|
+
* @param bytes The array of bytes to decode.
|
|
338
|
+
* @returns The bytes decoded into a string.
|
|
315
339
|
*/
|
|
316
340
|
function decodeContent(bytes) {
|
|
317
341
|
return decoder.decode(bytes);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpc-client.js","sourceRoot":"","sources":["../../src/grpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ClientOptions } from \"@grpc/grpc-js\";\nimport { ChannelCredentials, credentials, Metadata } from \"@grpc/grpc-js\";\nimport type { Span } from \"@opentelemetry/api\";\nimport { context as contextAPI, trace as traceAPI } from \"@opentelemetry/api\";\nimport { GrpcTransport } from \"@protobuf-ts/grpc-transport\";\nimport type { ClientStreamingCall, RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport { TextDecoder, TextEncoder } from \"util\";\nimport { trace, tracer } from \"./internal/telemetry\";\nimport type { Objekt, Project, UpdateRequest, UpdateResponse } from \"./pb/fs_pb\";\nimport { FsClient } from \"./pb/fs_pb.client\";\n\nexport type { Objekt, Project };\n\n/**\n * Options for {@link DateiLagerGrpcClient}.\n */\nexport interface DateiLagerGrpcClientOptions {\n /**\n * The address of the dateilager server.\n */\n server:\n | string\n | {\n /**\n * The host of the dateilager server.\n */\n host: string;\n\n /**\n * The port of the dateilager server.\n */\n port: number;\n };\n\n /**\n * The token that will be sent as authorization metadata to the dateilager server.\n */\n token: string | (() => Promise<string>);\n\n /**\n * Options that will be passed to the underlying grpc client constructor.\n *\n * @see ClientOptions\n */\n grpcClientOptions?: ClientOptions;\n\n /**\n * Options that will be passed to every remote procedure call.\n *\n * @see RpcOptions\n */\n rpcOptions?: RpcOptions | (() => RpcOptions | undefined);\n}\n\n/**\n * A client class for interacting with DateiLager's GRPC API.\n *\n * The DateiLager API surface area is as minimal as possible;\n * convenience functions, such as getObject, should be implemented within the client.\n */\nexport class DateiLagerGrpcClient {\n /** @internal */\n private readonly _client: FsClient;\n\n /** @internal */\n private readonly _transport: GrpcTransport;\n\n /** @internal */\n private readonly _rpcOptions: () => RpcOptions | undefined;\n\n /**\n * The library used to interact with GRPC creates connections lazily, this constructor will not\n * raise an error even if there is no service running at {@link DateiLagerGrpcClientOptions.server server}.\n *\n * @param options Grpc client options.\n */\n public constructor(options: DateiLagerGrpcClientOptions) {\n const tokenFn = typeof options.token === \"string\" ? () => Promise.resolve(options.token as string) : options.token;\n\n this._transport = new GrpcTransport({\n host: typeof options.server === \"string\" ? options.server : `${options.server.host}:${options.server.port}`,\n channelCredentials: credentials.combineChannelCredentials(\n ChannelCredentials.createSsl(),\n credentials.createFromMetadataGenerator((_, callback) => {\n tokenFn()\n .then((token) => {\n const meta = new Metadata();\n meta.add(\"authorization\", `Bearer ${token}`);\n callback(null, meta);\n })\n .catch(callback);\n })\n ),\n clientOptions: options.grpcClientOptions,\n });\n\n this._client = new FsClient(this._transport);\n\n this._rpcOptions = options.rpcOptions instanceof Function ? options.rpcOptions : () => options.rpcOptions as RpcOptions | undefined;\n }\n\n /**\n * Close the underlying GRPC client.\n */\n public close(): void {\n this._transport.close();\n }\n\n /**\n * Create a new project.\n *\n * @param project The id of the project.\n * @param packPatterns The paths to pack.\n * @param template The id of the project to start from.\n */\n public async newProject(project: bigint, packPatterns: string[], template?: bigint): Promise<void> {\n await trace(\n \"dateilager-grpc-client.new-project\",\n {\n attributes: {\n \"dl.project\": String(project),\n \"dl.pack_patterns\": packPatterns,\n \"dl.template\": String(template),\n },\n },\n () => this._client.newProject({ id: project, packPatterns, template }, this._rpcOptions())\n );\n }\n\n /**\n * Delete a project.\n *\n * @param project The id of the project.\n */\n public async deleteProject(project: bigint): Promise<void> {\n await trace(\n \"dateilager-grpc-client.delete-project\",\n {\n attributes: {\n \"dl.project\": String(project),\n },\n },\n () => this._client.deleteProject({ project }, this._rpcOptions())\n );\n }\n\n /**\n * List objects.\n *\n * @param project The id of the project.\n * @param path The path to list objects under.\n * @param ignores The paths under {@link path} to ignore.\n * @param from The project version to start from.\n * @param to The project version to end at.\n * @returns A stream of objects.\n * @yields An object from the stream.\n * @example\n * for await (const object of client.listObjects(1n, \"\")) {\n * console.log(\"[listObjects] path: \" + object.path);\n * console.log(\"[listObjects] content:\\n\" + object.content);\n * }\n */\n public async *listObjects(\n project: bigint,\n path: string,\n ignores: string[] = [],\n from?: bigint,\n to?: bigint\n ): AsyncGenerator<Objekt, void> {\n const parentContext = contextAPI.active();\n const span = tracer.startSpan(\n \"dateilager-grpc-client.list-objects\",\n {\n attributes: {\n \"dl.project\": String(project),\n \"dl.path\": path,\n \"dl.ignores\": ignores,\n \"dl.from_version\": String(from),\n \"dl.to_version\": String(to),\n },\n },\n parentContext\n );\n\n try {\n const call = contextAPI.with(traceAPI.setSpan(parentContext, span), () =>\n this._client.get(\n {\n project,\n fromVersion: from,\n toVersion: to,\n queries: [\n {\n path,\n ignores,\n isPrefix: true,\n withContent: true,\n },\n ],\n },\n this._rpcOptions()\n )\n );\n\n for await (const response of call.responses) {\n if (response.object) {\n yield response.object;\n }\n }\n\n await call.status;\n } finally {\n span.end();\n }\n }\n\n /**\n * Get an object.\n *\n * @param project The id of the project.\n * @param path The path of the object.\n * @returns The object at the given path or undefined if it does not exist.\n */\n public async getObject(project: bigint, path: string): Promise<Objekt | undefined> {\n return await trace(\n \"dateilager-grpc-client.get-object\",\n {\n attributes: {\n \"dl.project\": String(project),\n \"dl.path\": path,\n },\n },\n async () => {\n const call = this._client.get(\n {\n project,\n queries: [\n {\n path,\n isPrefix: false,\n withContent: true,\n ignores: [],\n },\n ],\n },\n this._rpcOptions()\n );\n\n let object: Objekt | undefined;\n for await (const response of call.responses) {\n object = response.object;\n }\n\n await call.status;\n\n return object;\n }\n );\n }\n\n /**\n * Update objects.\n *\n * @param project The id of the project.\n * @returns An {@link UpdateInputStream} to send objects to update.\n */\n public updateObjects(project: bigint): UpdateInputStream {\n const parentContext = contextAPI.active();\n const span = tracer.startSpan(\n \"dateilager-grpc-client.update-objects\",\n {\n attributes: {\n \"dl.project\": String(project),\n },\n },\n parentContext\n );\n\n const call = contextAPI.with(traceAPI.setSpan(parentContext, span), () => this._client.update(this._rpcOptions()));\n\n return new UpdateInputStream(project, call, span);\n }\n\n /**\n * Update an object.\n *\n * @param project The id of the project.\n * @param obj The object to update.\n * @returns The latest project version or `null` if something went wrong.\n */\n public async updateObject(project: bigint, obj: Objekt): Promise<bigint | null> {\n const stream = this.updateObjects(project);\n await stream.send(obj);\n return await stream.complete();\n }\n\n /**\n * Snapshot the current state of the dateilager server.\n *\n * @returns All the projects on the dateilager server.\n * @throws If the dateilager server's DL_ENV environment variable is PROD.\n * @see DateiLagerGrpcClient.resetToSnapshotInDevOrTests\n */\n public async snapshotInDevOrTests(): Promise<Project[]> {\n const call = await this._client.snapshot({}, this._rpcOptions());\n return call.response.projects;\n }\n\n /**\n * Reset the given projects to their respective versions and delete any remaining projects.\n * If no projects are provided, delete all projects.\n *\n * @param projects The projects to reset.\n * @throws If the dateilager server's DL_ENV environment variable is PROD.\n * @see DateiLagerGrpcClient.snapshotInDevOrTests\n */\n public async resetToSnapshotInDevOrTests(projects: Project[]): Promise<void> {\n await this._client.reset({ projects }, this._rpcOptions());\n }\n}\n\n/**\n * Used to send a stream of objects to update.\n *\n * @see DateiLagerGrpcClient.updateObjects\n */\nclass UpdateInputStream {\n /** @internal */\n private readonly _project: bigint;\n\n /** @internal */\n private readonly _call: ClientStreamingCall<UpdateRequest, UpdateResponse>;\n\n /** @internal */\n private readonly _span: Span;\n\n public constructor(project: bigint, call: ClientStreamingCall<UpdateRequest, UpdateResponse>, span: Span) {\n this._project = project;\n this._call = call;\n this._span = span;\n }\n\n /**\n * Send an object to update.\n *\n * @param obj The object to update.\n */\n public async send(obj: Objekt): Promise<void> {\n try {\n await this._call.requests.send({\n project: this._project,\n object: obj,\n });\n } catch (err) {\n this._span.end();\n throw err;\n }\n }\n\n /**\n * Complete the update request.\n *\n * @returns The latest project version or `null` if something went wrong.\n */\n public async complete(): Promise<bigint | null> {\n try {\n await this._call.requests.complete();\n const response = await this._call.response;\n return response.version != -1n ? response.version : null;\n } finally {\n this._span.end();\n }\n }\n}\n\nconst encoder = new TextEncoder();\n\n/**\n * Encode string object contents as an array of bytes.\n *\n * @param content The string to encode.\n * @returns The encoded content as an array of bytes.\n */\nexport function encodeContent(content: string): Uint8Array {\n return encoder.encode(content);\n}\n\nconst decoder = new TextDecoder();\n\n/**\n * Decode an array of bytes as an object's string contents.\n *\n * @param bytes The array of bytes to decode.\n * @returns The bytes decoded into a string.\n */\nexport function decodeContent(bytes: Uint8Array | undefined): string {\n return decoder.decode(bytes);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"grpc-client.js","sourceRoot":"","sources":["../../src/grpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ClientOptions } from \"@grpc/grpc-js\";\nimport { ChannelCredentials, credentials, Metadata } from \"@grpc/grpc-js\";\nimport type { Span } from \"@opentelemetry/api\";\nimport { context as contextAPI, trace as traceAPI } from \"@opentelemetry/api\";\nimport { GrpcTransport } from \"@protobuf-ts/grpc-transport\";\nimport type { ClientStreamingCall, RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport { TextDecoder, TextEncoder } from \"util\";\nimport { trace, tracer } from \"./internal/telemetry\";\nimport type { CloneToProjectResponse, Objekt, Project, UpdateRequest, UpdateResponse } from \"./pb/fs_pb\";\nimport { FsClient } from \"./pb/fs_pb.client\";\n\nexport type { Objekt, Project };\n\n/**\n * Options for {@link DateiLagerGrpcClient}.\n */\nexport interface DateiLagerGrpcClientOptions {\n /**\n * The address of the dateilager server.\n */\n server:\n | string\n | {\n /**\n * The host of the dateilager server.\n */\n host: string;\n\n /**\n * The port of the dateilager server.\n */\n port: number;\n };\n\n /**\n * The token that will be sent as authorization metadata to the dateilager server.\n */\n token: string | (() => Promise<string>);\n\n /**\n * Options that will be passed to the underlying grpc client constructor.\n *\n * @see ClientOptions\n */\n grpcClientOptions?: ClientOptions;\n\n /**\n * Options that will be passed to every remote procedure call.\n *\n * @see RpcOptions\n */\n rpcOptions?: RpcOptions | (() => RpcOptions | undefined);\n}\n\n/**\n * A client class for interacting with DateiLager's GRPC API.\n *\n * The DateiLager API surface area is as minimal as possible;\n * convenience functions, such as getObject, should be implemented within the client.\n */\nexport class DateiLagerGrpcClient {\n /** @internal */\n private readonly _client: FsClient;\n\n /** @internal */\n private readonly _transport: GrpcTransport;\n\n /** @internal */\n private readonly _rpcOptions: () => RpcOptions | undefined;\n\n /**\n * The library used to interact with GRPC creates connections lazily, this constructor will not\n * raise an error even if there is no service running at {@link DateiLagerGrpcClientOptions.server server}.\n *\n * @param options Grpc client options.\n */\n public constructor(options: DateiLagerGrpcClientOptions) {\n const tokenFn = typeof options.token === \"string\" ? () => Promise.resolve(options.token as string) : options.token;\n\n this._transport = new GrpcTransport({\n host: typeof options.server === \"string\" ? options.server : `${options.server.host}:${options.server.port}`,\n channelCredentials: credentials.combineChannelCredentials(\n ChannelCredentials.createSsl(),\n credentials.createFromMetadataGenerator((_, callback) => {\n tokenFn()\n .then((token) => {\n const meta = new Metadata();\n meta.add(\"authorization\", `Bearer ${token}`);\n callback(null, meta);\n })\n .catch(callback);\n })\n ),\n clientOptions: options.grpcClientOptions,\n });\n\n this._client = new FsClient(this._transport);\n\n this._rpcOptions = options.rpcOptions instanceof Function ? options.rpcOptions : () => options.rpcOptions as RpcOptions | undefined;\n }\n\n /**\n * Close the underlying GRPC client.\n */\n public close(): void {\n this._transport.close();\n }\n\n /**\n * Create a new project.\n *\n * @param project The id of the project.\n * @param packPatterns The paths to pack.\n * @param template The id of the project to start from.\n */\n public async newProject(project: bigint, packPatterns: string[], template?: bigint): Promise<void> {\n await trace(\n \"dateilager-grpc-client.new-project\",\n {\n attributes: {\n \"dl.project\": String(project),\n \"dl.pack_patterns\": packPatterns,\n \"dl.template\": String(template),\n },\n },\n () => this._client.newProject({ id: project, packPatterns, template }, this._rpcOptions())\n );\n }\n\n /**\n * Delete a project.\n *\n * @param project The id of the project.\n */\n public async deleteProject(project: bigint): Promise<void> {\n await trace(\n \"dateilager-grpc-client.delete-project\",\n {\n attributes: {\n \"dl.project\": String(project),\n },\n },\n () => this._client.deleteProject({ project }, this._rpcOptions())\n );\n }\n\n /**\n * List objects.\n *\n * @param project The id of the project.\n * @param path The path to list objects under.\n * @param ignores The paths under {@link path} to ignore.\n * @param from The project version to start from.\n * @param to The project version to end at.\n * @returns A stream of objects.\n * @yields An object from the stream.\n * @example\n * for await (const object of client.listObjects(1n, \"\")) {\n * console.log(\"[listObjects] path: \" + object.path);\n * console.log(\"[listObjects] content:\\n\" + object.content);\n * }\n */\n public async *listObjects(\n project: bigint,\n path: string,\n ignores: string[] = [],\n from?: bigint,\n to?: bigint\n ): AsyncGenerator<Objekt, void> {\n const parentContext = contextAPI.active();\n const span = tracer.startSpan(\n \"dateilager-grpc-client.list-objects\",\n {\n attributes: {\n \"dl.project\": String(project),\n \"dl.path\": path,\n \"dl.ignores\": ignores,\n \"dl.from_version\": String(from),\n \"dl.to_version\": String(to),\n },\n },\n parentContext\n );\n\n try {\n const call = contextAPI.with(traceAPI.setSpan(parentContext, span), () =>\n this._client.get(\n {\n project,\n fromVersion: from,\n toVersion: to,\n queries: [\n {\n path,\n ignores,\n isPrefix: true,\n withContent: true,\n },\n ],\n },\n this._rpcOptions()\n )\n );\n\n for await (const response of call.responses) {\n if (response.object) {\n yield response.object;\n }\n }\n\n await call.status;\n } finally {\n span.end();\n }\n }\n\n /**\n * Get an object.\n *\n * @param project The id of the project.\n * @param path The path of the object.\n * @returns The object at the given path or undefined if it does not exist.\n */\n public async getObject(project: bigint, path: string): Promise<Objekt | undefined> {\n return await trace(\n \"dateilager-grpc-client.get-object\",\n {\n attributes: {\n \"dl.project\": String(project),\n \"dl.path\": path,\n },\n },\n async () => {\n const call = this._client.get(\n {\n project,\n queries: [\n {\n path,\n isPrefix: false,\n withContent: true,\n ignores: [],\n },\n ],\n },\n this._rpcOptions()\n );\n\n let object: Objekt | undefined;\n for await (const response of call.responses) {\n object = response.object;\n }\n\n await call.status;\n\n return object;\n }\n );\n }\n\n /**\n * Update objects.\n *\n * @param project The id of the project.\n * @returns An {@link UpdateInputStream} to send objects to update.\n */\n public updateObjects(project: bigint): UpdateInputStream {\n const parentContext = contextAPI.active();\n const span = tracer.startSpan(\n \"dateilager-grpc-client.update-objects\",\n {\n attributes: {\n \"dl.project\": String(project),\n },\n },\n parentContext\n );\n\n const call = contextAPI.with(traceAPI.setSpan(parentContext, span), () => this._client.update(this._rpcOptions()));\n\n return new UpdateInputStream(project, call, span);\n }\n\n /**\n * Update an object.\n *\n * @param project The id of the project.\n * @param obj The object to update.\n * @returns The latest project version or `null` if something went wrong.\n */\n public async updateObject(project: bigint, obj: Objekt): Promise<bigint | null> {\n const stream = this.updateObjects(project);\n await stream.send(obj);\n return await stream.complete();\n }\n\n /**\n * Snapshot the current state of the dateilager server.\n *\n * @returns All the projects on the dateilager server.\n * @throws If the dateilager server's DL_ENV environment variable is PROD.\n * @see DateiLagerGrpcClient.resetToSnapshotInDevOrTests\n */\n public async snapshotInDevOrTests(): Promise<Project[]> {\n const call = await this._client.snapshot({}, this._rpcOptions());\n return call.response.projects;\n }\n\n /**\n * Reset the given projects to their respective versions and delete any remaining projects.\n * If no projects are provided, delete all projects.\n *\n * @param projects The projects to reset.\n * @throws If the dateilager server's DL_ENV environment variable is PROD.\n * @see DateiLagerGrpcClient.snapshotInDevOrTests\n */\n public async resetToSnapshotInDevOrTests(projects: Project[]): Promise<void> {\n await this._client.reset({ projects }, this._rpcOptions());\n }\n\n /**\n * Clones the `source` projects changes (from `fromVersion` up to `toVersion`) to the `target` project.\n * This method assumes that it is always a one way clone from source to target, it does not take into account\n * the changes that have occurred in the `target` project.\n *\n * @param source The source project.\n * @param target The target project.\n * @param fromVersion Start version of the source project.\n * @param toVersion Stop version of the source project.\n * @returns The new version number of the target project\n */\n public async cloneToProject(source: bigint, target: bigint, fromVersion: bigint, toVersion: bigint): Promise<CloneToProjectResponse> {\n return await trace(\n \"dateilager-grpc-client.clone-to-project\",\n {\n attributes: {\n \"dl.source\": String(source),\n \"dl.target\": String(target),\n \"dl.fromVersion\": String(fromVersion),\n \"dl.toVersion\": String(toVersion),\n },\n },\n async () => {\n const call = await this._client.cloneToProject({ source, target, fromVersion, toVersion }, this._rpcOptions());\n return call.response;\n }\n );\n }\n}\n\n/**\n * Used to send a stream of objects to update.\n *\n * @see DateiLagerGrpcClient.updateObjects\n */\nclass UpdateInputStream {\n /** @internal */\n private readonly _project: bigint;\n\n /** @internal */\n private readonly _call: ClientStreamingCall<UpdateRequest, UpdateResponse>;\n\n /** @internal */\n private readonly _span: Span;\n\n public constructor(project: bigint, call: ClientStreamingCall<UpdateRequest, UpdateResponse>, span: Span) {\n this._project = project;\n this._call = call;\n this._span = span;\n }\n\n /**\n * Send an object to update.\n *\n * @param obj The object to update.\n */\n public async send(obj: Objekt): Promise<void> {\n try {\n await this._call.requests.send({\n project: this._project,\n object: obj,\n });\n } catch (err) {\n this._span.end();\n throw err;\n }\n }\n\n /**\n * Complete the update request.\n *\n * @returns The latest project version or `null` if something went wrong.\n */\n public async complete(): Promise<bigint | null> {\n try {\n await this._call.requests.complete();\n const response = await this._call.response;\n return response.version != -1n ? response.version : null;\n } finally {\n this._span.end();\n }\n }\n}\n\nconst encoder = new TextEncoder();\n\n/**\n * Encode string object contents as an array of bytes.\n *\n * @param content The string to encode.\n * @returns The encoded content as an array of bytes.\n */\nexport function encodeContent(content: string): Uint8Array {\n return encoder.encode(content);\n}\n\nconst decoder = new TextDecoder();\n\n/**\n * Decode an array of bytes as an object's string contents.\n *\n * @param bytes The array of bytes to decode.\n * @returns The bytes decoded into a string.\n */\nexport function decodeContent(bytes: Uint8Array | undefined): string {\n return decoder.decode(bytes);\n}\n"]}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import type { RpcTransport } from "@protobuf-ts/runtime-rpc";
|
|
2
2
|
import type { ServiceInfo } from "@protobuf-ts/runtime-rpc";
|
|
3
|
+
import type { CloneToProjectResponse } from "./fs_pb";
|
|
4
|
+
import type { CloneToProjectRequest } from "./fs_pb";
|
|
5
|
+
import type { GcContentsResponse } from "./fs_pb";
|
|
6
|
+
import type { GcContentsRequest } from "./fs_pb";
|
|
7
|
+
import type { GcRandomProjectsResponse } from "./fs_pb";
|
|
8
|
+
import type { GcRandomProjectsRequest } from "./fs_pb";
|
|
9
|
+
import type { GcProjectResponse } from "./fs_pb";
|
|
10
|
+
import type { GcProjectRequest } from "./fs_pb";
|
|
3
11
|
import type { ResetResponse } from "./fs_pb";
|
|
4
12
|
import type { ResetRequest } from "./fs_pb";
|
|
5
13
|
import type { SnapshotResponse } from "./fs_pb";
|
|
@@ -62,6 +70,22 @@ export interface IFsClient {
|
|
|
62
70
|
* @generated from protobuf rpc: Reset(pb.ResetRequest) returns (pb.ResetResponse);
|
|
63
71
|
*/
|
|
64
72
|
reset(input: ResetRequest, options?: RpcOptions): UnaryCall<ResetRequest, ResetResponse>;
|
|
73
|
+
/**
|
|
74
|
+
* @generated from protobuf rpc: GcProject(pb.GcProjectRequest) returns (pb.GcProjectResponse);
|
|
75
|
+
*/
|
|
76
|
+
gcProject(input: GcProjectRequest, options?: RpcOptions): UnaryCall<GcProjectRequest, GcProjectResponse>;
|
|
77
|
+
/**
|
|
78
|
+
* @generated from protobuf rpc: GcRandomProjects(pb.GcRandomProjectsRequest) returns (pb.GcRandomProjectsResponse);
|
|
79
|
+
*/
|
|
80
|
+
gcRandomProjects(input: GcRandomProjectsRequest, options?: RpcOptions): UnaryCall<GcRandomProjectsRequest, GcRandomProjectsResponse>;
|
|
81
|
+
/**
|
|
82
|
+
* @generated from protobuf rpc: GcContents(pb.GcContentsRequest) returns (pb.GcContentsResponse);
|
|
83
|
+
*/
|
|
84
|
+
gcContents(input: GcContentsRequest, options?: RpcOptions): UnaryCall<GcContentsRequest, GcContentsResponse>;
|
|
85
|
+
/**
|
|
86
|
+
* @generated from protobuf rpc: CloneToProject(pb.CloneToProjectRequest) returns (pb.CloneToProjectResponse);
|
|
87
|
+
*/
|
|
88
|
+
cloneToProject(input: CloneToProjectRequest, options?: RpcOptions): UnaryCall<CloneToProjectRequest, CloneToProjectResponse>;
|
|
65
89
|
}
|
|
66
90
|
/**
|
|
67
91
|
* @generated from protobuf service pb.Fs
|
|
@@ -110,4 +134,20 @@ export declare class FsClient implements IFsClient, ServiceInfo {
|
|
|
110
134
|
* @generated from protobuf rpc: Reset(pb.ResetRequest) returns (pb.ResetResponse);
|
|
111
135
|
*/
|
|
112
136
|
reset(input: ResetRequest, options?: RpcOptions): UnaryCall<ResetRequest, ResetResponse>;
|
|
137
|
+
/**
|
|
138
|
+
* @generated from protobuf rpc: GcProject(pb.GcProjectRequest) returns (pb.GcProjectResponse);
|
|
139
|
+
*/
|
|
140
|
+
gcProject(input: GcProjectRequest, options?: RpcOptions): UnaryCall<GcProjectRequest, GcProjectResponse>;
|
|
141
|
+
/**
|
|
142
|
+
* @generated from protobuf rpc: GcRandomProjects(pb.GcRandomProjectsRequest) returns (pb.GcRandomProjectsResponse);
|
|
143
|
+
*/
|
|
144
|
+
gcRandomProjects(input: GcRandomProjectsRequest, options?: RpcOptions): UnaryCall<GcRandomProjectsRequest, GcRandomProjectsResponse>;
|
|
145
|
+
/**
|
|
146
|
+
* @generated from protobuf rpc: GcContents(pb.GcContentsRequest) returns (pb.GcContentsResponse);
|
|
147
|
+
*/
|
|
148
|
+
gcContents(input: GcContentsRequest, options?: RpcOptions): UnaryCall<GcContentsRequest, GcContentsResponse>;
|
|
149
|
+
/**
|
|
150
|
+
* @generated from protobuf rpc: CloneToProject(pb.CloneToProjectRequest) returns (pb.CloneToProjectResponse);
|
|
151
|
+
*/
|
|
152
|
+
cloneToProject(input: CloneToProjectRequest, options?: RpcOptions): UnaryCall<CloneToProjectRequest, CloneToProjectResponse>;
|
|
113
153
|
}
|