only allow webmentions from configured domains

This commit is contained in:
Wouter Groeneveld 2021-03-08 10:25:02 +01:00
parent 3045291d09
commit fc0ed203fe
8 changed files with 534 additions and 11 deletions

247
.pnp.js generated
View File

@ -37,6 +37,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
[null, {
"packageLocation": "./",
"packageDependencies": [
["got", "npm:11.8.2"],
["jest", "npm:26.6.3"],
["koa", "npm:2.13.1"],
["koa-body", "npm:4.2.0"],
@ -858,6 +859,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["@sindresorhus/is", [
["npm:4.0.0", {
"packageLocation": "./.yarn/cache/@sindresorhus-is-npm-4.0.0-5aa71e5397-7022d5037f.zip/node_modules/@sindresorhus/is/",
"packageDependencies": [
["@sindresorhus/is", "npm:4.0.0"]
],
"linkType": "HARD",
}]
]],
["@sinonjs/commons", [
["npm:1.8.2", {
"packageLocation": "./.yarn/cache/@sinonjs-commons-npm-1.8.2-36d9339683-b7eb499e35.zip/node_modules/@sinonjs/commons/",
@ -878,6 +888,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["@szmarczak/http-timer", [
["npm:4.0.5", {
"packageLocation": "./.yarn/cache/@szmarczak-http-timer-npm-4.0.5-03463d10ab-13d8f71dbd.zip/node_modules/@szmarczak/http-timer/",
"packageDependencies": [
["@szmarczak/http-timer", "npm:4.0.5"],
["defer-to-connect", "npm:2.0.1"]
],
"linkType": "HARD",
}]
]],
["@types/babel__core", [
["npm:7.1.12", {
"packageLocation": "./.yarn/cache/@types-babel__core-npm-7.1.12-0093691d63-e2642b77b8.zip/node_modules/@types/babel__core/",
@ -933,6 +953,19 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["@types/cacheable-request", [
["npm:6.0.1", {
"packageLocation": "./.yarn/cache/@types-cacheable-request-npm-6.0.1-067bf7714d-3dae802a08.zip/node_modules/@types/cacheable-request/",
"packageDependencies": [
["@types/cacheable-request", "npm:6.0.1"],
["@types/http-cache-semantics", "npm:4.0.0"],
["@types/keyv", "npm:3.1.1"],
["@types/node", "npm:14.14.32"],
["@types/responselike", "npm:1.0.0"]
],
"linkType": "HARD",
}]
]],
["@types/formidable", [
["npm:1.0.32", {
"packageLocation": "./.yarn/cache/@types-formidable-npm-1.0.32-12f895a971-98f3f54727.zip/node_modules/@types/formidable/",
@ -953,6 +986,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["@types/http-cache-semantics", [
["npm:4.0.0", {
"packageLocation": "./.yarn/cache/@types-http-cache-semantics-npm-4.0.0-000c9dc8e0-e16fae56d4.zip/node_modules/@types/http-cache-semantics/",
"packageDependencies": [
["@types/http-cache-semantics", "npm:4.0.0"]
],
"linkType": "HARD",
}]
]],
["@types/istanbul-lib-coverage", [
["npm:2.0.3", {
"packageLocation": "./.yarn/cache/@types-istanbul-lib-coverage-npm-2.0.3-67a37eb00a-d6f6dbf66d.zip/node_modules/@types/istanbul-lib-coverage/",
@ -982,6 +1024,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["@types/keyv", [
["npm:3.1.1", {
"packageLocation": "./.yarn/cache/@types-keyv-npm-3.1.1-779a80f2c7-3aaf557d5b.zip/node_modules/@types/keyv/",
"packageDependencies": [
["@types/keyv", "npm:3.1.1"],
["@types/node", "npm:14.14.32"]
],
"linkType": "HARD",
}]
]],
["@types/mongodb", [
["npm:3.6.9", {
"packageLocation": "./.yarn/cache/@types-mongodb-npm-3.6.9-2e9fa33eb9-ab78a36f7d.zip/node_modules/@types/mongodb/",
@ -1020,6 +1072,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["@types/responselike", [
["npm:1.0.0", {
"packageLocation": "./.yarn/cache/@types-responselike-npm-1.0.0-85dd08af42-e6e6613c80.zip/node_modules/@types/responselike/",
"packageDependencies": [
["@types/responselike", "npm:1.0.0"],
["@types/node", "npm:14.14.32"]
],
"linkType": "HARD",
}]
]],
["@types/stack-utils", [
["npm:2.0.0", {
"packageLocation": "./.yarn/cache/@types-stack-utils-npm-2.0.0-8ded8461bc-662312302e.zip/node_modules/@types/stack-utils/",
@ -1631,6 +1693,31 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["cacheable-lookup", [
["npm:5.0.4", {
"packageLocation": "./.yarn/cache/cacheable-lookup-npm-5.0.4-8f13e8b44b-cb5849f584.zip/node_modules/cacheable-lookup/",
"packageDependencies": [
["cacheable-lookup", "npm:5.0.4"]
],
"linkType": "HARD",
}]
]],
["cacheable-request", [
["npm:7.0.1", {
"packageLocation": "./.yarn/cache/cacheable-request-npm-7.0.1-d870be2496-fe0b6f3b8a.zip/node_modules/cacheable-request/",
"packageDependencies": [
["cacheable-request", "npm:7.0.1"],
["clone-response", "npm:1.0.2"],
["get-stream", "npm:5.2.0"],
["http-cache-semantics", "npm:4.1.0"],
["keyv", "npm:4.0.3"],
["lowercase-keys", "npm:2.0.0"],
["normalize-url", "npm:4.5.0"],
["responselike", "npm:2.0.0"]
],
"linkType": "HARD",
}]
]],
["callsites", [
["npm:3.1.0", {
"packageLocation": "./.yarn/cache/callsites-npm-3.1.0-268f989910-f726bf10d7.zip/node_modules/callsites/",
@ -1766,6 +1853,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["clone-response", [
["npm:1.0.2", {
"packageLocation": "./.yarn/cache/clone-response-npm-1.0.2-135ae8239d-71832f9219.zip/node_modules/clone-response/",
"packageDependencies": [
["clone-response", "npm:1.0.2"],
["mimic-response", "npm:1.0.1"]
],
"linkType": "HARD",
}]
]],
["cls-bluebird", [
["npm:2.1.0", {
"packageLocation": "./.yarn/cache/cls-bluebird-npm-2.1.0-1a11680445-f3b31004a9.zip/node_modules/cls-bluebird/",
@ -2124,6 +2221,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["decompress-response", [
["npm:6.0.0", {
"packageLocation": "./.yarn/cache/decompress-response-npm-6.0.0-359de2878c-bb8b8c42be.zip/node_modules/decompress-response/",
"packageDependencies": [
["decompress-response", "npm:6.0.0"],
["mimic-response", "npm:3.1.0"]
],
"linkType": "HARD",
}]
]],
["deep-equal", [
["npm:1.0.1", {
"packageLocation": "./.yarn/cache/deep-equal-npm-1.0.1-f05565c4e5-97d8558d19.zip/node_modules/deep-equal/",
@ -2151,6 +2258,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["defer-to-connect", [
["npm:2.0.1", {
"packageLocation": "./.yarn/cache/defer-to-connect-npm-2.0.1-9005cc8c60-6641e63777.zip/node_modules/defer-to-connect/",
"packageDependencies": [
["defer-to-connect", "npm:2.0.1"]
],
"linkType": "HARD",
}]
]],
["define-property", [
["npm:0.2.5", {
"packageLocation": "./.yarn/cache/define-property-npm-0.2.5-44a0da3575-6fed054072.zip/node_modules/define-property/",
@ -2839,6 +2955,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["got", [
["npm:11.8.2", {
"packageLocation": "./.yarn/cache/got-npm-11.8.2-c1eb105458-6415f98ec2.zip/node_modules/got/",
"packageDependencies": [
["got", "npm:11.8.2"],
["@sindresorhus/is", "npm:4.0.0"],
["@szmarczak/http-timer", "npm:4.0.5"],
["@types/cacheable-request", "npm:6.0.1"],
["@types/responselike", "npm:1.0.0"],
["cacheable-lookup", "npm:5.0.4"],
["cacheable-request", "npm:7.0.1"],
["decompress-response", "npm:6.0.0"],
["http2-wrapper", "npm:1.0.3"],
["lowercase-keys", "npm:2.0.0"],
["p-cancelable", "npm:2.0.0"],
["responselike", "npm:2.0.0"]
],
"linkType": "HARD",
}]
]],
["graceful-fs", [
["npm:4.2.6", {
"packageLocation": "./.yarn/cache/graceful-fs-npm-4.2.6-535b2234f1-84d39c7756.zip/node_modules/graceful-fs/",
@ -3000,6 +3136,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["http-cache-semantics", [
["npm:4.1.0", {
"packageLocation": "./.yarn/cache/http-cache-semantics-npm-4.1.0-860520a31f-451df9784a.zip/node_modules/http-cache-semantics/",
"packageDependencies": [
["http-cache-semantics", "npm:4.1.0"]
],
"linkType": "HARD",
}]
]],
["http-errors", [
["npm:1.7.3", {
"packageLocation": "./.yarn/cache/http-errors-npm-1.7.3-f6dc83b082-563ae4a3f1.zip/node_modules/http-errors/",
@ -3038,6 +3183,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["http2-wrapper", [
["npm:1.0.3", {
"packageLocation": "./.yarn/cache/http2-wrapper-npm-1.0.3-5b58ade1df-2fc0140a69.zip/node_modules/http2-wrapper/",
"packageDependencies": [
["http2-wrapper", "npm:1.0.3"],
["quick-lru", "npm:5.1.1"],
["resolve-alpn", "npm:1.0.0"]
],
"linkType": "HARD",
}]
]],
["human-signals", [
["npm:1.1.1", {
"packageLocation": "./.yarn/cache/human-signals-npm-1.1.1-616b2586c2-cac115f635.zip/node_modules/human-signals/",
@ -4058,6 +4214,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["json-buffer", [
["npm:3.0.1", {
"packageLocation": "./.yarn/cache/json-buffer-npm-3.0.1-f8f6d20603-78011309cb.zip/node_modules/json-buffer/",
"packageDependencies": [
["json-buffer", "npm:3.0.1"]
],
"linkType": "HARD",
}]
]],
["json-parse-even-better-errors", [
["npm:2.3.1", {
"packageLocation": "./.yarn/cache/json-parse-even-better-errors-npm-2.3.1-144d62256e-d89fa7fe57.zip/node_modules/json-parse-even-better-errors/",
@ -4136,6 +4301,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["keyv", [
["npm:4.0.3", {
"packageLocation": "./.yarn/cache/keyv-npm-4.0.3-4018fb536e-63527e3d01.zip/node_modules/keyv/",
"packageDependencies": [
["keyv", "npm:4.0.3"],
["json-buffer", "npm:3.0.1"]
],
"linkType": "HARD",
}]
]],
["kind-of", [
["npm:3.2.2", {
"packageLocation": "./.yarn/cache/kind-of-npm-3.2.2-7deaffa5f9-e8a1835c4b.zip/node_modules/kind-of/",
@ -4355,6 +4530,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["lowercase-keys", [
["npm:2.0.0", {
"packageLocation": "./.yarn/cache/lowercase-keys-npm-2.0.0-1876065a32-4da67f4186.zip/node_modules/lowercase-keys/",
"packageDependencies": [
["lowercase-keys", "npm:2.0.0"]
],
"linkType": "HARD",
}]
]],
["lru-cache", [
["npm:6.0.0", {
"packageLocation": "./.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-b8b78353d2.zip/node_modules/lru-cache/",
@ -4499,6 +4683,22 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["mimic-response", [
["npm:1.0.1", {
"packageLocation": "./.yarn/cache/mimic-response-npm-1.0.1-f6f85dde84-64b43c717e.zip/node_modules/mimic-response/",
"packageDependencies": [
["mimic-response", "npm:1.0.1"]
],
"linkType": "HARD",
}],
["npm:3.1.0", {
"packageLocation": "./.yarn/cache/mimic-response-npm-3.1.0-a4a24b4e96-cfbf19f66d.zip/node_modules/mimic-response/",
"packageDependencies": [
["mimic-response", "npm:3.1.0"]
],
"linkType": "HARD",
}]
]],
["minimatch", [
["npm:3.0.4", {
"packageLocation": "./.yarn/cache/minimatch-npm-3.0.4-6e76f51c23-47eab92639.zip/node_modules/minimatch/",
@ -4844,6 +5044,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["normalize-url", [
["npm:4.5.0", {
"packageLocation": "./.yarn/cache/normalize-url-npm-4.5.0-14a0c5430f-09794941db.zip/node_modules/normalize-url/",
"packageDependencies": [
["normalize-url", "npm:4.5.0"]
],
"linkType": "HARD",
}]
]],
["npm-run-path", [
["npm:2.0.2", {
"packageLocation": "./.yarn/cache/npm-run-path-npm-2.0.2-96c8b48857-0a1bc9a1e0.zip/node_modules/npm-run-path/",
@ -4997,6 +5206,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["p-cancelable", [
["npm:2.0.0", {
"packageLocation": "./.yarn/cache/p-cancelable-npm-2.0.0-5f988ffca4-966065f056.zip/node_modules/p-cancelable/",
"packageDependencies": [
["p-cancelable", "npm:2.0.0"]
],
"linkType": "HARD",
}]
]],
["p-each-series", [
["npm:2.2.0", {
"packageLocation": "./.yarn/cache/p-each-series-npm-2.2.0-b9907a1ae6-d5a0896eb7.zip/node_modules/p-each-series/",
@ -5290,6 +5508,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["quick-lru", [
["npm:5.1.1", {
"packageLocation": "./.yarn/cache/quick-lru-npm-5.1.1-e38e0edce3-fafb2b2fa1.zip/node_modules/quick-lru/",
"packageDependencies": [
["quick-lru", "npm:5.1.1"]
],
"linkType": "HARD",
}]
]],
["raw-body", [
["npm:2.4.1", {
"packageLocation": "./.yarn/cache/raw-body-npm-2.4.1-e6e30ccf94-dc56e010d2.zip/node_modules/raw-body/",
@ -5558,6 +5785,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["resolve-alpn", [
["npm:1.0.0", {
"packageLocation": "./.yarn/cache/resolve-alpn-npm-1.0.0-f655c150b7-17baee01c0.zip/node_modules/resolve-alpn/",
"packageDependencies": [
["resolve-alpn", "npm:1.0.0"]
],
"linkType": "HARD",
}]
]],
["resolve-cwd", [
["npm:3.0.0", {
"packageLocation": "./.yarn/cache/resolve-cwd-npm-3.0.0-e6f4e296bf-97edfbbf83.zip/node_modules/resolve-cwd/",
@ -5593,6 +5829,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD",
}]
]],
["responselike", [
["npm:2.0.0", {
"packageLocation": "./.yarn/cache/responselike-npm-2.0.0-7813864e97-11d8225dd8.zip/node_modules/responselike/",
"packageDependencies": [
["responselike", "npm:2.0.0"],
["lowercase-keys", "npm:2.0.0"]
],
"linkType": "HARD",
}]
]],
["ret", [
["npm:0.1.15", {
"packageLocation": "./.yarn/cache/ret-npm-0.1.15-0d3c19de76-749c2fcae7.zip/node_modules/ret/",
@ -5766,6 +6012,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageLocation": "./",
"packageDependencies": [
["serve-my-jams", "workspace:."],
["got", "npm:11.8.2"],
["jest", "npm:26.6.3"],
["koa", "npm:2.13.1"],
["koa-body", "npm:4.2.0"],

View File

@ -16,6 +16,7 @@
"jest": "^26.6.3"
},
"dependencies": {
"got": "^11.8.2",
"koa": "^2.13.1",
"koa-body": "^4.2.0",
"koa-helmet": "^6.0.0",

10
src/config.js Normal file
View File

@ -0,0 +1,10 @@
module.exports = {
port: 4000,
host: "localhost",
allowedWebmentionSources: [
"brainbaking.com",
"jefklakscodex.com"
]
}

View File

@ -30,12 +30,13 @@ app.use(bodyParser({
// route docs: https://github.com/koajs/router/blob/HEAD/API.md#module_koa-router--Router+get%7Cput%7Cpost%7Cpatch%7Cdelete%7Cdel
require("./webmention/route").route(router);
const config = require("./config");
app.use(router.routes()).use(router.allowedMethods());
const port = process.env.PORT || 4000
const port = process.env.PORT || config.port
app.listen(port, "localhost", () => {
app.listen(port, config.host, () => {
console.log(`Started localhost at port ${port}`)
});

View File

@ -1,10 +1,20 @@
const got = require('got')
const config = require('./../config')
function isValidUrl(url) {
return url !== undefined &&
(url.startsWith("http://") || url.startsWith("https://"))
}
function isValidDomain(url) {
return config.allowedWebmentionSources.some(domain => {
return url.indexOf(domain) !== -1
})
}
/**
Remember, TARGET is own domain, SOURCE is the article to process
https://www.w3.org/TR/webmention/#sender-notifies-receiver
example:
POST /webmention-endpoint HTTP/1.1
@ -20,12 +30,31 @@ function isValidUrl(url) {
function validate(request) {
return request.type === "application/x-www-form-urlencoded" &&
request.body !== undefined &&
isValidUrl(request?.body.source) &&
isValidUrl(request?.body.target)
isValidUrl(request?.body?.source) &&
isValidUrl(request?.body?.target) &&
request?.body?.source !== request?.body?.target &&
isValidDomain(request?.body?.source)
}
function processSourceBody(body, target) {
if(body.indexOf(target) === -1) {
return
}
}
async function receive(body) {
// do stuff with it
try {
await got(body.target)
} catch(unknownTarget) {
return
}
try {
const src = await got(body.source)
processSourceBody(src.body, body.target)
} catch(unknownSource) {
return
}
}
module.exports = {

View File

@ -6,6 +6,7 @@ function route(router) {
if(!validate(ctx.request)) {
ctx.throw(400, "malformed webmention request")
}
// we do NOT await this on purpose.
receive(ctx.request.body)
ctx.body = "Thanks, bro. Will process this webmention soon, pinky swear!";

View File

@ -3,11 +3,34 @@ const { receive, validate } = require('../../src/webmention/receive')
describe("validate tests", () => {
const validhttpurl = "http://localhost/bla"
const validhttpsurl = "https://localhost/blie"
const validhttpurl = "http://brainbaking.com/bla"
const validhttpsurl = "https://brainbaking.com/blie"
const urlfrominvaliddomain = "http://brainthe.bake/jup"
const invalidurl = "lolzw"
test("is valid if source and target https urls", () => {
const result = validate({
type: "application/x-www-form-urlencoded",
body: {
source: validhttpsurl + "1",
target: validhttpsurl + "2"
}
})
expect(result).toBe(true)
})
test("is NOT valid if source is a valid url but not form valid domain", () => {
const result = validate({
type: "application/x-www-form-urlencoded",
body: {
source: urlfrominvaliddomain,
target: validhttpsurl + "2"
}
})
expect(result).toBe(false)
})
test("is NOT valid if source and target are the same urls", () => {
const result = validate({
type: "application/x-www-form-urlencoded",
body: {
@ -16,14 +39,14 @@ describe("validate tests", () => {
}
})
expect(result).toBe(true)
expect(result).toBe(false)
})
test("is valid if source and target http urls", () => {
const result = validate({
type: "application/x-www-form-urlencoded",
body: {
source: validhttpurl,
target: validhttpurl
source: validhttpurl + "1",
target: validhttpurl + "2"
}
})

213
yarn.lock
View File

@ -621,6 +621,13 @@ __metadata:
languageName: node
linkType: hard
"@sindresorhus/is@npm:^4.0.0":
version: 4.0.0
resolution: "@sindresorhus/is@npm:4.0.0"
checksum: 7022d5037ff778c5c369c353e16a173c3797de5f4196b631ec00b0f710a3ccb016937ce454d4fac6ca32d695ed30a59444e941f8f78ff7692dc3c50959b3fe61
languageName: node
linkType: hard
"@sinonjs/commons@npm:^1.7.0":
version: 1.8.2
resolution: "@sinonjs/commons@npm:1.8.2"
@ -639,6 +646,15 @@ __metadata:
languageName: node
linkType: hard
"@szmarczak/http-timer@npm:^4.0.5":
version: 4.0.5
resolution: "@szmarczak/http-timer@npm:4.0.5"
dependencies:
defer-to-connect: ^2.0.0
checksum: 13d8f71dbd792b620b2cd13d72d086ef031ebefd5263a9db2f34693a32e4d90920fa1d7075cd59bf0c9810b2b1b93ad36d89fc88aba4cd3b8022df7ecc5ffdec
languageName: node
linkType: hard
"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.7":
version: 7.1.12
resolution: "@types/babel__core@npm:7.1.12"
@ -689,6 +705,18 @@ __metadata:
languageName: node
linkType: hard
"@types/cacheable-request@npm:^6.0.1":
version: 6.0.1
resolution: "@types/cacheable-request@npm:6.0.1"
dependencies:
"@types/http-cache-semantics": "*"
"@types/keyv": "*"
"@types/node": "*"
"@types/responselike": "*"
checksum: 3dae802a0808573986c56b92bf16cd031a5b648b6c893d20c7ef6bfda3fc72a2107c7978697d2b27b14febc597162d6959985eeb5befc307a9f9f3c5081d4905
languageName: node
linkType: hard
"@types/formidable@npm:^1.0.31":
version: 1.0.32
resolution: "@types/formidable@npm:1.0.32"
@ -707,6 +735,13 @@ __metadata:
languageName: node
linkType: hard
"@types/http-cache-semantics@npm:*":
version: 4.0.0
resolution: "@types/http-cache-semantics@npm:4.0.0"
checksum: e16fae56d4daea4ed678b4d5918b693b44ca12fb5e479b87d242d3a35bf3a014974dcf9ed7aba7e29149fdb6c3719f9987fca51b20ef10aa84b58f86553c2f74
languageName: node
linkType: hard
"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1":
version: 2.0.3
resolution: "@types/istanbul-lib-coverage@npm:2.0.3"
@ -732,6 +767,15 @@ __metadata:
languageName: node
linkType: hard
"@types/keyv@npm:*":
version: 3.1.1
resolution: "@types/keyv@npm:3.1.1"
dependencies:
"@types/node": "*"
checksum: 3aaf557d5b82e733d5a17b7f55af5d6be953363c3a594f006d64265790fe87c301c6e1400c0b6b1cf72add50a0ceddc25afb8231ab8302a2e5b6ebfbfac30e5d
languageName: node
linkType: hard
"@types/mongodb@npm:^3.5.27":
version: 3.6.9
resolution: "@types/mongodb@npm:3.6.9"
@ -763,6 +807,15 @@ __metadata:
languageName: node
linkType: hard
"@types/responselike@npm:*, @types/responselike@npm:^1.0.0":
version: 1.0.0
resolution: "@types/responselike@npm:1.0.0"
dependencies:
"@types/node": "*"
checksum: e6e6613c800aeda63e2331e753e8d21df1a2c9aa7a4bc71ed792a848e4811fc96e609759089355314a2318c76eff1f161499cd242044838ab1e6f56e463ebb9c
languageName: node
linkType: hard
"@types/stack-utils@npm:^2.0.0":
version: 2.0.0
resolution: "@types/stack-utils@npm:2.0.0"
@ -1278,6 +1331,28 @@ __metadata:
languageName: node
linkType: hard
"cacheable-lookup@npm:^5.0.3":
version: 5.0.4
resolution: "cacheable-lookup@npm:5.0.4"
checksum: cb5849f5841e37f007aeaea2516ecf2cb0a9730667694d131331a04413f6c3bf2587391d55003cc2b95ef59085b5f50ac9887a0b7c673fc0c8102bcc69b6d73d
languageName: node
linkType: hard
"cacheable-request@npm:^7.0.1":
version: 7.0.1
resolution: "cacheable-request@npm:7.0.1"
dependencies:
clone-response: ^1.0.2
get-stream: ^5.1.0
http-cache-semantics: ^4.0.0
keyv: ^4.0.0
lowercase-keys: ^2.0.0
normalize-url: ^4.1.0
responselike: ^2.0.0
checksum: fe0b6f3b8a145c98fecc00f0f1b13a9886cad9bf4537533c5568cba19db81c8ee09ace9c61967d5a4e72615e174d771b6b8080c3816f0b74fc6f9c69060c3ff0
languageName: node
linkType: hard
"callsites@npm:^3.0.0":
version: 3.1.0
resolution: "callsites@npm:3.1.0"
@ -1394,6 +1469,15 @@ __metadata:
languageName: node
linkType: hard
"clone-response@npm:^1.0.2":
version: 1.0.2
resolution: "clone-response@npm:1.0.2"
dependencies:
mimic-response: ^1.0.0
checksum: 71832f9219f2682b0915bdbc0dd187ba8e63d16b0af5342b44f97b34afe9400a1f528a253dd2f70a8dd8b23bfa4c4e106928fcc520fa5899d769af95e4cce53c
languageName: node
linkType: hard
"cls-bluebird@npm:^2.1.0":
version: 2.1.0
resolution: "cls-bluebird@npm:2.1.0"
@ -1683,6 +1767,15 @@ __metadata:
languageName: node
linkType: hard
"decompress-response@npm:^6.0.0":
version: 6.0.0
resolution: "decompress-response@npm:6.0.0"
dependencies:
mimic-response: ^3.1.0
checksum: bb8b8c42be7767994764d27f91a3949e3dc9008da82f1aaeab1de40f1ebb50d7abf17b31b2e4000f8d267a1e75f76052efd58d4419124c04bf430e184c164fad
languageName: node
linkType: hard
"deep-equal@npm:~1.0.1":
version: 1.0.1
resolution: "deep-equal@npm:1.0.1"
@ -1704,6 +1797,13 @@ __metadata:
languageName: node
linkType: hard
"defer-to-connect@npm:^2.0.0":
version: 2.0.1
resolution: "defer-to-connect@npm:2.0.1"
checksum: 6641e6377732f3066e5f101ae4f22de6b85c45fda3ff0cd710412901af7570cfbb77c9c25cb6dcd5d1b52b816e37fccfc013c9ec7f1f6a95823773625e8be6c5
languageName: node
linkType: hard
"define-property@npm:^0.2.5":
version: 0.2.5
resolution: "define-property@npm:0.2.5"
@ -2272,7 +2372,7 @@ fsevents@^2.1.2:
languageName: node
linkType: hard
"get-stream@npm:^5.0.0":
"get-stream@npm:^5.0.0, get-stream@npm:^5.1.0":
version: 5.2.0
resolution: "get-stream@npm:5.2.0"
dependencies:
@ -2318,6 +2418,25 @@ fsevents@^2.1.2:
languageName: node
linkType: hard
"got@npm:^11.8.2":
version: 11.8.2
resolution: "got@npm:11.8.2"
dependencies:
"@sindresorhus/is": ^4.0.0
"@szmarczak/http-timer": ^4.0.5
"@types/cacheable-request": ^6.0.1
"@types/responselike": ^1.0.0
cacheable-lookup: ^5.0.3
cacheable-request: ^7.0.1
decompress-response: ^6.0.0
http2-wrapper: ^1.0.0-beta.5.2
lowercase-keys: ^2.0.0
p-cancelable: ^2.0.0
responselike: ^2.0.0
checksum: 6415f98ec249e932ca8223396e58ec18017ade64e21efc40db62f994f3551eaf7eca945671d40b2486f0650b1f17b5a2a0f11655ea501712566ef60be010f07f
languageName: node
linkType: hard
"graceful-fs@npm:^4.2.3, graceful-fs@npm:^4.2.4":
version: 4.2.6
resolution: "graceful-fs@npm:4.2.6"
@ -2458,6 +2577,13 @@ fsevents@^2.1.2:
languageName: node
linkType: hard
"http-cache-semantics@npm:^4.0.0":
version: 4.1.0
resolution: "http-cache-semantics@npm:4.1.0"
checksum: 451df9784af2acbe0cc1fd70291285c08ca4a8966ab5ee4d3975e003d1ad4d74c81473086d628f31296b31221966fda8bc5ea1e29dd8f1f33f9fc2b0fdca65ca
languageName: node
linkType: hard
"http-errors@npm:1.7.3, http-errors@npm:~1.7.2":
version: 1.7.3
resolution: "http-errors@npm:1.7.3"
@ -2495,6 +2621,16 @@ fsevents@^2.1.2:
languageName: node
linkType: hard
"http2-wrapper@npm:^1.0.0-beta.5.2":
version: 1.0.3
resolution: "http2-wrapper@npm:1.0.3"
dependencies:
quick-lru: ^5.1.1
resolve-alpn: ^1.0.0
checksum: 2fc0140a69558cf1352372ed6cdf94eb6d108b2755ca087a5626044667033ca9fd6d0e5e04db3c3d2129aadff99b9b07b5bcf3952f5b7138926cb7a1d3128c6e
languageName: node
linkType: hard
"human-signals@npm:^1.1.1":
version: 1.1.1
resolution: "human-signals@npm:1.1.1"
@ -3414,6 +3550,13 @@ fsevents@^2.1.2:
languageName: node
linkType: hard
"json-buffer@npm:3.0.1":
version: 3.0.1
resolution: "json-buffer@npm:3.0.1"
checksum: 78011309cb53c19195702ece9e282c8c58d7facd8d6e286857fd4daf511f0bd93424498898d0b9ecfde6ab8e87a2ab0c0a654fba4b1a4ec81fa51f2c48a5ddba
languageName: node
linkType: hard
"json-parse-even-better-errors@npm:^2.3.0":
version: 2.3.1
resolution: "json-parse-even-better-errors@npm:2.3.1"
@ -3481,6 +3624,15 @@ fsevents@^2.1.2:
languageName: node
linkType: hard
"keyv@npm:^4.0.0":
version: 4.0.3
resolution: "keyv@npm:4.0.3"
dependencies:
json-buffer: 3.0.1
checksum: 63527e3d010dd9b8f8e62435130cdb1518de7b7d0ebafcff1359611caa0e79c7f80f1863ff73e712d99ce69fa06be62b66a78fb5cfee6483f2f95eeac340f12b
languageName: node
linkType: hard
"kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0":
version: 3.2.2
resolution: "kind-of@npm:3.2.2"
@ -3680,6 +3832,13 @@ fsevents@^2.1.2:
languageName: node
linkType: hard
"lowercase-keys@npm:^2.0.0":
version: 2.0.0
resolution: "lowercase-keys@npm:2.0.0"
checksum: 4da67f41865a25360bb05749a66a83c60987c7efa0b8ec443941a19978c21ba916ae9fedca25b96fc652026c4264a437d3fec099d1949716b5483eec42395ec9
languageName: node
linkType: hard
"lru-cache@npm:^6.0.0":
version: 6.0.0
resolution: "lru-cache@npm:6.0.0"
@ -3805,6 +3964,20 @@ fsevents@^2.1.2:
languageName: node
linkType: hard
"mimic-response@npm:^1.0.0":
version: 1.0.1
resolution: "mimic-response@npm:1.0.1"
checksum: 64b43c717ed8710bc920576e96d38d0e504e9eec3114af8e00c9e3d7ae53cd459ee38febb0badc83e3a4e6d21cd571db43e9011f8cf014809989c87a1a9f0ea4
languageName: node
linkType: hard
"mimic-response@npm:^3.1.0":
version: 3.1.0
resolution: "mimic-response@npm:3.1.0"
checksum: cfbf19f66de6ad46df7481d9e8c1a7f30b6fa77dd771ad4a72a0443265041a39768182bde6d1de39001c2774168635bc74f42902e401c8ba33db55d69b773004
languageName: node
linkType: hard
"minimatch@npm:^3.0.4":
version: 3.0.4
resolution: "minimatch@npm:3.0.4"
@ -4102,6 +4275,13 @@ fsevents@^2.1.2:
languageName: node
linkType: hard
"normalize-url@npm:^4.1.0":
version: 4.5.0
resolution: "normalize-url@npm:4.5.0"
checksum: 09794941dbe5c7b91caf6f3cd1ae167c27f6d09793e4a03601a68b62de7e8ee9e5de21a246130cdbab98b01481de292f9556d492444a527648f9cf1220e4b0df
languageName: node
linkType: hard
"npm-run-path@npm:^2.0.0":
version: 2.0.2
resolution: "npm-run-path@npm:2.0.2"
@ -4237,6 +4417,13 @@ fsevents@^2.1.2:
languageName: node
linkType: hard
"p-cancelable@npm:^2.0.0":
version: 2.0.0
resolution: "p-cancelable@npm:2.0.0"
checksum: 966065f056a116a1ca3b6c7064d4d27a65bc1740c25cc60729faa5deea385bbd0f2317aedabb8e64c0cfc3c6b2dafe7f3ea65c267373d6d9be1602af443b4f12
languageName: node
linkType: hard
"p-each-series@npm:^2.1.0":
version: 2.2.0
resolution: "p-each-series@npm:2.2.0"
@ -4481,6 +4668,13 @@ fsevents@^2.1.2:
languageName: node
linkType: hard
"quick-lru@npm:^5.1.1":
version: 5.1.1
resolution: "quick-lru@npm:5.1.1"
checksum: fafb2b2fa1a948d6f2e88d4a60571be70b316d9b0be857d24fba0ac28fc31acebf535b643fe968473d689f8c655bcb2a0e4da67912f571059a4e4eb15740b021
languageName: node
linkType: hard
"raw-body@npm:^2.2.0":
version: 2.4.1
resolution: "raw-body@npm:2.4.1"
@ -4687,6 +4881,13 @@ fsevents@^2.1.2:
languageName: node
linkType: hard
"resolve-alpn@npm:^1.0.0":
version: 1.0.0
resolution: "resolve-alpn@npm:1.0.0"
checksum: 17baee01c03a57cebd163aa5c9bd94f33646378bce8aa94c7a8d29fc0e1bf0807532bda3c36bb929511606633921d0f4a69e7fcc894cf02ad1c742e649b71673
languageName: node
linkType: hard
"resolve-cwd@npm:^3.0.0":
version: 3.0.0
resolution: "resolve-cwd@npm:3.0.0"
@ -4737,6 +4938,15 @@ fsevents@^2.1.2:
languageName: node
linkType: hard
"responselike@npm:^2.0.0":
version: 2.0.0
resolution: "responselike@npm:2.0.0"
dependencies:
lowercase-keys: ^2.0.0
checksum: 11d8225dd8bbbd2ab7482c2e54ff2618e346c7d785e66d2ff5da03d6eafa8b33c3a4c6d685324dccf06f36ee2695db9bd2579382548c2a7253d770204694a63d
languageName: node
linkType: hard
"ret@npm:~0.1.10":
version: 0.1.15
resolution: "ret@npm:0.1.15"
@ -4901,6 +5111,7 @@ fsevents@^2.1.2:
version: 0.0.0-use.local
resolution: "serve-my-jams@workspace:."
dependencies:
got: ^11.8.2
jest: ^26.6.3
koa: ^2.13.1
koa-body: ^4.2.0