fix and enforce indent rules
authorJustin Wind <justin.wind+git@gmail.com>
Sun, 8 Aug 2021 19:05:24 +0000 (12:05 -0700)
committerJustin Wind <justin.wind+git@gmail.com>
Mon, 9 Aug 2021 16:46:38 +0000 (09:46 -0700)
15 files changed:
.eslintrc.json
.markdownlint.json [new file with mode: 0644]
CHANGELOG.md
package-lock.json
src/authenticator.js
src/common.js
src/db/base.js
src/db/postgres/index.js
src/db/sqlite/index.js
src/link-helper.js
src/manager.js
src/service.js
src/template/root-html.js
src/template/template-helper.js
src/worker.js

index 1a60b640385f4ee7004225e51f0ec169bec0f6b9..e6c6f891e3faa434368a990eaeaffb9f0aea42f4 100644 (file)
       "error",
       "last"
     ],
+    "indent": [
+      "warn",
+      2,
+      {
+        "SwitchCase": 1
+      }
+    ],
     "sonarjs/cognitive-complexity": "warn",
     "sonarjs/no-duplicate-string": "warn",
     "keyword-spacing": "error",
diff --git a/.markdownlint.json b/.markdownlint.json
new file mode 100644 (file)
index 0000000..18e3c71
--- /dev/null
@@ -0,0 +1,4 @@
+{
+  "MD013": false,
+  "MD024": false
+}
index d299b620a5446da6c922a6369d323a9b70289330..126fab9c23d8d04178e2b0589d9153cecd97f386 100644 (file)
@@ -4,13 +4,21 @@ Releases and notable changes to this project are documented here.
 
 ## [Unreleased]
 
+## [v1.1.0] - 
+
+### Added
+
+- Caching of topic contents for Postfix database backends.  This should greatly reduce the db load when many subscribers to a topic are delivered an update.
+- Minor cleanup to generated HTML pages.
+
 ## [v1.0.0] - 2021-08-01
 
 ### Added
 
-Everything.  MVP first stable release.
+Everything.  MVP first stable release.
 
 ---
 
-[Unreleased]: https://git.squeep.com/?p=websub-hub;a=commitdiff;h=HEAD;hp=v1.0.0
+[Unreleased]: https://git.squeep.com/?p=websub-hub;a=commitdiff;h=HEAD;hp=v1.1.0
+[v1.1.0]: https://git.squeep.com/?p=websub-hub;a=commitdiff;h=v1.1.0;hp=v1.0.0
 [v1.0.0]: https://git.squeep.com/?p=websub-hub;a=commitdiff;h=v1.0.0;hp=v0.0.0
\ No newline at end of file
index 410c0aa0932927797d14600d87d5910ddb6b2450..401fffd0260dd4ec156a88f2004d0aae25d4d4bc 100644 (file)
       "dev": true
     },
     "@squeep/api-dingus": {
-      "version": "git+https://git.squeep.com/squeep-api-dingus/#16db6709ab8407b1f696e3d5f92aa6980f182f39",
-      "from": "git+https://git.squeep.com/squeep-api-dingus/#v1.0.0",
+      "version": "git+https://git.squeep.com/squeep-api-dingus/#12b96f53e7976b74296c1e024432b88749e6c4b0",
+      "from": "git+https://git.squeep.com/squeep-api-dingus/#v1.1-dev",
       "requires": {
         "mime-db": "^1.49.0",
         "uuid": "^8.3.2"
       },
       "dependencies": {
-        "mime-db": {
-          "version": "1.49.0",
-          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz",
-          "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA=="
-        },
         "uuid": {
           "version": "8.3.2",
           "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
         }
       }
     },
+    "mime-db": {
+      "version": "1.49.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz",
+      "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA=="
+    },
     "mimic-response": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
       }
     },
     "tar": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz",
-      "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==",
+      "version": "6.1.6",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.6.tgz",
+      "integrity": "sha512-oaWyu5dQbHaYcyZCTfyPpC+VmI62/OM2RTUYavTk1MDr1cwW5Boi3baeYQKiZbY2uSQJGr+iMOzb/JFxLrft+g==",
       "requires": {
         "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
index ed4fc401af7771302b523732981d4f45abfe9ead..7053b56f12cb4eecd4592db9b9c227572c91606a 100644 (file)
@@ -103,7 +103,7 @@ class Authenticator {
     const authData = req.getHeader(Enum.Header.Authorization);
     if (authData
     &&  await this.isValidAuthorization(authData, ctx)) {
-        return true;
+      return true;
     }
     return this.requestBasic(res);
   }
index b82b13e35e9b2fbf8224b8ee6407b5e3076ac9a9..0cacc3bf086f2b57f0b10db1ef289c6be7961e15 100644 (file)
@@ -84,7 +84,7 @@ const topicLeaseDefaults = () => {
  * @param {Number} jitter
  * @returns {Number}
  */
-  const attemptRetrySeconds = (attempt, retryBackoffSeconds = [60, 120, 360, 1440, 7200, 43200, 86400], jitter = 0.618) => {
+const attemptRetrySeconds = (attempt, retryBackoffSeconds = [60, 120, 360, 1440, 7200, 43200, 86400], jitter = 0.618) => {
   const maxAttempt = retryBackoffSeconds.length - 1;
   if (typeof attempt !== 'number' || attempt < 0) {
     attempt = 0;
@@ -103,7 +103,7 @@ const topicLeaseDefaults = () => {
  * @param {Array} array
  * @param {Number} per
  */
- const arrayChunk = (array, per = 1) => {
+const arrayChunk = (array, per = 1) => {
   const nChunks = Math.ceil(array.length / per);
   return Array.from(Array(nChunks), (_, i) => array.slice(i * per, (i + 1) * per));
 }
@@ -114,7 +114,7 @@ const topicLeaseDefaults = () => {
  * @param {Array} dst
  * @param {Array} src
  */
- const stackSafePush = (dst, src) => {
+const stackSafePush = (dst, src) => {
   const jsEngineMaxArguments = 2**16; // Current as of Node 12
   arrayChunk(src, jsEngineMaxArguments).forEach((items) => {
     Array.prototype.push.apply(dst, items);
index 8d72d0fb88e2c63fa42e0a09773329147b86382e..21e26642fad6ab703ef5c0a7a094180b4b3d19bc 100644 (file)
@@ -76,7 +76,7 @@ class Database {
    * @param {String} method
    * @param {arguments} args
    */
-   _notImplemented(method, args) {
+  _notImplemented(method, args) {
     this.logger.error(_fileScope(method), 'abstract method called', Array.from(args));
     throw new DBErrors.NotImplemented(method);
   }
@@ -89,7 +89,7 @@ class Database {
    * Some engines will also perform other initializations or async actions which
    * are easier handled outside the constructor.
   */
-   async initialize() {
+  async initialize() {
     const _scope = _fileScope('initialize');
 
     const currentSchema = await this._currentSchema();
@@ -416,7 +416,7 @@ class Database {
    * @param {String} callback
    * @param {*} topicId
    */
-   async subscriptionGet(dbCtx, callback, topicId) {
+  async subscriptionGet(dbCtx, callback, topicId) {
     this._notImplemented('subscriptionGet', arguments);
   }
 
@@ -442,7 +442,7 @@ class Database {
    * @param {String=} data.httpRemoteAddr
    * @param {String=} data.httpFrom
    */
-   async subscriptionUpsert(dbCtx, data) {
+  async subscriptionUpsert(dbCtx, data) {
     this._notImplemented('subscriptionUpsert', arguments);
   }
 
@@ -520,7 +520,7 @@ class Database {
    * @param {*} topicId
    * @returns {Boolean}
    */
-   async topicFetchRequested(dbCtx, topicId) {
+  async topicFetchRequested(dbCtx, topicId) {
     this._notImplemented('topicPublish', arguments);
   }
 
@@ -679,7 +679,7 @@ class Database {
    * @param {Boolean} claim
    * @returns {*} verificationId
    */
-   async verificationInsert(dbCtx, verification) {
+  async verificationInsert(dbCtx, verification) {
     this._notImplemented('verificationInsert', arguments);
   }
 
@@ -704,9 +704,9 @@ class Database {
    * @param {String} data.reason
    * @param {Boolean} data.isPublisherValidated
    */
-   async verificationUpdate(dbCtx, verificationId, data) {
+  async verificationUpdate(dbCtx, verificationId, data) {
     this._notImplemented('verificationUpdate', arguments);
-   }
+  }
 
 
   /**
index e6b5f5b391b9fbb29992b834b6a6a6ad6dde1bd5..1c5d1d1c4f2253a79c3053232781f2bbb7e45f56 100644 (file)
@@ -739,7 +739,7 @@ class DatabasePostgres extends Database {
     let topics;
     try {
       topics = await dbCtx.manyOrNone(this.statement.topicGetInfoAll);
-      } catch (e) {
+    } catch (e) {
       this.logger.error(_scope, 'failed', { error: e, topics });
       throw e;
     }
index 775708ddcb93ccfa97edf0c75b07e63e2888856c..a4c3d38fa0f252b94982f5b12832a4bb0815dbb7 100644 (file)
@@ -687,7 +687,7 @@ class DatabaseSQLite extends Database {
     let topics;
     try {
       topics = this.statement.topicGetInfoAll.all();
-      } catch (e) {
+    } catch (e) {
       this.logger.error(_scope, 'failed', { error: e, topics });
       throw e;
     }
index 428f031dcbf13d2b6b83f516b24e37358402e9d8..1f3cd0992810f482717f0448781968afb0298723 100644 (file)
@@ -117,8 +117,7 @@ class LinkHelper {
                 .map(([name, value]) => ({ name, value })),
             };
             links.push(link);
-        });
-
+          });
       });
       feedParser.on('readable', () => {
         let _item;
@@ -147,8 +146,8 @@ class LinkHelper {
           const link = {
             target: attributes.href,
             attributes: Object.entries(attributes)
-            .filter(([name]) => name !== 'href')
-            .map(([name, value]) => ({ name, value })),
+              .filter(([name]) => name !== 'href')
+              .map(([name, value]) => ({ name, value })),
           };
           links.push(link);
         }
@@ -159,6 +158,7 @@ class LinkHelper {
     return links;
   }
 
+
   /**
    * Attempt to resolve a relative target URI
    * @param {String} uri
index b3aff45da975952ea8ad27d51aa058823348cbdd..6fb187cde3dc0da5854727ffbc9297199a752899 100644 (file)
@@ -40,7 +40,7 @@ class Manager {
    * @param {http.ServerResponse} res
    * @param {object} ctx
    */
-   async getHealthcheck(res, ctx) {
+  async getHealthcheck(res, ctx) {
     const _scope = _fileScope('getHealthcheck');
     const health = 'happy';
 
index dfba6b8f9747a20694aa9f8f1c4a268857d5ee5e..c69f6fb7c891366dfbe02e659a54414a05da401d 100644 (file)
@@ -66,7 +66,7 @@ class Service extends Dingus {
    * @param {Object} ctx 
    * @param {String} newPath
   */
-   async handlerRedirect(req, res, ctx, newPath) {
+  async handlerRedirect(req, res, ctx, newPath) {
     const _scope = _fileScope('handlerRedirect');
     this.logger.debug(_scope, 'called', { req: common.requestLogData(req), ctx });
 
@@ -185,8 +185,9 @@ class Service extends Dingus {
     await this.manager.getTopicDetails(res, ctx);
   }
 
+
   /**
-   * Same as super.ingestBody, but if no body was send, do not parse (and
+   * Same as super.ingestBody, but if no body was sent, do not parse (and
    * thus avoid possible unsupported media type error).
    * @param {http.ClientRequest} req
    * @param {http.ServerResponse} res
@@ -206,7 +207,7 @@ class Service extends Dingus {
    * @param {http.ServerResponse} res
    * @param {Object} ctx
    */
-   async handlerUpdateTopic(req, res, ctx) {
+  async handlerUpdateTopic(req, res, ctx) {
     const _scope = _fileScope('handlerUpdateTopic');
     this.logger.debug(_scope, 'called', { req: common.requestLogData(req), ctx });
 
@@ -226,17 +227,17 @@ class Service extends Dingus {
    * @param {Object} ctx
    */
   async handlerUpdateSubscription(req, res, ctx) {
-  const _scope = _fileScope('handlerUpdateSubscription');
-  this.logger.debug(_scope, 'called', { req: common.requestLogData(req), ctx });
+    const _scope = _fileScope('handlerUpdateSubscription');
+    this.logger.debug(_scope, 'called', { req: common.requestLogData(req), ctx });
 
-  this.setResponseType(this.responseTypes, req, res, ctx);
+    this.setResponseType(this.responseTypes, req, res, ctx);
 
-  await this.authenticator.required(req, res, ctx);
+    await this.authenticator.required(req, res, ctx);
 
-  await this.maybeIngestBody(req, res, ctx);
-  ctx.method = req.method;
-  await this.manager.updateSubscription(res, ctx);
-}
+    await this.maybeIngestBody(req, res, ctx);
+    ctx.method = req.method;
+    await this.manager.updateSubscription(res, ctx);
+  }
   
 
   /**
@@ -254,7 +255,7 @@ class Service extends Dingus {
     this.setResponseType(this.responseTypes, req, res, ctx);
 
     await this.serveFile(req, res, ctx, this.staticPath, file || ctx.params.file);
-    this.logger.info(_scope, 'finished', { ctx });
+    this.logger.info(_scope, 'finished', { ctx: { ...ctx, responseBody: common.logTruncate((ctx.responseBody || '').toString(), 100) } });
   }
 
 
index 97a1ad9c99c1b700a9b155935b83fc4c1ba8f0d3..d1939b84cd6bb690c07c0c65cd5cd7bbab6dd9c7 100644 (file)
@@ -83,7 +83,7 @@ function usageSection(isPublicHub, hubURL) {
           </li>
         </ul>
       </div>`
-  : `
+    : `
       <h2>Private Hub</h2>
       <p>
         This hub only serves specific topics.
index eb379172098925987febda3ee2f0a61339284744..b48a90ae6d02046dd7244788ec11d150e0c40ad8 100644 (file)
@@ -30,7 +30,7 @@ const dateOrNot = (date, otherwise) => {
  * @param {Number} seconds
  * @returns {String}
  */
- const secondsToPeriod = (seconds) => {
+const secondsToPeriod = (seconds) => {
   let value = seconds;
   const result = [];
 
@@ -212,7 +212,7 @@ function htmlHeader(pageTitle, navLinks = []) {
         <ol>
           ${navLinks.map((l) => renderNavLink(l)).join('\n')}
         </ol>`
-    : '') + `
+      : '') + `
       </nav>
     </header>
     <main>`;
index f956ba1d3cb61935a74236644be4307e276f5c3d..ca77369aa3646fa871547bc67f8bd5c49e65b6d4 100644 (file)
@@ -95,7 +95,7 @@ class Worker {
         isSettled = true;
         rejected = rej;
         throw rej;
-    });
+      });
 
     Object.defineProperties(promise, {
       isSettled: { get: () => isSettled },