Liu Song’s Projects


~/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