@bonsae/node-red-salesforce 0.4.0 → 0.4.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/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/server/schemas/salesforce-connection.ts","../src/server/lib/pkce.ts","../src/server/api/auth.ts","../src/server/api/index.ts","../src/server/nodes/salesforce-connection.ts","../src/server/schemas/salesforce-soql.ts","../src/server/nodes/salesforce-soql.ts","../src/server/schemas/salesforce-dml.ts","../src/server/nodes/salesforce-dml.ts","../src/server/schemas/salesforce-bulk.ts","../src/server/nodes/salesforce-bulk.ts","../src/server/schemas/salesforce-describe.ts","../src/server/nodes/salesforce-describe.ts","../src/server/schemas/salesforce-streaming.ts","../src/server/nodes/salesforce-streaming.ts","../src/server/schemas/salesforce-apex.ts","../src/server/nodes/salesforce-apex.ts","../src/server/index.ts"],"sourcesContent":["import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\" }),\n loginUrl: SchemaType.String({\n default: \"https://login.salesforce.com\",\n \"x-nrg-form\": { icon: \"globe\" },\n }),\n clientId: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"key\" },\n }),\n apiVersion: SchemaType.Union(\n [\n SchemaType.Literal(\"62.0\"),\n SchemaType.Literal(\"61.0\"),\n SchemaType.Literal(\"60.0\"),\n SchemaType.Literal(\"59.0\"),\n SchemaType.Literal(\"58.0\"),\n SchemaType.Literal(\"57.0\"),\n SchemaType.Literal(\"56.0\"),\n SchemaType.Literal(\"55.0\"),\n ],\n { default: \"62.0\", \"x-nrg-form\": { icon: \"code-fork\" } },\n ),\n callbackUrl: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"exchange\" },\n }),\n ),\n },\n { $id: \"salesforce-connection:config\" },\n);\n\nexport const CredentialsSchema = defineSchema(\n {\n accessToken: SchemaType.String({ default: \"\", format: \"password\" }),\n refreshToken: SchemaType.String({ default: \"\", format: \"password\" }),\n instanceUrl: SchemaType.String({ default: \"\" }),\n },\n { $id: \"salesforce-connection:credentials\" },\n);\n","import crypto from \"node:crypto\";\n\nconst AUTH_STATE_TTL = 10 * 60 * 1000; // 10 minutes\n\ninterface PendingAuthState {\n codeVerifier: string;\n nodeId: string;\n clientId: string;\n loginUrl: string;\n callbackUrl: string;\n timestamp: number;\n}\n\nconst pendingAuthStates = new Map<string, PendingAuthState>();\n\nexport function generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return crypto.createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n\nexport function createAuthState(params: {\n nodeId: string;\n clientId: string;\n loginUrl: string;\n callbackUrl: string;\n}): { state: string; codeChallenge: string } {\n const state = crypto.randomUUID();\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = generateCodeChallenge(codeVerifier);\n\n pendingAuthStates.set(state, {\n codeVerifier,\n nodeId: params.nodeId,\n clientId: params.clientId,\n loginUrl: params.loginUrl,\n callbackUrl: params.callbackUrl,\n timestamp: Date.now(),\n });\n\n // Cleanup stale entries\n for (const [key, value] of pendingAuthStates) {\n if (Date.now() - value.timestamp > AUTH_STATE_TTL) {\n pendingAuthStates.delete(key);\n }\n }\n\n return { state, codeChallenge };\n}\n\nexport function consumeAuthState(state: string): PendingAuthState | null {\n const entry = pendingAuthStates.get(state);\n if (!entry) return null;\n pendingAuthStates.delete(state);\n if (Date.now() - entry.timestamp > AUTH_STATE_TTL) return null;\n return entry;\n}\n","import type { RED } from \"@bonsae/nrg/server\";\nimport { createAuthState, consumeAuthState } from \"../lib/pkce\";\n\ninterface TokenResponse {\n access_token: string;\n refresh_token: string;\n instance_url: string;\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nfunction errorPage(message: string, autoClose = true): string {\n const script = autoClose\n ? \"<script>setTimeout(function(){window.close()},3000)</script>\"\n : \"\";\n return `<html><body><h2>Authorization Failed</h2><p>${escapeHtml(message)}</p>${script}</body></html>`;\n}\n\nfunction initAuthRoutes(RED: RED): void {\n const adminRoot = ((RED.settings as any).httpAdminRoot || \"\").replace(\n /\\/$/,\n \"\",\n );\n\n RED.httpAdmin.post(\"/salesforce/auth/start\", (req, res) => {\n try {\n const {\n nodeId,\n loginUrl,\n clientId,\n callbackUrl: overrideCallbackUrl,\n } = req.body;\n\n if (!nodeId || !loginUrl || !clientId) {\n res\n .status(400)\n .json({ error: \"nodeId, loginUrl, and clientId are required\" });\n return;\n }\n\n const callbackUrl =\n overrideCallbackUrl ||\n `${req.protocol}://${req.get(\"host\")}${adminRoot}/salesforce/auth/callback`;\n\n const { state, codeChallenge } = createAuthState({\n nodeId,\n clientId,\n loginUrl,\n callbackUrl,\n });\n\n const params = new URLSearchParams({\n response_type: \"code\",\n client_id: clientId,\n redirect_uri: callbackUrl,\n state,\n code_challenge: codeChallenge,\n code_challenge_method: \"S256\",\n });\n\n res.json({\n authorizationUrl: `${loginUrl}/services/oauth2/authorize?${params.toString()}`,\n });\n } catch (error) {\n RED.log.error(\n `salesforce-connection: auth/start error: ${error instanceof Error ? error.message : String(error)}`,\n );\n res.status(500).json({ error: \"Failed to start authorization\" });\n }\n });\n\n RED.httpAdmin.get(\"/salesforce/auth/callback\", async (req, res) => {\n try {\n const { code, state, error: oauthError, error_description } = req.query;\n\n if (oauthError) {\n RED.log.error(\n `salesforce-connection: OAuth error: ${oauthError} - ${error_description}`,\n );\n res\n .status(400)\n .send(errorPage(String(error_description || oauthError)));\n return;\n }\n\n if (!code || !state) {\n res.status(400).send(errorPage(\"Missing code or state parameter\"));\n return;\n }\n\n const entry = consumeAuthState(state as string);\n if (!entry) {\n res\n .status(400)\n .send(\n errorPage(\n \"Invalid or expired authorization state. Please try again.\",\n ),\n );\n return;\n }\n\n const tokenResponse = await fetch(\n `${entry.loginUrl}/services/oauth2/token`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n code: code as string,\n client_id: entry.clientId,\n redirect_uri: entry.callbackUrl,\n code_verifier: entry.codeVerifier,\n }),\n },\n );\n\n if (!tokenResponse.ok) {\n const errorBody = await tokenResponse.text();\n RED.log.error(\n `salesforce-connection: Token exchange failed: ${errorBody}`,\n );\n res\n .status(500)\n .send(\n errorPage(\n \"Token exchange failed. Check the Node-RED logs for details.\",\n ),\n );\n return;\n }\n\n const tokens = (await tokenResponse.json()) as TokenResponse;\n\n (RED.nodes as any).addCredentials(entry.nodeId, {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n instanceUrl: tokens.instance_url,\n });\n\n RED.log.info(\n `salesforce-connection: Successfully authorized node ${entry.nodeId} for ${tokens.instance_url}`,\n );\n\n const messageData = JSON.stringify({\n type: \"salesforce-auth-success\",\n nodeId: entry.nodeId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n instanceUrl: tokens.instance_url,\n });\n\n res.send(`<!DOCTYPE html>\n<html>\n<body>\n<h2>Authorization Successful</h2>\n<p>You can close this window.</p>\n<script>\n if (window.opener) {\n window.opener.postMessage(${messageData}, \"*\");\n }\n setTimeout(function() { window.close(); }, 1500);\n</script>\n</body>\n</html>`);\n } catch (error) {\n RED.log.error(\n `salesforce-connection: auth/callback error: ${error instanceof Error ? error.message : String(error)}`,\n );\n res.status(500).send(errorPage(\"An unexpected error occurred.\"));\n }\n });\n\n RED.httpAdmin.get(\"/salesforce/auth/status/:nodeId\", (req, res) => {\n try {\n const credentials = RED.nodes.getCredentials(req.params.nodeId);\n const authenticated = !!(\n credentials?.accessToken && credentials?.instanceUrl\n );\n res.json({\n authenticated,\n instanceUrl: authenticated ? credentials.instanceUrl : undefined,\n });\n } catch {\n res.json({ authenticated: false });\n }\n });\n}\n\nexport { initAuthRoutes };\n","import type { RED } from \"@bonsae/nrg/server\";\nimport { initAuthRoutes } from \"./auth\";\n\nfunction initRoutes(RED: RED): void {\n initAuthRoutes(RED);\n}\n\nexport { initRoutes };\n","import {\n ConfigNode,\n type Schema,\n type Infer,\n type RED,\n} from \"@bonsae/nrg/server\";\nimport jsforce, { type Connection } from \"jsforce\";\nimport {\n ConfigsSchema,\n CredentialsSchema,\n} from \"../schemas/salesforce-connection\";\nimport { initRoutes } from \"../api\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Credentials = Infer<typeof CredentialsSchema>;\n\nexport default class SalesforceConnection extends ConfigNode<\n Config,\n Credentials\n> {\n static override readonly type = \"salesforce-connection\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly credentialsSchema: Schema = CredentialsSchema;\n\n private conn: Connection | null = null;\n\n static override async registered(RED: RED) {\n initRoutes(RED);\n }\n\n async getConnection(): Promise<Connection> {\n if (this.conn) return this.conn;\n\n const credentials = this.credentials;\n if (!credentials?.accessToken || !credentials?.instanceUrl) {\n throw new Error(\n \"Salesforce connection not authorized. Please authorize in the node configuration.\",\n );\n }\n\n this.conn = new jsforce.Connection({\n oauth2: {\n clientId: this.config.clientId,\n loginUrl: this.config.loginUrl,\n },\n instanceUrl: credentials.instanceUrl,\n accessToken: credentials.accessToken,\n refreshToken: credentials.refreshToken,\n version: this.config.apiVersion,\n });\n\n this.conn.on(\"refresh\", (newAccessToken: string) => {\n (this.RED.nodes as any).addCredentials(this.id, {\n ...this.credentials,\n accessToken: newAccessToken,\n });\n });\n\n return this.conn;\n }\n\n getAccessToken(): string | undefined {\n return this.credentials?.accessToken;\n }\n\n getInstanceUrl(): string | undefined {\n return this.credentials?.instanceUrl;\n }\n\n override async closed() {\n this.conn = null;\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n query: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"search\",\n typedInputTypes: [\"str\", \"msg\", \"flow\", \"global\"],\n },\n }),\n },\n { $id: \"salesforce-soql:config\" },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-soql:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Array(SchemaType.Any()),\n totalSize: SchemaType.Number(),\n done: SchemaType.Boolean(),\n },\n { $id: \"salesforce-soql:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-soql\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceSoql extends IONode<Config, any, Input, Output> {\n static override readonly type = \"salesforce-soql\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n this.status({ fill: \"green\", shape: \"dot\", text: \"querying...\" });\n\n const conn = await connection.getConnection();\n const query = await this.config.query.resolve(msg);\n\n const result = await conn.query(query);\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `${result.totalSize} records`,\n });\n this.send({\n ...msg,\n payload: result.records,\n totalSize: result.totalSize,\n done: result.done,\n });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `SOQL query failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n operation: SchemaType.Union(\n [\n SchemaType.Literal(\"create\"),\n SchemaType.Literal(\"read\"),\n SchemaType.Literal(\"update\"),\n SchemaType.Literal(\"delete\"),\n SchemaType.Literal(\"upsert\"),\n ],\n { default: \"create\", \"x-nrg-form\": { icon: \"pencil\" } },\n ),\n sObjectType: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"cube\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n record: SchemaType.TypedInput<any>({\n \"x-nrg-form\": {\n icon: \"file-code-o\",\n typedInputTypes: [\"json\", \"msg\"],\n },\n }),\n externalIdField: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"key\" },\n }),\n ),\n emitError: SchemaType.Boolean({ default: false }),\n emitComplete: SchemaType.Boolean({ default: false }),\n emitStatus: SchemaType.Boolean({ default: false }),\n },\n {\n $id: \"salesforce-dml:config\",\n if: SchemaType.Object({\n operation: SchemaType.Literal(\"upsert\"),\n }),\n then: SchemaType.Object({\n externalIdField: SchemaType.String({ minLength: 1 }),\n }),\n errorMessage: {\n properties: {\n externalIdField: \"External ID Field is required for upsert operations\",\n },\n },\n },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-dml:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-dml:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-dml\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceDml extends IONode<Config, any, Input, Output> {\n static override readonly type = \"salesforce-dml\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n const operation = this.config.operation;\n this.status({ fill: \"green\", shape: \"dot\", text: `${operation}...` });\n\n const conn = await connection.getConnection();\n const sObjectType = await this.config.sObjectType.resolve(msg);\n const sobject = conn.sobject(sObjectType);\n\n // Use record from config if set, otherwise fall back to msg.payload\n const data = (await this.config.record.resolve(msg)) ?? msg.payload;\n\n let result: any;\n\n switch (operation) {\n case \"create\":\n result = await sobject.create(data);\n break;\n case \"read\":\n result = await sobject.retrieve(data);\n break;\n case \"update\":\n result = await sobject.update(data);\n break;\n case \"delete\":\n result = await sobject.destroy(data);\n break;\n case \"upsert\":\n result = await sobject.upsert(data, this.config.externalIdField!);\n break;\n default:\n throw new Error(`Unknown operation: ${operation}`);\n }\n\n this.status({ fill: \"green\", shape: \"dot\", text: `${operation} done` });\n this.send({ ...msg, payload: result });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `DML ${this.config.operation} failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n operation: SchemaType.Union(\n [\n SchemaType.Literal(\"insert\"),\n SchemaType.Literal(\"update\"),\n SchemaType.Literal(\"upsert\"),\n SchemaType.Literal(\"delete\"),\n SchemaType.Literal(\"query\"),\n ],\n { default: \"insert\", \"x-nrg-form\": { icon: \"database\" } },\n ),\n sObjectType: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"cube\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n externalIdField: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"key\" },\n }),\n ),\n assignmentRuleId: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"gavel\" },\n }),\n ),\n columnDelimiter: SchemaType.Union(\n [\n SchemaType.Literal(\"COMMA\"),\n SchemaType.Literal(\"TAB\"),\n SchemaType.Literal(\"PIPE\"),\n SchemaType.Literal(\"SEMICOLON\"),\n SchemaType.Literal(\"CARET\"),\n SchemaType.Literal(\"BACKQUOTE\"),\n ],\n { default: \"COMMA\", \"x-nrg-form\": { icon: \"columns\" } },\n ),\n lineEnding: SchemaType.Union(\n [SchemaType.Literal(\"LF\"), SchemaType.Literal(\"CRLF\")],\n { default: \"LF\", \"x-nrg-form\": { icon: \"level-down\" } },\n ),\n pollInterval: SchemaType.Number({\n default: 5000,\n minimum: 1000,\n \"x-nrg-form\": { icon: \"clock-o\" },\n }),\n pollTimeout: SchemaType.Number({\n default: 60000,\n minimum: 5000,\n \"x-nrg-form\": { icon: \"hourglass\" },\n }),\n emitError: SchemaType.Boolean({ default: false }),\n emitComplete: SchemaType.Boolean({ default: true }),\n emitStatus: SchemaType.Boolean({ default: false }),\n },\n {\n $id: \"salesforce-bulk:config\",\n if: SchemaType.Object({\n operation: SchemaType.Literal(\"upsert\"),\n }),\n then: SchemaType.Object({\n externalIdField: SchemaType.String({ minLength: 1 }),\n }),\n errorMessage: {\n properties: {\n externalIdField: \"External ID Field is required for upsert operations\",\n },\n },\n },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-bulk:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Array(SchemaType.Any()),\n },\n { $id: \"salesforce-bulk:output\" },\n);\n","import {\n IONode,\n defineSchema,\n type Schema,\n type Infer,\n} from \"@bonsae/nrg/server\";\nimport { ConfigsSchema, InputSchema } from \"../schemas/salesforce-bulk\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\n\nconst RecordOutputSchema = defineSchema(\n {},\n { $id: \"salesforce-bulk:record-output\" },\n);\nconst JobCreatedOutputSchema = defineSchema(\n {},\n { $id: \"salesforce-bulk:job-created-output\" },\n);\n\nexport default class SalesforceBulk extends IONode<Config> {\n static override readonly type = \"salesforce-bulk\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema[] = [\n RecordOutputSchema,\n JobCreatedOutputSchema,\n ];\n\n private sendRecord(msg: Input, payload: unknown) {\n this.sendToPort(0, { ...msg, payload });\n }\n\n private sendJobCreated(msg: Input, payload: object) {\n this.sendToPort(1, { ...msg, payload });\n }\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n const operation = this.config.operation;\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `bulk ${operation}...`,\n });\n\n const conn = await connection.getConnection();\n const sObjectType = await this.config.sObjectType.resolve(msg);\n\n let totalRecords = 0;\n\n if (operation === \"query\") {\n const stream = await conn.bulk2.query(msg.payload as string, {\n pollTimeout: this.config.pollTimeout,\n pollInterval: this.config.pollInterval,\n columnDelimiter: this.config.columnDelimiter,\n lineEnding: this.config.lineEnding,\n });\n\n await new Promise<void>((resolve, reject) => {\n stream.on(\"data\", (record: unknown) => {\n totalRecords++;\n this.sendRecord(msg, record);\n });\n stream.on(\"end\", () => resolve());\n stream.on(\"error\", reject);\n });\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `bulk ${operation}: ${totalRecords} records`,\n });\n\n this.sendToPort(\"complete\", {\n ...msg,\n payload: { operation, sObjectType, totalRecords },\n });\n } else {\n const records = msg.payload as Record<string, unknown>[];\n\n const job = conn.bulk2.createJob({\n operation,\n object: sObjectType,\n columnDelimiter: this.config.columnDelimiter,\n lineEnding: this.config.lineEnding,\n ...(operation === \"upsert\" && this.config.externalIdField\n ? { externalIdFieldName: this.config.externalIdField }\n : {}),\n ...(this.config.assignmentRuleId\n ? { assignmentRuleId: this.config.assignmentRuleId }\n : {}),\n });\n\n await job.open();\n\n this.sendJobCreated(msg, {\n jobId: (job as any).id,\n operation,\n sObjectType,\n state: \"Open\",\n });\n\n await job.uploadData(records);\n await job.close();\n await job.poll(this.config.pollInterval, this.config.pollTimeout);\n\n const jobResults = await job.getAllResults();\n const successfulResults = jobResults.successfulResults ?? [];\n const failedResults = jobResults.failedResults ?? [];\n const unprocessedRecords = jobResults.unprocessedRecords ?? [];\n totalRecords =\n successfulResults.length +\n failedResults.length +\n unprocessedRecords.length;\n\n for (const result of successfulResults) {\n this.sendRecord(msg, result);\n }\n for (const result of failedResults) {\n this.sendRecord(msg, result);\n }\n\n const successCount = successfulResults.length;\n const failureCount = failedResults.length;\n\n this.status({\n fill: failureCount > 0 ? \"red\" : \"green\",\n shape: \"dot\",\n text: `bulk ${operation}: ${totalRecords} records`,\n });\n\n this.sendToPort(\"complete\", {\n ...msg,\n payload: {\n jobId: (job as any).id,\n operation,\n sObjectType,\n totalRecords,\n successCount,\n failureCount,\n unprocessedCount: unprocessedRecords.length,\n },\n });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.status({ fill: \"red\", shape: \"dot\", text: message });\n this.error(`Bulk ${this.config.operation} failed: ${message}`, msg);\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n sObjectType: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"cube\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n emitError: SchemaType.Boolean({ default: false }),\n emitComplete: SchemaType.Boolean({ default: false }),\n emitStatus: SchemaType.Boolean({ default: false }),\n },\n { $id: \"salesforce-describe:config\" },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-describe:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Object({\n name: SchemaType.String(),\n fields: SchemaType.Array(SchemaType.Any()),\n childRelationships: SchemaType.Array(SchemaType.Any()),\n recordTypeInfos: SchemaType.Array(SchemaType.Any()),\n }),\n },\n { $id: \"salesforce-describe:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-describe\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceDescribe extends IONode<\n Config,\n any,\n Input,\n Output\n> {\n static override readonly type = \"salesforce-describe\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n this.status({ fill: \"green\", shape: \"dot\", text: \"describing...\" });\n\n const conn = await connection.getConnection();\n const sObjectType = await this.config.sObjectType.resolve(msg);\n const result = await conn.sobject(sObjectType).describe();\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `${result.name}: ${result.fields.length} fields`,\n });\n this.send({\n ...msg,\n payload: {\n name: result.name,\n fields: result.fields,\n childRelationships: result.childRelationships,\n recordTypeInfos: result.recordTypeInfos,\n },\n });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `Describe failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n channelName: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"rss\" },\n }),\n subscribeType: SchemaType.Union(\n [\n SchemaType.Literal(\"LATEST\"),\n SchemaType.Literal(\"EARLIEST\"),\n SchemaType.Literal(\"CUSTOM\"),\n ],\n { default: \"LATEST\", \"x-nrg-form\": { icon: \"history\" } },\n ),\n replayId: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"bookmark\" },\n }),\n ),\n numRequested: SchemaType.Number({\n default: 100,\n minimum: 1,\n maximum: 100,\n \"x-nrg-form\": { icon: \"sort-numeric-asc\" },\n }),\n emitError: SchemaType.Boolean({ default: false }),\n emitStatus: SchemaType.Boolean({ default: false }),\n },\n {\n $id: \"salesforce-streaming:config\",\n if: SchemaType.Object({\n subscribeType: SchemaType.Literal(\"CUSTOM\"),\n }),\n then: SchemaType.Object({\n replayId: SchemaType.String({ minLength: 1 }),\n }),\n errorMessage: {\n properties: {\n replayId: \"Replay ID is required when Subscribe Type is CUSTOM\",\n },\n },\n },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n replayId: SchemaType.Any(),\n channel: SchemaType.String(),\n topic: SchemaType.String(),\n },\n { $id: \"salesforce-streaming:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport { ConfigsSchema, OutputSchema } from \"../schemas/salesforce-streaming\";\nimport type SalesforceConnection from \"./salesforce-connection\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceStreaming extends IONode<\n Config,\n any,\n any,\n Output\n> {\n static override readonly type = \"salesforce-streaming\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n private client: any = null;\n private reconnectAttempt = 0;\n private maxReconnectDelay = 60000;\n private maxReconnectAttempts = 10;\n private grpcErrorHandler: ((err: Error) => void) | null = null;\n private stopped = false;\n\n override async created() {\n const connection = this.config.connection as SalesforceConnection;\n if (!connection) {\n this.status({ fill: \"red\", shape: \"dot\", text: \"no connection\" });\n this.error(\"No Salesforce connection configured\");\n return;\n }\n\n await this.subscribe(connection);\n }\n\n private async subscribe(connection: SalesforceConnection) {\n if (this.stopped) return;\n try {\n this.status({ fill: \"green\", shape: \"dot\", text: \"connecting...\" });\n\n // Refresh the jsforce connection to get a fresh token\n // (jsforce auto-refreshes expired tokens via the refresh event)\n let conn;\n try {\n conn = await connection.getConnection();\n // Validate the token is still valid with a lightweight API call\n await conn.identity();\n } catch {\n this.status({ fill: \"red\", shape: \"dot\", text: \"auth expired\" });\n this.error(\"Salesforce token expired. Re-authorize the connection.\");\n return;\n }\n\n const accessToken = connection.getAccessToken();\n const instanceUrl = connection.getInstanceUrl();\n\n if (!accessToken || !instanceUrl) {\n this.status({ fill: \"red\", shape: \"dot\", text: \"not authorized\" });\n this.error(\"Salesforce connection not authorized\");\n return;\n }\n\n const PubSubApiClient = (await import(\"salesforce-pubsub-api-client\"))\n .default;\n\n this.client = new PubSubApiClient({\n authType: \"user-supplied\",\n accessToken,\n instanceUrl,\n });\n\n await this.client.connect();\n\n const numRequested = this.config.numRequested || null;\n const channelName = this.config.channelName;\n\n const callback = (\n _subscription: any,\n callbackType: string,\n data?: any,\n ) => {\n if (callbackType === \"event\" || callbackType === \"lastevent\") {\n this.send({\n payload: data?.payload ?? data,\n replayId: data?.replayId,\n channel: channelName,\n topic: channelName,\n });\n } else if (callbackType === \"error\") {\n const errorMsg =\n data instanceof Error\n ? data.message\n : String(data ?? \"stream error\");\n this.warn(`Streaming error: ${errorMsg}`);\n\n // Stop retrying on auth errors — token is expired\n if (\n errorMsg.includes(\"UNAUTHENTICATED\") ||\n errorMsg.includes(\"authentication\")\n ) {\n this.stopped = true;\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: \"auth expired — re-authorize\",\n });\n this.error(\n \"Salesforce token expired. Re-authorize the connection.\",\n );\n this.cleanup();\n return;\n }\n\n this.status({ fill: \"red\", shape: \"dot\", text: errorMsg });\n this.scheduleReconnect(connection);\n } else if (callbackType === \"end\") {\n if (this.stopped) return;\n this.log(\"Streaming subscription ended\");\n this.status({ fill: \"red\", shape: \"dot\", text: \"disconnected\" });\n this.scheduleReconnect(connection);\n }\n };\n\n // Guard against uncaught gRPC errors that crash the process.\n // The @grpc/grpc-js library can throw before the pubsub client\n // attaches its own error handler to the bidi stream.\n if (this.grpcErrorHandler) {\n process.removeListener(\"uncaughtException\", this.grpcErrorHandler);\n }\n this.grpcErrorHandler = (err: Error) => {\n if (\n err.message?.includes(\"UNAUTHENTICATED\") ||\n err.message?.includes(\"authentication\")\n ) {\n this.stopped = true;\n this.warn(`Caught gRPC auth error: ${err.message}`);\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: \"auth expired — re-authorize\",\n });\n this.cleanup();\n // Don't rethrow — we handled it\n }\n };\n process.on(\"uncaughtException\", this.grpcErrorHandler);\n\n if (this.config.subscribeType === \"EARLIEST\") {\n this.client.subscribeFromEarliestEvent(\n channelName,\n callback,\n numRequested,\n );\n } else if (\n this.config.subscribeType === \"CUSTOM\" &&\n this.config.replayId\n ) {\n const replayId = parseInt(this.config.replayId, 10);\n this.client.subscribeFromReplayId(\n channelName,\n callback,\n numRequested,\n replayId,\n );\n } else {\n this.client.subscribe(channelName, callback, numRequested);\n }\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `subscribed: ${channelName}`,\n });\n this.reconnectAttempt = 0;\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `Streaming subscription failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n this.scheduleReconnect(connection);\n }\n }\n\n private scheduleReconnect(connection: SalesforceConnection) {\n if (this.stopped) return;\n this.reconnectAttempt++;\n\n if (this.reconnectAttempt > this.maxReconnectAttempts) {\n this.error(\n `Streaming: max reconnect attempts (${this.maxReconnectAttempts}) reached. Giving up.`,\n );\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: \"reconnect failed — re-deploy to retry\",\n });\n return;\n }\n\n const delay = Math.min(\n 1000 * Math.pow(2, this.reconnectAttempt),\n this.maxReconnectDelay,\n );\n this.log(\n `Scheduling reconnect in ${delay}ms (attempt ${this.reconnectAttempt}/${this.maxReconnectAttempts})`,\n );\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `reconnecting in ${Math.round(delay / 1000)}s`,\n });\n this.setTimeout(async () => {\n await this.cleanup();\n await this.subscribe(connection);\n }, delay);\n }\n\n private async cleanup() {\n try {\n if (this.grpcErrorHandler) {\n process.removeListener(\"uncaughtException\", this.grpcErrorHandler);\n this.grpcErrorHandler = null;\n }\n if (this.client) {\n await this.client.close?.();\n this.client = null;\n }\n } catch {\n // Ignore cleanup errors\n }\n }\n\n override async closed() {\n await this.cleanup();\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n method: SchemaType.Union(\n [\n SchemaType.Literal(\"GET\"),\n SchemaType.Literal(\"POST\"),\n SchemaType.Literal(\"PUT\"),\n SchemaType.Literal(\"PATCH\"),\n SchemaType.Literal(\"DELETE\"),\n ],\n { default: \"POST\", \"x-nrg-form\": { icon: \"random\" } },\n ),\n path: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"link\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n emitError: SchemaType.Boolean({ default: false }),\n emitComplete: SchemaType.Boolean({ default: false }),\n emitStatus: SchemaType.Boolean({ default: false }),\n },\n { $id: \"salesforce-apex:config\" },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-apex:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-apex:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-apex\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceApex extends IONode<Config, any, Input, Output> {\n static override readonly type = \"salesforce-apex\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n const method = this.config.method;\n this.status({ fill: \"green\", shape: \"dot\", text: `${method}...` });\n\n const conn = await connection.getConnection();\n const path = await this.config.path.resolve(msg);\n\n let result: any;\n const apexMethod = method.toLowerCase() as\n | \"get\"\n | \"post\"\n | \"put\"\n | \"patch\"\n | \"delete\";\n\n if (apexMethod === \"get\" || apexMethod === \"delete\") {\n result = await conn.apex[apexMethod](path);\n } else {\n result = await conn.apex[apexMethod](path, msg.payload);\n }\n\n this.status({ fill: \"green\", shape: \"dot\", text: `${method} done` });\n this.send({ ...msg, payload: result });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `Apex ${this.config.method} failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineModule } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"./nodes/salesforce-connection\";\nimport SalesforceSoql from \"./nodes/salesforce-soql\";\nimport SalesforceDml from \"./nodes/salesforce-dml\";\nimport SalesforceBulk from \"./nodes/salesforce-bulk\";\nimport SalesforceDescribe from \"./nodes/salesforce-describe\";\nimport SalesforceStreaming from \"./nodes/salesforce-streaming\";\nimport SalesforceApex from \"./nodes/salesforce-apex\";\n\nexport default defineModule({\n nodes: [\n SalesforceConnection,\n SalesforceSoql,\n SalesforceDml,\n SalesforceBulk,\n SalesforceDescribe,\n SalesforceStreaming,\n SalesforceApex,\n ],\n});\n"],"names":["ConfigsSchema","__nrgRegisterTypes","defineSchema","SchemaType","ConfigNode","IONode","defineModule","jsforce","crypto","ConfigsSchema$6","CredentialsSchema","AUTH_STATE_TTL","generateCodeVerifier","__name","generateCodeChallenge","verifier","createAuthState","params","state","codeVerifier","codeChallenge","pendingAuthStates","key","value","consumeAuthState","entry","escapeHtml","str","errorPage","message","autoClose","script","initAuthRoutes","RED","adminRoot","req","res","nodeId","loginUrl","clientId","overrideCallbackUrl","callbackUrl","error","code","oauthError","error_description","tokenResponse","errorBody","tokens","messageData","credentials","authenticated","initRoutes","_SalesforceConnection","__publicField","newAccessToken","_a","SalesforceConnection","ConfigsSchema$5","InputSchema","InputSchema$4","OutputSchema$4","_SalesforceSoql","msg","connection","conn","query","result","SalesforceSoql","ConfigsSchema$4","InputSchema$3","OutputSchema$3","_SalesforceDml","operation","sobject","sObjectType","data","SalesforceDml","ConfigsSchema$3","InputSchema$2","RecordOutputSchema","JobCreatedOutputSchema","_SalesforceBulk","payload","totalRecords","stream","resolve","reject","record","job","records","jobResults","successfulResults","failedResults","unprocessedRecords","successCount","failureCount","SalesforceBulk","ConfigsSchema$2","InputSchema$1","OutputSchema$2","_SalesforceDescribe","SalesforceDescribe","ConfigsSchema$1","OutputSchema","OutputSchema$1","_SalesforceStreaming","accessToken","instanceUrl","PubSubApiClient","numRequested","channelName","callback","_subscription","callbackType","errorMsg","err","_b","replayId","delay","SalesforceStreaming","_SalesforceApex","method","path","apexMethod","SalesforceApex","index"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/server/schemas/salesforce-connection.ts","../src/server/lib/pkce.ts","../src/server/api/auth.ts","../src/server/api/index.ts","../src/server/nodes/salesforce-connection.ts","../src/server/schemas/salesforce-soql.ts","../src/server/nodes/salesforce-soql.ts","../src/server/schemas/salesforce-dml.ts","../src/server/nodes/salesforce-dml.ts","../src/server/schemas/salesforce-bulk.ts","../src/server/nodes/salesforce-bulk.ts","../src/server/schemas/salesforce-describe.ts","../src/server/nodes/salesforce-describe.ts","../src/server/schemas/salesforce-streaming.ts","../src/server/nodes/salesforce-streaming.ts","../src/server/schemas/salesforce-apex.ts","../src/server/nodes/salesforce-apex.ts","../src/server/index.ts"],"sourcesContent":["import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\" }),\n loginUrl: SchemaType.String({\n default: \"https://login.salesforce.com\",\n \"x-nrg-form\": { icon: \"globe\" },\n }),\n clientId: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"key\" },\n }),\n apiVersion: SchemaType.Union(\n [\n SchemaType.Literal(\"62.0\"),\n SchemaType.Literal(\"61.0\"),\n SchemaType.Literal(\"60.0\"),\n SchemaType.Literal(\"59.0\"),\n SchemaType.Literal(\"58.0\"),\n SchemaType.Literal(\"57.0\"),\n SchemaType.Literal(\"56.0\"),\n SchemaType.Literal(\"55.0\"),\n ],\n { default: \"62.0\", \"x-nrg-form\": { icon: \"code-fork\" } },\n ),\n callbackUrl: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"exchange\" },\n }),\n ),\n },\n { $id: \"salesforce-connection:config\" },\n);\n\nexport const CredentialsSchema = defineSchema(\n {\n accessToken: SchemaType.String({ default: \"\", format: \"password\" }),\n refreshToken: SchemaType.String({ default: \"\", format: \"password\" }),\n instanceUrl: SchemaType.String({ default: \"\" }),\n },\n { $id: \"salesforce-connection:credentials\" },\n);\n","import crypto from \"node:crypto\";\n\nconst AUTH_STATE_TTL = 10 * 60 * 1000; // 10 minutes\n\ninterface PendingAuthState {\n codeVerifier: string;\n nodeId: string;\n clientId: string;\n loginUrl: string;\n callbackUrl: string;\n timestamp: number;\n}\n\nconst pendingAuthStates = new Map<string, PendingAuthState>();\n\nexport function generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return crypto.createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n\nexport function createAuthState(params: {\n nodeId: string;\n clientId: string;\n loginUrl: string;\n callbackUrl: string;\n}): { state: string; codeChallenge: string } {\n const state = crypto.randomUUID();\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = generateCodeChallenge(codeVerifier);\n\n pendingAuthStates.set(state, {\n codeVerifier,\n nodeId: params.nodeId,\n clientId: params.clientId,\n loginUrl: params.loginUrl,\n callbackUrl: params.callbackUrl,\n timestamp: Date.now(),\n });\n\n // Cleanup stale entries\n for (const [key, value] of pendingAuthStates) {\n if (Date.now() - value.timestamp > AUTH_STATE_TTL) {\n pendingAuthStates.delete(key);\n }\n }\n\n return { state, codeChallenge };\n}\n\nexport function consumeAuthState(state: string): PendingAuthState | null {\n const entry = pendingAuthStates.get(state);\n if (!entry) return null;\n pendingAuthStates.delete(state);\n if (Date.now() - entry.timestamp > AUTH_STATE_TTL) return null;\n return entry;\n}\n","import type { RED } from \"@bonsae/nrg/server\";\nimport { createAuthState, consumeAuthState } from \"../lib/pkce\";\n\ninterface TokenResponse {\n access_token: string;\n refresh_token: string;\n instance_url: string;\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nfunction errorPage(message: string, autoClose = true): string {\n const script = autoClose\n ? \"<script>setTimeout(function(){window.close()},3000)</script>\"\n : \"\";\n return `<html><body><h2>Authorization Failed</h2><p>${escapeHtml(message)}</p>${script}</body></html>`;\n}\n\nfunction initAuthRoutes(RED: RED): void {\n const adminRoot = ((RED.settings as any).httpAdminRoot || \"\").replace(\n /\\/$/,\n \"\",\n );\n\n RED.httpAdmin.post(\"/salesforce/auth/start\", (req, res) => {\n try {\n const {\n nodeId,\n loginUrl,\n clientId,\n callbackUrl: overrideCallbackUrl,\n } = req.body;\n\n if (!nodeId || !loginUrl || !clientId) {\n res\n .status(400)\n .json({ error: \"nodeId, loginUrl, and clientId are required\" });\n return;\n }\n\n const callbackUrl =\n overrideCallbackUrl ||\n `${req.protocol}://${req.get(\"host\")}${adminRoot}/salesforce/auth/callback`;\n\n const { state, codeChallenge } = createAuthState({\n nodeId,\n clientId,\n loginUrl,\n callbackUrl,\n });\n\n const params = new URLSearchParams({\n response_type: \"code\",\n client_id: clientId,\n redirect_uri: callbackUrl,\n state,\n code_challenge: codeChallenge,\n code_challenge_method: \"S256\",\n });\n\n res.json({\n authorizationUrl: `${loginUrl}/services/oauth2/authorize?${params.toString()}`,\n });\n } catch (error) {\n RED.log.error(\n `salesforce-connection: auth/start error: ${error instanceof Error ? error.message : String(error)}`,\n );\n res.status(500).json({ error: \"Failed to start authorization\" });\n }\n });\n\n RED.httpAdmin.get(\"/salesforce/auth/callback\", async (req, res) => {\n try {\n const { code, state, error: oauthError, error_description } = req.query;\n\n if (oauthError) {\n RED.log.error(\n `salesforce-connection: OAuth error: ${oauthError} - ${error_description}`,\n );\n res\n .status(400)\n .send(errorPage(String(error_description || oauthError)));\n return;\n }\n\n if (!code || !state) {\n res.status(400).send(errorPage(\"Missing code or state parameter\"));\n return;\n }\n\n const entry = consumeAuthState(state as string);\n if (!entry) {\n res\n .status(400)\n .send(\n errorPage(\n \"Invalid or expired authorization state. Please try again.\",\n ),\n );\n return;\n }\n\n const tokenResponse = await fetch(\n `${entry.loginUrl}/services/oauth2/token`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n code: code as string,\n client_id: entry.clientId,\n redirect_uri: entry.callbackUrl,\n code_verifier: entry.codeVerifier,\n }),\n },\n );\n\n if (!tokenResponse.ok) {\n const errorBody = await tokenResponse.text();\n RED.log.error(\n `salesforce-connection: Token exchange failed: ${errorBody}`,\n );\n res\n .status(500)\n .send(\n errorPage(\n \"Token exchange failed. Check the Node-RED logs for details.\",\n ),\n );\n return;\n }\n\n const tokens = (await tokenResponse.json()) as TokenResponse;\n\n (RED.nodes as any).addCredentials(entry.nodeId, {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n instanceUrl: tokens.instance_url,\n });\n\n RED.log.info(\n `salesforce-connection: Successfully authorized node ${entry.nodeId} for ${tokens.instance_url}`,\n );\n\n const messageData = JSON.stringify({\n type: \"salesforce-auth-success\",\n nodeId: entry.nodeId,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n instanceUrl: tokens.instance_url,\n });\n\n res.send(`<!DOCTYPE html>\n<html>\n<body>\n<h2>Authorization Successful</h2>\n<p>You can close this window.</p>\n<script>\n if (window.opener) {\n window.opener.postMessage(${messageData}, \"*\");\n }\n setTimeout(function() { window.close(); }, 1500);\n</script>\n</body>\n</html>`);\n } catch (error) {\n RED.log.error(\n `salesforce-connection: auth/callback error: ${error instanceof Error ? error.message : String(error)}`,\n );\n res.status(500).send(errorPage(\"An unexpected error occurred.\"));\n }\n });\n\n RED.httpAdmin.get(\"/salesforce/auth/status/:nodeId\", (req, res) => {\n try {\n const credentials = RED.nodes.getCredentials(req.params.nodeId);\n const authenticated = !!(\n credentials?.accessToken && credentials?.instanceUrl\n );\n res.json({\n authenticated,\n instanceUrl: authenticated ? credentials.instanceUrl : undefined,\n });\n } catch {\n res.json({ authenticated: false });\n }\n });\n}\n\nexport { initAuthRoutes };\n","import type { RED } from \"@bonsae/nrg/server\";\nimport { initAuthRoutes } from \"./auth\";\n\nfunction initRoutes(RED: RED): void {\n initAuthRoutes(RED);\n}\n\nexport { initRoutes };\n","import {\n ConfigNode,\n type Schema,\n type Infer,\n type RED,\n} from \"@bonsae/nrg/server\";\nimport jsforce, { type Connection } from \"jsforce\";\nimport {\n ConfigsSchema,\n CredentialsSchema,\n} from \"../schemas/salesforce-connection\";\nimport { initRoutes } from \"../api\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Credentials = Infer<typeof CredentialsSchema>;\n\nexport default class SalesforceConnection extends ConfigNode<\n Config,\n Credentials\n> {\n static override readonly type = \"salesforce-connection\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly credentialsSchema: Schema = CredentialsSchema;\n\n private conn: Connection | null = null;\n\n static override async registered(RED: RED) {\n initRoutes(RED);\n }\n\n async getConnection(): Promise<Connection> {\n if (this.conn) return this.conn;\n\n const credentials = this.credentials;\n if (!credentials?.accessToken || !credentials?.instanceUrl) {\n throw new Error(\n \"Salesforce connection not authorized. Please authorize in the node configuration.\",\n );\n }\n\n this.conn = new jsforce.Connection({\n oauth2: {\n clientId: this.config.clientId,\n loginUrl: this.config.loginUrl,\n },\n instanceUrl: credentials.instanceUrl,\n accessToken: credentials.accessToken,\n refreshToken: credentials.refreshToken,\n version: this.config.apiVersion,\n });\n\n this.conn.on(\"refresh\", (newAccessToken: string) => {\n (this.RED.nodes as any).addCredentials(this.id, {\n ...this.credentials,\n accessToken: newAccessToken,\n });\n });\n\n return this.conn;\n }\n\n getAccessToken(): string | undefined {\n return this.credentials?.accessToken;\n }\n\n getInstanceUrl(): string | undefined {\n return this.credentials?.instanceUrl;\n }\n\n override async closed() {\n this.conn = null;\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n query: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"search\",\n typedInputTypes: [\"str\", \"msg\", \"flow\", \"global\"],\n },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n { $id: \"salesforce-soql:config\" },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-soql:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Array(SchemaType.Any()),\n totalSize: SchemaType.Number(),\n done: SchemaType.Boolean(),\n },\n { $id: \"salesforce-soql:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-soql\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceSoql extends IONode<Config, any, Input, Output> {\n static override readonly type = \"salesforce-soql\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n this.status({ fill: \"green\", shape: \"dot\", text: \"querying...\" });\n\n const conn = await connection.getConnection();\n const query = await this.config.query.resolve(msg);\n\n const result = await conn.query(query);\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `${result.totalSize} records`,\n });\n this.send({\n ...msg,\n payload: result.records,\n totalSize: result.totalSize,\n done: result.done,\n });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `SOQL query failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n operation: SchemaType.Union(\n [\n SchemaType.Literal(\"create\"),\n SchemaType.Literal(\"read\"),\n SchemaType.Literal(\"update\"),\n SchemaType.Literal(\"delete\"),\n SchemaType.Literal(\"upsert\"),\n ],\n { default: \"create\", \"x-nrg-form\": { icon: \"pencil\" } },\n ),\n sObjectType: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"cube\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n record: SchemaType.TypedInput<any>({\n \"x-nrg-form\": {\n icon: \"file-code-o\",\n typedInputTypes: [\"json\", \"msg\"],\n },\n }),\n externalIdField: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"key\" },\n }),\n ),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n {\n $id: \"salesforce-dml:config\",\n if: SchemaType.Object({\n operation: SchemaType.Literal(\"upsert\"),\n }),\n then: SchemaType.Object({\n externalIdField: SchemaType.String({ minLength: 1 }),\n }),\n errorMessage: {\n properties: {\n externalIdField: \"External ID Field is required for upsert operations\",\n },\n },\n },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-dml:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-dml:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-dml\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceDml extends IONode<Config, any, Input, Output> {\n static override readonly type = \"salesforce-dml\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n const operation = this.config.operation;\n this.status({ fill: \"green\", shape: \"dot\", text: `${operation}...` });\n\n const conn = await connection.getConnection();\n const sObjectType = await this.config.sObjectType.resolve(msg);\n const sobject = conn.sobject(sObjectType);\n\n // Use record from config if set, otherwise fall back to msg.payload\n const data = (await this.config.record.resolve(msg)) ?? msg.payload;\n\n let result: any;\n\n switch (operation) {\n case \"create\":\n result = await sobject.create(data);\n break;\n case \"read\":\n result = await sobject.retrieve(data);\n break;\n case \"update\":\n result = await sobject.update(data);\n break;\n case \"delete\":\n result = await sobject.destroy(data);\n break;\n case \"upsert\":\n result = await sobject.upsert(data, this.config.externalIdField!);\n break;\n default:\n throw new Error(`Unknown operation: ${operation}`);\n }\n\n this.status({ fill: \"green\", shape: \"dot\", text: `${operation} done` });\n this.send({ ...msg, payload: result });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `DML ${this.config.operation} failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n operation: SchemaType.Union(\n [\n SchemaType.Literal(\"insert\"),\n SchemaType.Literal(\"update\"),\n SchemaType.Literal(\"upsert\"),\n SchemaType.Literal(\"delete\"),\n SchemaType.Literal(\"query\"),\n ],\n { default: \"insert\", \"x-nrg-form\": { icon: \"database\" } },\n ),\n sObjectType: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"cube\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n externalIdField: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"key\" },\n }),\n ),\n assignmentRuleId: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"gavel\" },\n }),\n ),\n columnDelimiter: SchemaType.Union(\n [\n SchemaType.Literal(\"COMMA\"),\n SchemaType.Literal(\"TAB\"),\n SchemaType.Literal(\"PIPE\"),\n SchemaType.Literal(\"SEMICOLON\"),\n SchemaType.Literal(\"CARET\"),\n SchemaType.Literal(\"BACKQUOTE\"),\n ],\n { default: \"COMMA\", \"x-nrg-form\": { icon: \"columns\" } },\n ),\n lineEnding: SchemaType.Union(\n [SchemaType.Literal(\"LF\"), SchemaType.Literal(\"CRLF\")],\n { default: \"LF\", \"x-nrg-form\": { icon: \"level-down\" } },\n ),\n pollInterval: SchemaType.Number({\n default: 5000,\n minimum: 1000,\n \"x-nrg-form\": { icon: \"clock-o\" },\n }),\n pollTimeout: SchemaType.Number({\n default: 60000,\n minimum: 5000,\n \"x-nrg-form\": { icon: \"hourglass\" },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: true }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n {\n $id: \"salesforce-bulk:config\",\n if: SchemaType.Object({\n operation: SchemaType.Literal(\"upsert\"),\n }),\n then: SchemaType.Object({\n externalIdField: SchemaType.String({ minLength: 1 }),\n }),\n errorMessage: {\n properties: {\n externalIdField: \"External ID Field is required for upsert operations\",\n },\n },\n },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-bulk:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Array(SchemaType.Any()),\n },\n { $id: \"salesforce-bulk:output\" },\n);\n","import {\n IONode,\n defineSchema,\n type Schema,\n type Infer,\n} from \"@bonsae/nrg/server\";\nimport { ConfigsSchema, InputSchema } from \"../schemas/salesforce-bulk\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\n\nconst RecordOutputSchema = defineSchema(\n {},\n { $id: \"salesforce-bulk:record-output\" },\n);\nconst JobCreatedOutputSchema = defineSchema(\n {},\n { $id: \"salesforce-bulk:job-created-output\" },\n);\n\nconst outputsSchema = {\n record: RecordOutputSchema,\n jobCreated: JobCreatedOutputSchema,\n};\n\ntype Output = Infer<typeof outputsSchema>;\n\nexport default class SalesforceBulk extends IONode<Config, any, Input, Output> {\n static override readonly type = \"salesforce-bulk\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema = outputsSchema;\n\n private sendRecord(msg: Input, payload: unknown) {\n this.sendToPort(\"record\", { ...msg, payload });\n }\n\n private sendJobCreated(msg: Input, payload: object) {\n this.sendToPort(\"jobCreated\", { ...msg, payload });\n }\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n const operation = this.config.operation;\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `bulk ${operation}...`,\n });\n\n const conn = await connection.getConnection();\n const sObjectType = await this.config.sObjectType.resolve(msg);\n\n let totalRecords = 0;\n\n if (operation === \"query\") {\n const stream = await conn.bulk2.query(msg.payload as string, {\n pollTimeout: this.config.pollTimeout,\n pollInterval: this.config.pollInterval,\n columnDelimiter: this.config.columnDelimiter,\n lineEnding: this.config.lineEnding,\n });\n\n await new Promise<void>((resolve, reject) => {\n stream.on(\"data\", (record: unknown) => {\n totalRecords++;\n this.sendRecord(msg, record);\n });\n stream.on(\"end\", () => resolve());\n stream.on(\"error\", reject);\n });\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `bulk ${operation}: ${totalRecords} records`,\n });\n\n this.sendToPort(\"complete\", {\n ...msg,\n payload: { operation, sObjectType, totalRecords },\n });\n } else {\n const records = msg.payload as Record<string, unknown>[];\n\n const job = conn.bulk2.createJob({\n operation,\n object: sObjectType,\n columnDelimiter: this.config.columnDelimiter,\n lineEnding: this.config.lineEnding,\n ...(operation === \"upsert\" && this.config.externalIdField\n ? { externalIdFieldName: this.config.externalIdField }\n : {}),\n ...(this.config.assignmentRuleId\n ? { assignmentRuleId: this.config.assignmentRuleId }\n : {}),\n });\n\n await job.open();\n\n this.sendJobCreated(msg, {\n jobId: (job as any).id,\n operation,\n sObjectType,\n state: \"Open\",\n });\n\n await job.uploadData(records);\n await job.close();\n await job.poll(this.config.pollInterval, this.config.pollTimeout);\n\n const jobResults = await job.getAllResults();\n const successfulResults = jobResults.successfulResults ?? [];\n const failedResults = jobResults.failedResults ?? [];\n const unprocessedRecords = jobResults.unprocessedRecords ?? [];\n totalRecords =\n successfulResults.length +\n failedResults.length +\n unprocessedRecords.length;\n\n for (const result of successfulResults) {\n this.sendRecord(msg, result);\n }\n for (const result of failedResults) {\n this.sendRecord(msg, result);\n }\n\n const successCount = successfulResults.length;\n const failureCount = failedResults.length;\n\n this.status({\n fill: failureCount > 0 ? \"red\" : \"green\",\n shape: \"dot\",\n text: `bulk ${operation}: ${totalRecords} records`,\n });\n\n this.sendToPort(\"complete\", {\n ...msg,\n payload: {\n jobId: (job as any).id,\n operation,\n sObjectType,\n totalRecords,\n successCount,\n failureCount,\n unprocessedCount: unprocessedRecords.length,\n },\n });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.status({ fill: \"red\", shape: \"dot\", text: message });\n this.error(`Bulk ${this.config.operation} failed: ${message}`, msg);\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n sObjectType: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"cube\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n { $id: \"salesforce-describe:config\" },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-describe:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Object({\n name: SchemaType.String(),\n fields: SchemaType.Array(SchemaType.Any()),\n childRelationships: SchemaType.Array(SchemaType.Any()),\n recordTypeInfos: SchemaType.Array(SchemaType.Any()),\n }),\n },\n { $id: \"salesforce-describe:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-describe\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceDescribe extends IONode<\n Config,\n any,\n Input,\n Output\n> {\n static override readonly type = \"salesforce-describe\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n this.status({ fill: \"green\", shape: \"dot\", text: \"describing...\" });\n\n const conn = await connection.getConnection();\n const sObjectType = await this.config.sObjectType.resolve(msg);\n const result = await conn.sobject(sObjectType).describe();\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `${result.name}: ${result.fields.length} fields`,\n });\n this.send({\n ...msg,\n payload: {\n name: result.name,\n fields: result.fields,\n childRelationships: result.childRelationships,\n recordTypeInfos: result.recordTypeInfos,\n },\n });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `Describe failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n channelName: SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"rss\" },\n }),\n subscribeType: SchemaType.Union(\n [\n SchemaType.Literal(\"LATEST\"),\n SchemaType.Literal(\"EARLIEST\"),\n SchemaType.Literal(\"CUSTOM\"),\n ],\n { default: \"LATEST\", \"x-nrg-form\": { icon: \"history\" } },\n ),\n replayId: SchemaType.Optional(\n SchemaType.String({\n default: \"\",\n \"x-nrg-form\": { icon: \"bookmark\" },\n }),\n ),\n numRequested: SchemaType.Number({\n default: 100,\n minimum: 1,\n maximum: 100,\n \"x-nrg-form\": { icon: \"sort-numeric-asc\" },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n {\n $id: \"salesforce-streaming:config\",\n if: SchemaType.Object({\n subscribeType: SchemaType.Literal(\"CUSTOM\"),\n }),\n then: SchemaType.Object({\n replayId: SchemaType.String({ minLength: 1 }),\n }),\n errorMessage: {\n properties: {\n replayId: \"Replay ID is required when Subscribe Type is CUSTOM\",\n },\n },\n },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n replayId: SchemaType.Any(),\n channel: SchemaType.String(),\n topic: SchemaType.String(),\n },\n { $id: \"salesforce-streaming:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport { ConfigsSchema, OutputSchema } from \"../schemas/salesforce-streaming\";\nimport type SalesforceConnection from \"./salesforce-connection\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceStreaming extends IONode<\n Config,\n any,\n any,\n Output\n> {\n static override readonly type = \"salesforce-streaming\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n private client: any = null;\n private reconnectAttempt = 0;\n private maxReconnectDelay = 60000;\n private maxReconnectAttempts = 10;\n private grpcErrorHandler: ((err: Error) => void) | null = null;\n private stopped = false;\n\n override async created() {\n const connection = this.config.connection as SalesforceConnection;\n if (!connection) {\n this.status({ fill: \"red\", shape: \"dot\", text: \"no connection\" });\n this.error(\"No Salesforce connection configured\");\n return;\n }\n\n await this.subscribe(connection);\n }\n\n private async subscribe(connection: SalesforceConnection) {\n if (this.stopped) return;\n try {\n this.status({ fill: \"green\", shape: \"dot\", text: \"connecting...\" });\n\n // Refresh the jsforce connection to get a fresh token\n // (jsforce auto-refreshes expired tokens via the refresh event)\n let conn;\n try {\n conn = await connection.getConnection();\n // Validate the token is still valid with a lightweight API call\n await conn.identity();\n } catch {\n this.status({ fill: \"red\", shape: \"dot\", text: \"auth expired\" });\n this.error(\"Salesforce token expired. Re-authorize the connection.\");\n return;\n }\n\n const accessToken = connection.getAccessToken();\n const instanceUrl = connection.getInstanceUrl();\n\n if (!accessToken || !instanceUrl) {\n this.status({ fill: \"red\", shape: \"dot\", text: \"not authorized\" });\n this.error(\"Salesforce connection not authorized\");\n return;\n }\n\n const PubSubApiClient = (await import(\"salesforce-pubsub-api-client\"))\n .default;\n\n this.client = new PubSubApiClient({\n authType: \"user-supplied\",\n accessToken,\n instanceUrl,\n });\n\n await this.client.connect();\n\n const numRequested = this.config.numRequested || null;\n const channelName = this.config.channelName;\n\n const callback = (\n _subscription: any,\n callbackType: string,\n data?: any,\n ) => {\n if (callbackType === \"event\" || callbackType === \"lastevent\") {\n this.send({\n payload: data?.payload ?? data,\n replayId: data?.replayId,\n channel: channelName,\n topic: channelName,\n });\n } else if (callbackType === \"error\") {\n const errorMsg =\n data instanceof Error\n ? data.message\n : String(data ?? \"stream error\");\n this.warn(`Streaming error: ${errorMsg}`);\n\n // Stop retrying on auth errors — token is expired\n if (\n errorMsg.includes(\"UNAUTHENTICATED\") ||\n errorMsg.includes(\"authentication\")\n ) {\n this.stopped = true;\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: \"auth expired — re-authorize\",\n });\n this.error(\n \"Salesforce token expired. Re-authorize the connection.\",\n );\n this.cleanup();\n return;\n }\n\n this.status({ fill: \"red\", shape: \"dot\", text: errorMsg });\n this.scheduleReconnect(connection);\n } else if (callbackType === \"end\") {\n if (this.stopped) return;\n this.log(\"Streaming subscription ended\");\n this.status({ fill: \"red\", shape: \"dot\", text: \"disconnected\" });\n this.scheduleReconnect(connection);\n }\n };\n\n // Guard against uncaught gRPC errors that crash the process.\n // The @grpc/grpc-js library can throw before the pubsub client\n // attaches its own error handler to the bidi stream.\n if (this.grpcErrorHandler) {\n process.removeListener(\"uncaughtException\", this.grpcErrorHandler);\n }\n this.grpcErrorHandler = (err: Error) => {\n if (\n err.message?.includes(\"UNAUTHENTICATED\") ||\n err.message?.includes(\"authentication\")\n ) {\n this.stopped = true;\n this.warn(`Caught gRPC auth error: ${err.message}`);\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: \"auth expired — re-authorize\",\n });\n this.cleanup();\n // Don't rethrow — we handled it\n }\n };\n process.on(\"uncaughtException\", this.grpcErrorHandler);\n\n if (this.config.subscribeType === \"EARLIEST\") {\n this.client.subscribeFromEarliestEvent(\n channelName,\n callback,\n numRequested,\n );\n } else if (\n this.config.subscribeType === \"CUSTOM\" &&\n this.config.replayId\n ) {\n const replayId = parseInt(this.config.replayId, 10);\n this.client.subscribeFromReplayId(\n channelName,\n callback,\n numRequested,\n replayId,\n );\n } else {\n this.client.subscribe(channelName, callback, numRequested);\n }\n\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `subscribed: ${channelName}`,\n });\n this.reconnectAttempt = 0;\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `Streaming subscription failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n this.scheduleReconnect(connection);\n }\n }\n\n private scheduleReconnect(connection: SalesforceConnection) {\n if (this.stopped) return;\n this.reconnectAttempt++;\n\n if (this.reconnectAttempt > this.maxReconnectAttempts) {\n this.error(\n `Streaming: max reconnect attempts (${this.maxReconnectAttempts}) reached. Giving up.`,\n );\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: \"reconnect failed — re-deploy to retry\",\n });\n return;\n }\n\n const delay = Math.min(\n 1000 * Math.pow(2, this.reconnectAttempt),\n this.maxReconnectDelay,\n );\n this.log(\n `Scheduling reconnect in ${delay}ms (attempt ${this.reconnectAttempt}/${this.maxReconnectAttempts})`,\n );\n this.status({\n fill: \"green\",\n shape: \"dot\",\n text: `reconnecting in ${Math.round(delay / 1000)}s`,\n });\n this.setTimeout(async () => {\n await this.cleanup();\n await this.subscribe(connection);\n }, delay);\n }\n\n private async cleanup() {\n try {\n if (this.grpcErrorHandler) {\n process.removeListener(\"uncaughtException\", this.grpcErrorHandler);\n this.grpcErrorHandler = null;\n }\n if (this.client) {\n await this.client.close?.();\n this.client = null;\n }\n } catch {\n // Ignore cleanup errors\n }\n }\n\n override async closed() {\n await this.cleanup();\n }\n}\n","import { defineSchema, SchemaType } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"../nodes/salesforce-connection\";\n\nexport const ConfigsSchema = defineSchema(\n {\n name: SchemaType.String({ default: \"\", \"x-nrg-form\": { icon: \"tag\" } }),\n connection: SchemaType.NodeRef(SalesforceConnection, {\n \"x-nrg-form\": { icon: \"cloud\" },\n }),\n method: SchemaType.Union(\n [\n SchemaType.Literal(\"GET\"),\n SchemaType.Literal(\"POST\"),\n SchemaType.Literal(\"PUT\"),\n SchemaType.Literal(\"PATCH\"),\n SchemaType.Literal(\"DELETE\"),\n ],\n { default: \"POST\", \"x-nrg-form\": { icon: \"random\" } },\n ),\n path: SchemaType.TypedInput<string>({\n \"x-nrg-form\": {\n icon: \"link\",\n typedInputTypes: [\"str\", \"msg\"],\n },\n }),\n errorPort: SchemaType.Boolean({ default: false }),\n completePort: SchemaType.Boolean({ default: false }),\n statusPort: SchemaType.Boolean({ default: false }),\n },\n { $id: \"salesforce-apex:config\" },\n);\n\nexport const InputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-apex:input\" },\n);\n\nexport const OutputSchema = defineSchema(\n {\n payload: SchemaType.Any(),\n },\n { $id: \"salesforce-apex:output\" },\n);\n","import { IONode, type Schema, type Infer } from \"@bonsae/nrg/server\";\nimport {\n ConfigsSchema,\n InputSchema,\n OutputSchema,\n} from \"../schemas/salesforce-apex\";\n\ntype Config = Infer<typeof ConfigsSchema>;\ntype Input = Infer<typeof InputSchema>;\ntype Output = Infer<typeof OutputSchema>;\n\nexport default class SalesforceApex extends IONode<Config, any, Input, Output> {\n static override readonly type = \"salesforce-apex\";\n static override readonly category = \"salesforce\";\n static override readonly color: `#${string}` = \"#FFFFFF\";\n static override readonly configSchema: Schema = ConfigsSchema;\n static override readonly inputSchema: Schema = InputSchema;\n static override readonly outputsSchema: Schema = OutputSchema;\n\n override async input(msg: Input) {\n const connection = this.config.connection;\n if (!connection) {\n this.error(\"No Salesforce connection configured\", msg);\n return;\n }\n\n try {\n const method = this.config.method;\n this.status({ fill: \"green\", shape: \"dot\", text: `${method}...` });\n\n const conn = await connection.getConnection();\n const path = await this.config.path.resolve(msg);\n\n let result: any;\n const apexMethod = method.toLowerCase() as\n | \"get\"\n | \"post\"\n | \"put\"\n | \"patch\"\n | \"delete\";\n\n if (apexMethod === \"get\" || apexMethod === \"delete\") {\n result = await conn.apex[apexMethod](path);\n } else {\n result = await conn.apex[apexMethod](path, msg.payload);\n }\n\n this.status({ fill: \"green\", shape: \"dot\", text: `${method} done` });\n this.send({ ...msg, payload: result });\n } catch (error) {\n this.status({\n fill: \"red\",\n shape: \"dot\",\n text: error instanceof Error ? error.message : String(error),\n });\n this.error(\n `Apex ${this.config.method} failed: ${error instanceof Error ? error.message : String(error)}`,\n msg,\n );\n }\n }\n}\n","import { defineModule } from \"@bonsae/nrg/server\";\nimport SalesforceConnection from \"./nodes/salesforce-connection\";\nimport SalesforceSoql from \"./nodes/salesforce-soql\";\nimport SalesforceDml from \"./nodes/salesforce-dml\";\nimport SalesforceBulk from \"./nodes/salesforce-bulk\";\nimport SalesforceDescribe from \"./nodes/salesforce-describe\";\nimport SalesforceStreaming from \"./nodes/salesforce-streaming\";\nimport SalesforceApex from \"./nodes/salesforce-apex\";\n\nexport default defineModule({\n nodes: [\n SalesforceConnection,\n SalesforceSoql,\n SalesforceDml,\n SalesforceBulk,\n SalesforceDescribe,\n SalesforceStreaming,\n SalesforceApex,\n ],\n});\n"],"names":["ConfigsSchema","__nrgRegisterTypes","defineSchema","SchemaType","ConfigNode","IONode","defineModule","jsforce","crypto","ConfigsSchema$6","CredentialsSchema","AUTH_STATE_TTL","generateCodeVerifier","__name","generateCodeChallenge","verifier","createAuthState","params","state","codeVerifier","codeChallenge","pendingAuthStates","key","value","consumeAuthState","entry","escapeHtml","str","errorPage","message","autoClose","script","initAuthRoutes","RED","adminRoot","req","res","nodeId","loginUrl","clientId","overrideCallbackUrl","callbackUrl","error","code","oauthError","error_description","tokenResponse","errorBody","tokens","messageData","credentials","authenticated","initRoutes","_SalesforceConnection","__publicField","newAccessToken","_a","SalesforceConnection","ConfigsSchema$5","InputSchema","InputSchema$4","OutputSchema$4","_SalesforceSoql","msg","connection","conn","query","result","SalesforceSoql","ConfigsSchema$4","InputSchema$3","OutputSchema$3","_SalesforceDml","operation","sobject","sObjectType","data","SalesforceDml","ConfigsSchema$3","InputSchema$2","RecordOutputSchema","JobCreatedOutputSchema","outputsSchema","_SalesforceBulk","payload","totalRecords","stream","resolve","reject","record","job","records","jobResults","successfulResults","failedResults","unprocessedRecords","successCount","failureCount","SalesforceBulk","ConfigsSchema$2","InputSchema$1","OutputSchema$2","_SalesforceDescribe","SalesforceDescribe","ConfigsSchema$1","OutputSchema","OutputSchema$1","_SalesforceStreaming","accessToken","instanceUrl","PubSubApiClient","numRequested","channelName","callback","_subscription","callbackType","errorMsg","err","_b","replayId","delay","SalesforceStreaming","_SalesforceApex","method","path","apexMethod","SalesforceApex","index"],"mappings":"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"}
@@ -34,6 +34,9 @@
34
34
  <tbody>
35
35
  <tr><td>Verbindung</td><td>connection</td><td>NodeRef → salesforce-connection [format: node-id]</td><td>Ja</td><td></td><td>Reference to salesforce-connection</td></tr>
36
36
  <tr><td>Abfrage</td><td>query</td><td>TypedInput</td><td>Ja</td><td><code>{"type":"str","value":""}</code></td><td>Represents a Node-RED TypedInput value and its type.</td></tr>
37
+ <tr><td></td><td>errorPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
38
+ <tr><td></td><td>completePort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
39
+ <tr><td></td><td>statusPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
37
40
  </tbody>
38
41
  </table>
39
42
  </div>
@@ -72,9 +75,9 @@
72
75
  <tr><td>SObject-Typ</td><td>sObjectType</td><td>TypedInput</td><td>Ja</td><td><code>{"type":"str","value":""}</code></td><td>Represents a Node-RED TypedInput value and its type.</td></tr>
73
76
  <tr><td></td><td>record</td><td>TypedInput</td><td>Ja</td><td><code>{"type":"str","value":""}</code></td><td>Represents a Node-RED TypedInput value and its type.</td></tr>
74
77
  <tr><td>Externes ID-Feld</td><td>externalIdField</td><td>string</td><td>Nein</td><td><code>""</code></td><td></td></tr>
75
- <tr><td></td><td>emitError</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
76
- <tr><td></td><td>emitComplete</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
77
- <tr><td></td><td>emitStatus</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
78
+ <tr><td></td><td>errorPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
79
+ <tr><td></td><td>completePort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
80
+ <tr><td></td><td>statusPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
78
81
  </tbody>
79
82
  </table>
80
83
  </div>
@@ -115,9 +118,9 @@
115
118
  <tr><td></td><td>lineEnding</td><td></td><td>Ja</td><td><code>"LF"</code></td><td></td></tr>
116
119
  <tr><td></td><td>pollInterval</td><td>number [min: 1000]</td><td>Ja</td><td><code>5000</code></td><td></td></tr>
117
120
  <tr><td></td><td>pollTimeout</td><td>number [min: 5000]</td><td>Ja</td><td><code>60000</code></td><td></td></tr>
118
- <tr><td></td><td>emitError</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
119
- <tr><td></td><td>emitComplete</td><td>boolean</td><td>Ja</td><td><code>true</code></td><td></td></tr>
120
- <tr><td></td><td>emitStatus</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
121
+ <tr><td></td><td>errorPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
122
+ <tr><td></td><td>completePort</td><td>boolean</td><td>Ja</td><td><code>true</code></td><td></td></tr>
123
+ <tr><td></td><td>statusPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
121
124
  </tbody>
122
125
  </table>
123
126
  </div>
@@ -141,9 +144,9 @@
141
144
  <tbody>
142
145
  <tr><td>Verbindung</td><td>connection</td><td>NodeRef → salesforce-connection [format: node-id]</td><td>Ja</td><td></td><td>Reference to salesforce-connection</td></tr>
143
146
  <tr><td>SObject-Typ</td><td>sObjectType</td><td>TypedInput</td><td>Ja</td><td><code>{"type":"str","value":""}</code></td><td>Represents a Node-RED TypedInput value and its type.</td></tr>
144
- <tr><td></td><td>emitError</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
145
- <tr><td></td><td>emitComplete</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
146
- <tr><td></td><td>emitStatus</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
147
+ <tr><td></td><td>errorPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
148
+ <tr><td></td><td>completePort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
149
+ <tr><td></td><td>statusPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
147
150
  </tbody>
148
151
  </table>
149
152
  </div>
@@ -180,8 +183,9 @@
180
183
  <tr><td>Abonnieren ab</td><td>subscribeType</td><td></td><td>Ja</td><td><code>"LATEST"</code></td><td></td></tr>
181
184
  <tr><td>Replay-ID</td><td>replayId</td><td>string</td><td>Nein</td><td><code>""</code></td><td></td></tr>
182
185
  <tr><td>Batchgröße</td><td>numRequested</td><td>number [min: 1, max: 100]</td><td>Ja</td><td><code>100</code></td><td></td></tr>
183
- <tr><td></td><td>emitError</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
184
- <tr><td></td><td>emitStatus</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
186
+ <tr><td></td><td>errorPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
187
+ <tr><td></td><td>completePort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
188
+ <tr><td></td><td>statusPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
185
189
  </tbody>
186
190
  </table>
187
191
  </div>
@@ -209,9 +213,9 @@
209
213
  <tr><td>Verbindung</td><td>connection</td><td>NodeRef → salesforce-connection [format: node-id]</td><td>Ja</td><td></td><td>Reference to salesforce-connection</td></tr>
210
214
  <tr><td>Methode</td><td>method</td><td></td><td>Ja</td><td><code>"POST"</code></td><td></td></tr>
211
215
  <tr><td>Pfad</td><td>path</td><td>TypedInput</td><td>Ja</td><td><code>{"type":"str","value":""}</code></td><td>Represents a Node-RED TypedInput value and its type.</td></tr>
212
- <tr><td></td><td>emitError</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
213
- <tr><td></td><td>emitComplete</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
214
- <tr><td></td><td>emitStatus</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
216
+ <tr><td></td><td>errorPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
217
+ <tr><td></td><td>completePort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
218
+ <tr><td></td><td>statusPort</td><td>boolean</td><td>Ja</td><td><code>false</code></td><td></td></tr>
215
219
  </tbody>
216
220
  </table>
217
221
  </div>
@@ -34,6 +34,9 @@
34
34
  <tbody>
35
35
  <tr><td>Connection</td><td>connection</td><td>NodeRef → salesforce-connection [format: node-id]</td><td>Yes</td><td></td><td>Reference to salesforce-connection</td></tr>
36
36
  <tr><td>Query</td><td>query</td><td>TypedInput</td><td>Yes</td><td><code>{"type":"str","value":""}</code></td><td>Represents a Node-RED TypedInput value and its type.</td></tr>
37
+ <tr><td></td><td>errorPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
38
+ <tr><td></td><td>completePort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
39
+ <tr><td></td><td>statusPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
37
40
  </tbody>
38
41
  </table>
39
42
  </div>
@@ -72,9 +75,9 @@
72
75
  <tr><td>SObject Type</td><td>sObjectType</td><td>TypedInput</td><td>Yes</td><td><code>{"type":"str","value":""}</code></td><td>Represents a Node-RED TypedInput value and its type.</td></tr>
73
76
  <tr><td></td><td>record</td><td>TypedInput</td><td>Yes</td><td><code>{"type":"str","value":""}</code></td><td>Represents a Node-RED TypedInput value and its type.</td></tr>
74
77
  <tr><td>External ID Field</td><td>externalIdField</td><td>string</td><td>No</td><td><code>""</code></td><td></td></tr>
75
- <tr><td></td><td>emitError</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
76
- <tr><td></td><td>emitComplete</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
77
- <tr><td></td><td>emitStatus</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
78
+ <tr><td></td><td>errorPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
79
+ <tr><td></td><td>completePort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
80
+ <tr><td></td><td>statusPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
78
81
  </tbody>
79
82
  </table>
80
83
  </div>
@@ -115,9 +118,9 @@
115
118
  <tr><td></td><td>lineEnding</td><td></td><td>Yes</td><td><code>"LF"</code></td><td></td></tr>
116
119
  <tr><td></td><td>pollInterval</td><td>number [min: 1000]</td><td>Yes</td><td><code>5000</code></td><td></td></tr>
117
120
  <tr><td></td><td>pollTimeout</td><td>number [min: 5000]</td><td>Yes</td><td><code>60000</code></td><td></td></tr>
118
- <tr><td></td><td>emitError</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
119
- <tr><td></td><td>emitComplete</td><td>boolean</td><td>Yes</td><td><code>true</code></td><td></td></tr>
120
- <tr><td></td><td>emitStatus</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
121
+ <tr><td></td><td>errorPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
122
+ <tr><td></td><td>completePort</td><td>boolean</td><td>Yes</td><td><code>true</code></td><td></td></tr>
123
+ <tr><td></td><td>statusPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
121
124
  </tbody>
122
125
  </table>
123
126
  </div>
@@ -141,9 +144,9 @@
141
144
  <tbody>
142
145
  <tr><td>Connection</td><td>connection</td><td>NodeRef → salesforce-connection [format: node-id]</td><td>Yes</td><td></td><td>Reference to salesforce-connection</td></tr>
143
146
  <tr><td>SObject Type</td><td>sObjectType</td><td>TypedInput</td><td>Yes</td><td><code>{"type":"str","value":""}</code></td><td>Represents a Node-RED TypedInput value and its type.</td></tr>
144
- <tr><td></td><td>emitError</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
145
- <tr><td></td><td>emitComplete</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
146
- <tr><td></td><td>emitStatus</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
147
+ <tr><td></td><td>errorPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
148
+ <tr><td></td><td>completePort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
149
+ <tr><td></td><td>statusPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
147
150
  </tbody>
148
151
  </table>
149
152
  </div>
@@ -180,8 +183,9 @@
180
183
  <tr><td>Subscribe From</td><td>subscribeType</td><td></td><td>Yes</td><td><code>"LATEST"</code></td><td></td></tr>
181
184
  <tr><td>Replay ID</td><td>replayId</td><td>string</td><td>No</td><td><code>""</code></td><td></td></tr>
182
185
  <tr><td>Batch Size</td><td>numRequested</td><td>number [min: 1, max: 100]</td><td>Yes</td><td><code>100</code></td><td></td></tr>
183
- <tr><td></td><td>emitError</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
184
- <tr><td></td><td>emitStatus</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
186
+ <tr><td></td><td>errorPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
187
+ <tr><td></td><td>completePort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
188
+ <tr><td></td><td>statusPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
185
189
  </tbody>
186
190
  </table>
187
191
  </div>
@@ -209,9 +213,9 @@
209
213
  <tr><td>Connection</td><td>connection</td><td>NodeRef → salesforce-connection [format: node-id]</td><td>Yes</td><td></td><td>Reference to salesforce-connection</td></tr>
210
214
  <tr><td>Method</td><td>method</td><td></td><td>Yes</td><td><code>"POST"</code></td><td></td></tr>
211
215
  <tr><td>Path</td><td>path</td><td>TypedInput</td><td>Yes</td><td><code>{"type":"str","value":""}</code></td><td>Represents a Node-RED TypedInput value and its type.</td></tr>
212
- <tr><td></td><td>emitError</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
213
- <tr><td></td><td>emitComplete</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
214
- <tr><td></td><td>emitStatus</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
216
+ <tr><td></td><td>errorPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
217
+ <tr><td></td><td>completePort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
218
+ <tr><td></td><td>statusPort</td><td>boolean</td><td>Yes</td><td><code>false</code></td><td></td></tr>
215
219
  </tbody>
216
220
  </table>
217
221
  </div>