n8n-nodes-pocketbase 1.1.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -6
- package/dist/credentials/PocketbaseHttpApi.credentials.d.ts +1 -1
- package/dist/credentials/PocketbaseHttpApi.credentials.js +36 -41
- package/dist/credentials/PocketbaseHttpApi.credentials.js.map +1 -1
- package/dist/nodes/{PocketbaseHttp → Common}/GenericFunctions.d.ts +4 -3
- package/dist/nodes/Common/GenericFunctions.js +85 -0
- package/dist/nodes/Common/GenericFunctions.js.map +1 -0
- package/dist/nodes/{PocketbaseHttp → Common}/LoadOptions.d.ts +1 -1
- package/dist/nodes/Common/LoadOptions.js +124 -0
- package/dist/nodes/Common/LoadOptions.js.map +1 -0
- package/dist/nodes/Common/PocketbaseAuth.d.ts +10 -0
- package/dist/nodes/Common/PocketbaseAuth.js +122 -0
- package/dist/nodes/Common/PocketbaseAuth.js.map +1 -0
- package/dist/nodes/{PocketbaseHttp → Common}/RequestBodyFunctions.d.ts +1 -1
- package/dist/nodes/Common/RequestBodyFunctions.js +131 -0
- package/dist/nodes/Common/RequestBodyFunctions.js.map +1 -0
- package/dist/nodes/PocketbaseHttp/PocketbaseHttp.node.d.ts +1 -1
- package/dist/nodes/PocketbaseHttp/PocketbaseHttp.node.js +118 -117
- package/dist/nodes/PocketbaseHttp/PocketbaseHttp.node.js.map +1 -1
- package/dist/nodes/PocketbaseHttp/PocketbaseHttp.node.json +2 -2
- package/dist/nodes/PocketbaseTrigger/PocketbaseTrigger.node.d.ts +13 -0
- package/dist/nodes/PocketbaseTrigger/PocketbaseTrigger.node.js +239 -0
- package/dist/nodes/PocketbaseTrigger/PocketbaseTrigger.node.js.map +1 -0
- package/dist/nodes/PocketbaseTrigger/PocketbaseTrigger.node.json +18 -0
- package/dist/nodes/PocketbaseTrigger/pocketbaseTrigger.dark.svg +10 -0
- package/dist/nodes/PocketbaseTrigger/pocketbaseTrigger.svg +10 -0
- package/dist/package.json +35 -19
- package/dist/tests/GenericFunctions.spec.d.ts +1 -0
- package/dist/tests/GenericFunctions.spec.js +177 -0
- package/dist/tests/GenericFunctions.spec.js.map +1 -0
- package/dist/tests/PocketbaseAuth.spec.d.ts +1 -0
- package/dist/tests/PocketbaseAuth.spec.js +105 -0
- package/dist/tests/PocketbaseAuth.spec.js.map +1 -0
- package/dist/tests/PocketbaseAuthIntegration.spec.d.ts +1 -0
- package/dist/tests/PocketbaseAuthIntegration.spec.js +202 -0
- package/dist/tests/PocketbaseAuthIntegration.spec.js.map +1 -0
- package/dist/tests/PocketbaseTrigger.spec.d.ts +1 -0
- package/dist/tests/PocketbaseTrigger.spec.js +243 -0
- package/dist/tests/PocketbaseTrigger.spec.js.map +1 -0
- package/dist/tests/PocketbaseTriggerIntegration.spec.d.ts +1 -0
- package/dist/tests/PocketbaseTriggerIntegration.spec.js +125 -0
- package/dist/tests/PocketbaseTriggerIntegration.spec.js.map +1 -0
- package/dist/tests/RequestBodyFunctions.spec.d.ts +1 -0
- package/dist/tests/RequestBodyFunctions.spec.js +232 -0
- package/dist/tests/RequestBodyFunctions.spec.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.js +11 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +35 -19
- package/dist/nodes/PocketbaseHttp/GenericFunctions.js +0 -42
- package/dist/nodes/PocketbaseHttp/GenericFunctions.js.map +0 -1
- package/dist/nodes/PocketbaseHttp/LoadOptions.js +0 -92
- package/dist/nodes/PocketbaseHttp/LoadOptions.js.map +0 -1
- package/dist/nodes/PocketbaseHttp/RequestBodyFunctions.js +0 -53
- package/dist/nodes/PocketbaseHttp/RequestBodyFunctions.js.map +0 -1
package/README.md
CHANGED
|
@@ -7,10 +7,23 @@ PocketBase is an open source backend consisting of embedded database (SQLite) wi
|
|
|
7
7
|
[n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/reference/license/) workflow automation platform.
|
|
8
8
|
|
|
9
9
|
[Installation](#installation)
|
|
10
|
+
[Usage Tips](#usage-tips)
|
|
10
11
|
[Operations](#operations)
|
|
11
12
|
[Credentials](#credentials)
|
|
12
13
|
[Compatibility](#compatibility)
|
|
13
|
-
[
|
|
14
|
+
[Development](#development)
|
|
15
|
+
[Resources](#resources)
|
|
16
|
+
|
|
17
|
+
## Usage Tips
|
|
18
|
+
|
|
19
|
+
### Clearing Fields
|
|
20
|
+
To clear a field (set it to its zero-value or delete a file), you can send `null` as the value:
|
|
21
|
+
- **Text/Number/Select/Relation**: Use an expression to return `null` to clear the field.
|
|
22
|
+
- **JSON**: Use `null` to store a literal null value.
|
|
23
|
+
- **File**: Use `null` to delete the existing file.
|
|
24
|
+
|
|
25
|
+
In the **Fields** parameter, use an expression: `={{ null }}`.
|
|
26
|
+
In the **JSON Body**, use the literal `null`: `{"myField": null}`.
|
|
14
27
|
|
|
15
28
|
## Installation
|
|
16
29
|
|
|
@@ -20,19 +33,37 @@ Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes
|
|
|
20
33
|
|
|
21
34
|
Nearly all PocketBase operations for Base collections should be implemented.
|
|
22
35
|
|
|
36
|
+
### Trigger Node (Beta)
|
|
37
|
+
|
|
38
|
+
This node allows you to subscribe to PocketBase events (create, update, delete) in real-time via Server-Sent Events (SSE).
|
|
39
|
+
|
|
40
|
+
**Note**: The trigger node is currently in Beta. We've implemented basic reconnection logic, but it may still be sensitive to network interruptions or large amounts of data. Please use with caution in production.
|
|
41
|
+
|
|
23
42
|
## Credentials
|
|
24
43
|
|
|
25
44
|
Ensure you have an Auth collection in your PocketBase defined and the "Username/Password" Auth method turned on.
|
|
26
|
-
Alternatively, you can use your administrator account and the "_superusers" collection which PocketBase creates automatically since [v0.23.0](https://github.com/pocketbase/pocketbase/releases/tag/v0.23.0).
|
|
45
|
+
Alternatively, you can use your administrator account and the "\_superusers" collection which PocketBase creates automatically since [v0.23.0](https://github.com/pocketbase/pocketbase/releases/tag/v0.23.0).
|
|
27
46
|
|
|
28
47
|
## Compatibility
|
|
29
48
|
|
|
30
|
-
This was developed for version
|
|
49
|
+
This was developed for version 2.17.5 of n8n and version 0.37.2 of PocketBase.
|
|
31
50
|
|
|
32
|
-
##
|
|
51
|
+
## Development
|
|
52
|
+
|
|
53
|
+
This project uses modern tooling for development:
|
|
33
54
|
|
|
34
|
-
|
|
35
|
-
|
|
55
|
+
- **Linting**: [oxlint](https://oxc.rs/docs/guide/usage/linter.html) for fast linting.
|
|
56
|
+
- **Formatting**: [oxfmt](https://oxc.rs/docs/guide/usage/formatter.html) for fast formatting.
|
|
57
|
+
- **Testing**: [vitest](https://vitest.dev/) for unit and integration tests.
|
|
36
58
|
|
|
59
|
+
### Scripts
|
|
37
60
|
|
|
61
|
+
- `npm run lint`: Lint the project.
|
|
62
|
+
- `npm run format`: Format the project.
|
|
63
|
+
- `npm test`: Run tests.
|
|
64
|
+
- `npm run test:pipeline`: Run a full integration test against a PocketBase instance in Docker and update the compatibility section in `README.md`.
|
|
65
|
+
|
|
66
|
+
## Resources
|
|
38
67
|
|
|
68
|
+
- [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
|
|
69
|
+
- [PocketBase Introduction](https://pocketbase.io/docs/)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IAuthenticate, IconFile, ICredentialDataDecryptedObject, ICredentialTestRequest, ICredentialType, IHttpRequestHelper, INodeProperties } from
|
|
1
|
+
import { IAuthenticate, IconFile, ICredentialDataDecryptedObject, ICredentialTestRequest, ICredentialType, IHttpRequestHelper, INodeProperties } from "n8n-workflow";
|
|
2
2
|
export declare class PocketbaseHttpApi implements ICredentialType {
|
|
3
3
|
name: string;
|
|
4
4
|
displayName: string;
|
|
@@ -1,95 +1,90 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PocketbaseHttpApi = void 0;
|
|
4
|
+
const PocketbaseAuth_1 = require("../nodes/Common/PocketbaseAuth");
|
|
4
5
|
class PocketbaseHttpApi {
|
|
5
6
|
constructor() {
|
|
6
|
-
this.name =
|
|
7
|
-
this.displayName =
|
|
8
|
-
this.documentationUrl =
|
|
7
|
+
this.name = "pocketbaseHttpApi";
|
|
8
|
+
this.displayName = "PocketBase HTTP API";
|
|
9
|
+
this.documentationUrl = "https://pocketbase.io/docs/authentication/";
|
|
9
10
|
this.properties = [
|
|
10
11
|
{
|
|
11
|
-
displayName:
|
|
12
|
-
name:
|
|
13
|
-
type:
|
|
14
|
-
default:
|
|
12
|
+
displayName: "URL",
|
|
13
|
+
name: "url",
|
|
14
|
+
type: "string",
|
|
15
|
+
default: "",
|
|
15
16
|
required: true,
|
|
16
17
|
},
|
|
17
18
|
{
|
|
18
|
-
displayName:
|
|
19
|
-
name:
|
|
20
|
-
type:
|
|
21
|
-
default:
|
|
19
|
+
displayName: "Admin (_superusers) username",
|
|
20
|
+
name: "username",
|
|
21
|
+
type: "string",
|
|
22
|
+
default: "",
|
|
22
23
|
required: true,
|
|
23
24
|
},
|
|
24
25
|
{
|
|
25
|
-
displayName:
|
|
26
|
-
name:
|
|
27
|
-
type:
|
|
26
|
+
displayName: "Admin (_superusers) password",
|
|
27
|
+
name: "password",
|
|
28
|
+
type: "string",
|
|
28
29
|
typeOptions: {
|
|
29
30
|
password: true,
|
|
30
31
|
},
|
|
31
|
-
default:
|
|
32
|
+
default: "",
|
|
32
33
|
required: true,
|
|
33
34
|
},
|
|
34
35
|
{
|
|
35
|
-
displayName:
|
|
36
|
-
name:
|
|
37
|
-
type:
|
|
36
|
+
displayName: "Session Token",
|
|
37
|
+
name: "token",
|
|
38
|
+
type: "hidden",
|
|
38
39
|
typeOptions: {
|
|
39
40
|
expirable: true,
|
|
40
41
|
password: true,
|
|
41
42
|
},
|
|
42
|
-
default:
|
|
43
|
+
default: "",
|
|
43
44
|
},
|
|
44
45
|
];
|
|
45
46
|
this.test = {
|
|
46
47
|
request: {
|
|
47
|
-
baseURL:
|
|
48
|
-
url:
|
|
49
|
-
method:
|
|
48
|
+
baseURL: "={{$credentials?.url?.replace(/\\/$/, '')}}",
|
|
49
|
+
url: "=/api/collections/_superusers/auth-with-password",
|
|
50
|
+
method: "POST",
|
|
50
51
|
body: {
|
|
51
|
-
identity:
|
|
52
|
-
password:
|
|
52
|
+
identity: "={{$credentials?.username}}",
|
|
53
|
+
password: "={{$credentials?.password}}",
|
|
53
54
|
},
|
|
54
55
|
},
|
|
55
56
|
rules: [
|
|
56
57
|
{
|
|
57
|
-
type:
|
|
58
|
+
type: "responseCode",
|
|
58
59
|
properties: {
|
|
59
60
|
value: 200,
|
|
60
|
-
message:
|
|
61
|
+
message: "Test",
|
|
61
62
|
},
|
|
62
63
|
},
|
|
63
64
|
{
|
|
64
|
-
type:
|
|
65
|
+
type: "responseCode",
|
|
65
66
|
properties: {
|
|
66
67
|
value: 400,
|
|
67
|
-
message:
|
|
68
|
+
message: "An error occurred during login",
|
|
68
69
|
},
|
|
69
70
|
},
|
|
70
71
|
],
|
|
71
72
|
};
|
|
72
73
|
this.authenticate = {
|
|
73
|
-
type:
|
|
74
|
+
type: "generic",
|
|
74
75
|
properties: {
|
|
75
76
|
headers: {
|
|
76
|
-
Authorization:
|
|
77
|
+
Authorization: "={{ $credentials.token }}",
|
|
77
78
|
},
|
|
78
79
|
},
|
|
79
80
|
};
|
|
80
|
-
this.icon =
|
|
81
|
+
this.icon = "file:pocketbase.svg";
|
|
81
82
|
}
|
|
82
83
|
async preAuthentication(credentials) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
body: {
|
|
88
|
-
identity: username,
|
|
89
|
-
password,
|
|
90
|
-
},
|
|
91
|
-
}));
|
|
92
|
-
return { token };
|
|
84
|
+
if (credentials.token) {
|
|
85
|
+
return await PocketbaseAuth_1.refresh.call(this, credentials);
|
|
86
|
+
}
|
|
87
|
+
return await PocketbaseAuth_1.login.call(this, credentials);
|
|
93
88
|
}
|
|
94
89
|
}
|
|
95
90
|
exports.PocketbaseHttpApi = PocketbaseHttpApi;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PocketbaseHttpApi.credentials.js","sourceRoot":"","sources":["../../credentials/PocketbaseHttpApi.credentials.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"PocketbaseHttpApi.credentials.js","sourceRoot":"","sources":["../../credentials/PocketbaseHttpApi.credentials.ts"],"names":[],"mappings":";;;AASA,mEAAgE;AAEhE,MAAa,iBAAiB;IAA9B;QACE,SAAI,GAAG,mBAAmB,CAAC;QAC3B,gBAAW,GAAG,qBAAqB,CAAC;QACpC,qBAAgB,GAAG,4CAA4C,CAAC;QAChE,eAAU,GAAsB;YAC9B;gBACE,WAAW,EAAE,KAAK;gBAClB,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,WAAW,EAAE,8BAA8B;gBAC3C,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,WAAW,EAAE,8BAA8B;gBAC3C,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE;oBACX,QAAQ,EAAE,IAAI;iBACf;gBACD,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,WAAW,EAAE,eAAe;gBAC5B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE;oBACX,SAAS,EAAE,IAAI;oBACf,QAAQ,EAAE,IAAI;iBACf;gBACD,OAAO,EAAE,EAAE;aACZ;SACF,CAAC;QAEF,SAAI,GAA2B;YAC7B,OAAO,EAAE;gBACP,OAAO,EAAE,6CAA6C;gBACtD,GAAG,EAAE,kDAAkD;gBACvD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE;oBACJ,QAAQ,EAAE,6BAA6B;oBACvC,QAAQ,EAAE,6BAA6B;iBACxC;aACF;YACD,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,cAAc;oBACpB,UAAU,EAAE;wBACV,KAAK,EAAE,GAAG;wBACV,OAAO,EAAE,MAAM;qBAChB;iBACF;gBACD;oBACE,IAAI,EAAE,cAAc;oBACpB,UAAU,EAAE;wBACV,KAAK,EAAE,GAAG;wBACV,OAAO,EAAE,gCAAgC;qBAC1C;iBACF;aACF;SACF,CAAC;QASF,iBAAY,GAAkB;YAC5B,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,aAAa,EAAE,2BAA2B;iBAC3C;aACF;SACF,CAAC;QAEF,SAAI,GAAG,qBAAiC,CAAC;IAC3C,CAAC;IAjBC,KAAK,CAAC,iBAAiB,CAA2B,WAA2C;QAC3F,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,MAAM,wBAAO,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,MAAM,sBAAK,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC7C,CAAC;CAYF;AAtFD,8CAsFC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { DeclarativeRestApiSettings, IExecutePaginationFunctions, IExecuteSingleFunctions, IHttpRequestOptions, INodeExecutionData } from
|
|
1
|
+
import { DeclarativeRestApiSettings, IExecutePaginationFunctions, IExecuteSingleFunctions, IHttpRequestOptions, INodeExecutionData } from "n8n-workflow";
|
|
2
2
|
export declare function recordViewPreSendAction(this: IExecuteSingleFunctions, requestOptions: IHttpRequestOptions): Promise<IHttpRequestOptions>;
|
|
3
3
|
export declare function recordViewPostReceiveAction(this: IExecuteSingleFunctions, items: INodeExecutionData[]): Promise<INodeExecutionData[]>;
|
|
4
|
-
export declare function
|
|
5
|
-
export declare
|
|
4
|
+
export declare function recordPreSendAction(this: IExecuteSingleFunctions, requestOptions: IHttpRequestOptions): Promise<IHttpRequestOptions>;
|
|
5
|
+
export declare const recordUpdatePreSendAction: typeof recordPreSendAction;
|
|
6
|
+
export declare const recordCreatePreSendAction: typeof recordPreSendAction;
|
|
6
7
|
export declare function pagination(this: IExecutePaginationFunctions, requestOptions: DeclarativeRestApiSettings.ResultOptions): Promise<INodeExecutionData[]>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.recordCreatePreSendAction = exports.recordUpdatePreSendAction = void 0;
|
|
4
|
+
exports.recordViewPreSendAction = recordViewPreSendAction;
|
|
5
|
+
exports.recordViewPostReceiveAction = recordViewPostReceiveAction;
|
|
6
|
+
exports.recordPreSendAction = recordPreSendAction;
|
|
7
|
+
exports.pagination = pagination;
|
|
8
|
+
const RequestBodyFunctions_1 = require("./RequestBodyFunctions");
|
|
9
|
+
async function recordViewPreSendAction(requestOptions) {
|
|
10
|
+
var _a;
|
|
11
|
+
this.logger.debug(`Request URL: ${requestOptions.url} | ${JSON.stringify((_a = requestOptions.qs) !== null && _a !== void 0 ? _a : {})}`);
|
|
12
|
+
return requestOptions;
|
|
13
|
+
}
|
|
14
|
+
async function recordViewPostReceiveAction(items) {
|
|
15
|
+
return items;
|
|
16
|
+
}
|
|
17
|
+
async function recordPreSendAction(requestOptions) {
|
|
18
|
+
return await RequestBodyFunctions_1.prepareRequestBody.call(this, requestOptions);
|
|
19
|
+
}
|
|
20
|
+
exports.recordUpdatePreSendAction = recordPreSendAction;
|
|
21
|
+
exports.recordCreatePreSendAction = recordPreSendAction;
|
|
22
|
+
async function pagination(requestOptions) {
|
|
23
|
+
var _a, _b, _c;
|
|
24
|
+
var _d;
|
|
25
|
+
const allIsActive = this.getNodeParameter("parameters.allElements", false);
|
|
26
|
+
let executions = [];
|
|
27
|
+
let page = this.getNodeParameter("parameters.page", 1);
|
|
28
|
+
let totalPages = allIsActive ? Infinity : page;
|
|
29
|
+
(_a = requestOptions.options) !== null && _a !== void 0 ? _a : (requestOptions.options = {});
|
|
30
|
+
(_b = (_d = requestOptions.options).qs) !== null && _b !== void 0 ? _b : (_d.qs = {});
|
|
31
|
+
const maxPages = 1000;
|
|
32
|
+
do {
|
|
33
|
+
if (allIsActive && page > maxPages) {
|
|
34
|
+
throw new Error(`Pagination exceeded maximum of ${maxPages} pages`);
|
|
35
|
+
}
|
|
36
|
+
requestOptions.options.qs.page = page;
|
|
37
|
+
const responseData = await this.makeRoutingRequest(requestOptions);
|
|
38
|
+
if (!responseData || responseData.length === 0) {
|
|
39
|
+
return executions;
|
|
40
|
+
}
|
|
41
|
+
const responseBody = (_c = responseData === null || responseData === void 0 ? void 0 : responseData[0]) === null || _c === void 0 ? void 0 : _c.json;
|
|
42
|
+
if (!responseBody || typeof responseBody !== "object") {
|
|
43
|
+
throw new Error("Invalid response from PocketBase");
|
|
44
|
+
}
|
|
45
|
+
const resPage = Number(responseBody.page);
|
|
46
|
+
if (!Number.isFinite(resPage)) {
|
|
47
|
+
if (executions.length > 0) {
|
|
48
|
+
this.logger.warn("Received invalid page number in response; returning partial results", {
|
|
49
|
+
page: responseBody.page,
|
|
50
|
+
itemsCollected: executions.length,
|
|
51
|
+
});
|
|
52
|
+
return executions;
|
|
53
|
+
}
|
|
54
|
+
throw new Error("Missing or invalid page in PocketBase response");
|
|
55
|
+
}
|
|
56
|
+
if (resPage !== page) {
|
|
57
|
+
throw new Error(`PocketBase returned page ${resPage} but we requested ${page}`);
|
|
58
|
+
}
|
|
59
|
+
if (allIsActive) {
|
|
60
|
+
const resTotalPages = Number(responseBody.totalPages);
|
|
61
|
+
if (!Number.isFinite(resTotalPages)) {
|
|
62
|
+
throw new Error("Missing or invalid totalPages in PocketBase response");
|
|
63
|
+
}
|
|
64
|
+
totalPages = resTotalPages;
|
|
65
|
+
this.logger.debug(`Fetching page ${page} of ${totalPages}`);
|
|
66
|
+
}
|
|
67
|
+
if (!Array.isArray(responseBody.items)) {
|
|
68
|
+
throw new Error(`PocketBase response for page ${page} (of ${totalPages}) did not contain an items array`);
|
|
69
|
+
}
|
|
70
|
+
const items = responseBody.items;
|
|
71
|
+
executions.push(...items.map((item) => ({ json: item })));
|
|
72
|
+
if (items.length === 0) {
|
|
73
|
+
if (page < totalPages) {
|
|
74
|
+
this.logger.warn(`PocketBase returned 0 items for page ${page} even though totalPages is ${totalPages}`, {
|
|
75
|
+
page,
|
|
76
|
+
totalPages,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
page++;
|
|
82
|
+
} while (page <= totalPages);
|
|
83
|
+
return executions;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=GenericFunctions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenericFunctions.js","sourceRoot":"","sources":["../../../nodes/Common/GenericFunctions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LoadOptions = void 0;
|
|
4
|
+
async function loadPocketBaseFields(collectionName = null) {
|
|
5
|
+
const { url } = await this.getCredentials("pocketbaseHttpApi");
|
|
6
|
+
const normalizedUrl = url.replace(/\/$/, "");
|
|
7
|
+
const resource = collectionName
|
|
8
|
+
? collectionName
|
|
9
|
+
: this.getNodeParameter("resource");
|
|
10
|
+
const { fields } = await this.helpers.httpRequestWithAuthentication.call(this, "pocketbaseHttpApi", {
|
|
11
|
+
url: `${normalizedUrl}/api/collections/${resource}`,
|
|
12
|
+
method: "GET",
|
|
13
|
+
});
|
|
14
|
+
return fields;
|
|
15
|
+
}
|
|
16
|
+
function getRecordLabel(id, data) {
|
|
17
|
+
if (data.name !== null && data.name !== undefined && data.name !== "") {
|
|
18
|
+
return String(data.name);
|
|
19
|
+
}
|
|
20
|
+
const shortColumns = Object.entries(data)
|
|
21
|
+
.filter(([key, value]) => {
|
|
22
|
+
var _a;
|
|
23
|
+
if (key === "name" || key === "id")
|
|
24
|
+
return false;
|
|
25
|
+
const serialized = (_a = JSON.stringify(value)) !== null && _a !== void 0 ? _a : "";
|
|
26
|
+
return serialized.length <= 30 && serialized.length > 2;
|
|
27
|
+
})
|
|
28
|
+
.map(([key, value]) => `${key}: ${JSON.stringify(value)}`);
|
|
29
|
+
const fallback = shortColumns.join(", ").substring(0, 100);
|
|
30
|
+
return fallback || id || "";
|
|
31
|
+
}
|
|
32
|
+
exports.LoadOptions = {
|
|
33
|
+
async getCollections() {
|
|
34
|
+
const { url } = await this.getCredentials("pocketbaseHttpApi");
|
|
35
|
+
const normalizedUrl = url.replace(/\/$/, "");
|
|
36
|
+
const items = [];
|
|
37
|
+
let page = 1;
|
|
38
|
+
let totalPages = 0;
|
|
39
|
+
do {
|
|
40
|
+
const { items: pageItems, totalPages: pageTotalPages } = await this.helpers.httpRequestWithAuthentication.call(this, "pocketbaseHttpApi", {
|
|
41
|
+
url: `${normalizedUrl}/api/collections`,
|
|
42
|
+
method: "GET",
|
|
43
|
+
qs: { page },
|
|
44
|
+
});
|
|
45
|
+
items.push(...pageItems);
|
|
46
|
+
totalPages = pageTotalPages;
|
|
47
|
+
page++;
|
|
48
|
+
} while (page <= totalPages);
|
|
49
|
+
return items.map(({ name }) => ({ name, value: name }));
|
|
50
|
+
},
|
|
51
|
+
async getFields() {
|
|
52
|
+
const returnData = [];
|
|
53
|
+
const fields = await loadPocketBaseFields.call(this);
|
|
54
|
+
fields === null || fields === void 0 ? void 0 : fields.forEach(({ name, type }) => {
|
|
55
|
+
if (type === "relation") {
|
|
56
|
+
returnData.push({
|
|
57
|
+
name,
|
|
58
|
+
value: name,
|
|
59
|
+
});
|
|
60
|
+
returnData.push({
|
|
61
|
+
name: `All fields from relation '${name}'`,
|
|
62
|
+
value: `expand.${name}.*`,
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
returnData.push({
|
|
67
|
+
name,
|
|
68
|
+
value: name,
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
return returnData;
|
|
72
|
+
},
|
|
73
|
+
async getRelations() {
|
|
74
|
+
const returnData = [];
|
|
75
|
+
const fields = await loadPocketBaseFields.call(this);
|
|
76
|
+
fields === null || fields === void 0 ? void 0 : fields.forEach(({ name, type }) => {
|
|
77
|
+
if (type !== "relation") {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
returnData.push({
|
|
81
|
+
name,
|
|
82
|
+
value: name,
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
return returnData;
|
|
86
|
+
},
|
|
87
|
+
async getRows() {
|
|
88
|
+
const returnData = [];
|
|
89
|
+
const { url } = await this.getCredentials("pocketbaseHttpApi");
|
|
90
|
+
const normalizedUrl = url.replace(/\/$/, "");
|
|
91
|
+
const resource = this.getNodeParameter("resource");
|
|
92
|
+
const items = [];
|
|
93
|
+
let page = 1;
|
|
94
|
+
let totalPages = 1;
|
|
95
|
+
const maxPages = 5;
|
|
96
|
+
do {
|
|
97
|
+
const { items: pageItems, totalPages: pageTotalPages } = await this.helpers.httpRequestWithAuthentication.call(this, "pocketbaseHttpApi", {
|
|
98
|
+
url: `${normalizedUrl}/api/collections/${resource}/records`,
|
|
99
|
+
method: "GET",
|
|
100
|
+
qs: { sort: "-created", page, perPage: 50 },
|
|
101
|
+
});
|
|
102
|
+
items.push(...pageItems);
|
|
103
|
+
totalPages = pageTotalPages;
|
|
104
|
+
page++;
|
|
105
|
+
} while (page <= totalPages && page <= maxPages);
|
|
106
|
+
if (items.length === 0) {
|
|
107
|
+
return [
|
|
108
|
+
{
|
|
109
|
+
name: "No records found",
|
|
110
|
+
value: "",
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
items.forEach((item) => {
|
|
115
|
+
const id = item.id;
|
|
116
|
+
returnData.push({
|
|
117
|
+
name: getRecordLabel(id, item),
|
|
118
|
+
value: id,
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
return returnData;
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=LoadOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoadOptions.js","sourceRoot":"","sources":["../../../nodes/Common/LoadOptions.ts"],"names":[],"mappings":";;;AAwBA,KAAK,UAAU,oBAAoB,CAEjC,iBAAgC,IAAI;IAEpC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAI,GAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,cAAc;QAC7B,CAAC,CAAC,cAAc;QAChB,CAAC,CAAE,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAuB,CAAC;IAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CACtE,IAAI,EACJ,mBAAmB,EACnB;QACE,GAAG,EAAE,GAAG,aAAa,oBAAoB,QAAQ,EAAE;QACnD,MAAM,EAAE,KAAK;KACd,CACF,CAAC;IAEF,OAAO,MAA2B,CAAC;AACrC,CAAC;AAKD,SAAS,cAAc,CAAC,EAAU,EAAE,IAAiB;IACnD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QACtE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAGD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SACtC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;;QACvB,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACjD,MAAM,UAAU,GAAG,MAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,mCAAI,EAAE,CAAC;QAE/C,OAAO,UAAU,CAAC,MAAM,IAAI,EAAE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1D,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,OAAO,QAAQ,IAAI,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC;AAEY,QAAA,WAAW,GAAG;IACzB,KAAK,CAAC,cAAc;QAClB,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QAC/D,MAAM,aAAa,GAAI,GAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAEzD,MAAM,KAAK,GAAuB,EAAE,CAAC;QACrC,IAAI,IAAI,GAAW,CAAC,CAAC;QACrB,IAAI,UAAU,GAAW,CAAC,CAAC;QAE3B,GAAG,CAAC;YACF,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,GACpD,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,EAAE;gBAC/E,GAAG,EAAE,GAAG,aAAa,kBAAkB;gBACvC,MAAM,EAAE,KAAK;gBACb,EAAE,EAAE,EAAE,IAAI,EAAE;aACb,CAAC,CAAC;YAEL,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;YACzB,UAAU,GAAG,cAAc,CAAC;YAC5B,IAAI,EAAE,CAAC;QACT,CAAC,QAAQ,IAAI,IAAI,UAAU,EAAE;QAE7B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAA2B,CAAC;IACpF,CAAC;IACD,KAAK,CAAC,SAAS;QACb,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAErD,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;YACjC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;gBACxB,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI;oBACJ,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,6BAA6B,IAAI,GAAG;oBAC1C,KAAK,EAAE,UAAU,IAAI,IAAI;iBAC1B,CAAC,CAAC;gBAEH,OAAO;YACT,CAAC;YAED,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI;gBACJ,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,KAAK,CAAC,YAAY;QAChB,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAErD,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;YACjC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI;gBACJ,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,KAAK,CAAC,OAAO;QACX,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QAC/D,MAAM,aAAa,GAAI,GAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAsB,CAAC;QAExE,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,IAAI,IAAI,GAAW,CAAC,CAAC;QACrB,IAAI,UAAU,GAAW,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC;QAEnB,GAAG,CAAC;YACF,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,GACpD,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,EAAE;gBAC/E,GAAG,EAAE,GAAG,aAAa,oBAAoB,QAAQ,UAAU;gBAC3D,MAAM,EAAE,KAAK;gBACb,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;aAC5C,CAAC,CAAC;YAEL,KAAK,CAAC,IAAI,CAAC,GAAI,SAA2B,CAAC,CAAC;YAC5C,UAAU,GAAG,cAAc,CAAC;YAC5B,IAAI,EAAE,CAAC;QACT,CAAC,QAAQ,IAAI,IAAI,UAAU,IAAI,IAAI,IAAI,QAAQ,EAAE;QAEjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL;oBACE,IAAI,EAAE,kBAAkB;oBACxB,KAAK,EAAE,EAAE;iBACV;aACF,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAY,CAAC;YAC7B,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC;gBAC9B,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IHttpRequestHelper, ICredentialDataDecryptedObject } from "n8n-workflow";
|
|
2
|
+
export declare const inFlightRequests: Map<string, Promise<{
|
|
3
|
+
token: string;
|
|
4
|
+
}>>;
|
|
5
|
+
export declare function login(this: IHttpRequestHelper, credentials: ICredentialDataDecryptedObject): Promise<{
|
|
6
|
+
token: string;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function refresh(this: IHttpRequestHelper, credentials: ICredentialDataDecryptedObject): Promise<{
|
|
9
|
+
token: string;
|
|
10
|
+
}>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.inFlightRequests = void 0;
|
|
4
|
+
exports.login = login;
|
|
5
|
+
exports.refresh = refresh;
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
function isTokenExpired(token) {
|
|
8
|
+
if (!token)
|
|
9
|
+
return true;
|
|
10
|
+
try {
|
|
11
|
+
const parts = token.split(".");
|
|
12
|
+
if (parts.length !== 3)
|
|
13
|
+
return true;
|
|
14
|
+
const base64 = parts[1].replace(/-/g, "+").replace(/_/g, "/");
|
|
15
|
+
const payload = JSON.parse(Buffer.from(base64, "base64").toString("utf-8"));
|
|
16
|
+
if (typeof payload.exp !== "number" || !Number.isFinite(payload.exp)) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
return Date.now() / 1000 > payload.exp - 300;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.inFlightRequests = new Map();
|
|
26
|
+
function getCredentialFingerprint(credentials) {
|
|
27
|
+
const normalizedUrl = (credentials.url || "").replace(/\/$/, "");
|
|
28
|
+
const canonical = JSON.stringify({
|
|
29
|
+
url: normalizedUrl,
|
|
30
|
+
username: credentials.username || "",
|
|
31
|
+
password: credentials.password || "",
|
|
32
|
+
});
|
|
33
|
+
return (0, node_crypto_1.createHash)("sha256").update(canonical).digest("hex");
|
|
34
|
+
}
|
|
35
|
+
async function executeLogin(url, creds) {
|
|
36
|
+
const normalizedUrl = url.endsWith("/") ? url.slice(0, -1) : url;
|
|
37
|
+
const { token } = (await this.helpers.httpRequest({
|
|
38
|
+
method: "POST",
|
|
39
|
+
url: `${normalizedUrl}/api/collections/_superusers/auth-with-password`,
|
|
40
|
+
body: {
|
|
41
|
+
identity: creds.username,
|
|
42
|
+
password: creds.password,
|
|
43
|
+
},
|
|
44
|
+
}));
|
|
45
|
+
return { token };
|
|
46
|
+
}
|
|
47
|
+
function validateCredentials(credentials) {
|
|
48
|
+
if (typeof credentials !== "object" || credentials === null) {
|
|
49
|
+
throw new Error("Credentials must be an object");
|
|
50
|
+
}
|
|
51
|
+
const creds = credentials;
|
|
52
|
+
const { username, password, url } = creds;
|
|
53
|
+
if (typeof url !== "string" || url.trim() === "") {
|
|
54
|
+
throw new Error("PocketBase URL is missing or invalid in Credentials");
|
|
55
|
+
}
|
|
56
|
+
if (typeof username !== "string" || username.trim() === "") {
|
|
57
|
+
throw new Error("PocketBase Admin username is missing or invalid in Credentials");
|
|
58
|
+
}
|
|
59
|
+
if (typeof password !== "string" || password.trim() === "") {
|
|
60
|
+
throw new Error("PocketBase Admin password is missing or invalid in Credentials");
|
|
61
|
+
}
|
|
62
|
+
return creds;
|
|
63
|
+
}
|
|
64
|
+
async function login(credentials) {
|
|
65
|
+
const creds = validateCredentials(credentials);
|
|
66
|
+
const { url } = creds;
|
|
67
|
+
const fingerprint = getCredentialFingerprint(creds);
|
|
68
|
+
const existingRequest = exports.inFlightRequests.get(fingerprint);
|
|
69
|
+
if (existingRequest) {
|
|
70
|
+
return await existingRequest;
|
|
71
|
+
}
|
|
72
|
+
const loginPromise = executeLogin.call(this, url, creds);
|
|
73
|
+
exports.inFlightRequests.set(fingerprint, loginPromise);
|
|
74
|
+
try {
|
|
75
|
+
return await loginPromise;
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
exports.inFlightRequests.delete(fingerprint);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function refresh(credentials) {
|
|
82
|
+
const creds = validateCredentials(credentials);
|
|
83
|
+
const { url, token: existingToken } = credentials;
|
|
84
|
+
if (!isTokenExpired(existingToken)) {
|
|
85
|
+
return { token: existingToken };
|
|
86
|
+
}
|
|
87
|
+
const fingerprint = getCredentialFingerprint(creds);
|
|
88
|
+
const existingRequest = exports.inFlightRequests.get(fingerprint);
|
|
89
|
+
if (existingRequest) {
|
|
90
|
+
return await existingRequest;
|
|
91
|
+
}
|
|
92
|
+
const refreshFn = async () => {
|
|
93
|
+
const normalizedUrl = url.endsWith("/") ? url.slice(0, -1) : url;
|
|
94
|
+
try {
|
|
95
|
+
const { token } = (await this.helpers.httpRequest({
|
|
96
|
+
method: "POST",
|
|
97
|
+
url: `${normalizedUrl}/api/collections/_superusers/auth-refresh`,
|
|
98
|
+
headers: {
|
|
99
|
+
Authorization: existingToken,
|
|
100
|
+
},
|
|
101
|
+
}));
|
|
102
|
+
return { token };
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
const err = error;
|
|
106
|
+
const httpCode = Number((err === null || err === void 0 ? void 0 : err.httpCode) || (err === null || err === void 0 ? void 0 : err.status));
|
|
107
|
+
if (httpCode === 401 || httpCode === 403 || httpCode === 404) {
|
|
108
|
+
return await executeLogin.call(this, url, creds);
|
|
109
|
+
}
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
const refreshPromise = refreshFn();
|
|
114
|
+
exports.inFlightRequests.set(fingerprint, refreshPromise);
|
|
115
|
+
try {
|
|
116
|
+
return await refreshPromise;
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
exports.inFlightRequests.delete(fingerprint);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=PocketbaseAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PocketbaseAuth.js","sourceRoot":"","sources":["../../../nodes/Common/PocketbaseAuth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { IExecuteSingleFunctions, IHttpRequestOptions } from
|
|
1
|
+
import { IExecuteSingleFunctions, IHttpRequestOptions } from "n8n-workflow";
|
|
2
2
|
export declare function prepareRequestBody(this: IExecuteSingleFunctions, requestOptions: IHttpRequestOptions): Promise<IHttpRequestOptions>;
|