UNPKG

@jsforce/jsforce-node

Version:

Salesforce API Library for JavaScript

355 lines (354 loc) 11.9 kB
/// <reference types="node" /> /// <reference types="node" /> import { EventEmitter } from 'events'; import { Readable } from 'stream'; import Connection from '../connection'; import { Parsable } from '../record-stream'; import { Record, Schema } from '../types'; export type IngestOperation = 'insert' | 'update' | 'upsert' | 'delete' | 'hardDelete'; type BaseJobInfo = { id: string; object: string; createdById: string; createdDate: string; systemModstamp: string; apiVersion: number; lineEnding: 'LF' | 'CRLF'; columnDelimiter: 'BACKQUOTE' | 'CARET' | 'COMMA' | 'PIPE' | 'SEMICOLON' | 'TAB'; concurrencyMode: 'Parallel'; contentType: 'CSV'; numberRecordsProcessed: number; retries: number; totalProcessingTime: number; }; export type QueryJobInfoV2 = BaseJobInfo & { operation: 'query' | 'queryAll'; state: 'UploadComplete' | 'InProgress' | 'Aborted' | 'JobComplete' | 'Failed'; jobType: 'V2Query'; isPkChunkingSupported: boolean; }; export type JobInfoV2 = BaseJobInfo & { apexProcessingTime: number; apiActiveProcessingTime: number; assignmentRuleId?: string; contentUrl: string; errorMessage?: string; externalIdFieldName?: string; jobType: 'BigObjectIngest' | 'Classic' | 'V2Ingest'; operation: IngestOperation; state: 'Open' | 'UploadComplete' | 'InProgress' | 'JobComplete' | 'Aborted' | 'Failed'; numberRecordsFailed: number; }; export type IngestJobV2SuccessfulResults<S extends Schema> = Array<{ sf__Created: 'true' | 'false'; sf__Id: string; } & S>; export type IngestJobV2FailedResults<S extends Schema> = Array<{ sf__Error: string; sf__Id: string; } & S>; export type IngestJobV2UnprocessedRecords<S extends Schema> = S[] | string; export type IngestJobV2Results<S extends Schema> = { successfulResults: IngestJobV2SuccessfulResults<S>; failedResults: IngestJobV2FailedResults<S>; unprocessedRecords: IngestJobV2UnprocessedRecords<S>; }; type NewIngestJobOptions = Required<Pick<JobInfoV2, 'object' | 'operation'>> & Partial<Pick<JobInfoV2, 'assignmentRuleId' | 'columnDelimiter' | 'externalIdFieldName' | 'lineEnding' | 'contentType'>>; type NewQueryJobOptions = { query: string; operation: QueryJobInfoV2['operation']; } & Partial<Pick<QueryJobInfoV2, 'columnDelimiter' | 'lineEnding'>>; type CreateIngestJobV2Options = { bodyParams: NewIngestJobOptions; pollingOptions: BulkV2PollingOptions; }; type ExistingIngestJobOptions = { id: string; pollingOptions: BulkV2PollingOptions; }; type CreateQueryJobV2Options = { bodyParams: NewQueryJobOptions; pollingOptions: BulkV2PollingOptions; }; type ExistingQueryJobV2Options = { id: string; pollingOptions: BulkV2PollingOptions; }; type BulkV2PollingOptions = { pollInterval: number; pollTimeout: number; }; export declare class BulkV2<S extends Schema> { private connection; private logger; /** * Polling interval in milliseconds * * Default: 1000 (1 second) */ pollInterval: number; /** * Polling timeout in milliseconds * * Default: 30000 (30 seconds) */ pollTimeout: number; constructor(connection: Connection<S>); /** * Create an instance of an ingest job object. * * @params {NewIngestJobOptions} options object * @returns {IngestJobV2} An ingest job instance * @example * // Upsert records to the Account object. * * const job = connection.bulk2.createJob({ * operation: 'insert' * object: 'Account', * }); * * // create the job in the org * await job.open() * * // upload data * await job.uploadData(csvFile) * * // finished uploading data, mark it as ready for processing * await job.close() */ createJob(options: NewIngestJobOptions): IngestJobV2<S>; /** * Get an ingest or query job instance specified by a given job ID * * @param options Options object with a job ID * @returns IngestJobV2 An ingest job */ job(type: 'query', options: Pick<ExistingQueryJobV2Options, 'id'>): QueryJobV2<S>; job(type: 'ingest', options: Pick<ExistingIngestJobOptions, 'id'>): IngestJobV2<S>; /** * Create, upload, and start bulkload job */ loadAndWaitForResults(options: NewIngestJobOptions & Partial<BulkV2PollingOptions> & { input: Record[] | Readable | string; }): Promise<IngestJobV2Results<S>>; /** * Execute bulk query and get a record stream. * * Default timeout: 10000ms * * @param soql SOQL query * @param options * * @returns {RecordStream} - Record stream, convertible to a CSV data stream */ query(soql: string, options?: Partial<BulkV2PollingOptions> & { scanAll?: boolean; columnDelimiter?: QueryJobInfoV2['columnDelimiter']; lineEnding?: QueryJobInfoV2['lineEnding']; }): Promise<Parsable<Record>>; } export declare class QueryJobV2<S extends Schema> extends EventEmitter { private readonly connection; private readonly logger; private readonly _id?; private readonly bodyParams?; private readonly pollingOptions; private error; private jobInfo?; private locator?; constructor(conn: Connection<S>, options: ExistingQueryJobV2Options | CreateQueryJobV2Options); /** * Get the query job ID. * * @returns {string} query job Id. */ get id(): string; /** * Get the query job info. * * @returns {Promise<QueryJobInfoV2>} query job information. */ getInfo(): QueryJobInfoV2; /** * Creates a query job * * @returns {Promise<QueryJobInfoV2>} job information. */ open(): Promise<QueryJobInfoV2>; /** * Abort the job * * The 'aborted' event is emitted when the job successfully aborts. * @returns {Promise<QueryJobInfoV2>} job information. */ abort(): Promise<QueryJobInfoV2>; /** * Poll for the state of the processing for the job. * * @param interval Polling interval in milliseconds * @param timeout Polling timeout in milliseconds * @returns {Promise<Record[]>} A promise that resolves when the job finished being processed. */ poll(interval?: number, timeout?: number): Promise<void>; /** * Check the latest job status * * @returns {Promise<QueryJobInfoV2>} job information. */ check(): Promise<QueryJobInfoV2>; /** * Get the results for a query job as a record stream * * This method assumes the job finished being processed * @returns {RecordStream} - Record stream, convertible to a CSV data stream */ result(): Promise<Parsable<Record>>; /** * Deletes a query job. */ delete(): Promise<void>; private createQueryRequest; } /** * Class for Bulk API V2 Ingest Job */ export declare class IngestJobV2<S extends Schema> extends EventEmitter { private readonly connection; private readonly logger; private readonly _id?; private readonly bodyParams?; private readonly jobData; private pollingOptions; private bulkJobSuccessfulResults?; private bulkJobFailedResults?; private bulkJobUnprocessedRecords?; private error; private jobInfo?; /** * */ constructor(conn: Connection<S>, options: CreateIngestJobV2Options | ExistingIngestJobOptions); /** * Get the query job ID. * * @returns {string} query job Id. */ get id(): string; /** * Get the query job info. * * @returns {Promise<QueryJobInfoV2>} ingest job information. */ getInfo(): JobInfoV2; /** * Create a job representing a bulk operation in the org * * @returns {Promise<QueryJobInfoV2>} job information. */ open(): Promise<Partial<JobInfoV2>>; /** Upload data for a job in CSV format * * @param input CSV as a string, or array of records or readable stream */ uploadData(input: string | Record[] | Readable): Promise<void>; /** * Close opened job * * This method will notify the org that the upload of job data is complete and is ready for processing. */ close(): Promise<void>; /** * Set the status to abort */ abort(): Promise<void>; /** * Poll for the state of the processing for the job. * * This method will only throw after a timeout. To capture a * job failure while polling you must set a listener for the * `failed` event before calling it: * * job.on('failed', (err) => console.error(err)) * await job.poll() * * @param interval Polling interval in milliseconds * @param timeout Polling timeout in milliseconds * @returns {Promise<void>} A promise that resolves when the job finishes successfully */ poll(interval?: number, timeout?: number): Promise<void>; /** * Check the latest batch status in server */ check(): Promise<JobInfoV2>; /** Return all record results * * This method will return successful, failed and unprocessed records * * @returns Promise<IngestJobV2Results> */ getAllResults(): Promise<IngestJobV2Results<S>>; /** Return successful results * * The order of records returned is not guaranteed to match the ordering of the uploaded data. * * @param {boolean} raw Get results as a CSV string * @returns Promise<IngestJobV2SuccessfulResults> */ getSuccessfulResults(raw?: false): Promise<IngestJobV2SuccessfulResults<S>>; /** Return successful results * * The order of records returned is not guaranteed to match the ordering of the uploaded data. * * @param {boolean} raw Get results as a CSV string * @returns Promise<string> */ getSuccessfulResults(raw: true): Promise<string>; /** Return failed results * * The order of records in the response is not guaranteed to match the ordering of records in the original job data. * * @param {boolean} raw Get results as a CSV string * @returns Promise<IngestJobV2SuccessfulResults> */ getFailedResults(raw?: false): Promise<IngestJobV2FailedResults<S>>; /** Return failed results * * The order of records in the response is not guaranteed to match the ordering of records in the original job data. * * @param {boolean} raw Get results as a CSV string * @returns Promise<string> */ getFailedResults(raw: true): Promise<string>; /** Return unprocessed results * * The unprocessed records endpoint returns records as a CSV. * If the request helper is able to parse it, you get the records * as an array of objects. * If unable to parse it (bad CSV), you get the raw response as a string. * * The order of records in the response is not guaranteed to match the ordering of records in the original job data. * * @param {boolean} raw Get results as a CSV string * @returns Promise<IngestJobV2UnprocessedRecords> */ getUnprocessedRecords(raw?: false): Promise<IngestJobV2UnprocessedRecords<S>>; /** Return unprocessed results * * The unprocessed records endpoint returns records as a CSV. * If the request helper is able to parse it, you get the records * as an array of objects. * If unable to parse it (bad CSV), you get the raw response as a string. * * The order of records in the response is not guaranteed to match the ordering of records in the original job data. * * @param {boolean} raw Get results as a CSV string * @returns Promise<string> */ getUnprocessedRecords(raw: true): Promise<string>; /** * Deletes an ingest job. */ delete(): Promise<void>; private createIngestRequest; } export default BulkV2;