@n8n/rest-api-client 2.35.3 → 2.36.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.
@@ -1 +1 @@
1
- {"version":3,"file":"consent.cjs","names":["makeRestApiRequest"],"sources":["../../src/api/consent.ts"],"sourcesContent":["import type { IRestApiContext } from '../types';\nimport { makeRestApiRequest } from '../utils';\n\nexport interface ConsentDetails {\n\tclientName: string;\n\tclientId: string;\n\tredirectUri?: string;\n\tresourceName?: string;\n\t/**\n\t * Scopes the user can grant (already capped by what the client requested).\n\t * Empty = full user delegation (no picker shown).\n\t */\n\tscopes: string[];\n\t/** Scopes this user granted to this client last time, used to preselect the picker. */\n\tpreviousScopes?: string[];\n\t/** Tool names each scope unlocks, shown per scope group in the picker. */\n\tscopeTools?: Record<string, string[]>;\n}\n\nexport interface ConsentApprovalResponse {\n\tstatus: string;\n\tredirectUrl: string;\n}\n\nexport async function getConsentDetails(context: IRestApiContext): Promise<ConsentDetails> {\n\treturn await makeRestApiRequest(context, 'GET', '/consent/details');\n}\n\nexport async function approveConsent(\n\tcontext: IRestApiContext,\n\tapproved: boolean,\n\tscopes?: string[],\n): Promise<ConsentApprovalResponse> {\n\treturn await makeRestApiRequest(context, 'POST', '/consent/approve', { approved, scopes });\n}\n"],"mappings":";;;AAwBA,eAAsB,kBAAkB,SAAmD;AAC1F,QAAO,MAAMA,iCAAmB,SAAS,OAAO,mBAAmB;;AAGpE,eAAsB,eACrB,SACA,UACA,QACmC;AACnC,QAAO,MAAMA,iCAAmB,SAAS,QAAQ,oBAAoB;EAAE;EAAU;EAAQ,CAAC"}
1
+ {"version":3,"file":"consent.cjs","names":["makeRestApiRequest"],"sources":["../../src/api/consent.ts"],"sourcesContent":["import type { ConsentUiHints } from '@n8n/api-types';\n\nimport type { IRestApiContext } from '../types';\nimport { makeRestApiRequest } from '../utils';\n\nexport interface ConsentDetails {\n\tclientName: string;\n\tclientId: string;\n\tredirectUri?: string;\n\tresourceName?: string;\n\t/**\n\t * Scopes the user can grant (already capped by what the client requested).\n\t * Empty = full user delegation (no picker shown).\n\t */\n\tscopes: string[];\n\t/** Scopes this user granted to this client last time, used to preselect the picker. */\n\tpreviousScopes?: string[];\n\t/** Tool names each scope unlocks, shown per scope group in the picker. */\n\tscopeTools?: Record<string, string[]>;\n\t/** Presentation hints from the resource (icon, consent noun) for first-party clients. */\n\tuiHints?: ConsentUiHints;\n\t/** True only for first-party clients (e.g. form triggers) that skip the trust gate. */\n\tisFirstParty?: boolean;\n}\n\nexport interface ConsentApprovalResponse {\n\tstatus: string;\n\tredirectUrl: string;\n}\n\nexport async function getConsentDetails(context: IRestApiContext): Promise<ConsentDetails> {\n\treturn await makeRestApiRequest(context, 'GET', '/consent/details');\n}\n\nexport async function approveConsent(\n\tcontext: IRestApiContext,\n\tapproved: boolean,\n\tscopes?: string[],\n): Promise<ConsentApprovalResponse> {\n\treturn await makeRestApiRequest(context, 'POST', '/consent/approve', { approved, scopes });\n}\n"],"mappings":";;;AA8BA,eAAsB,kBAAkB,SAAmD;AAC1F,QAAO,MAAMA,iCAAmB,SAAS,OAAO,mBAAmB;;AAGpE,eAAsB,eACrB,SACA,UACA,QACmC;AACnC,QAAO,MAAMA,iCAAmB,SAAS,QAAQ,oBAAoB;EAAE;EAAU;EAAQ,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { t as IRestApiContext } from "../types2.cjs";
2
+ import { ConsentUiHints } from "@n8n/api-types";
2
3
 
3
4
  //#region src/api/consent.d.ts
4
5
  interface ConsentDetails {
@@ -9,6 +10,8 @@ interface ConsentDetails {
9
10
  scopes: string[];
10
11
  previousScopes?: string[];
11
12
  scopeTools?: Record<string, string[]>;
13
+ uiHints?: ConsentUiHints;
14
+ isFirstParty?: boolean;
12
15
  }
13
16
  interface ConsentApprovalResponse {
14
17
  status: string;
@@ -1,4 +1,5 @@
1
1
  import { t as IRestApiContext } from "../types2.mjs";
2
+ import { ConsentUiHints } from "@n8n/api-types";
2
3
 
3
4
  //#region src/api/consent.d.ts
4
5
  interface ConsentDetails {
@@ -9,6 +10,8 @@ interface ConsentDetails {
9
10
  scopes: string[];
10
11
  previousScopes?: string[];
11
12
  scopeTools?: Record<string, string[]>;
13
+ uiHints?: ConsentUiHints;
14
+ isFirstParty?: boolean;
12
15
  }
13
16
  interface ConsentApprovalResponse {
14
17
  status: string;
@@ -1 +1 @@
1
- {"version":3,"file":"consent.mjs","names":[],"sources":["../../src/api/consent.ts"],"sourcesContent":["import type { IRestApiContext } from '../types';\nimport { makeRestApiRequest } from '../utils';\n\nexport interface ConsentDetails {\n\tclientName: string;\n\tclientId: string;\n\tredirectUri?: string;\n\tresourceName?: string;\n\t/**\n\t * Scopes the user can grant (already capped by what the client requested).\n\t * Empty = full user delegation (no picker shown).\n\t */\n\tscopes: string[];\n\t/** Scopes this user granted to this client last time, used to preselect the picker. */\n\tpreviousScopes?: string[];\n\t/** Tool names each scope unlocks, shown per scope group in the picker. */\n\tscopeTools?: Record<string, string[]>;\n}\n\nexport interface ConsentApprovalResponse {\n\tstatus: string;\n\tredirectUrl: string;\n}\n\nexport async function getConsentDetails(context: IRestApiContext): Promise<ConsentDetails> {\n\treturn await makeRestApiRequest(context, 'GET', '/consent/details');\n}\n\nexport async function approveConsent(\n\tcontext: IRestApiContext,\n\tapproved: boolean,\n\tscopes?: string[],\n): Promise<ConsentApprovalResponse> {\n\treturn await makeRestApiRequest(context, 'POST', '/consent/approve', { approved, scopes });\n}\n"],"mappings":";;;AAwBA,eAAsB,kBAAkB,SAAmD;AAC1F,QAAO,MAAM,mBAAmB,SAAS,OAAO,mBAAmB;;AAGpE,eAAsB,eACrB,SACA,UACA,QACmC;AACnC,QAAO,MAAM,mBAAmB,SAAS,QAAQ,oBAAoB;EAAE;EAAU;EAAQ,CAAC"}
1
+ {"version":3,"file":"consent.mjs","names":[],"sources":["../../src/api/consent.ts"],"sourcesContent":["import type { ConsentUiHints } from '@n8n/api-types';\n\nimport type { IRestApiContext } from '../types';\nimport { makeRestApiRequest } from '../utils';\n\nexport interface ConsentDetails {\n\tclientName: string;\n\tclientId: string;\n\tredirectUri?: string;\n\tresourceName?: string;\n\t/**\n\t * Scopes the user can grant (already capped by what the client requested).\n\t * Empty = full user delegation (no picker shown).\n\t */\n\tscopes: string[];\n\t/** Scopes this user granted to this client last time, used to preselect the picker. */\n\tpreviousScopes?: string[];\n\t/** Tool names each scope unlocks, shown per scope group in the picker. */\n\tscopeTools?: Record<string, string[]>;\n\t/** Presentation hints from the resource (icon, consent noun) for first-party clients. */\n\tuiHints?: ConsentUiHints;\n\t/** True only for first-party clients (e.g. form triggers) that skip the trust gate. */\n\tisFirstParty?: boolean;\n}\n\nexport interface ConsentApprovalResponse {\n\tstatus: string;\n\tredirectUrl: string;\n}\n\nexport async function getConsentDetails(context: IRestApiContext): Promise<ConsentDetails> {\n\treturn await makeRestApiRequest(context, 'GET', '/consent/details');\n}\n\nexport async function approveConsent(\n\tcontext: IRestApiContext,\n\tapproved: boolean,\n\tscopes?: string[],\n): Promise<ConsentApprovalResponse> {\n\treturn await makeRestApiRequest(context, 'POST', '/consent/approve', { approved, scopes });\n}\n"],"mappings":";;;AA8BA,eAAsB,kBAAkB,SAAmD;AAC1F,QAAO,MAAM,mBAAmB,SAAS,OAAO,mBAAmB;;AAGpE,eAAsB,eACrB,SACA,UACA,QACmC;AACnC,QAAO,MAAM,mBAAmB,SAAS,QAAQ,oBAAoB;EAAE;EAAU;EAAQ,CAAC"}
package/dist/index.cjs CHANGED
@@ -168,6 +168,7 @@ exports.sendGetWorkerStatus = require_orchestration.sendGetWorkerStatus;
168
168
  exports.sendTestMessageToDestination = require_eventbus_ee.sendTestMessageToDestination;
169
169
  exports.sendUserEvent = require_cloudPlans.sendUserEvent;
170
170
  exports.sessionStarted = require_events.sessionStarted;
171
+ exports.setUnauthorizedHandler = require_utils.setUnauthorizedHandler;
171
172
  exports.setupOwner = require_users.setupOwner;
172
173
  exports.streamRequest = require_utils.streamRequest;
173
174
  exports.submitPersonalizationSurvey = require_users.submitPersonalizationSurvey;
package/dist/index.d.cts CHANGED
@@ -34,5 +34,5 @@ import { C as updateCurrentUserPassword, D as validatePasswordToken, E as update
34
34
  import { t as findWebhook } from "./webhooks.cjs";
35
35
  import { a as WorkflowHistoryRequestParams, c as WorkflowVersionData, d as getWorkflowHistory, f as getWorkflowVersion, i as WorkflowHistoryActionTypes, l as WorkflowVersionId, m as updateWorkflowHistoryVersion, n as UpdateWorkflowHistoryVersion, o as WorkflowPublishHistory, p as getWorkflowVersionsByIds, r as WorkflowHistory, s as WorkflowVersion, t as PublishTimelineEvent, u as getPublishTimeline } from "./workflowHistory.cjs";
36
36
  import "./index2.cjs";
37
- import { a as get, c as patch, d as streamRequest, i as STREAM_SEPARATOR, l as post, n as NO_NETWORK_ERROR_CODE, o as getFullApiResponse, r as ResponseError, s as makeRestApiRequest, t as MfaRequiredError, u as request } from "./utils2.cjs";
38
- export { ApiMessageEventBusDestinationOptions, Cloud, CreateRoleMappingRuleInput, CurrentUserResponse, DisableMfaParams, DynamicNotification, IInstanceAiExampleWorkflow, IInstanceAiExamplesQuery, IInstanceAiExamplesResponse, IPersonalizationLatestVersion, IPersonalizationSurveyAnswersV1, IPersonalizationSurveyAnswersV2, IPersonalizationSurveyAnswersV3, IPersonalizationSurveyVersions, IRestApiContext, ITag, ITemplatesCategory, ITemplatesCollection, ITemplatesCollectionFull, ITemplatesCollectionResponse, ITemplatesNode, ITemplatesQuery, ITemplatesWorkflow, ITemplatesWorkflowFull, ITemplatesWorkflowInfo, ITemplatesWorkflowResponse, IUser, IUserResponse, IWorkflowTemplate, IWorkflowTemplateNode, IWorkflowTemplateNodeCredentials, InstanceUsage, LdapConfig, LdapSyncData, LdapSyncTable, MfaRequiredError, NO_NETWORK_ERROR_CODE, OidcLogoutResponse, PatchRoleMappingRuleInput, ProvisioningConfig, ProvisioningConfigPatch, PublishTimelineEvent, ResponseError, RoleMappingRuleResponse, RoleMappingRuleType, STREAM_SEPARATOR, SamlPreferencesExtractedData, TemplateSearchFacet, UpdateGlobalRolePayload, UpdateWorkflowHistoryVersion, Version, VersionNode, WhatsNewArticle, WhatsNewSection, WorkflowData, WorkflowDataCreate, WorkflowDataUpdate, WorkflowHistory, WorkflowHistoryActionTypes, WorkflowHistoryRequestParams, WorkflowMetadata, WorkflowPublishHistory, WorkflowVersion, WorkflowVersionData, WorkflowVersionId, activateLicenseKey, canEnableMFA, changePassword, connectProvider, createApiKey, createCredentialResolver, createProjectSecretProviderConnection, createRole, createRoleMappingRule, createSecretProviderConnection, deleteApiKey, deleteCredentialResolver, deleteDestinationFromDb, deleteProjectSecretProviderConnection, deleteRole, deleteRoleMappingRule, deleteSecretProviderConnection, deleteUser, disableMfa, dismissBannerPermanently, enableMfa, enableSecretProviderConnection, fetchCommunityNodeAttributes, fetchCommunityNodeTypes, findWebhook, generateInviteLink, get, getAdminPanelLoginCode, getApiKeyScopes, getApiKeys, getAvailableCommunityPackageCount, getBecomeCreatorCta, getCategories, getCloudUserInfo, getClusterInfo, getCollectionById, getCollections, getCredentialResolver, getCredentialResolverTypes, getCredentialResolverWorkflows, getCredentialResolvers, getCurrentPlan, getCurrentUsage, getDestinationsFromBackend, getEventNamesFromBackend, getExternalSecrets, getExternalSecretsProvider, getExternalSecretsProviders, getFirstAdoptionDate, getFullApiResponse, getGlobalExternalSecrets, getGlobalExternalSecretsForProject, getInstalledCommunityNodes, getInstanceAiExamples, getInviteLink, getLdapConfig, getLdapSynchronizations, getLicense, getLocalResourceMapperFields, getMfaQR, getModuleSettings, getNextVersions, getNodeParameterActionResult, getNodeParameterOptions, getNodeTranslationHeaders, getNodeTypeVersions, getNodeTypes, getNodeTypesByIdentifier, getNodesInformation, getOidcConfig, getPasswordResetLink, getProjectExternalSecrets, getProjectSecretProviderConnectionByKey, getProjectSecretProviderConnectionsByProjectId, getProvisioningConfig, getPublishTimeline, getResourceLocatorResults, getResourceMapperFields, getRoleAssignments, getRoleBySlug, getRoleMembers, getRoleProjectMembers, getRoles, getSamlConfig, getSamlMetadata, getSecretProviderConnectionByKey, getSecretProviderConnections, getSecretProviderTypes, getSecuritySettings, getSettings, getTemplateById, getThirdPartyLicenses, getUpgradeOffer, getUsers, getWhatsNewSection, getWorkflowHistory, getWorkflowTemplate, getWorkflowVersion, getWorkflowVersionsByIds, getWorkflows, hasDestinationId, initOidcLogin, initSSO, installNewPackage, listRoleMappingRules, login, loginCurrentUser, logout, makeRestApiRequest, moveRoleMappingRule, oidcLogout, patch, post, registerCommunityEdition, reloadProvider, reloadSecretProviderConnection, renewLicense, request, requestLicenseTrial, rotateApiKey, runLdapSync, saveDestinationToDb, saveOidcConfig, saveProvisioningConfig, saveSamlConfig, sendConfirmationEmail, sendForgotPasswordEmail, sendGetWorkerStatus, sendTestMessageToDestination, sendUserEvent, sessionStarted, setupOwner, streamRequest, submitPersonalizationSurvey, testExternalSecretsProviderConnection, testHealthEndpoint, testLdapConnection, testOidcConfig, testProjectSecretProviderConnection, testSamlConfig, testSecretProviderConnection, toggleSamlConfig, uninstallPackage, updateAiUsageSettings, updateApiKey, updateCredentialResolver, updateCurrentUser, updateCurrentUserPassword, updateCurrentUserSettings, updateEnforceMfa, updateExternalSecretsSettings, updateGlobalRole, updateLdapConfig, updateNpsSurveyState, updateOtherUserSettings, updatePackage, updateProjectSecretProviderConnection, updateProvider, updateRole, updateRoleMappingRule, updateSecretProviderConnection, updateSecuritySettings, updateWorkflowHistoryVersion, validatePasswordToken, validateSignupToken, verifyMfaCode };
37
+ import { a as UnauthorizedHandler, c as makeRestApiRequest, d as request, f as setUnauthorizedHandler, i as STREAM_SEPARATOR, l as patch, n as NO_NETWORK_ERROR_CODE, o as get, p as streamRequest, r as ResponseError, s as getFullApiResponse, t as MfaRequiredError, u as post } from "./utils2.cjs";
38
+ export { ApiMessageEventBusDestinationOptions, Cloud, CreateRoleMappingRuleInput, CurrentUserResponse, DisableMfaParams, DynamicNotification, IInstanceAiExampleWorkflow, IInstanceAiExamplesQuery, IInstanceAiExamplesResponse, IPersonalizationLatestVersion, IPersonalizationSurveyAnswersV1, IPersonalizationSurveyAnswersV2, IPersonalizationSurveyAnswersV3, IPersonalizationSurveyVersions, IRestApiContext, ITag, ITemplatesCategory, ITemplatesCollection, ITemplatesCollectionFull, ITemplatesCollectionResponse, ITemplatesNode, ITemplatesQuery, ITemplatesWorkflow, ITemplatesWorkflowFull, ITemplatesWorkflowInfo, ITemplatesWorkflowResponse, IUser, IUserResponse, IWorkflowTemplate, IWorkflowTemplateNode, IWorkflowTemplateNodeCredentials, InstanceUsage, LdapConfig, LdapSyncData, LdapSyncTable, MfaRequiredError, NO_NETWORK_ERROR_CODE, OidcLogoutResponse, PatchRoleMappingRuleInput, ProvisioningConfig, ProvisioningConfigPatch, PublishTimelineEvent, ResponseError, RoleMappingRuleResponse, RoleMappingRuleType, STREAM_SEPARATOR, SamlPreferencesExtractedData, TemplateSearchFacet, UnauthorizedHandler, UpdateGlobalRolePayload, UpdateWorkflowHistoryVersion, Version, VersionNode, WhatsNewArticle, WhatsNewSection, WorkflowData, WorkflowDataCreate, WorkflowDataUpdate, WorkflowHistory, WorkflowHistoryActionTypes, WorkflowHistoryRequestParams, WorkflowMetadata, WorkflowPublishHistory, WorkflowVersion, WorkflowVersionData, WorkflowVersionId, activateLicenseKey, canEnableMFA, changePassword, connectProvider, createApiKey, createCredentialResolver, createProjectSecretProviderConnection, createRole, createRoleMappingRule, createSecretProviderConnection, deleteApiKey, deleteCredentialResolver, deleteDestinationFromDb, deleteProjectSecretProviderConnection, deleteRole, deleteRoleMappingRule, deleteSecretProviderConnection, deleteUser, disableMfa, dismissBannerPermanently, enableMfa, enableSecretProviderConnection, fetchCommunityNodeAttributes, fetchCommunityNodeTypes, findWebhook, generateInviteLink, get, getAdminPanelLoginCode, getApiKeyScopes, getApiKeys, getAvailableCommunityPackageCount, getBecomeCreatorCta, getCategories, getCloudUserInfo, getClusterInfo, getCollectionById, getCollections, getCredentialResolver, getCredentialResolverTypes, getCredentialResolverWorkflows, getCredentialResolvers, getCurrentPlan, getCurrentUsage, getDestinationsFromBackend, getEventNamesFromBackend, getExternalSecrets, getExternalSecretsProvider, getExternalSecretsProviders, getFirstAdoptionDate, getFullApiResponse, getGlobalExternalSecrets, getGlobalExternalSecretsForProject, getInstalledCommunityNodes, getInstanceAiExamples, getInviteLink, getLdapConfig, getLdapSynchronizations, getLicense, getLocalResourceMapperFields, getMfaQR, getModuleSettings, getNextVersions, getNodeParameterActionResult, getNodeParameterOptions, getNodeTranslationHeaders, getNodeTypeVersions, getNodeTypes, getNodeTypesByIdentifier, getNodesInformation, getOidcConfig, getPasswordResetLink, getProjectExternalSecrets, getProjectSecretProviderConnectionByKey, getProjectSecretProviderConnectionsByProjectId, getProvisioningConfig, getPublishTimeline, getResourceLocatorResults, getResourceMapperFields, getRoleAssignments, getRoleBySlug, getRoleMembers, getRoleProjectMembers, getRoles, getSamlConfig, getSamlMetadata, getSecretProviderConnectionByKey, getSecretProviderConnections, getSecretProviderTypes, getSecuritySettings, getSettings, getTemplateById, getThirdPartyLicenses, getUpgradeOffer, getUsers, getWhatsNewSection, getWorkflowHistory, getWorkflowTemplate, getWorkflowVersion, getWorkflowVersionsByIds, getWorkflows, hasDestinationId, initOidcLogin, initSSO, installNewPackage, listRoleMappingRules, login, loginCurrentUser, logout, makeRestApiRequest, moveRoleMappingRule, oidcLogout, patch, post, registerCommunityEdition, reloadProvider, reloadSecretProviderConnection, renewLicense, request, requestLicenseTrial, rotateApiKey, runLdapSync, saveDestinationToDb, saveOidcConfig, saveProvisioningConfig, saveSamlConfig, sendConfirmationEmail, sendForgotPasswordEmail, sendGetWorkerStatus, sendTestMessageToDestination, sendUserEvent, sessionStarted, setUnauthorizedHandler, setupOwner, streamRequest, submitPersonalizationSurvey, testExternalSecretsProviderConnection, testHealthEndpoint, testLdapConnection, testOidcConfig, testProjectSecretProviderConnection, testSamlConfig, testSecretProviderConnection, toggleSamlConfig, uninstallPackage, updateAiUsageSettings, updateApiKey, updateCredentialResolver, updateCurrentUser, updateCurrentUserPassword, updateCurrentUserSettings, updateEnforceMfa, updateExternalSecretsSettings, updateGlobalRole, updateLdapConfig, updateNpsSurveyState, updateOtherUserSettings, updatePackage, updateProjectSecretProviderConnection, updateProvider, updateRole, updateRoleMappingRule, updateSecretProviderConnection, updateSecuritySettings, updateWorkflowHistoryVersion, validatePasswordToken, validateSignupToken, verifyMfaCode };
package/dist/index.d.mts CHANGED
@@ -34,5 +34,5 @@ import { C as updateCurrentUserPassword, D as validatePasswordToken, E as update
34
34
  import { t as findWebhook } from "./webhooks.mjs";
35
35
  import { a as WorkflowHistoryRequestParams, c as WorkflowVersionData, d as getWorkflowHistory, f as getWorkflowVersion, i as WorkflowHistoryActionTypes, l as WorkflowVersionId, m as updateWorkflowHistoryVersion, n as UpdateWorkflowHistoryVersion, o as WorkflowPublishHistory, p as getWorkflowVersionsByIds, r as WorkflowHistory, s as WorkflowVersion, t as PublishTimelineEvent, u as getPublishTimeline } from "./workflowHistory.mjs";
36
36
  import "./index2.mjs";
37
- import { a as get, c as patch, d as streamRequest, i as STREAM_SEPARATOR, l as post, n as NO_NETWORK_ERROR_CODE, o as getFullApiResponse, r as ResponseError, s as makeRestApiRequest, t as MfaRequiredError, u as request } from "./utils2.mjs";
38
- export { ApiMessageEventBusDestinationOptions, Cloud, CreateRoleMappingRuleInput, CurrentUserResponse, DisableMfaParams, DynamicNotification, IInstanceAiExampleWorkflow, IInstanceAiExamplesQuery, IInstanceAiExamplesResponse, IPersonalizationLatestVersion, IPersonalizationSurveyAnswersV1, IPersonalizationSurveyAnswersV2, IPersonalizationSurveyAnswersV3, IPersonalizationSurveyVersions, IRestApiContext, ITag, ITemplatesCategory, ITemplatesCollection, ITemplatesCollectionFull, ITemplatesCollectionResponse, ITemplatesNode, ITemplatesQuery, ITemplatesWorkflow, ITemplatesWorkflowFull, ITemplatesWorkflowInfo, ITemplatesWorkflowResponse, IUser, IUserResponse, IWorkflowTemplate, IWorkflowTemplateNode, IWorkflowTemplateNodeCredentials, InstanceUsage, LdapConfig, LdapSyncData, LdapSyncTable, MfaRequiredError, NO_NETWORK_ERROR_CODE, OidcLogoutResponse, PatchRoleMappingRuleInput, ProvisioningConfig, ProvisioningConfigPatch, PublishTimelineEvent, ResponseError, RoleMappingRuleResponse, RoleMappingRuleType, STREAM_SEPARATOR, SamlPreferencesExtractedData, TemplateSearchFacet, UpdateGlobalRolePayload, UpdateWorkflowHistoryVersion, Version, VersionNode, WhatsNewArticle, WhatsNewSection, WorkflowData, WorkflowDataCreate, WorkflowDataUpdate, WorkflowHistory, WorkflowHistoryActionTypes, WorkflowHistoryRequestParams, WorkflowMetadata, WorkflowPublishHistory, WorkflowVersion, WorkflowVersionData, WorkflowVersionId, activateLicenseKey, canEnableMFA, changePassword, connectProvider, createApiKey, createCredentialResolver, createProjectSecretProviderConnection, createRole, createRoleMappingRule, createSecretProviderConnection, deleteApiKey, deleteCredentialResolver, deleteDestinationFromDb, deleteProjectSecretProviderConnection, deleteRole, deleteRoleMappingRule, deleteSecretProviderConnection, deleteUser, disableMfa, dismissBannerPermanently, enableMfa, enableSecretProviderConnection, fetchCommunityNodeAttributes, fetchCommunityNodeTypes, findWebhook, generateInviteLink, get, getAdminPanelLoginCode, getApiKeyScopes, getApiKeys, getAvailableCommunityPackageCount, getBecomeCreatorCta, getCategories, getCloudUserInfo, getClusterInfo, getCollectionById, getCollections, getCredentialResolver, getCredentialResolverTypes, getCredentialResolverWorkflows, getCredentialResolvers, getCurrentPlan, getCurrentUsage, getDestinationsFromBackend, getEventNamesFromBackend, getExternalSecrets, getExternalSecretsProvider, getExternalSecretsProviders, getFirstAdoptionDate, getFullApiResponse, getGlobalExternalSecrets, getGlobalExternalSecretsForProject, getInstalledCommunityNodes, getInstanceAiExamples, getInviteLink, getLdapConfig, getLdapSynchronizations, getLicense, getLocalResourceMapperFields, getMfaQR, getModuleSettings, getNextVersions, getNodeParameterActionResult, getNodeParameterOptions, getNodeTranslationHeaders, getNodeTypeVersions, getNodeTypes, getNodeTypesByIdentifier, getNodesInformation, getOidcConfig, getPasswordResetLink, getProjectExternalSecrets, getProjectSecretProviderConnectionByKey, getProjectSecretProviderConnectionsByProjectId, getProvisioningConfig, getPublishTimeline, getResourceLocatorResults, getResourceMapperFields, getRoleAssignments, getRoleBySlug, getRoleMembers, getRoleProjectMembers, getRoles, getSamlConfig, getSamlMetadata, getSecretProviderConnectionByKey, getSecretProviderConnections, getSecretProviderTypes, getSecuritySettings, getSettings, getTemplateById, getThirdPartyLicenses, getUpgradeOffer, getUsers, getWhatsNewSection, getWorkflowHistory, getWorkflowTemplate, getWorkflowVersion, getWorkflowVersionsByIds, getWorkflows, hasDestinationId, initOidcLogin, initSSO, installNewPackage, listRoleMappingRules, login, loginCurrentUser, logout, makeRestApiRequest, moveRoleMappingRule, oidcLogout, patch, post, registerCommunityEdition, reloadProvider, reloadSecretProviderConnection, renewLicense, request, requestLicenseTrial, rotateApiKey, runLdapSync, saveDestinationToDb, saveOidcConfig, saveProvisioningConfig, saveSamlConfig, sendConfirmationEmail, sendForgotPasswordEmail, sendGetWorkerStatus, sendTestMessageToDestination, sendUserEvent, sessionStarted, setupOwner, streamRequest, submitPersonalizationSurvey, testExternalSecretsProviderConnection, testHealthEndpoint, testLdapConnection, testOidcConfig, testProjectSecretProviderConnection, testSamlConfig, testSecretProviderConnection, toggleSamlConfig, uninstallPackage, updateAiUsageSettings, updateApiKey, updateCredentialResolver, updateCurrentUser, updateCurrentUserPassword, updateCurrentUserSettings, updateEnforceMfa, updateExternalSecretsSettings, updateGlobalRole, updateLdapConfig, updateNpsSurveyState, updateOtherUserSettings, updatePackage, updateProjectSecretProviderConnection, updateProvider, updateRole, updateRoleMappingRule, updateSecretProviderConnection, updateSecuritySettings, updateWorkflowHistoryVersion, validatePasswordToken, validateSignupToken, verifyMfaCode };
37
+ import { a as UnauthorizedHandler, c as makeRestApiRequest, d as request, f as setUnauthorizedHandler, i as STREAM_SEPARATOR, l as patch, n as NO_NETWORK_ERROR_CODE, o as get, p as streamRequest, r as ResponseError, s as getFullApiResponse, t as MfaRequiredError, u as post } from "./utils2.mjs";
38
+ export { ApiMessageEventBusDestinationOptions, Cloud, CreateRoleMappingRuleInput, CurrentUserResponse, DisableMfaParams, DynamicNotification, IInstanceAiExampleWorkflow, IInstanceAiExamplesQuery, IInstanceAiExamplesResponse, IPersonalizationLatestVersion, IPersonalizationSurveyAnswersV1, IPersonalizationSurveyAnswersV2, IPersonalizationSurveyAnswersV3, IPersonalizationSurveyVersions, IRestApiContext, ITag, ITemplatesCategory, ITemplatesCollection, ITemplatesCollectionFull, ITemplatesCollectionResponse, ITemplatesNode, ITemplatesQuery, ITemplatesWorkflow, ITemplatesWorkflowFull, ITemplatesWorkflowInfo, ITemplatesWorkflowResponse, IUser, IUserResponse, IWorkflowTemplate, IWorkflowTemplateNode, IWorkflowTemplateNodeCredentials, InstanceUsage, LdapConfig, LdapSyncData, LdapSyncTable, MfaRequiredError, NO_NETWORK_ERROR_CODE, OidcLogoutResponse, PatchRoleMappingRuleInput, ProvisioningConfig, ProvisioningConfigPatch, PublishTimelineEvent, ResponseError, RoleMappingRuleResponse, RoleMappingRuleType, STREAM_SEPARATOR, SamlPreferencesExtractedData, TemplateSearchFacet, UnauthorizedHandler, UpdateGlobalRolePayload, UpdateWorkflowHistoryVersion, Version, VersionNode, WhatsNewArticle, WhatsNewSection, WorkflowData, WorkflowDataCreate, WorkflowDataUpdate, WorkflowHistory, WorkflowHistoryActionTypes, WorkflowHistoryRequestParams, WorkflowMetadata, WorkflowPublishHistory, WorkflowVersion, WorkflowVersionData, WorkflowVersionId, activateLicenseKey, canEnableMFA, changePassword, connectProvider, createApiKey, createCredentialResolver, createProjectSecretProviderConnection, createRole, createRoleMappingRule, createSecretProviderConnection, deleteApiKey, deleteCredentialResolver, deleteDestinationFromDb, deleteProjectSecretProviderConnection, deleteRole, deleteRoleMappingRule, deleteSecretProviderConnection, deleteUser, disableMfa, dismissBannerPermanently, enableMfa, enableSecretProviderConnection, fetchCommunityNodeAttributes, fetchCommunityNodeTypes, findWebhook, generateInviteLink, get, getAdminPanelLoginCode, getApiKeyScopes, getApiKeys, getAvailableCommunityPackageCount, getBecomeCreatorCta, getCategories, getCloudUserInfo, getClusterInfo, getCollectionById, getCollections, getCredentialResolver, getCredentialResolverTypes, getCredentialResolverWorkflows, getCredentialResolvers, getCurrentPlan, getCurrentUsage, getDestinationsFromBackend, getEventNamesFromBackend, getExternalSecrets, getExternalSecretsProvider, getExternalSecretsProviders, getFirstAdoptionDate, getFullApiResponse, getGlobalExternalSecrets, getGlobalExternalSecretsForProject, getInstalledCommunityNodes, getInstanceAiExamples, getInviteLink, getLdapConfig, getLdapSynchronizations, getLicense, getLocalResourceMapperFields, getMfaQR, getModuleSettings, getNextVersions, getNodeParameterActionResult, getNodeParameterOptions, getNodeTranslationHeaders, getNodeTypeVersions, getNodeTypes, getNodeTypesByIdentifier, getNodesInformation, getOidcConfig, getPasswordResetLink, getProjectExternalSecrets, getProjectSecretProviderConnectionByKey, getProjectSecretProviderConnectionsByProjectId, getProvisioningConfig, getPublishTimeline, getResourceLocatorResults, getResourceMapperFields, getRoleAssignments, getRoleBySlug, getRoleMembers, getRoleProjectMembers, getRoles, getSamlConfig, getSamlMetadata, getSecretProviderConnectionByKey, getSecretProviderConnections, getSecretProviderTypes, getSecuritySettings, getSettings, getTemplateById, getThirdPartyLicenses, getUpgradeOffer, getUsers, getWhatsNewSection, getWorkflowHistory, getWorkflowTemplate, getWorkflowVersion, getWorkflowVersionsByIds, getWorkflows, hasDestinationId, initOidcLogin, initSSO, installNewPackage, listRoleMappingRules, login, loginCurrentUser, logout, makeRestApiRequest, moveRoleMappingRule, oidcLogout, patch, post, registerCommunityEdition, reloadProvider, reloadSecretProviderConnection, renewLicense, request, requestLicenseTrial, rotateApiKey, runLdapSync, saveDestinationToDb, saveOidcConfig, saveProvisioningConfig, saveSamlConfig, sendConfirmationEmail, sendForgotPasswordEmail, sendGetWorkerStatus, sendTestMessageToDestination, sendUserEvent, sessionStarted, setUnauthorizedHandler, setupOwner, streamRequest, submitPersonalizationSurvey, testExternalSecretsProviderConnection, testHealthEndpoint, testLdapConnection, testOidcConfig, testProjectSecretProviderConnection, testSamlConfig, testSecretProviderConnection, toggleSamlConfig, uninstallPackage, updateAiUsageSettings, updateApiKey, updateCredentialResolver, updateCurrentUser, updateCurrentUserPassword, updateCurrentUserSettings, updateEnforceMfa, updateExternalSecretsSettings, updateGlobalRole, updateLdapConfig, updateNpsSurveyState, updateOtherUserSettings, updatePackage, updateProjectSecretProviderConnection, updateProvider, updateRole, updateRoleMappingRule, updateSecretProviderConnection, updateSecuritySettings, updateWorkflowHistoryVersion, validatePasswordToken, validateSignupToken, verifyMfaCode };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { a as get, c as patch, d as streamRequest, i as STREAM_SEPARATOR, l as post, n as NO_NETWORK_ERROR_CODE, o as getFullApiResponse, r as ResponseError, s as makeRestApiRequest, t as MfaRequiredError, u as request } from "./utils2.mjs";
1
+ import { a as get, c as patch, d as setUnauthorizedHandler, f as streamRequest, i as STREAM_SEPARATOR, l as post, n as NO_NETWORK_ERROR_CODE, o as getFullApiResponse, r as ResponseError, s as makeRestApiRequest, t as MfaRequiredError, u as request } from "./utils2.mjs";
2
2
  import { t as updateAiUsageSettings } from "./ai-usage.mjs";
3
3
  import { a as rotateApiKey, i as getApiKeys, n as deleteApiKey, o as updateApiKey, r as getApiKeyScopes, t as createApiKey } from "./api-keys.mjs";
4
4
  import { a as getUpgradeOffer, i as getCurrentUsage, n as getCloudUserInfo, o as sendConfirmationEmail, r as getCurrentPlan, s as sendUserEvent, t as getAdminPanelLoginCode } from "./cloudPlans.mjs";
@@ -33,4 +33,4 @@ import { t as findWebhook } from "./webhooks.mjs";
33
33
  import { a as updateWorkflowHistoryVersion, i as getWorkflowVersionsByIds, n as getWorkflowHistory, r as getWorkflowVersion, t as getPublishTimeline } from "./workflowHistory.mjs";
34
34
  import "./api.mjs";
35
35
 
36
- export { MfaRequiredError, NO_NETWORK_ERROR_CODE, ResponseError, STREAM_SEPARATOR, activateLicenseKey, canEnableMFA, changePassword, connectProvider, createApiKey, createCredentialResolver, createProjectSecretProviderConnection, createRole, createRoleMappingRule, createSecretProviderConnection, deleteApiKey, deleteCredentialResolver, deleteDestinationFromDb, deleteProjectSecretProviderConnection, deleteRole, deleteRoleMappingRule, deleteSecretProviderConnection, deleteUser, disableMfa, dismissBannerPermanently, enableMfa, enableSecretProviderConnection, fetchCommunityNodeAttributes, fetchCommunityNodeTypes, findWebhook, generateInviteLink, get, getAdminPanelLoginCode, getApiKeyScopes, getApiKeys, getAvailableCommunityPackageCount, getBecomeCreatorCta, getCategories, getCloudUserInfo, getClusterInfo, getCollectionById, getCollections, getCredentialResolver, getCredentialResolverTypes, getCredentialResolverWorkflows, getCredentialResolvers, getCurrentPlan, getCurrentUsage, getDestinationsFromBackend, getEventNamesFromBackend, getExternalSecrets, getExternalSecretsProvider, getExternalSecretsProviders, getFirstAdoptionDate, getFullApiResponse, getGlobalExternalSecrets, getGlobalExternalSecretsForProject, getInstalledCommunityNodes, getInstanceAiExamples, getInviteLink, getLdapConfig, getLdapSynchronizations, getLicense, getLocalResourceMapperFields, getMfaQR, getModuleSettings, getNextVersions, getNodeParameterActionResult, getNodeParameterOptions, getNodeTranslationHeaders, getNodeTypeVersions, getNodeTypes, getNodeTypesByIdentifier, getNodesInformation, getOidcConfig, getPasswordResetLink, getProjectExternalSecrets, getProjectSecretProviderConnectionByKey, getProjectSecretProviderConnectionsByProjectId, getProvisioningConfig, getPublishTimeline, getResourceLocatorResults, getResourceMapperFields, getRoleAssignments, getRoleBySlug, getRoleMembers, getRoleProjectMembers, getRoles, getSamlConfig, getSamlMetadata, getSecretProviderConnectionByKey, getSecretProviderConnections, getSecretProviderTypes, getSecuritySettings, getSettings, getTemplateById, getThirdPartyLicenses, getUpgradeOffer, getUsers, getWhatsNewSection, getWorkflowHistory, getWorkflowTemplate, getWorkflowVersion, getWorkflowVersionsByIds, getWorkflows, hasDestinationId, initOidcLogin, initSSO, installNewPackage, listRoleMappingRules, login, loginCurrentUser, logout, makeRestApiRequest, moveRoleMappingRule, oidcLogout, patch, post, registerCommunityEdition, reloadProvider, reloadSecretProviderConnection, renewLicense, request, requestLicenseTrial, rotateApiKey, runLdapSync, saveDestinationToDb, saveOidcConfig, saveProvisioningConfig, saveSamlConfig, sendConfirmationEmail, sendForgotPasswordEmail, sendGetWorkerStatus, sendTestMessageToDestination, sendUserEvent, sessionStarted, setupOwner, streamRequest, submitPersonalizationSurvey, testExternalSecretsProviderConnection, testHealthEndpoint, testLdapConnection, testOidcConfig, testProjectSecretProviderConnection, testSamlConfig, testSecretProviderConnection, toggleSamlConfig, uninstallPackage, updateAiUsageSettings, updateApiKey, updateCredentialResolver, updateCurrentUser, updateCurrentUserPassword, updateCurrentUserSettings, updateEnforceMfa, updateExternalSecretsSettings, updateGlobalRole, updateLdapConfig, updateNpsSurveyState, updateOtherUserSettings, updatePackage, updateProjectSecretProviderConnection, updateProvider, updateRole, updateRoleMappingRule, updateSecretProviderConnection, updateSecuritySettings, updateWorkflowHistoryVersion, validatePasswordToken, validateSignupToken, verifyMfaCode };
36
+ export { MfaRequiredError, NO_NETWORK_ERROR_CODE, ResponseError, STREAM_SEPARATOR, activateLicenseKey, canEnableMFA, changePassword, connectProvider, createApiKey, createCredentialResolver, createProjectSecretProviderConnection, createRole, createRoleMappingRule, createSecretProviderConnection, deleteApiKey, deleteCredentialResolver, deleteDestinationFromDb, deleteProjectSecretProviderConnection, deleteRole, deleteRoleMappingRule, deleteSecretProviderConnection, deleteUser, disableMfa, dismissBannerPermanently, enableMfa, enableSecretProviderConnection, fetchCommunityNodeAttributes, fetchCommunityNodeTypes, findWebhook, generateInviteLink, get, getAdminPanelLoginCode, getApiKeyScopes, getApiKeys, getAvailableCommunityPackageCount, getBecomeCreatorCta, getCategories, getCloudUserInfo, getClusterInfo, getCollectionById, getCollections, getCredentialResolver, getCredentialResolverTypes, getCredentialResolverWorkflows, getCredentialResolvers, getCurrentPlan, getCurrentUsage, getDestinationsFromBackend, getEventNamesFromBackend, getExternalSecrets, getExternalSecretsProvider, getExternalSecretsProviders, getFirstAdoptionDate, getFullApiResponse, getGlobalExternalSecrets, getGlobalExternalSecretsForProject, getInstalledCommunityNodes, getInstanceAiExamples, getInviteLink, getLdapConfig, getLdapSynchronizations, getLicense, getLocalResourceMapperFields, getMfaQR, getModuleSettings, getNextVersions, getNodeParameterActionResult, getNodeParameterOptions, getNodeTranslationHeaders, getNodeTypeVersions, getNodeTypes, getNodeTypesByIdentifier, getNodesInformation, getOidcConfig, getPasswordResetLink, getProjectExternalSecrets, getProjectSecretProviderConnectionByKey, getProjectSecretProviderConnectionsByProjectId, getProvisioningConfig, getPublishTimeline, getResourceLocatorResults, getResourceMapperFields, getRoleAssignments, getRoleBySlug, getRoleMembers, getRoleProjectMembers, getRoles, getSamlConfig, getSamlMetadata, getSecretProviderConnectionByKey, getSecretProviderConnections, getSecretProviderTypes, getSecuritySettings, getSettings, getTemplateById, getThirdPartyLicenses, getUpgradeOffer, getUsers, getWhatsNewSection, getWorkflowHistory, getWorkflowTemplate, getWorkflowVersion, getWorkflowVersionsByIds, getWorkflows, hasDestinationId, initOidcLogin, initSSO, installNewPackage, listRoleMappingRules, login, loginCurrentUser, logout, makeRestApiRequest, moveRoleMappingRule, oidcLogout, patch, post, registerCommunityEdition, reloadProvider, reloadSecretProviderConnection, renewLicense, request, requestLicenseTrial, rotateApiKey, runLdapSync, saveDestinationToDb, saveOidcConfig, saveProvisioningConfig, saveSamlConfig, sendConfirmationEmail, sendForgotPasswordEmail, sendGetWorkerStatus, sendTestMessageToDestination, sendUserEvent, sessionStarted, setUnauthorizedHandler, setupOwner, streamRequest, submitPersonalizationSurvey, testExternalSecretsProviderConnection, testHealthEndpoint, testLdapConnection, testOidcConfig, testProjectSecretProviderConnection, testSamlConfig, testSecretProviderConnection, toggleSamlConfig, uninstallPackage, updateAiUsageSettings, updateApiKey, updateCredentialResolver, updateCurrentUser, updateCurrentUserPassword, updateCurrentUserSettings, updateEnforceMfa, updateExternalSecretsSettings, updateGlobalRole, updateLdapConfig, updateNpsSurveyState, updateOtherUserSettings, updatePackage, updateProjectSecretProviderConnection, updateProvider, updateRole, updateRoleMappingRule, updateSecretProviderConnection, updateSecuritySettings, updateWorkflowHistoryVersion, validatePasswordToken, validateSignupToken, verifyMfaCode };
package/dist/utils.cjs CHANGED
@@ -10,4 +10,5 @@ exports.makeRestApiRequest = require_utils.makeRestApiRequest;
10
10
  exports.patch = require_utils.patch;
11
11
  exports.post = require_utils.post;
12
12
  exports.request = require_utils.request;
13
+ exports.setUnauthorizedHandler = require_utils.setUnauthorizedHandler;
13
14
  exports.streamRequest = require_utils.streamRequest;
package/dist/utils.d.cts CHANGED
@@ -1,3 +1,3 @@
1
1
  import "./types2.cjs";
2
- import { a as get, c as patch, d as streamRequest, i as STREAM_SEPARATOR, l as post, n as NO_NETWORK_ERROR_CODE, o as getFullApiResponse, r as ResponseError, s as makeRestApiRequest, t as MfaRequiredError, u as request } from "./utils2.cjs";
3
- export { MfaRequiredError, NO_NETWORK_ERROR_CODE, ResponseError, STREAM_SEPARATOR, get, getFullApiResponse, makeRestApiRequest, patch, post, request, streamRequest };
2
+ import { a as UnauthorizedHandler, c as makeRestApiRequest, d as request, f as setUnauthorizedHandler, i as STREAM_SEPARATOR, l as patch, n as NO_NETWORK_ERROR_CODE, o as get, p as streamRequest, r as ResponseError, s as getFullApiResponse, t as MfaRequiredError, u as post } from "./utils2.cjs";
3
+ export { MfaRequiredError, NO_NETWORK_ERROR_CODE, ResponseError, STREAM_SEPARATOR, UnauthorizedHandler, get, getFullApiResponse, makeRestApiRequest, patch, post, request, setUnauthorizedHandler, streamRequest };
package/dist/utils.d.mts CHANGED
@@ -1,3 +1,3 @@
1
1
  import "./types2.mjs";
2
- import { a as get, c as patch, d as streamRequest, i as STREAM_SEPARATOR, l as post, n as NO_NETWORK_ERROR_CODE, o as getFullApiResponse, r as ResponseError, s as makeRestApiRequest, t as MfaRequiredError, u as request } from "./utils2.mjs";
3
- export { MfaRequiredError, NO_NETWORK_ERROR_CODE, ResponseError, STREAM_SEPARATOR, get, getFullApiResponse, makeRestApiRequest, patch, post, request, streamRequest };
2
+ import { a as UnauthorizedHandler, c as makeRestApiRequest, d as request, f as setUnauthorizedHandler, i as STREAM_SEPARATOR, l as patch, n as NO_NETWORK_ERROR_CODE, o as get, p as streamRequest, r as ResponseError, s as getFullApiResponse, t as MfaRequiredError, u as post } from "./utils2.mjs";
3
+ export { MfaRequiredError, NO_NETWORK_ERROR_CODE, ResponseError, STREAM_SEPARATOR, UnauthorizedHandler, get, getFullApiResponse, makeRestApiRequest, patch, post, request, setUnauthorizedHandler, streamRequest };
package/dist/utils.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { a as get, c as patch, d as streamRequest, i as STREAM_SEPARATOR, l as post, n as NO_NETWORK_ERROR_CODE, o as getFullApiResponse, r as ResponseError, s as makeRestApiRequest, t as MfaRequiredError, u as request } from "./utils2.mjs";
1
+ import { a as get, c as patch, d as setUnauthorizedHandler, f as streamRequest, i as STREAM_SEPARATOR, l as post, n as NO_NETWORK_ERROR_CODE, o as getFullApiResponse, r as ResponseError, s as makeRestApiRequest, t as MfaRequiredError, u as request } from "./utils2.mjs";
2
2
 
3
- export { MfaRequiredError, NO_NETWORK_ERROR_CODE, ResponseError, STREAM_SEPARATOR, get, getFullApiResponse, makeRestApiRequest, patch, post, request, streamRequest };
3
+ export { MfaRequiredError, NO_NETWORK_ERROR_CODE, ResponseError, STREAM_SEPARATOR, get, getFullApiResponse, makeRestApiRequest, patch, post, request, setUnauthorizedHandler, streamRequest };
package/dist/utils2.cjs CHANGED
@@ -28,14 +28,6 @@ axios = __toESM(axios);
28
28
  let n8n_workflow = require("n8n-workflow");
29
29
 
30
30
  //#region src/utils.ts
31
- const getBrowserId = () => {
32
- let browserId = localStorage.getItem(__n8n_constants.BROWSER_ID_STORAGE_KEY);
33
- if (!browserId) {
34
- browserId = crypto.randomUUID();
35
- localStorage.setItem(__n8n_constants.BROWSER_ID_STORAGE_KEY, browserId);
36
- }
37
- return browserId;
38
- };
39
31
  const NO_NETWORK_ERROR_CODE = 999;
40
32
  const STREAM_SEPARATOR = "⧉⇋⇋➽⌑⧉§§\n";
41
33
  var MfaRequiredError = class extends Error {
@@ -70,6 +62,10 @@ var ResponseError = class extends Error {
70
62
  if (hint) this.hint = hint;
71
63
  }
72
64
  };
65
+ let unauthorizedHandler;
66
+ function setUnauthorizedHandler(handler) {
67
+ unauthorizedHandler = handler;
68
+ }
73
69
  const legacyParamSerializer = (params) => Object.keys(params).filter((key) => params[key] !== void 0).map((key) => {
74
70
  if (Array.isArray(params[key])) return params[key].map((v) => `${key}[]=${encodeURIComponent(v)}`).join("&");
75
71
  if (typeof params[key] === "object") params[key] = JSON.stringify(params[key]);
@@ -83,7 +79,7 @@ async function request(config) {
83
79
  baseURL,
84
80
  headers: headers ?? {}
85
81
  };
86
- if (baseURL.startsWith("/")) options.headers["browser-id"] = getBrowserId();
82
+ if (baseURL.startsWith("/")) options.headers["browser-id"] = (0, __n8n_constants.getBrowserId)();
87
83
  if ({}.env.NODE_ENV !== "production" && !baseURL.includes("api.n8n.io") && !baseURL.includes("n8n.cloud")) options.withCredentials = options.withCredentials ?? true;
88
84
  if ([
89
85
  "POST",
@@ -100,6 +96,7 @@ async function request(config) {
100
96
  if (error.message === "Network Error") throw new ResponseError("Can't connect to n8n.", { errorCode: NO_NETWORK_ERROR_CODE });
101
97
  const errorResponseData = error.response?.data;
102
98
  if (errorResponseData?.mfaRequired === true) throw new MfaRequiredError();
99
+ if (error.response?.status === 401) unauthorizedHandler?.(baseURL);
103
100
  if (errorResponseData?.message !== void 0) {
104
101
  if (errorResponseData.name === "NodeApiError") {
105
102
  errorResponseData.httpStatusCode = error.response.status;
@@ -176,7 +173,7 @@ async function streamRequest(context, apiEndpoint, payload, onChunk, onDone, onE
176
173
  };
177
174
  const assistantRequest = {
178
175
  headers: {
179
- "browser-id": getBrowserId(),
176
+ "browser-id": (0, __n8n_constants.getBrowserId)(),
180
177
  "Content-Type": "application/json"
181
178
  },
182
179
  method: "POST",
@@ -300,6 +297,12 @@ Object.defineProperty(exports, 'request', {
300
297
  return request;
301
298
  }
302
299
  });
300
+ Object.defineProperty(exports, 'setUnauthorizedHandler', {
301
+ enumerable: true,
302
+ get: function () {
303
+ return setUnauthorizedHandler;
304
+ }
305
+ });
303
306
  Object.defineProperty(exports, 'streamRequest', {
304
307
  enumerable: true,
305
308
  get: function () {
@@ -1 +1 @@
1
- {"version":3,"file":"utils2.cjs","names":["BROWSER_ID_STORAGE_KEY","options: AxiosRequestConfig","onErrorOnce: ((e: Error) => void) | undefined","assistantRequest: RequestInit","data: T","e: unknown"],"sources":["../src/utils.ts"],"sourcesContent":["import { BROWSER_ID_STORAGE_KEY } from '@n8n/constants';\nimport { assert } from '@n8n/utils/assert';\nimport type { AxiosRequestConfig, Method, RawAxiosRequestHeaders } from 'axios';\nimport axios from 'axios';\nimport { jsonParse } from 'n8n-workflow';\nimport type { GenericValue, IDataObject } from 'n8n-workflow';\n\nimport type { IRestApiContext } from './types';\n\nconst getBrowserId = () => {\n\tlet browserId = localStorage.getItem(BROWSER_ID_STORAGE_KEY);\n\tif (!browserId) {\n\t\tbrowserId = crypto.randomUUID();\n\t\tlocalStorage.setItem(BROWSER_ID_STORAGE_KEY, browserId);\n\t}\n\treturn browserId;\n};\n\nexport const NO_NETWORK_ERROR_CODE = 999;\nexport const STREAM_SEPARATOR = '⧉⇋⇋➽⌑⧉§§\\n';\n\nexport class MfaRequiredError extends Error {\n\tconstructor() {\n\t\tsuper('MFA is required to access this resource. Please set up MFA in your user settings.');\n\t\tthis.name = 'MfaRequiredError';\n\t}\n}\n\nexport class ResponseError extends Error {\n\t// The HTTP status code of response\n\thttpStatusCode?: number;\n\n\t// The error code in the response\n\terrorCode?: number;\n\n\t// The stack trace of the server\n\tserverStackTrace?: string;\n\n\t// Additional metadata from the server (e.g., EULA URL)\n\tmeta?: Record<string, unknown>;\n\n\t// Additional hint from the server\n\thint?: string;\n\n\t/**\n\t * Creates an instance of ResponseError.\n\t * @param {string} message The error message\n\t * @param {number} [errorCode] The error code which can be used by frontend to identify the actual error\n\t * @param {number} [httpStatusCode] The HTTP status code the response should have\n\t * @param {string} [stack] The stack trace\n\t * @param {Record<string, unknown>} [meta] Additional metadata from the server\n\t * @param {string} [hint] Additional hint from the server\n\t */\n\tconstructor(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\terrorCode?: number;\n\t\t\thttpStatusCode?: number;\n\t\t\tstack?: string;\n\t\t\tmeta?: Record<string, unknown>;\n\t\t\thint?: ResponseError['hint'];\n\t\t} = {},\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'ResponseError';\n\n\t\tconst { errorCode, httpStatusCode, stack, meta, hint } = options;\n\t\tif (errorCode) {\n\t\t\tthis.errorCode = errorCode;\n\t\t}\n\t\tif (httpStatusCode) {\n\t\t\tthis.httpStatusCode = httpStatusCode;\n\t\t}\n\t\tif (stack) {\n\t\t\tthis.serverStackTrace = stack;\n\t\t}\n\t\tif (meta) {\n\t\t\tthis.meta = meta;\n\t\t}\n\t\tif (hint) {\n\t\t\tthis.hint = hint;\n\t\t}\n\t}\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst legacyParamSerializer = (params: Record<string, any>) =>\n\tObject.keys(params)\n\t\t.filter((key) => params[key] !== undefined)\n\t\t.map((key) => {\n\t\t\tif (Array.isArray(params[key])) {\n\t\t\t\treturn params[key].map((v: string) => `${key}[]=${encodeURIComponent(v)}`).join('&');\n\t\t\t}\n\t\t\tif (typeof params[key] === 'object') {\n\t\t\t\tparams[key] = JSON.stringify(params[key]);\n\t\t\t}\n\t\t\treturn `${key}=${encodeURIComponent(params[key])}`;\n\t\t})\n\t\t.join('&');\n\nexport async function request(config: {\n\tmethod: Method;\n\tbaseURL: string;\n\tendpoint: string;\n\theaders?: RawAxiosRequestHeaders;\n\tdata?: GenericValue | GenericValue[];\n\twithCredentials?: boolean;\n}) {\n\tconst { method, baseURL, endpoint, headers, data } = config;\n\tconst options: AxiosRequestConfig = {\n\t\tmethod,\n\t\turl: endpoint,\n\t\tbaseURL,\n\t\theaders: headers ?? {},\n\t};\n\tif (baseURL.startsWith('/')) {\n\t\toptions.headers!['browser-id'] = getBrowserId();\n\t}\n\tif (\n\t\timport.meta.env.NODE_ENV !== 'production' &&\n\t\t!baseURL.includes('api.n8n.io') &&\n\t\t!baseURL.includes('n8n.cloud')\n\t) {\n\t\toptions.withCredentials = options.withCredentials ?? true;\n\t}\n\tif (['POST', 'PATCH', 'PUT'].includes(method)) {\n\t\toptions.data = data;\n\t} else if (data) {\n\t\toptions.params = data;\n\t\toptions.paramsSerializer = legacyParamSerializer;\n\t}\n\n\ttry {\n\t\tconst response = await axios.request(options);\n\t\treturn response.data;\n\t} catch (error) {\n\t\tif (error.message === 'Network Error') {\n\t\t\tthrow new ResponseError(\"Can't connect to n8n.\", {\n\t\t\t\terrorCode: NO_NETWORK_ERROR_CODE,\n\t\t\t});\n\t\t}\n\n\t\tconst errorResponseData = error.response?.data;\n\t\tif (errorResponseData?.mfaRequired === true) {\n\t\t\tthrow new MfaRequiredError();\n\t\t}\n\t\tif (errorResponseData?.message !== undefined) {\n\t\t\tif (errorResponseData.name === 'NodeApiError') {\n\t\t\t\terrorResponseData.httpStatusCode = error.response.status;\n\t\t\t\tthrow errorResponseData;\n\t\t\t}\n\n\t\t\tthrow new ResponseError(errorResponseData.message, {\n\t\t\t\terrorCode: errorResponseData.code,\n\t\t\t\thttpStatusCode: error.response.status,\n\t\t\t\tstack: errorResponseData.stack,\n\t\t\t\tmeta: errorResponseData.meta,\n\t\t\t\thint: errorResponseData.hint,\n\t\t\t});\n\t\t}\n\n\t\tthrow error;\n\t}\n}\n\n/**\n * Sends a request to the API and returns the response without extracting the data key.\n * @param context Rest API context\n * @param method HTTP method\n * @param endpoint relative path to the API endpoint\n * @param data request data\n * @returns data and total count\n */\nexport async function getFullApiResponse<T>(\n\tcontext: IRestApiContext,\n\tmethod: Method,\n\tendpoint: string,\n\tdata?: GenericValue | GenericValue[],\n) {\n\tconst response = await request({\n\t\tmethod,\n\t\tbaseURL: context.baseUrl,\n\t\tendpoint,\n\t\theaders: { 'push-ref': context.pushRef },\n\t\tdata,\n\t});\n\n\treturn response as { count: number; data: T };\n}\n\nexport async function makeRestApiRequest<T>(\n\tcontext: IRestApiContext,\n\tmethod: Method,\n\tendpoint: string,\n\tdata?: GenericValue | GenericValue[],\n) {\n\tconst response = await request({\n\t\tmethod,\n\t\tbaseURL: context.baseUrl,\n\t\tendpoint,\n\t\theaders: { 'push-ref': context.pushRef },\n\t\tdata,\n\t});\n\n\t// All cli rest api endpoints return data wrapped in `data` key\n\treturn response.data as T;\n}\n\nexport async function get(\n\tbaseURL: string,\n\tendpoint: string,\n\tparams?: IDataObject,\n\theaders?: RawAxiosRequestHeaders,\n) {\n\treturn await request({ method: 'GET', baseURL, endpoint, headers, data: params });\n}\n\nexport async function post(\n\tbaseURL: string,\n\tendpoint: string,\n\tparams?: IDataObject,\n\theaders?: RawAxiosRequestHeaders,\n) {\n\treturn await request({ method: 'POST', baseURL, endpoint, headers, data: params });\n}\n\nexport async function patch(\n\tbaseURL: string,\n\tendpoint: string,\n\tparams?: IDataObject,\n\theaders?: RawAxiosRequestHeaders,\n) {\n\treturn await request({ method: 'PATCH', baseURL, endpoint, headers, data: params });\n}\n\nexport async function streamRequest<T extends object>(\n\tcontext: IRestApiContext,\n\tapiEndpoint: string,\n\tpayload: object,\n\tonChunk?: (chunk: T) => void,\n\tonDone?: () => void,\n\tonError?: (e: Error) => void,\n\tseparator = STREAM_SEPARATOR,\n\tabortSignal?: AbortSignal,\n): Promise<void> {\n\tlet onErrorOnce: ((e: Error) => void) | undefined = (e: Error) => {\n\t\tonErrorOnce = undefined;\n\t\tonError?.(e);\n\t};\n\tconst headers: Record<string, string> = {\n\t\t'browser-id': getBrowserId(),\n\t\t'Content-Type': 'application/json',\n\t};\n\tconst assistantRequest: RequestInit = {\n\t\theaders,\n\t\tmethod: 'POST',\n\t\tcredentials: 'include',\n\t\tbody: JSON.stringify(payload),\n\t\tsignal: abortSignal,\n\t};\n\ttry {\n\t\tconst response = await fetch(`${context.baseUrl}${apiEndpoint}`, assistantRequest);\n\n\t\tif (response.body) {\n\t\t\t// Handle the streaming response\n\t\t\tconst reader = response.body.getReader();\n\t\t\tconst decoder = new TextDecoder('utf-8');\n\n\t\t\tlet buffer = '';\n\n\t\t\tasync function readStream() {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) {\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tonErrorOnce?.(\n\t\t\t\t\t\t\tnew ResponseError(response.statusText, {\n\t\t\t\t\t\t\t\thttpStatusCode: response.status,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (buffer.trim()) {\n\t\t\t\t\t\t// The stream ended with leftover content that never parsed as JSON.\n\t\t\t\t\t\t// A JSON-like fragment means the stream was cut off mid-chunk;\n\t\t\t\t\t\t// anything else is a plain-text error body from an upstream\n\t\t\t\t\t\t// service — surface its content instead of silently dropping it.\n\t\t\t\t\t\tconst leftover = buffer.trim();\n\t\t\t\t\t\tconst message = /^[[{]/.test(leftover) ? 'Connection lost' : leftover.slice(0, 256);\n\t\t\t\t\t\tonErrorOnce?.(new Error(message));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonDone?.();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst chunk = decoder.decode(value);\n\t\t\t\tbuffer += chunk;\n\n\t\t\t\tconst splitChunks = buffer.split(separator);\n\n\t\t\t\tbuffer = '';\n\t\t\t\tfor (const splitChunk of splitChunks) {\n\t\t\t\t\tif (splitChunk) {\n\t\t\t\t\t\tlet data: T;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdata = jsonParse<T>(splitChunk, { errorMessage: 'Invalid json' });\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t// incomplete json. append to buffer to complete\n\t\t\t\t\t\t\tbuffer += splitChunk;\n\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\t\t\t// Call chunk callback if request was successful\n\t\t\t\t\t\t\t\tonChunk?.(data);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Otherwise, call error callback\n\t\t\t\t\t\t\t\tconst message = 'message' in data ? data.message : response.statusText;\n\t\t\t\t\t\t\t\tonErrorOnce?.(\n\t\t\t\t\t\t\t\t\tnew ResponseError(String(message), {\n\t\t\t\t\t\t\t\t\t\thttpStatusCode: response.status,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\t\t\tonErrorOnce?.(e);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait readStream();\n\t\t\t}\n\n\t\t\t// Start reading the stream\n\t\t\tawait readStream();\n\t\t} else if (onErrorOnce) {\n\t\t\tonErrorOnce(new Error(response.statusText));\n\t\t}\n\t} catch (e: unknown) {\n\t\tassert(e instanceof Error);\n\t\tonErrorOnce?.(e);\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils2.cjs","names":["unauthorizedHandler: UnauthorizedHandler | undefined","options: AxiosRequestConfig","onErrorOnce: ((e: Error) => void) | undefined","assistantRequest: RequestInit","data: T","e: unknown"],"sources":["../src/utils.ts"],"sourcesContent":["import { getBrowserId } from '@n8n/constants';\nimport { assert } from '@n8n/utils/assert';\nimport type { AxiosRequestConfig, Method, RawAxiosRequestHeaders } from 'axios';\nimport axios from 'axios';\nimport { jsonParse } from 'n8n-workflow';\nimport type { GenericValue, IDataObject } from 'n8n-workflow';\n\nimport type { IRestApiContext } from './types';\n\nexport const NO_NETWORK_ERROR_CODE = 999;\nexport const STREAM_SEPARATOR = '⧉⇋⇋➽⌑⧉§§\\n';\n\nexport class MfaRequiredError extends Error {\n\tconstructor() {\n\t\tsuper('MFA is required to access this resource. Please set up MFA in your user settings.');\n\t\tthis.name = 'MfaRequiredError';\n\t}\n}\n\nexport class ResponseError extends Error {\n\t// The HTTP status code of response\n\thttpStatusCode?: number;\n\n\t// The error code in the response\n\terrorCode?: number;\n\n\t// The stack trace of the server\n\tserverStackTrace?: string;\n\n\t// Additional metadata from the server (e.g., EULA URL)\n\tmeta?: Record<string, unknown>;\n\n\t// Additional hint from the server\n\thint?: string;\n\n\t/**\n\t * Creates an instance of ResponseError.\n\t * @param {string} message The error message\n\t * @param {number} [errorCode] The error code which can be used by frontend to identify the actual error\n\t * @param {number} [httpStatusCode] The HTTP status code the response should have\n\t * @param {string} [stack] The stack trace\n\t * @param {Record<string, unknown>} [meta] Additional metadata from the server\n\t * @param {string} [hint] Additional hint from the server\n\t */\n\tconstructor(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\terrorCode?: number;\n\t\t\thttpStatusCode?: number;\n\t\t\tstack?: string;\n\t\t\tmeta?: Record<string, unknown>;\n\t\t\thint?: ResponseError['hint'];\n\t\t} = {},\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'ResponseError';\n\n\t\tconst { errorCode, httpStatusCode, stack, meta, hint } = options;\n\t\tif (errorCode) {\n\t\t\tthis.errorCode = errorCode;\n\t\t}\n\t\tif (httpStatusCode) {\n\t\t\tthis.httpStatusCode = httpStatusCode;\n\t\t}\n\t\tif (stack) {\n\t\t\tthis.serverStackTrace = stack;\n\t\t}\n\t\tif (meta) {\n\t\t\tthis.meta = meta;\n\t\t}\n\t\tif (hint) {\n\t\t\tthis.hint = hint;\n\t\t}\n\t}\n}\n\nexport type UnauthorizedHandler = (baseURL: string) => void;\nlet unauthorizedHandler: UnauthorizedHandler | undefined;\n\n// Called on every 401 from request() below, with its baseURL, so non-n8n hosts can be ignored.\nexport function setUnauthorizedHandler(handler: UnauthorizedHandler): void {\n\tunauthorizedHandler = handler;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst legacyParamSerializer = (params: Record<string, any>) =>\n\tObject.keys(params)\n\t\t.filter((key) => params[key] !== undefined)\n\t\t.map((key) => {\n\t\t\tif (Array.isArray(params[key])) {\n\t\t\t\treturn params[key].map((v: string) => `${key}[]=${encodeURIComponent(v)}`).join('&');\n\t\t\t}\n\t\t\tif (typeof params[key] === 'object') {\n\t\t\t\tparams[key] = JSON.stringify(params[key]);\n\t\t\t}\n\t\t\treturn `${key}=${encodeURIComponent(params[key])}`;\n\t\t})\n\t\t.join('&');\n\nexport async function request(config: {\n\tmethod: Method;\n\tbaseURL: string;\n\tendpoint: string;\n\theaders?: RawAxiosRequestHeaders;\n\tdata?: GenericValue | GenericValue[];\n\twithCredentials?: boolean;\n}) {\n\tconst { method, baseURL, endpoint, headers, data } = config;\n\tconst options: AxiosRequestConfig = {\n\t\tmethod,\n\t\turl: endpoint,\n\t\tbaseURL,\n\t\theaders: headers ?? {},\n\t};\n\tif (baseURL.startsWith('/')) {\n\t\toptions.headers!['browser-id'] = getBrowserId();\n\t}\n\tif (\n\t\timport.meta.env.NODE_ENV !== 'production' &&\n\t\t!baseURL.includes('api.n8n.io') &&\n\t\t!baseURL.includes('n8n.cloud')\n\t) {\n\t\toptions.withCredentials = options.withCredentials ?? true;\n\t}\n\tif (['POST', 'PATCH', 'PUT'].includes(method)) {\n\t\toptions.data = data;\n\t} else if (data) {\n\t\toptions.params = data;\n\t\toptions.paramsSerializer = legacyParamSerializer;\n\t}\n\n\ttry {\n\t\tconst response = await axios.request(options);\n\t\treturn response.data;\n\t} catch (error) {\n\t\tif (error.message === 'Network Error') {\n\t\t\tthrow new ResponseError(\"Can't connect to n8n.\", {\n\t\t\t\terrorCode: NO_NETWORK_ERROR_CODE,\n\t\t\t});\n\t\t}\n\n\t\tconst errorResponseData = error.response?.data;\n\t\tif (errorResponseData?.mfaRequired === true) {\n\t\t\tthrow new MfaRequiredError();\n\t\t}\n\n\t\t// After mfaRequired: that 401 means valid-but-unenrolled, not expired.\n\t\tif (error.response?.status === 401) {\n\t\t\tunauthorizedHandler?.(baseURL);\n\t\t}\n\n\t\tif (errorResponseData?.message !== undefined) {\n\t\t\tif (errorResponseData.name === 'NodeApiError') {\n\t\t\t\terrorResponseData.httpStatusCode = error.response.status;\n\t\t\t\tthrow errorResponseData;\n\t\t\t}\n\n\t\t\tthrow new ResponseError(errorResponseData.message, {\n\t\t\t\terrorCode: errorResponseData.code,\n\t\t\t\thttpStatusCode: error.response.status,\n\t\t\t\tstack: errorResponseData.stack,\n\t\t\t\tmeta: errorResponseData.meta,\n\t\t\t\thint: errorResponseData.hint,\n\t\t\t});\n\t\t}\n\n\t\tthrow error;\n\t}\n}\n\n/**\n * Sends a request to the API and returns the response without extracting the data key.\n * @param context Rest API context\n * @param method HTTP method\n * @param endpoint relative path to the API endpoint\n * @param data request data\n * @returns data and total count\n */\nexport async function getFullApiResponse<T>(\n\tcontext: IRestApiContext,\n\tmethod: Method,\n\tendpoint: string,\n\tdata?: GenericValue | GenericValue[],\n) {\n\tconst response = await request({\n\t\tmethod,\n\t\tbaseURL: context.baseUrl,\n\t\tendpoint,\n\t\theaders: { 'push-ref': context.pushRef },\n\t\tdata,\n\t});\n\n\treturn response as { count: number; data: T };\n}\n\nexport async function makeRestApiRequest<T>(\n\tcontext: IRestApiContext,\n\tmethod: Method,\n\tendpoint: string,\n\tdata?: GenericValue | GenericValue[],\n) {\n\tconst response = await request({\n\t\tmethod,\n\t\tbaseURL: context.baseUrl,\n\t\tendpoint,\n\t\theaders: { 'push-ref': context.pushRef },\n\t\tdata,\n\t});\n\n\t// All cli rest api endpoints return data wrapped in `data` key\n\treturn response.data as T;\n}\n\nexport async function get(\n\tbaseURL: string,\n\tendpoint: string,\n\tparams?: IDataObject,\n\theaders?: RawAxiosRequestHeaders,\n) {\n\treturn await request({ method: 'GET', baseURL, endpoint, headers, data: params });\n}\n\nexport async function post(\n\tbaseURL: string,\n\tendpoint: string,\n\tparams?: IDataObject,\n\theaders?: RawAxiosRequestHeaders,\n) {\n\treturn await request({ method: 'POST', baseURL, endpoint, headers, data: params });\n}\n\nexport async function patch(\n\tbaseURL: string,\n\tendpoint: string,\n\tparams?: IDataObject,\n\theaders?: RawAxiosRequestHeaders,\n) {\n\treturn await request({ method: 'PATCH', baseURL, endpoint, headers, data: params });\n}\n\nexport async function streamRequest<T extends object>(\n\tcontext: IRestApiContext,\n\tapiEndpoint: string,\n\tpayload: object,\n\tonChunk?: (chunk: T) => void,\n\tonDone?: () => void,\n\tonError?: (e: Error) => void,\n\tseparator = STREAM_SEPARATOR,\n\tabortSignal?: AbortSignal,\n): Promise<void> {\n\tlet onErrorOnce: ((e: Error) => void) | undefined = (e: Error) => {\n\t\tonErrorOnce = undefined;\n\t\tonError?.(e);\n\t};\n\tconst headers: Record<string, string> = {\n\t\t'browser-id': getBrowserId(),\n\t\t'Content-Type': 'application/json',\n\t};\n\tconst assistantRequest: RequestInit = {\n\t\theaders,\n\t\tmethod: 'POST',\n\t\tcredentials: 'include',\n\t\tbody: JSON.stringify(payload),\n\t\tsignal: abortSignal,\n\t};\n\ttry {\n\t\tconst response = await fetch(`${context.baseUrl}${apiEndpoint}`, assistantRequest);\n\n\t\tif (response.body) {\n\t\t\t// Handle the streaming response\n\t\t\tconst reader = response.body.getReader();\n\t\t\tconst decoder = new TextDecoder('utf-8');\n\n\t\t\tlet buffer = '';\n\n\t\t\tasync function readStream() {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) {\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tonErrorOnce?.(\n\t\t\t\t\t\t\tnew ResponseError(response.statusText, {\n\t\t\t\t\t\t\t\thttpStatusCode: response.status,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (buffer.trim()) {\n\t\t\t\t\t\t// The stream ended with leftover content that never parsed as JSON.\n\t\t\t\t\t\t// A JSON-like fragment means the stream was cut off mid-chunk;\n\t\t\t\t\t\t// anything else is a plain-text error body from an upstream\n\t\t\t\t\t\t// service — surface its content instead of silently dropping it.\n\t\t\t\t\t\tconst leftover = buffer.trim();\n\t\t\t\t\t\tconst message = /^[[{]/.test(leftover) ? 'Connection lost' : leftover.slice(0, 256);\n\t\t\t\t\t\tonErrorOnce?.(new Error(message));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonDone?.();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst chunk = decoder.decode(value);\n\t\t\t\tbuffer += chunk;\n\n\t\t\t\tconst splitChunks = buffer.split(separator);\n\n\t\t\t\tbuffer = '';\n\t\t\t\tfor (const splitChunk of splitChunks) {\n\t\t\t\t\tif (splitChunk) {\n\t\t\t\t\t\tlet data: T;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdata = jsonParse<T>(splitChunk, { errorMessage: 'Invalid json' });\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t// incomplete json. append to buffer to complete\n\t\t\t\t\t\t\tbuffer += splitChunk;\n\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\t\t\t// Call chunk callback if request was successful\n\t\t\t\t\t\t\t\tonChunk?.(data);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Otherwise, call error callback\n\t\t\t\t\t\t\t\tconst message = 'message' in data ? data.message : response.statusText;\n\t\t\t\t\t\t\t\tonErrorOnce?.(\n\t\t\t\t\t\t\t\t\tnew ResponseError(String(message), {\n\t\t\t\t\t\t\t\t\t\thttpStatusCode: response.status,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\t\t\tonErrorOnce?.(e);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait readStream();\n\t\t\t}\n\n\t\t\t// Start reading the stream\n\t\t\tawait readStream();\n\t\t} else if (onErrorOnce) {\n\t\t\tonErrorOnce(new Error(response.statusText));\n\t\t}\n\t} catch (e: unknown) {\n\t\tassert(e instanceof Error);\n\t\tonErrorOnce?.(e);\n\t}\n}\n"],"mappings":"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"}
package/dist/utils2.d.cts CHANGED
@@ -22,6 +22,8 @@ declare class ResponseError extends Error {
22
22
  hint?: ResponseError['hint'];
23
23
  });
24
24
  }
25
+ type UnauthorizedHandler = (baseURL: string) => void;
26
+ declare function setUnauthorizedHandler(handler: UnauthorizedHandler): void;
25
27
  declare function request(config: {
26
28
  method: Method;
27
29
  baseURL: string;
@@ -40,5 +42,5 @@ declare function post(baseURL: string, endpoint: string, params?: IDataObject, h
40
42
  declare function patch(baseURL: string, endpoint: string, params?: IDataObject, headers?: RawAxiosRequestHeaders): Promise<any>;
41
43
  declare function streamRequest<T extends object>(context: IRestApiContext, apiEndpoint: string, payload: object, onChunk?: (chunk: T) => void, onDone?: () => void, onError?: (e: Error) => void, separator?: string, abortSignal?: AbortSignal): Promise<void>;
42
44
  //#endregion
43
- export { get as a, patch as c, streamRequest as d, STREAM_SEPARATOR as i, post as l, NO_NETWORK_ERROR_CODE as n, getFullApiResponse as o, ResponseError as r, makeRestApiRequest as s, MfaRequiredError as t, request as u };
45
+ export { UnauthorizedHandler as a, makeRestApiRequest as c, request as d, setUnauthorizedHandler as f, STREAM_SEPARATOR as i, patch as l, NO_NETWORK_ERROR_CODE as n, get as o, streamRequest as p, ResponseError as r, getFullApiResponse as s, MfaRequiredError as t, post as u };
44
46
  //# sourceMappingURL=utils2.d.cts.map
package/dist/utils2.d.mts CHANGED
@@ -22,6 +22,8 @@ declare class ResponseError extends Error {
22
22
  hint?: ResponseError['hint'];
23
23
  });
24
24
  }
25
+ type UnauthorizedHandler = (baseURL: string) => void;
26
+ declare function setUnauthorizedHandler(handler: UnauthorizedHandler): void;
25
27
  declare function request(config: {
26
28
  method: Method;
27
29
  baseURL: string;
@@ -40,5 +42,5 @@ declare function post(baseURL: string, endpoint: string, params?: IDataObject, h
40
42
  declare function patch(baseURL: string, endpoint: string, params?: IDataObject, headers?: RawAxiosRequestHeaders): Promise<any>;
41
43
  declare function streamRequest<T extends object>(context: IRestApiContext, apiEndpoint: string, payload: object, onChunk?: (chunk: T) => void, onDone?: () => void, onError?: (e: Error) => void, separator?: string, abortSignal?: AbortSignal): Promise<void>;
42
44
  //#endregion
43
- export { get as a, patch as c, streamRequest as d, STREAM_SEPARATOR as i, post as l, NO_NETWORK_ERROR_CODE as n, getFullApiResponse as o, ResponseError as r, makeRestApiRequest as s, MfaRequiredError as t, request as u };
45
+ export { UnauthorizedHandler as a, makeRestApiRequest as c, request as d, setUnauthorizedHandler as f, STREAM_SEPARATOR as i, patch as l, NO_NETWORK_ERROR_CODE as n, get as o, streamRequest as p, ResponseError as r, getFullApiResponse as s, MfaRequiredError as t, post as u };
44
46
  //# sourceMappingURL=utils2.d.mts.map
package/dist/utils2.mjs CHANGED
@@ -1,17 +1,9 @@
1
- import { BROWSER_ID_STORAGE_KEY } from "@n8n/constants";
1
+ import { getBrowserId } from "@n8n/constants";
2
2
  import { assert } from "@n8n/utils/assert";
3
3
  import axios from "axios";
4
4
  import { jsonParse } from "n8n-workflow";
5
5
 
6
6
  //#region src/utils.ts
7
- const getBrowserId = () => {
8
- let browserId = localStorage.getItem(BROWSER_ID_STORAGE_KEY);
9
- if (!browserId) {
10
- browserId = crypto.randomUUID();
11
- localStorage.setItem(BROWSER_ID_STORAGE_KEY, browserId);
12
- }
13
- return browserId;
14
- };
15
7
  const NO_NETWORK_ERROR_CODE = 999;
16
8
  const STREAM_SEPARATOR = "⧉⇋⇋➽⌑⧉§§\n";
17
9
  var MfaRequiredError = class extends Error {
@@ -46,6 +38,10 @@ var ResponseError = class extends Error {
46
38
  if (hint) this.hint = hint;
47
39
  }
48
40
  };
41
+ let unauthorizedHandler;
42
+ function setUnauthorizedHandler(handler) {
43
+ unauthorizedHandler = handler;
44
+ }
49
45
  const legacyParamSerializer = (params) => Object.keys(params).filter((key) => params[key] !== void 0).map((key) => {
50
46
  if (Array.isArray(params[key])) return params[key].map((v) => `${key}[]=${encodeURIComponent(v)}`).join("&");
51
47
  if (typeof params[key] === "object") params[key] = JSON.stringify(params[key]);
@@ -76,6 +72,7 @@ async function request(config) {
76
72
  if (error.message === "Network Error") throw new ResponseError("Can't connect to n8n.", { errorCode: NO_NETWORK_ERROR_CODE });
77
73
  const errorResponseData = error.response?.data;
78
74
  if (errorResponseData?.mfaRequired === true) throw new MfaRequiredError();
75
+ if (error.response?.status === 401) unauthorizedHandler?.(baseURL);
79
76
  if (errorResponseData?.message !== void 0) {
80
77
  if (errorResponseData.name === "NodeApiError") {
81
78
  errorResponseData.httpStatusCode = error.response.status;
@@ -210,5 +207,5 @@ async function streamRequest(context, apiEndpoint, payload, onChunk, onDone, onE
210
207
  }
211
208
 
212
209
  //#endregion
213
- export { get as a, patch as c, streamRequest as d, STREAM_SEPARATOR as i, post as l, NO_NETWORK_ERROR_CODE as n, getFullApiResponse as o, ResponseError as r, makeRestApiRequest as s, MfaRequiredError as t, request as u };
210
+ export { get as a, patch as c, setUnauthorizedHandler as d, streamRequest as f, STREAM_SEPARATOR as i, post as l, NO_NETWORK_ERROR_CODE as n, getFullApiResponse as o, ResponseError as r, makeRestApiRequest as s, MfaRequiredError as t, request as u };
214
211
  //# sourceMappingURL=utils2.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils2.mjs","names":["options: AxiosRequestConfig","onErrorOnce: ((e: Error) => void) | undefined","assistantRequest: RequestInit","data: T","e: unknown"],"sources":["../src/utils.ts"],"sourcesContent":["import { BROWSER_ID_STORAGE_KEY } from '@n8n/constants';\nimport { assert } from '@n8n/utils/assert';\nimport type { AxiosRequestConfig, Method, RawAxiosRequestHeaders } from 'axios';\nimport axios from 'axios';\nimport { jsonParse } from 'n8n-workflow';\nimport type { GenericValue, IDataObject } from 'n8n-workflow';\n\nimport type { IRestApiContext } from './types';\n\nconst getBrowserId = () => {\n\tlet browserId = localStorage.getItem(BROWSER_ID_STORAGE_KEY);\n\tif (!browserId) {\n\t\tbrowserId = crypto.randomUUID();\n\t\tlocalStorage.setItem(BROWSER_ID_STORAGE_KEY, browserId);\n\t}\n\treturn browserId;\n};\n\nexport const NO_NETWORK_ERROR_CODE = 999;\nexport const STREAM_SEPARATOR = '⧉⇋⇋➽⌑⧉§§\\n';\n\nexport class MfaRequiredError extends Error {\n\tconstructor() {\n\t\tsuper('MFA is required to access this resource. Please set up MFA in your user settings.');\n\t\tthis.name = 'MfaRequiredError';\n\t}\n}\n\nexport class ResponseError extends Error {\n\t// The HTTP status code of response\n\thttpStatusCode?: number;\n\n\t// The error code in the response\n\terrorCode?: number;\n\n\t// The stack trace of the server\n\tserverStackTrace?: string;\n\n\t// Additional metadata from the server (e.g., EULA URL)\n\tmeta?: Record<string, unknown>;\n\n\t// Additional hint from the server\n\thint?: string;\n\n\t/**\n\t * Creates an instance of ResponseError.\n\t * @param {string} message The error message\n\t * @param {number} [errorCode] The error code which can be used by frontend to identify the actual error\n\t * @param {number} [httpStatusCode] The HTTP status code the response should have\n\t * @param {string} [stack] The stack trace\n\t * @param {Record<string, unknown>} [meta] Additional metadata from the server\n\t * @param {string} [hint] Additional hint from the server\n\t */\n\tconstructor(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\terrorCode?: number;\n\t\t\thttpStatusCode?: number;\n\t\t\tstack?: string;\n\t\t\tmeta?: Record<string, unknown>;\n\t\t\thint?: ResponseError['hint'];\n\t\t} = {},\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'ResponseError';\n\n\t\tconst { errorCode, httpStatusCode, stack, meta, hint } = options;\n\t\tif (errorCode) {\n\t\t\tthis.errorCode = errorCode;\n\t\t}\n\t\tif (httpStatusCode) {\n\t\t\tthis.httpStatusCode = httpStatusCode;\n\t\t}\n\t\tif (stack) {\n\t\t\tthis.serverStackTrace = stack;\n\t\t}\n\t\tif (meta) {\n\t\t\tthis.meta = meta;\n\t\t}\n\t\tif (hint) {\n\t\t\tthis.hint = hint;\n\t\t}\n\t}\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst legacyParamSerializer = (params: Record<string, any>) =>\n\tObject.keys(params)\n\t\t.filter((key) => params[key] !== undefined)\n\t\t.map((key) => {\n\t\t\tif (Array.isArray(params[key])) {\n\t\t\t\treturn params[key].map((v: string) => `${key}[]=${encodeURIComponent(v)}`).join('&');\n\t\t\t}\n\t\t\tif (typeof params[key] === 'object') {\n\t\t\t\tparams[key] = JSON.stringify(params[key]);\n\t\t\t}\n\t\t\treturn `${key}=${encodeURIComponent(params[key])}`;\n\t\t})\n\t\t.join('&');\n\nexport async function request(config: {\n\tmethod: Method;\n\tbaseURL: string;\n\tendpoint: string;\n\theaders?: RawAxiosRequestHeaders;\n\tdata?: GenericValue | GenericValue[];\n\twithCredentials?: boolean;\n}) {\n\tconst { method, baseURL, endpoint, headers, data } = config;\n\tconst options: AxiosRequestConfig = {\n\t\tmethod,\n\t\turl: endpoint,\n\t\tbaseURL,\n\t\theaders: headers ?? {},\n\t};\n\tif (baseURL.startsWith('/')) {\n\t\toptions.headers!['browser-id'] = getBrowserId();\n\t}\n\tif (\n\t\timport.meta.env.NODE_ENV !== 'production' &&\n\t\t!baseURL.includes('api.n8n.io') &&\n\t\t!baseURL.includes('n8n.cloud')\n\t) {\n\t\toptions.withCredentials = options.withCredentials ?? true;\n\t}\n\tif (['POST', 'PATCH', 'PUT'].includes(method)) {\n\t\toptions.data = data;\n\t} else if (data) {\n\t\toptions.params = data;\n\t\toptions.paramsSerializer = legacyParamSerializer;\n\t}\n\n\ttry {\n\t\tconst response = await axios.request(options);\n\t\treturn response.data;\n\t} catch (error) {\n\t\tif (error.message === 'Network Error') {\n\t\t\tthrow new ResponseError(\"Can't connect to n8n.\", {\n\t\t\t\terrorCode: NO_NETWORK_ERROR_CODE,\n\t\t\t});\n\t\t}\n\n\t\tconst errorResponseData = error.response?.data;\n\t\tif (errorResponseData?.mfaRequired === true) {\n\t\t\tthrow new MfaRequiredError();\n\t\t}\n\t\tif (errorResponseData?.message !== undefined) {\n\t\t\tif (errorResponseData.name === 'NodeApiError') {\n\t\t\t\terrorResponseData.httpStatusCode = error.response.status;\n\t\t\t\tthrow errorResponseData;\n\t\t\t}\n\n\t\t\tthrow new ResponseError(errorResponseData.message, {\n\t\t\t\terrorCode: errorResponseData.code,\n\t\t\t\thttpStatusCode: error.response.status,\n\t\t\t\tstack: errorResponseData.stack,\n\t\t\t\tmeta: errorResponseData.meta,\n\t\t\t\thint: errorResponseData.hint,\n\t\t\t});\n\t\t}\n\n\t\tthrow error;\n\t}\n}\n\n/**\n * Sends a request to the API and returns the response without extracting the data key.\n * @param context Rest API context\n * @param method HTTP method\n * @param endpoint relative path to the API endpoint\n * @param data request data\n * @returns data and total count\n */\nexport async function getFullApiResponse<T>(\n\tcontext: IRestApiContext,\n\tmethod: Method,\n\tendpoint: string,\n\tdata?: GenericValue | GenericValue[],\n) {\n\tconst response = await request({\n\t\tmethod,\n\t\tbaseURL: context.baseUrl,\n\t\tendpoint,\n\t\theaders: { 'push-ref': context.pushRef },\n\t\tdata,\n\t});\n\n\treturn response as { count: number; data: T };\n}\n\nexport async function makeRestApiRequest<T>(\n\tcontext: IRestApiContext,\n\tmethod: Method,\n\tendpoint: string,\n\tdata?: GenericValue | GenericValue[],\n) {\n\tconst response = await request({\n\t\tmethod,\n\t\tbaseURL: context.baseUrl,\n\t\tendpoint,\n\t\theaders: { 'push-ref': context.pushRef },\n\t\tdata,\n\t});\n\n\t// All cli rest api endpoints return data wrapped in `data` key\n\treturn response.data as T;\n}\n\nexport async function get(\n\tbaseURL: string,\n\tendpoint: string,\n\tparams?: IDataObject,\n\theaders?: RawAxiosRequestHeaders,\n) {\n\treturn await request({ method: 'GET', baseURL, endpoint, headers, data: params });\n}\n\nexport async function post(\n\tbaseURL: string,\n\tendpoint: string,\n\tparams?: IDataObject,\n\theaders?: RawAxiosRequestHeaders,\n) {\n\treturn await request({ method: 'POST', baseURL, endpoint, headers, data: params });\n}\n\nexport async function patch(\n\tbaseURL: string,\n\tendpoint: string,\n\tparams?: IDataObject,\n\theaders?: RawAxiosRequestHeaders,\n) {\n\treturn await request({ method: 'PATCH', baseURL, endpoint, headers, data: params });\n}\n\nexport async function streamRequest<T extends object>(\n\tcontext: IRestApiContext,\n\tapiEndpoint: string,\n\tpayload: object,\n\tonChunk?: (chunk: T) => void,\n\tonDone?: () => void,\n\tonError?: (e: Error) => void,\n\tseparator = STREAM_SEPARATOR,\n\tabortSignal?: AbortSignal,\n): Promise<void> {\n\tlet onErrorOnce: ((e: Error) => void) | undefined = (e: Error) => {\n\t\tonErrorOnce = undefined;\n\t\tonError?.(e);\n\t};\n\tconst headers: Record<string, string> = {\n\t\t'browser-id': getBrowserId(),\n\t\t'Content-Type': 'application/json',\n\t};\n\tconst assistantRequest: RequestInit = {\n\t\theaders,\n\t\tmethod: 'POST',\n\t\tcredentials: 'include',\n\t\tbody: JSON.stringify(payload),\n\t\tsignal: abortSignal,\n\t};\n\ttry {\n\t\tconst response = await fetch(`${context.baseUrl}${apiEndpoint}`, assistantRequest);\n\n\t\tif (response.body) {\n\t\t\t// Handle the streaming response\n\t\t\tconst reader = response.body.getReader();\n\t\t\tconst decoder = new TextDecoder('utf-8');\n\n\t\t\tlet buffer = '';\n\n\t\t\tasync function readStream() {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) {\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tonErrorOnce?.(\n\t\t\t\t\t\t\tnew ResponseError(response.statusText, {\n\t\t\t\t\t\t\t\thttpStatusCode: response.status,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (buffer.trim()) {\n\t\t\t\t\t\t// The stream ended with leftover content that never parsed as JSON.\n\t\t\t\t\t\t// A JSON-like fragment means the stream was cut off mid-chunk;\n\t\t\t\t\t\t// anything else is a plain-text error body from an upstream\n\t\t\t\t\t\t// service — surface its content instead of silently dropping it.\n\t\t\t\t\t\tconst leftover = buffer.trim();\n\t\t\t\t\t\tconst message = /^[[{]/.test(leftover) ? 'Connection lost' : leftover.slice(0, 256);\n\t\t\t\t\t\tonErrorOnce?.(new Error(message));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonDone?.();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst chunk = decoder.decode(value);\n\t\t\t\tbuffer += chunk;\n\n\t\t\t\tconst splitChunks = buffer.split(separator);\n\n\t\t\t\tbuffer = '';\n\t\t\t\tfor (const splitChunk of splitChunks) {\n\t\t\t\t\tif (splitChunk) {\n\t\t\t\t\t\tlet data: T;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdata = jsonParse<T>(splitChunk, { errorMessage: 'Invalid json' });\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t// incomplete json. append to buffer to complete\n\t\t\t\t\t\t\tbuffer += splitChunk;\n\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\t\t\t// Call chunk callback if request was successful\n\t\t\t\t\t\t\t\tonChunk?.(data);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Otherwise, call error callback\n\t\t\t\t\t\t\t\tconst message = 'message' in data ? data.message : response.statusText;\n\t\t\t\t\t\t\t\tonErrorOnce?.(\n\t\t\t\t\t\t\t\t\tnew ResponseError(String(message), {\n\t\t\t\t\t\t\t\t\t\thttpStatusCode: response.status,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\t\t\tonErrorOnce?.(e);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait readStream();\n\t\t\t}\n\n\t\t\t// Start reading the stream\n\t\t\tawait readStream();\n\t\t} else if (onErrorOnce) {\n\t\t\tonErrorOnce(new Error(response.statusText));\n\t\t}\n\t} catch (e: unknown) {\n\t\tassert(e instanceof Error);\n\t\tonErrorOnce?.(e);\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils2.mjs","names":["unauthorizedHandler: UnauthorizedHandler | undefined","options: AxiosRequestConfig","onErrorOnce: ((e: Error) => void) | undefined","assistantRequest: RequestInit","data: T","e: unknown"],"sources":["../src/utils.ts"],"sourcesContent":["import { getBrowserId } from '@n8n/constants';\nimport { assert } from '@n8n/utils/assert';\nimport type { AxiosRequestConfig, Method, RawAxiosRequestHeaders } from 'axios';\nimport axios from 'axios';\nimport { jsonParse } from 'n8n-workflow';\nimport type { GenericValue, IDataObject } from 'n8n-workflow';\n\nimport type { IRestApiContext } from './types';\n\nexport const NO_NETWORK_ERROR_CODE = 999;\nexport const STREAM_SEPARATOR = '⧉⇋⇋➽⌑⧉§§\\n';\n\nexport class MfaRequiredError extends Error {\n\tconstructor() {\n\t\tsuper('MFA is required to access this resource. Please set up MFA in your user settings.');\n\t\tthis.name = 'MfaRequiredError';\n\t}\n}\n\nexport class ResponseError extends Error {\n\t// The HTTP status code of response\n\thttpStatusCode?: number;\n\n\t// The error code in the response\n\terrorCode?: number;\n\n\t// The stack trace of the server\n\tserverStackTrace?: string;\n\n\t// Additional metadata from the server (e.g., EULA URL)\n\tmeta?: Record<string, unknown>;\n\n\t// Additional hint from the server\n\thint?: string;\n\n\t/**\n\t * Creates an instance of ResponseError.\n\t * @param {string} message The error message\n\t * @param {number} [errorCode] The error code which can be used by frontend to identify the actual error\n\t * @param {number} [httpStatusCode] The HTTP status code the response should have\n\t * @param {string} [stack] The stack trace\n\t * @param {Record<string, unknown>} [meta] Additional metadata from the server\n\t * @param {string} [hint] Additional hint from the server\n\t */\n\tconstructor(\n\t\tmessage: string,\n\t\toptions: {\n\t\t\terrorCode?: number;\n\t\t\thttpStatusCode?: number;\n\t\t\tstack?: string;\n\t\t\tmeta?: Record<string, unknown>;\n\t\t\thint?: ResponseError['hint'];\n\t\t} = {},\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'ResponseError';\n\n\t\tconst { errorCode, httpStatusCode, stack, meta, hint } = options;\n\t\tif (errorCode) {\n\t\t\tthis.errorCode = errorCode;\n\t\t}\n\t\tif (httpStatusCode) {\n\t\t\tthis.httpStatusCode = httpStatusCode;\n\t\t}\n\t\tif (stack) {\n\t\t\tthis.serverStackTrace = stack;\n\t\t}\n\t\tif (meta) {\n\t\t\tthis.meta = meta;\n\t\t}\n\t\tif (hint) {\n\t\t\tthis.hint = hint;\n\t\t}\n\t}\n}\n\nexport type UnauthorizedHandler = (baseURL: string) => void;\nlet unauthorizedHandler: UnauthorizedHandler | undefined;\n\n// Called on every 401 from request() below, with its baseURL, so non-n8n hosts can be ignored.\nexport function setUnauthorizedHandler(handler: UnauthorizedHandler): void {\n\tunauthorizedHandler = handler;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst legacyParamSerializer = (params: Record<string, any>) =>\n\tObject.keys(params)\n\t\t.filter((key) => params[key] !== undefined)\n\t\t.map((key) => {\n\t\t\tif (Array.isArray(params[key])) {\n\t\t\t\treturn params[key].map((v: string) => `${key}[]=${encodeURIComponent(v)}`).join('&');\n\t\t\t}\n\t\t\tif (typeof params[key] === 'object') {\n\t\t\t\tparams[key] = JSON.stringify(params[key]);\n\t\t\t}\n\t\t\treturn `${key}=${encodeURIComponent(params[key])}`;\n\t\t})\n\t\t.join('&');\n\nexport async function request(config: {\n\tmethod: Method;\n\tbaseURL: string;\n\tendpoint: string;\n\theaders?: RawAxiosRequestHeaders;\n\tdata?: GenericValue | GenericValue[];\n\twithCredentials?: boolean;\n}) {\n\tconst { method, baseURL, endpoint, headers, data } = config;\n\tconst options: AxiosRequestConfig = {\n\t\tmethod,\n\t\turl: endpoint,\n\t\tbaseURL,\n\t\theaders: headers ?? {},\n\t};\n\tif (baseURL.startsWith('/')) {\n\t\toptions.headers!['browser-id'] = getBrowserId();\n\t}\n\tif (\n\t\timport.meta.env.NODE_ENV !== 'production' &&\n\t\t!baseURL.includes('api.n8n.io') &&\n\t\t!baseURL.includes('n8n.cloud')\n\t) {\n\t\toptions.withCredentials = options.withCredentials ?? true;\n\t}\n\tif (['POST', 'PATCH', 'PUT'].includes(method)) {\n\t\toptions.data = data;\n\t} else if (data) {\n\t\toptions.params = data;\n\t\toptions.paramsSerializer = legacyParamSerializer;\n\t}\n\n\ttry {\n\t\tconst response = await axios.request(options);\n\t\treturn response.data;\n\t} catch (error) {\n\t\tif (error.message === 'Network Error') {\n\t\t\tthrow new ResponseError(\"Can't connect to n8n.\", {\n\t\t\t\terrorCode: NO_NETWORK_ERROR_CODE,\n\t\t\t});\n\t\t}\n\n\t\tconst errorResponseData = error.response?.data;\n\t\tif (errorResponseData?.mfaRequired === true) {\n\t\t\tthrow new MfaRequiredError();\n\t\t}\n\n\t\t// After mfaRequired: that 401 means valid-but-unenrolled, not expired.\n\t\tif (error.response?.status === 401) {\n\t\t\tunauthorizedHandler?.(baseURL);\n\t\t}\n\n\t\tif (errorResponseData?.message !== undefined) {\n\t\t\tif (errorResponseData.name === 'NodeApiError') {\n\t\t\t\terrorResponseData.httpStatusCode = error.response.status;\n\t\t\t\tthrow errorResponseData;\n\t\t\t}\n\n\t\t\tthrow new ResponseError(errorResponseData.message, {\n\t\t\t\terrorCode: errorResponseData.code,\n\t\t\t\thttpStatusCode: error.response.status,\n\t\t\t\tstack: errorResponseData.stack,\n\t\t\t\tmeta: errorResponseData.meta,\n\t\t\t\thint: errorResponseData.hint,\n\t\t\t});\n\t\t}\n\n\t\tthrow error;\n\t}\n}\n\n/**\n * Sends a request to the API and returns the response without extracting the data key.\n * @param context Rest API context\n * @param method HTTP method\n * @param endpoint relative path to the API endpoint\n * @param data request data\n * @returns data and total count\n */\nexport async function getFullApiResponse<T>(\n\tcontext: IRestApiContext,\n\tmethod: Method,\n\tendpoint: string,\n\tdata?: GenericValue | GenericValue[],\n) {\n\tconst response = await request({\n\t\tmethod,\n\t\tbaseURL: context.baseUrl,\n\t\tendpoint,\n\t\theaders: { 'push-ref': context.pushRef },\n\t\tdata,\n\t});\n\n\treturn response as { count: number; data: T };\n}\n\nexport async function makeRestApiRequest<T>(\n\tcontext: IRestApiContext,\n\tmethod: Method,\n\tendpoint: string,\n\tdata?: GenericValue | GenericValue[],\n) {\n\tconst response = await request({\n\t\tmethod,\n\t\tbaseURL: context.baseUrl,\n\t\tendpoint,\n\t\theaders: { 'push-ref': context.pushRef },\n\t\tdata,\n\t});\n\n\t// All cli rest api endpoints return data wrapped in `data` key\n\treturn response.data as T;\n}\n\nexport async function get(\n\tbaseURL: string,\n\tendpoint: string,\n\tparams?: IDataObject,\n\theaders?: RawAxiosRequestHeaders,\n) {\n\treturn await request({ method: 'GET', baseURL, endpoint, headers, data: params });\n}\n\nexport async function post(\n\tbaseURL: string,\n\tendpoint: string,\n\tparams?: IDataObject,\n\theaders?: RawAxiosRequestHeaders,\n) {\n\treturn await request({ method: 'POST', baseURL, endpoint, headers, data: params });\n}\n\nexport async function patch(\n\tbaseURL: string,\n\tendpoint: string,\n\tparams?: IDataObject,\n\theaders?: RawAxiosRequestHeaders,\n) {\n\treturn await request({ method: 'PATCH', baseURL, endpoint, headers, data: params });\n}\n\nexport async function streamRequest<T extends object>(\n\tcontext: IRestApiContext,\n\tapiEndpoint: string,\n\tpayload: object,\n\tonChunk?: (chunk: T) => void,\n\tonDone?: () => void,\n\tonError?: (e: Error) => void,\n\tseparator = STREAM_SEPARATOR,\n\tabortSignal?: AbortSignal,\n): Promise<void> {\n\tlet onErrorOnce: ((e: Error) => void) | undefined = (e: Error) => {\n\t\tonErrorOnce = undefined;\n\t\tonError?.(e);\n\t};\n\tconst headers: Record<string, string> = {\n\t\t'browser-id': getBrowserId(),\n\t\t'Content-Type': 'application/json',\n\t};\n\tconst assistantRequest: RequestInit = {\n\t\theaders,\n\t\tmethod: 'POST',\n\t\tcredentials: 'include',\n\t\tbody: JSON.stringify(payload),\n\t\tsignal: abortSignal,\n\t};\n\ttry {\n\t\tconst response = await fetch(`${context.baseUrl}${apiEndpoint}`, assistantRequest);\n\n\t\tif (response.body) {\n\t\t\t// Handle the streaming response\n\t\t\tconst reader = response.body.getReader();\n\t\t\tconst decoder = new TextDecoder('utf-8');\n\n\t\t\tlet buffer = '';\n\n\t\t\tasync function readStream() {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) {\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tonErrorOnce?.(\n\t\t\t\t\t\t\tnew ResponseError(response.statusText, {\n\t\t\t\t\t\t\t\thttpStatusCode: response.status,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (buffer.trim()) {\n\t\t\t\t\t\t// The stream ended with leftover content that never parsed as JSON.\n\t\t\t\t\t\t// A JSON-like fragment means the stream was cut off mid-chunk;\n\t\t\t\t\t\t// anything else is a plain-text error body from an upstream\n\t\t\t\t\t\t// service — surface its content instead of silently dropping it.\n\t\t\t\t\t\tconst leftover = buffer.trim();\n\t\t\t\t\t\tconst message = /^[[{]/.test(leftover) ? 'Connection lost' : leftover.slice(0, 256);\n\t\t\t\t\t\tonErrorOnce?.(new Error(message));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonDone?.();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst chunk = decoder.decode(value);\n\t\t\t\tbuffer += chunk;\n\n\t\t\t\tconst splitChunks = buffer.split(separator);\n\n\t\t\t\tbuffer = '';\n\t\t\t\tfor (const splitChunk of splitChunks) {\n\t\t\t\t\tif (splitChunk) {\n\t\t\t\t\t\tlet data: T;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdata = jsonParse<T>(splitChunk, { errorMessage: 'Invalid json' });\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t// incomplete json. append to buffer to complete\n\t\t\t\t\t\t\tbuffer += splitChunk;\n\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\t\t\t// Call chunk callback if request was successful\n\t\t\t\t\t\t\t\tonChunk?.(data);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Otherwise, call error callback\n\t\t\t\t\t\t\t\tconst message = 'message' in data ? data.message : response.statusText;\n\t\t\t\t\t\t\t\tonErrorOnce?.(\n\t\t\t\t\t\t\t\t\tnew ResponseError(String(message), {\n\t\t\t\t\t\t\t\t\t\thttpStatusCode: response.status,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\t\tif (e instanceof Error) {\n\t\t\t\t\t\t\t\tonErrorOnce?.(e);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait readStream();\n\t\t\t}\n\n\t\t\t// Start reading the stream\n\t\t\tawait readStream();\n\t\t} else if (onErrorOnce) {\n\t\t\tonErrorOnce(new Error(response.statusText));\n\t\t}\n\t} catch (e: unknown) {\n\t\tassert(e instanceof Error);\n\t\tonErrorOnce?.(e);\n\t}\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@n8n/rest-api-client",
3
3
  "type": "module",
4
- "version": "2.35.3",
4
+ "version": "2.36.1",
5
5
  "files": [
6
6
  "dist",
7
7
  "LICENSE.md",
@@ -26,11 +26,11 @@
26
26
  "js-base64": "3.7.8",
27
27
  "axios": "1.18.0",
28
28
  "flatted": "3.4.2",
29
- "@n8n/api-types": "1.35.3",
30
- "@n8n/constants": "0.34.0",
31
- "@n8n/permissions": "0.72.0",
32
- "n8n-workflow": "2.35.2",
33
- "@n8n/utils": "1.43.1"
29
+ "@n8n/api-types": "1.36.1",
30
+ "@n8n/permissions": "0.73.0",
31
+ "@n8n/constants": "0.35.0",
32
+ "@n8n/utils": "1.44.0",
33
+ "n8n-workflow": "2.36.1"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@testing-library/jest-dom": "^6.6.3",
@@ -41,10 +41,10 @@
41
41
  "vitest": "^4.1.9",
42
42
  "vue-tsc": "^2.2.8",
43
43
  "@n8n/eslint-config": "0.0.1",
44
- "@n8n/i18n": "2.35.3",
45
- "@n8n/typescript-config": "1.9.0",
46
44
  "@n8n/playwright-janitor": "0.1.0",
47
- "@n8n/vitest-config": "1.20.0"
45
+ "@n8n/i18n": "2.36.1",
46
+ "@n8n/typescript-config": "1.10.0",
47
+ "@n8n/vitest-config": "1.21.0"
48
48
  },
49
49
  "license": "SEE LICENSE IN LICENSE.md",
50
50
  "homepage": "https://n8n.io",