diff --git a/.npmrc b/.npmrc index 30ab299..bdd926f 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ link-workspace-packages=true +@jsr:registry=https://npm.jsr.io diff --git a/packages/server/package.json b/packages/server/package.json index 0e816a1..2f03207 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -11,6 +11,7 @@ "author": "", "license": "ISC", "dependencies": { + "@std/async": "npm:@jsr/std__async@^1.0.12", "@zip.js/zip.js": "^2.7.52", "better-sqlite3": "^9.6.0", "chokidar": "^3.6.0", diff --git a/packages/server/src/content/comic.ts b/packages/server/src/content/comic.ts index e61eb9d..ca0210c 100644 --- a/packages/server/src/content/comic.ts +++ b/packages/server/src/content/comic.ts @@ -3,6 +3,7 @@ import type { DocumentBody } from "dbtype"; import { readZip } from "../util/zipwrap.ts"; import { type ContentConstructOption, createDefaultClass, registerContentReferrer } from "./file.ts"; import { TextWriter } from "@zip.js/zip.js"; +import { retry } from "@std/async" type ComicType = "doujinshi" | "artist cg" | "manga" | "western"; interface ComicDesc { @@ -43,8 +44,16 @@ export class ComicReferrer extends createDefaultClass("comic") { .then(() => zip.handle.close()); } - async createDocumentBody(): Promise { - await this.initDesc(); + override async createDocumentBody(): Promise { + await retry(async () => { + await this.initDesc(); + }, { + jitter: 0.5, + maxAttempts: 5, + minTimeout: 10, + maxTimeout: 1000, + multiplier: 2, + }); const basebody = await super.createDocumentBody(); this.desc?.title; if (this.desc === undefined) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0603fcc..e9305d7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -169,6 +169,9 @@ importers: packages/server: dependencies: + '@std/async': + specifier: npm:@jsr/std__async@^1.0.12 + version: '@jsr/std__async@1.0.12' '@zip.js/zip.js': specifier: ^2.7.52 version: 2.7.52 @@ -782,6 +785,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jsr/std__async@1.0.12': + resolution: {integrity: sha512-NUaSOcwMetVeVkIqet2Ammy2A5YxG8ViFxryBbTaC4h7l/cgAkU59U3zF58ek4Y8HZ0Nx5De7qBptPfp62kcgw==, tarball: https://npm.jsr.io/~/11/@jsr/std__async/1.0.12.tgz} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2706,6 +2712,7 @@ packages: node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead node-fetch@3.3.2: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} @@ -3970,6 +3977,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jsr/std__async@1.0.12': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5