UNPKG

@cloudquery/plugin-sdk-javascript

Version:

This is the high-level package to use for developing CloudQuery plugins in JavaScript

153 lines 6.41 kB
import { pluginV3 } from '@cloudquery/plugin-pb-javascript'; import { encodeTables, flattenTables } from '../schema/table.js'; export class MigrateTable extends pluginV3.cloudquery.plugin.v3.Sync.MessageMigrateTable { } export class DeleteStale extends pluginV3.cloudquery.plugin.v3.Write.MessageDeleteStale { } export class SyncRequest extends pluginV3.cloudquery.plugin.v3.Sync.Request { } export class Insert extends pluginV3.cloudquery.plugin.v3.Sync.MessageInsert { } export class SyncResponse extends pluginV3.cloudquery.plugin.v3.Sync.Response { } export class ReadRequest extends pluginV3.cloudquery.plugin.v3.Read.Request { } export class ReadResponse extends pluginV3.cloudquery.plugin.v3.Read.Response { } export class WriteRequest extends pluginV3.cloudquery.plugin.v3.Write.Request { } export class WriteResponse extends pluginV3.cloudquery.plugin.v3.Write.Response { } export class PluginServer extends pluginV3.cloudquery.plugin.v3.UnimplementedPluginService { // Needed due to some TypeScript nonsense plugin; constructor(plugin) { super(); this.plugin = plugin; } GetName(call, callback) { return callback(null, new pluginV3.cloudquery.plugin.v3.GetName.Response({ name: this.plugin.name() })); } GetVersion(call, callback) { return callback(null, new pluginV3.cloudquery.plugin.v3.GetVersion.Response({ version: this.plugin.version() })); } GetSpecSchema(call, callback) { return callback(null, new pluginV3.cloudquery.plugin.v3.GetSpecSchema.Response({ json_schema: this.plugin.jsonSchema() })); } Init(call, callback) { const { spec = new Uint8Array(), no_connection: noConnection = false } = call.request.toObject(); const stringSpec = new TextDecoder().decode(spec); this.plugin .init(stringSpec, { noConnection }) .then(() => { // eslint-disable-next-line promise/no-callback-in-promise return callback(null, new pluginV3.cloudquery.plugin.v3.Init.Response()); }) .catch((error) => { // eslint-disable-next-line promise/no-callback-in-promise return callback(error, null); }); } GetTables(call, callback) { const { tables = [], skip_tables: skipTables = [], skip_dependent_tables: skipDependentTables = false, } = call.request.toObject(); this.plugin .tables({ tables, skipTables, skipDependentTables }) .then((tables) => { const flattened = flattenTables(tables); // eslint-disable-next-line promise/no-callback-in-promise return callback(null, new pluginV3.cloudquery.plugin.v3.GetTables.Response({ tables: encodeTables(flattened) })); }) .catch((error) => { // eslint-disable-next-line promise/no-callback-in-promise return callback(error, null); }); } Sync(call) { const { tables = [], skip_tables: skipTables = [], skip_dependent_tables: skipDependentTables = false, deterministic_cq_id: deterministicCQId = false, backend: { connection = '', table_name: tableName = '' } = {}, } = call.request.toObject(); this.plugin.sync({ tables, skipTables, skipDependentTables, deterministicCQId, backendOptions: { connection, tableName }, stream: call, }); } Read(call) { this.plugin.read(call); } Write(call, callback) { this.plugin .write(call) .then(() => { // eslint-disable-next-line promise/no-callback-in-promise return callback(null, new pluginV3.cloudquery.plugin.v3.Write.Response()); }) .catch((error) => { // eslint-disable-next-line promise/no-callback-in-promise return callback(error, null); }); } Close(call, callback) { this.plugin .close() .then(() => { // eslint-disable-next-line promise/no-callback-in-promise return callback(null, new pluginV3.cloudquery.plugin.v3.Close.Response()); }) .catch((error) => { // eslint-disable-next-line promise/no-callback-in-promise return callback(error, null); }); } Transform( // eslint-disable-next-line @typescript-eslint/no-unused-vars call) { throw new Error('Method not implemented.'); } TransformSchema( // eslint-disable-next-line @typescript-eslint/no-unused-vars call, // eslint-disable-next-line @typescript-eslint/no-unused-vars callback) { throw new Error('Method not implemented.'); } TestConnection(call, callback) { 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', })); }); } } } //# sourceMappingURL=plugin.js.map