~/Projects/cloudflare.js
git clone https://code.lsong.org/cloudflare.js
Commit
- Commit
- 9680e2068e36953ed8748f7ac9112a8f225b95f8
- Author
- Lsong <[email protected]>
- Date
- 2022-01-11 16:56:26 +0800 +0800
- Diffstat
README.md | 27 +++++++++++++ example/index.js | 29 ++++++++++++++ index.js | 22 ++++++++++ lib/Accounts/index.js | 7 +++ lib/Memberships/index.js | 7 +++ lib/User/index.js | 16 +++++++ lib/User/tokens.js | 32 +++++++++++++++ lib/Zones/index.js | 12 +++++ lib/http.js | 85 ++++++++++++++++++++++++++++++++++++++++++ package.json | 15 +++++++
update
diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e883045c6099ac4a3954ffb863750762cbb9ed54 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +## cloudflare + +> Cloudflare API in JavaScript + +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) + +### Installation + +``` +~$ npm i @song940/cloudflare +``` + +### Example + +```js +const Cloudflare = require('@song940/cloudflare'); + +const { CF_TOKEN } = process.env; + +const cf = new Cloudflare({ + token: CF_TOKEN, +}); +``` + +### License + + Apache License 2.0 \ No newline at end of file diff --git a/example/index.js b/example/index.js new file mode 100644 index 0000000000000000000000000000000000000000..27a6ab82203640cbb30c3d8921007fdc6f951faf --- /dev/null +++ b/example/index.js @@ -0,0 +1,29 @@ +const Cloudflare = require('..'); + +const { CF_TOKEN } = process.env; + +const cf = new Cloudflare({ + token: CF_TOKEN, +}); + +(async () => { + + await cf.user.tokens.verify({}); + + const zones = await cf.zones.list(); + console.log(zones); + for (const zone of zones) { + console.log(zone); + } + + // const user = await cf.user.get(); + // console.log(user); + // await cf.user.tokens.list(); + // await cf.user.tokens.get(); + // await cf.user.tokens.create(); + // await cf.user.tokens.edit(); + // await cf.user.tokens.del(); + // await cf.user.tokens.roll(); + // await cf.user.tokens.permission_groups(); + +})(); \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000000000000000000000000000000000000..4bf16beeb3b5813b03bc94f96950bdef1f056f9b --- /dev/null +++ b/index.js @@ -0,0 +1,22 @@ +const HTTP = require('./lib/http'); +const User = require('./lib/User'); +const Zones = require('./lib/Zones'); +const Accounts = require('./lib/Accounts'); +const Memberships = require('./lib/Memberships'); + +class Cloudflare extends HTTP { + constructor({ email, key, token, api = 'https://api.cloudflare.com/client/v4' }) { + super(); + this.api = api; + this.email = email; + this.key = key; + this.token = token; + // APIs + this.user = new User(this); + this.zones = new Zones(this); + this.accounts = new Accounts(this); + this.memberships = new Memberships(this); + } +} + +module.exports = Cloudflare; \ No newline at end of file diff --git a/lib/Accounts/index.js b/lib/Accounts/index.js new file mode 100644 index 0000000000000000000000000000000000000000..42f3bbec13c898c1c5f6f734d46144ea88a853a9 --- /dev/null +++ b/lib/Accounts/index.js @@ -0,0 +1,7 @@ + + +class Accounts { + +} + +module.exports = Accounts; \ No newline at end of file diff --git a/lib/Memberships/index.js b/lib/Memberships/index.js new file mode 100644 index 0000000000000000000000000000000000000000..10cb9b728933eeeb32bd5367cff2a3511cfb01f1 --- /dev/null +++ b/lib/Memberships/index.js @@ -0,0 +1,7 @@ + + +class Memberships { + +} + +module.exports = Memberships; \ No newline at end of file diff --git a/lib/User/index.js b/lib/User/index.js new file mode 100644 index 0000000000000000000000000000000000000000..0530f28602527836bc381ea9f1988c611d2a9aa1 --- /dev/null +++ b/lib/User/index.js @@ -0,0 +1,16 @@ +const Tokens = require('./tokens'); + +class Users { + constructor(cf) { + this.cf = cf; + this.tokens = new Tokens(cf); + } + get() { + return this.cf.get('/user'); + } + edit() { + + } +} + +module.exports = Users; \ No newline at end of file diff --git a/lib/User/tokens.js b/lib/User/tokens.js new file mode 100644 index 0000000000000000000000000000000000000000..c6089196f045994711f5365869414b98c8733ae2 --- /dev/null +++ b/lib/User/tokens.js @@ -0,0 +1,32 @@ + +class Tokens { + constructor(cf) { + this.cf = cf; + } + list() { + + } + get() { + + } + edit() { + + } + del() { + + } + roll() { + + } + create() { + + } + verify() { + return this.cf.get('/user/tokens/verify'); + } + permission_groups() { + + } +} + +module.exports = Tokens; \ No newline at end of file diff --git a/lib/Zones/index.js b/lib/Zones/index.js new file mode 100644 index 0000000000000000000000000000000000000000..2bdd4871e556e3c14eb713a7de0843ab7a350c0b --- /dev/null +++ b/lib/Zones/index.js @@ -0,0 +1,12 @@ + + +class Zones { + constructor(cf) { + this.cf = cf; + } + list() { + return this.cf.get('/zones'); + } +} + +module.exports = Zones; \ No newline at end of file diff --git a/lib/base.js b/lib/base.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 Binary files /dev/null and b/lib/base.js differ diff --git a/lib/http.js b/lib/http.js new file mode 100644 index 0000000000000000000000000000000000000000..55e938d9076dc1b1b51ce729cd9402e1681bb5af --- /dev/null +++ b/lib/http.js @@ -0,0 +1,85 @@ +const https = require('https'); +const assert = require('assert'); +const { debuglog } = require('util'); + +const debug = debuglog('cloudflare'); + +const request = (method, url, payload, headers) => { + return new Promise((resolve, reject) => { + const req = https.request(url, { + method, + headers, + }, resolve); + req.once('error', reject); + req.end(payload); + }); +}; + +const readStream = stream => { + const buffer = []; + return new Promise((resolve, reject) => { + stream + .on('error', reject) + .on('data', chunk => buffer.push(chunk)) + .on('end', () => resolve(Buffer.concat(buffer))) + }); +}; + +const ensureStatusCode = expected => { + if (!Array.isArray(expected)) + expected = [expected]; + return res => { + const { statusCode } = res; + assert.ok(expected.includes(statusCode), `status code must be "${expected}" but actually "${statusCode}"`); + return res; + }; +}; + +const handleError = res => { + const { success, errors, messages, result } = res; + if (success) return result; + for (const message of messages) { + debug('response message:', message); + } + for (const error of errors) { + const { code, message } = error; + throw new Error(`${code}: ${message}`); + } +}; + + +class HTTPClient { + getHeaders() { + const headers = { + 'Content-Type': 'application/json' + }; + const { email, key, token } = this; + if (token) { + headers.Authorization = `Bearer ${token}`; + } else { + headers['X-Auth-Email'] = email; + headers['X-Auth-Key'] = key; + } + return headers; + } + request(method, path, payload) { + const { api } = this; + const headers = this.getHeaders(); + debug('request', method, api + path, payload); + return Promise + .resolve() + .then(() => request(method, api + path, JSON.stringify(payload), headers)) + .then(ensureStatusCode(200)) + .then(readStream) + .then(JSON.parse) + .then(handleError); + } + get(path, payload) { + return this.request('GET', path, payload); + } + post() { + return this.request('POST', path, payload); + } +} + +module.exports = HTTPClient; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000000000000000000000000000000000000..52f6d1c5e2983aef3768c59e291e327f109d6a7d --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "@song940/cloudflare", + "version": "0.0.0", + "description": "Cloudflare API in JavaScript", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "cloudflare", + "javascript" + ], + "author": "Lsong <[email protected]>", + "license": "MIT" +} \ No newline at end of file