diff --git a/package-lock.json b/package-lock.json index 2de50a9..38ceb5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MPL-2.0", "dependencies": { "@apache-arrow/esnext-esm": "^12.0.1", - "@cloudquery/plugin-pb-javascript": "^0.0.18", + "@cloudquery/plugin-pb-javascript": "^0.0.19", "@grpc/grpc-js": "^1.9.0", "@types/luxon": "^3.3.1", "ajv": "^8.12.0", @@ -264,9 +264,10 @@ } }, "node_modules/@cloudquery/plugin-pb-javascript": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@cloudquery/plugin-pb-javascript/-/plugin-pb-javascript-0.0.18.tgz", - "integrity": "sha512-HSBDE/ojSsHX+NdmYqy0D1B5kBxWy/A5YqV84zVuR00qrEd30ecyW12wI71tKt7OWQEUvXL23Agx1Dm75LmBTQ==", + "version": "0.0.19", + "resolved": "https://registry.npmjs.org/@cloudquery/plugin-pb-javascript/-/plugin-pb-javascript-0.0.19.tgz", + "integrity": "sha512-22LB7dVE/X6gVEkJ/zYoARn8X1+pVBdfkmaOIQHA+lvVstKBXeRL7zMD4V88+HGb1KJ0El2yn0Ch81p42wyQgQ==", + "license": "MPL-2.0", "dependencies": { "google-protobuf": "^3.21.2" }, diff --git a/package.json b/package.json index 39c2f14..925268a 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ }, "dependencies": { "@apache-arrow/esnext-esm": "^12.0.1", - "@cloudquery/plugin-pb-javascript": "^0.0.18", + "@cloudquery/plugin-pb-javascript": "^0.0.19", "@grpc/grpc-js": "^1.9.0", "@types/luxon": "^3.3.1", "ajv": "^8.12.0", diff --git a/src/grpc/plugin.ts b/src/grpc/plugin.ts index 2a572a1..d284a5c 100644 --- a/src/grpc/plugin.ts +++ b/src/grpc/plugin.ts @@ -158,4 +158,54 @@ export class PluginServer extends pluginV3.cloudquery.plugin.v3.UnimplementedPlu return callback(error, null); }); } + + TestConnection( + call: grpc.ServerUnaryCall< + pluginV3.cloudquery.plugin.v3.TestConnection.Request, + pluginV3.cloudquery.plugin.v3.TestConnection.Response + >, + callback: grpc.sendUnaryData, + ): void { + const { spec = new Uint8Array() } = call.request.toObject(); + + const stringSpec = new TextDecoder().decode(spec); + if (this.plugin.testConnection) { + this.plugin + .testConnection(stringSpec) + .then(({ success, failureCode, failureDescription }) => { + // eslint-disable-next-line promise/no-callback-in-promise + return callback( + null, + new pluginV3.cloudquery.plugin.v3.TestConnection.Response({ + success, + failure_code: failureCode, + failure_description: failureDescription, + }), + ); + }) + .catch((error) => { + // eslint-disable-next-line promise/no-callback-in-promise + return callback(error, null); + }); + } else { + // fall back to init + this.plugin + .init(stringSpec, { noConnection: false }) + .then(() => { + // eslint-disable-next-line promise/no-callback-in-promise + return callback(null, new pluginV3.cloudquery.plugin.v3.TestConnection.Response({ success: true })); + }) + .catch(() => { + // eslint-disable-next-line promise/no-callback-in-promise + return callback( + null, + new pluginV3.cloudquery.plugin.v3.TestConnection.Response({ + success: false, + failure_code: 'UNKNOWN', + failure_description: 'Failed to connect', + }), + ); + }); + } + } } diff --git a/src/plugin/plugin.ts b/src/plugin/plugin.ts index fe4291b..7dd2bea 100644 --- a/src/plugin/plugin.ts +++ b/src/plugin/plugin.ts @@ -70,6 +70,7 @@ export interface Plugin extends Client { dockerFile: () => string; buildTargets: () => BuildTarget[]; init: (spec: string, options: NewClientOptions) => Promise; + testConnection?: (spec: string) => Promise<{ success?: boolean; failureCode?: string; failureDescription?: string }>; } export const newUnimplementedSource = (): SourceClient => {