From 4d9a1ab6a497e03ace8fe7ed6ddb9651903ea48e Mon Sep 17 00:00:00 2001 From: Jorge Cortes Date: Mon, 14 Oct 2024 12:41:36 -0500 Subject: [PATCH] Ngrok: new action components --- .../create-https-edge/create-https-edge.mjs | 57 +++++++++++ .../delete-https-edge/delete-https-edge.mjs | 42 ++++++++ .../actions/get-https-edge/get-https-edge.mjs | 40 ++++++++ .../update-https-edge/update-https-edge.mjs | 67 +++++++++++++ components/ngrok/ngrok.app.mjs | 99 ++++++++++++++++++- components/ngrok/package.json | 7 +- pnpm-lock.yaml | 11 ++- 7 files changed, 313 insertions(+), 10 deletions(-) create mode 100644 components/ngrok/actions/create-https-edge/create-https-edge.mjs create mode 100644 components/ngrok/actions/delete-https-edge/delete-https-edge.mjs create mode 100644 components/ngrok/actions/get-https-edge/get-https-edge.mjs create mode 100644 components/ngrok/actions/update-https-edge/update-https-edge.mjs diff --git a/components/ngrok/actions/create-https-edge/create-https-edge.mjs b/components/ngrok/actions/create-https-edge/create-https-edge.mjs new file mode 100644 index 0000000000000..cef5483f17643 --- /dev/null +++ b/components/ngrok/actions/create-https-edge/create-https-edge.mjs @@ -0,0 +1,57 @@ +import app from "../../ngrok.app.mjs"; + +export default { + key: "ngrok-create-https-edge", + name: "Create HTTPS Edge", + description: "Create an HTTPS Edge. [See the documentation](https://ngrok.com/docs/api/resources/edges-https/#create-https-edge).", + version: "0.0.1", + type: "action", + props: { + app, + description: { + propDefinition: [ + app, + "description", + ], + }, + hostports: { + propDefinition: [ + app, + "hostports", + ], + }, + metadata: { + propDefinition: [ + app, + "metadata", + ], + }, + }, + methods: { + createHTTPSEdge(args = {}) { + return this.app.post({ + path: "/edges/https", + ...args, + }); + }, + }, + async run({ $ }) { + const { + createHTTPSEdge, + description, + hostports, + metadata, + } = this; + + const response = await createHTTPSEdge({ + $, + data: { + description, + hostports, + metadata: metadata && JSON.stringify(metadata), + }, + }); + $.export("$summary", `Successfully created new HTTPS edge with ID \`${response.id}\`.`); + return response; + }, +}; diff --git a/components/ngrok/actions/delete-https-edge/delete-https-edge.mjs b/components/ngrok/actions/delete-https-edge/delete-https-edge.mjs new file mode 100644 index 0000000000000..d5ef8c4adafb4 --- /dev/null +++ b/components/ngrok/actions/delete-https-edge/delete-https-edge.mjs @@ -0,0 +1,42 @@ +import app from "../../ngrok.app.mjs"; + +export default { + key: "ngrok-delete-https-edge", + name: "Delete HTTPS Edge", + description: "Delete an HTTPS Edge. [See the documentation](https://ngrok.com/docs/api/resources/edges-https/#delete-https-edge).", + version: "0.0.1", + type: "action", + props: { + app, + edgeId: { + propDefinition: [ + app, + "edgeId", + ], + }, + }, + methods: { + deleteHTTPSEdge({ + edgeId, ...args + } = {}) { + return this.app.delete({ + path: `/edges/https/${edgeId}`, + ...args, + }); + }, + }, + async run({ $ }) { + const { + deleteHTTPSEdge, + edgeId, + } = this; + await deleteHTTPSEdge({ + $, + edgeId, + }); + $.export("$summary", "Successfully deleted HTTPS edge."); + return { + success: true, + }; + }, +}; diff --git a/components/ngrok/actions/get-https-edge/get-https-edge.mjs b/components/ngrok/actions/get-https-edge/get-https-edge.mjs new file mode 100644 index 0000000000000..522d1622682a2 --- /dev/null +++ b/components/ngrok/actions/get-https-edge/get-https-edge.mjs @@ -0,0 +1,40 @@ +import app from "../../ngrok.app.mjs"; + +export default { + key: "ngrok-get-https-edge", + name: "Get HTTPS Edge", + description: "Get the details of an HTTPS Edge. [See the documentation](https://ngrok.com/docs/api/resources/edges-https/#get-https-edge).", + version: "0.0.1", + type: "action", + props: { + app, + edgeId: { + propDefinition: [ + app, + "edgeId", + ], + }, + }, + methods: { + getHTTPSEdge({ + edgeId, ...args + } = {}) { + return this.app._makeRequest({ + path: `/edges/https/${edgeId}`, + ...args, + }); + }, + }, + async run({ $ }) { + const { + getHTTPSEdge, + edgeId, + } = this; + const response = await getHTTPSEdge({ + $, + edgeId, + }); + $.export("$summary", `Successfully retrieved HTTPS edge with ID \`${response.id}\`.`); + return response; + }, +}; diff --git a/components/ngrok/actions/update-https-edge/update-https-edge.mjs b/components/ngrok/actions/update-https-edge/update-https-edge.mjs new file mode 100644 index 0000000000000..744fb9348f12a --- /dev/null +++ b/components/ngrok/actions/update-https-edge/update-https-edge.mjs @@ -0,0 +1,67 @@ +import app from "../../ngrok.app.mjs"; + +export default { + key: "ngrok-update-https-edge", + name: "Update HTTPS Edge", + description: "Updates an HTTPS Edge. [See the documentation](https://ngrok.com/docs/api/resources/edges-https/#update-https-edge).", + version: "0.0.1", + type: "action", + props: { + app, + edgeId: { + propDefinition: [ + app, + "edgeId", + ], + }, + description: { + propDefinition: [ + app, + "description", + ], + }, + hostports: { + propDefinition: [ + app, + "hostports", + ], + }, + metadata: { + propDefinition: [ + app, + "metadata", + ], + }, + }, + methods: { + updateHTTPSEdge({ + edgeId, ...args + } = {}) { + return this.app.patch({ + path: `/edges/https/${edgeId}`, + ...args, + }); + }, + }, + async run({ $ }) { + const { + updateHTTPSEdge, + edgeId, + description, + hostports, + metadata, + } = this; + + const response = await updateHTTPSEdge({ + $, + edgeId, + data: { + description, + hostports, + metadata: metadata && JSON.stringify(metadata), + }, + }); + $.export("$summary", `Successfully updated Agent Ingress ID \`${response.id}\`.`); + return response; + }, +}; diff --git a/components/ngrok/ngrok.app.mjs b/components/ngrok/ngrok.app.mjs index 8207685709577..d032d2f569bf4 100644 --- a/components/ngrok/ngrok.app.mjs +++ b/components/ngrok/ngrok.app.mjs @@ -1,11 +1,102 @@ +import { axios } from "@pipedream/platform"; + export default { type: "app", app: "ngrok", - propDefinitions: {}, + propDefinitions: { + description: { + type: "string", + label: "Description", + description: "What this edge will be used for.", + }, + hostports: { + type: "string[]", + label: "Host Ports", + description: "Hostports served by this edge. Eg: `example.com:443`", + optional: true, + }, + metadata: { + type: "object", + label: "Metadata", + description: "The metadata of the agent ingress. Arbitrary user-defined machine-readable data.", + optional: true, + }, + edgeId: { + type: "string", + label: "Edge ID", + description: "The ID of the edge to update.", + async options({ prevContext: { url } }) { + if (url === null) { + return []; + } + const { + next_page_uri: nextPageUri, + https_edges: edges, + } = await this.listHTTPSEdges({ + url, + params: { + limit: 10, + }, + }); + const options = edges.map(({ + id: value, description: label, + }) => ({ + label, + value, + })); + return { + options, + context: { + url: nextPageUri, + }, + }; + }, + }, + }, methods: { - // this.$auth contains connected account data - authKeys() { - console.log(Object.keys(this.$auth)); + getUrl(path) { + return `https://api.ngrok.com${path}`; + }, + getHeaders(headers) { + return { + ...headers, + "Authorization": `Bearer ${this.$auth.api_key}`, + "Content-Type": "application/json", + "Ngrok-Version": "2", + }; + }, + _makeRequest({ + $ = this, url, path, headers, ...args + } = {}) { + return axios($, { + ...args, + url: url || this.getUrl(path), + headers: this.getHeaders(headers), + }); + }, + post(args = {}) { + return this._makeRequest({ + method: "POST", + ...args, + }); + }, + patch(args = {}) { + return this._makeRequest({ + method: "PATCH", + ...args, + }); + }, + delete(args = {}) { + return this._makeRequest({ + method: "DELETE", + ...args, + }); + }, + listHTTPSEdges(args = {}) { + return this._makeRequest({ + path: "/edges/https", + ...args, + }); }, }, }; diff --git a/components/ngrok/package.json b/components/ngrok/package.json index 3314b55af4c19..cb986e652731f 100644 --- a/components/ngrok/package.json +++ b/components/ngrok/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/ngrok", - "version": "0.0.1", + "version": "0.1.0", "description": "Pipedream ngrok Components", "main": "ngrok.app.mjs", "keywords": [ @@ -11,5 +11,8 @@ "author": "Pipedream (https://pipedream.com/)", "publishConfig": { "access": "public" + }, + "dependencies": { + "@pipedream/platform": "3.0.3" } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 57193cde8027a..9f692c93514a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,7 +60,7 @@ importers: pnpm: 7.33.6 putout: 32.2.0_typescript@5.2.2 renamer: 4.0.0 - ts-jest: 29.1.1_py5cyg2l76gggsf4xgc65fzuzq + ts-jest: 29.1.1_s6pp5jfszqvqftxetajx5tybba tsc-esm-fix: 2.20.17 tsc-watch: 5.0.3_typescript@5.2.2 typescript: 5.2.2 @@ -6475,7 +6475,10 @@ importers: '@pipedream/platform': 1.5.1 components/ngrok: - specifiers: {} + specifiers: + '@pipedream/platform': 3.0.3 + dependencies: + '@pipedream/platform': 3.0.3 components/niceboard: specifiers: {} @@ -34621,7 +34624,7 @@ packages: engines: {node: '>=6'} dev: true - /ts-jest/29.1.1_py5cyg2l76gggsf4xgc65fzuzq: + /ts-jest/29.1.1_s6pp5jfszqvqftxetajx5tybba: resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -34642,7 +34645,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.7.0_@types+node@20.9.2