@bgord/bun 1.19.13 → 1.19.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ab-hono-noop.middleware.d.ts +2 -3
- package/dist/ab-hono-noop.middleware.d.ts.map +1 -1
- package/dist/ab-hono-noop.middleware.js +4 -9
- package/dist/ab-hono-noop.middleware.js.map +1 -1
- package/dist/ab-variant-name.vo.d.ts +9 -0
- package/dist/ab-variant-name.vo.d.ts.map +1 -0
- package/dist/ab-variant-name.vo.js +10 -0
- package/dist/ab-variant-name.vo.js.map +1 -0
- package/dist/ab-variant.vo.d.ts +2 -1
- package/dist/ab-variant.vo.d.ts.map +1 -1
- package/dist/ab-variant.vo.js.map +1 -1
- package/dist/basic-auth-password.vo.d.ts +2 -1
- package/dist/basic-auth-password.vo.d.ts.map +1 -1
- package/dist/basic-auth-password.vo.js +2 -1
- package/dist/basic-auth-password.vo.js.map +1 -1
- package/dist/basic-auth-username.vo.d.ts +2 -1
- package/dist/basic-auth-username.vo.d.ts.map +1 -1
- package/dist/basic-auth-username.vo.js +2 -1
- package/dist/basic-auth-username.vo.js.map +1 -1
- package/dist/cache-repository-redis.adapter.d.ts +1 -2
- package/dist/cache-repository-redis.adapter.d.ts.map +1 -1
- package/dist/cache-repository-redis.adapter.js.map +1 -1
- package/dist/certificate-inspector-noop.adapter.d.ts +2 -1
- package/dist/certificate-inspector-noop.adapter.d.ts.map +1 -1
- package/dist/certificate-inspector-noop.adapter.js.map +1 -1
- package/dist/certificate-inspector-tls.adapter.d.ts +2 -1
- package/dist/certificate-inspector-tls.adapter.d.ts.map +1 -1
- package/dist/certificate-inspector-tls.adapter.js.map +1 -1
- package/dist/certificate-inspector.port.d.ts +2 -1
- package/dist/certificate-inspector.port.d.ts.map +1 -1
- package/dist/csv-stringifier.adapter.d.ts.map +1 -1
- package/dist/csv-stringifier.adapter.js +1 -0
- package/dist/csv-stringifier.adapter.js.map +1 -1
- package/dist/environment-loader-encrypted.adapter.d.ts +1 -1
- package/dist/environment-loader-encrypted.adapter.d.ts.map +1 -1
- package/dist/environment-loader-encrypted.adapter.js +5 -7
- package/dist/environment-loader-encrypted.adapter.js.map +1 -1
- package/dist/environment-loader-noop.adapter.d.ts +1 -1
- package/dist/environment-loader-noop.adapter.d.ts.map +1 -1
- package/dist/environment-loader-noop.adapter.js +5 -7
- package/dist/environment-loader-noop.adapter.js.map +1 -1
- package/dist/environment-loader-process-safe.adapter.d.ts +1 -1
- package/dist/environment-loader-process-safe.adapter.d.ts.map +1 -1
- package/dist/environment-loader-process-safe.adapter.js +2 -9
- package/dist/environment-loader-process-safe.adapter.js.map +1 -1
- package/dist/environment-loader-process.adapter.d.ts +1 -1
- package/dist/environment-loader-process.adapter.d.ts.map +1 -1
- package/dist/environment-loader-process.adapter.js +5 -7
- package/dist/environment-loader-process.adapter.js.map +1 -1
- package/dist/environment-loader.port.d.ts +0 -3
- package/dist/environment-loader.port.d.ts.map +1 -1
- package/dist/environment-loader.port.js +1 -1
- package/dist/environment-loader.port.js.map +1 -1
- package/dist/event-upcaster-chain.adapter.d.ts.map +1 -1
- package/dist/event-upcaster-chain.adapter.js +5 -0
- package/dist/event-upcaster-chain.adapter.js.map +1 -1
- package/dist/event-validator-registry.adapter.d.ts +1 -1
- package/dist/event-validator-registry.adapter.d.ts.map +1 -1
- package/dist/event-validator-registry.adapter.js +2 -7
- package/dist/event-validator-registry.adapter.js.map +1 -1
- package/dist/event-validator-registry.port.d.ts +0 -3
- package/dist/event-validator-registry.port.d.ts.map +1 -1
- package/dist/event-validator-registry.port.js +1 -1
- package/dist/event-validator-registry.port.js.map +1 -1
- package/dist/file-uploader-hono.middleware.d.ts.map +1 -1
- package/dist/file-uploader-hono.middleware.js +4 -13
- package/dist/file-uploader-hono.middleware.js.map +1 -1
- package/dist/file-uploader.middleware.d.ts.map +1 -1
- package/dist/file-uploader.middleware.js +1 -0
- package/dist/file-uploader.middleware.js.map +1 -1
- package/dist/graceful-shutdown.service.d.ts +8 -4
- package/dist/graceful-shutdown.service.d.ts.map +1 -1
- package/dist/graceful-shutdown.service.js +27 -26
- package/dist/graceful-shutdown.service.js.map +1 -1
- package/dist/hostname.vo.d.ts +8 -0
- package/dist/hostname.vo.d.ts.map +1 -0
- package/dist/hostname.vo.js +9 -0
- package/dist/hostname.vo.js.map +1 -0
- package/dist/http-logger.middleware.js +1 -1
- package/dist/http-logger.middleware.js.map +1 -1
- package/dist/image-blur.adapter.d.ts +2 -0
- package/dist/image-blur.adapter.d.ts.map +1 -1
- package/dist/image-blur.adapter.js +1 -1
- package/dist/image-blur.adapter.js.map +1 -1
- package/dist/image-compressor.adapter.d.ts +2 -0
- package/dist/image-compressor.adapter.d.ts.map +1 -1
- package/dist/image-compressor.adapter.js +1 -1
- package/dist/image-compressor.adapter.js.map +1 -1
- package/dist/image-exif-clear.adapter.d.ts +2 -0
- package/dist/image-exif-clear.adapter.d.ts.map +1 -1
- package/dist/image-exif-clear.adapter.js +1 -1
- package/dist/image-exif-clear.adapter.js.map +1 -1
- package/dist/image-formatter.adapter.d.ts +2 -0
- package/dist/image-formatter.adapter.d.ts.map +1 -1
- package/dist/image-formatter.adapter.js +1 -1
- package/dist/image-formatter.adapter.js.map +1 -1
- package/dist/image-generator-web-view.adapter.d.ts.map +1 -1
- package/dist/image-generator-web-view.adapter.js +1 -0
- package/dist/image-generator-web-view.adapter.js.map +1 -1
- package/dist/image-grayscale.adapter.d.ts +2 -0
- package/dist/image-grayscale.adapter.d.ts.map +1 -1
- package/dist/image-grayscale.adapter.js +1 -1
- package/dist/image-grayscale.adapter.js.map +1 -1
- package/dist/image-processor.adapter.d.ts +2 -0
- package/dist/image-processor.adapter.d.ts.map +1 -1
- package/dist/image-processor.adapter.js +1 -1
- package/dist/image-processor.adapter.js.map +1 -1
- package/dist/image-resizer.adapter.d.ts +2 -0
- package/dist/image-resizer.adapter.d.ts.map +1 -1
- package/dist/image-resizer.adapter.js +1 -1
- package/dist/image-resizer.adapter.js.map +1 -1
- package/dist/image.types.d.ts +1 -1
- package/dist/image.types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/job-registry.adapter.d.ts +1 -1
- package/dist/job-registry.adapter.d.ts.map +1 -1
- package/dist/job-registry.adapter.js +2 -7
- package/dist/job-registry.adapter.js.map +1 -1
- package/dist/job-registry.port.d.ts +0 -3
- package/dist/job-registry.port.d.ts.map +1 -1
- package/dist/job-registry.port.js +1 -1
- package/dist/job-registry.port.js.map +1 -1
- package/dist/prerequisite-verifier-binary.adapter.js +1 -1
- package/dist/prerequisite-verifier-binary.adapter.js.map +1 -1
- package/dist/prerequisite-verifier-dns.adapter.d.ts +2 -1
- package/dist/prerequisite-verifier-dns.adapter.d.ts.map +1 -1
- package/dist/prerequisite-verifier-dns.adapter.js.map +1 -1
- package/dist/prerequisite-verifier-ssl-certificate-expiry.adapter.d.ts +2 -1
- package/dist/prerequisite-verifier-ssl-certificate-expiry.adapter.d.ts.map +1 -1
- package/dist/prerequisite-verifier-ssl-certificate-expiry.adapter.js.map +1 -1
- package/dist/prerequisite-verifier-translations.adapter.js +5 -5
- package/dist/prerequisite-verifier-translations.adapter.js.map +1 -1
- package/dist/reactive-config-file-json.adapter.d.ts +1 -1
- package/dist/reactive-config-file-json.adapter.d.ts.map +1 -1
- package/dist/reactive-config-file-json.adapter.js +2 -7
- package/dist/reactive-config-file-json.adapter.js.map +1 -1
- package/dist/reactive-config-noop.adapter.d.ts +1 -1
- package/dist/reactive-config-noop.adapter.d.ts.map +1 -1
- package/dist/reactive-config-noop.adapter.js +2 -7
- package/dist/reactive-config-noop.adapter.js.map +1 -1
- package/dist/reactive-config-with-fallback.adapter.d.ts +1 -1
- package/dist/reactive-config-with-fallback.adapter.d.ts.map +1 -1
- package/dist/reactive-config-with-fallback.adapter.js +2 -7
- package/dist/reactive-config-with-fallback.adapter.js.map +1 -1
- package/dist/reactive-config.port.d.ts +0 -3
- package/dist/reactive-config.port.d.ts.map +1 -1
- package/dist/reactive-config.port.js +1 -1
- package/dist/reactive-config.port.js.map +1 -1
- package/dist/remote-file-storage-disk.adapter.d.ts +2 -0
- package/dist/remote-file-storage-disk.adapter.d.ts.map +1 -1
- package/dist/remote-file-storage-disk.adapter.js +1 -1
- package/dist/remote-file-storage-disk.adapter.js.map +1 -1
- package/dist/shield-api-key.strategy.d.ts.map +1 -1
- package/dist/shield-api-key.strategy.js +6 -1
- package/dist/shield-api-key.strategy.js.map +1 -1
- package/dist/shield-basic-auth.strategy.d.ts.map +1 -1
- package/dist/shield-basic-auth.strategy.js +3 -2
- package/dist/shield-basic-auth.strategy.js.map +1 -1
- package/dist/shield-recaptcha.strategy.js +1 -1
- package/dist/shield-recaptcha.strategy.js.map +1 -1
- package/dist/sitemap-entry.vo.d.ts +1 -0
- package/dist/sitemap-entry.vo.d.ts.map +1 -1
- package/dist/sitemap-entry.vo.js +9 -1
- package/dist/sitemap-entry.vo.js.map +1 -1
- package/dist/standard-schema-validator.service.d.ts +5 -0
- package/dist/standard-schema-validator.service.d.ts.map +1 -0
- package/dist/standard-schema-validator.service.js +14 -0
- package/dist/standard-schema-validator.service.js.map +1 -0
- package/dist/subject-application-resolver.vo.d.ts +0 -1
- package/dist/subject-application-resolver.vo.d.ts.map +1 -1
- package/dist/subject-application-resolver.vo.js +2 -3
- package/dist/subject-application-resolver.vo.js.map +1 -1
- package/dist/subject-request-resolver.vo.d.ts +0 -1
- package/dist/subject-request-resolver.vo.d.ts.map +1 -1
- package/dist/subject-request-resolver.vo.js +2 -3
- package/dist/subject-request-resolver.vo.js.map +1 -1
- package/dist/temporary-file-absolute.adapter.d.ts +2 -0
- package/dist/temporary-file-absolute.adapter.d.ts.map +1 -1
- package/dist/temporary-file-absolute.adapter.js +1 -1
- package/dist/temporary-file-absolute.adapter.js.map +1 -1
- package/dist/timing.middleware.d.ts.map +1 -1
- package/dist/timing.middleware.js +1 -2
- package/dist/timing.middleware.js.map +1 -1
- package/dist/woodchopper-sampling-every-nth.strategy.d.ts.map +1 -1
- package/dist/woodchopper-sampling-every-nth.strategy.js +1 -3
- package/dist/woodchopper-sampling-every-nth.strategy.js.map +1 -1
- package/package.json +7 -7
- package/readme.md +3 -0
- package/src/ab-hono-noop.middleware.ts +2 -13
- package/src/ab-variant-name.vo.ts +17 -0
- package/src/ab-variant.vo.ts +2 -1
- package/src/basic-auth-password.vo.ts +5 -0
- package/src/basic-auth-username.vo.ts +5 -0
- package/src/cache-repository-redis.adapter.ts +1 -2
- package/src/certificate-inspector-noop.adapter.ts +2 -1
- package/src/certificate-inspector-tls.adapter.ts +2 -1
- package/src/certificate-inspector.port.ts +2 -1
- package/src/csv-stringifier.adapter.ts +1 -0
- package/src/environment-loader-encrypted.adapter.ts +9 -9
- package/src/environment-loader-noop.adapter.ts +9 -9
- package/src/environment-loader-process-safe.adapter.ts +8 -11
- package/src/environment-loader-process.adapter.ts +9 -9
- package/src/environment-loader.port.ts +0 -2
- package/src/event-upcaster-chain.adapter.ts +5 -0
- package/src/event-validator-registry.adapter.ts +3 -9
- package/src/event-validator-registry.port.ts +0 -2
- package/src/file-uploader-hono.middleware.ts +3 -17
- package/src/file-uploader.middleware.ts +1 -0
- package/src/graceful-shutdown.service.ts +27 -28
- package/src/hostname.vo.ts +15 -0
- package/src/http-logger.middleware.ts +1 -1
- package/src/image-blur.adapter.ts +9 -2
- package/src/image-compressor.adapter.ts +9 -2
- package/src/image-exif-clear.adapter.ts +9 -2
- package/src/image-formatter.adapter.ts +5 -1
- package/src/image-generator-web-view.adapter.ts +1 -0
- package/src/image-grayscale.adapter.ts +9 -2
- package/src/image-processor.adapter.ts +5 -1
- package/src/image-resizer.adapter.ts +9 -2
- package/src/image.types.ts +1 -1
- package/src/index.ts +2 -0
- package/src/job-registry.adapter.ts +3 -6
- package/src/job-registry.port.ts +0 -2
- package/src/prerequisite-verifier-binary.adapter.ts +1 -1
- package/src/prerequisite-verifier-dns.adapter.ts +2 -1
- package/src/prerequisite-verifier-ssl-certificate-expiry.adapter.ts +2 -1
- package/src/prerequisite-verifier-translations.adapter.ts +4 -4
- package/src/reactive-config-file-json.adapter.ts +3 -9
- package/src/reactive-config-noop.adapter.ts +3 -9
- package/src/reactive-config-with-fallback.adapter.ts +3 -9
- package/src/reactive-config.port.ts +0 -2
- package/src/remote-file-storage-disk.adapter.ts +5 -1
- package/src/shield-api-key.strategy.ts +7 -1
- package/src/shield-basic-auth.strategy.ts +4 -2
- package/src/shield-recaptcha.strategy.ts +1 -1
- package/src/sitemap-entry.vo.ts +11 -4
- package/src/standard-schema-validator.service.ts +15 -0
- package/src/subject-application-resolver.vo.ts +2 -6
- package/src/subject-request-resolver.vo.ts +2 -6
- package/src/temporary-file-absolute.adapter.ts +6 -1
- package/src/timing.middleware.ts +1 -3
- package/src/woodchopper-sampling-every-nth.strategy.ts +1 -2
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
type ReactiveConfigPort,
|
|
4
|
-
type ReactiveConfigSchema,
|
|
5
|
-
} from "./reactive-config.port";
|
|
1
|
+
import type { ReactiveConfigPort, ReactiveConfigSchema } from "./reactive-config.port";
|
|
2
|
+
import { StandardSchemaValidator } from "./standard-schema-validator.service";
|
|
6
3
|
|
|
7
4
|
export class ReactiveConfigNoopAdapter<T extends object> implements ReactiveConfigPort<T> {
|
|
8
5
|
constructor(
|
|
@@ -11,9 +8,6 @@ export class ReactiveConfigNoopAdapter<T extends object> implements ReactiveConf
|
|
|
11
8
|
) {}
|
|
12
9
|
|
|
13
10
|
async get(): Promise<Readonly<T>> {
|
|
14
|
-
|
|
15
|
-
if (result instanceof Promise) throw new Error(ReactiveConfigError.NoAsyncSchema);
|
|
16
|
-
if (result.issues) throw new Error(result.issues[0]?.message);
|
|
17
|
-
return Object.freeze(result.value);
|
|
11
|
+
return Object.freeze(StandardSchemaValidator.validate(this.schema, this.value));
|
|
18
12
|
}
|
|
19
13
|
}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
type ReactiveConfigPort,
|
|
4
|
-
type ReactiveConfigSchema,
|
|
5
|
-
} from "./reactive-config.port";
|
|
1
|
+
import type { ReactiveConfigPort, ReactiveConfigSchema } from "./reactive-config.port";
|
|
2
|
+
import { StandardSchemaValidator } from "./standard-schema-validator.service";
|
|
6
3
|
|
|
7
4
|
export class ReactiveConfigWithFallbackAdapter<T extends object> implements ReactiveConfigPort<T> {
|
|
8
5
|
constructor(
|
|
@@ -15,10 +12,7 @@ export class ReactiveConfigWithFallbackAdapter<T extends object> implements Reac
|
|
|
15
12
|
try {
|
|
16
13
|
return await this.inner.get();
|
|
17
14
|
} catch {
|
|
18
|
-
|
|
19
|
-
if (result instanceof Promise) throw new Error(ReactiveConfigError.NoAsyncSchema);
|
|
20
|
-
if (result.issues) throw new Error(result.issues[0]?.message);
|
|
21
|
-
return Object.freeze(result.value);
|
|
15
|
+
return Object.freeze(StandardSchemaValidator.validate(this.schema, this.fallback));
|
|
22
16
|
}
|
|
23
17
|
}
|
|
24
18
|
}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
2
|
|
|
3
|
-
export const ReactiveConfigError = { NoAsyncSchema: "reactive.config.no.async.schema" };
|
|
4
|
-
|
|
5
3
|
export type ReactiveConfigSchema<T extends object> = StandardSchemaV1<unknown, T>;
|
|
6
4
|
|
|
7
5
|
export interface ReactiveConfigPort<T extends object> {
|
|
@@ -5,6 +5,7 @@ import type { FileCleanerPort } from "./file-cleaner.port";
|
|
|
5
5
|
import type { FileCopierPort } from "./file-copier.port";
|
|
6
6
|
import type { FileRenamerPort } from "./file-renamer.port";
|
|
7
7
|
import type { HashFilePort } from "./hash-file.port";
|
|
8
|
+
import type { NonceProviderPort } from "./nonce-provider.port";
|
|
8
9
|
import type {
|
|
9
10
|
RemoteFileStoragePort,
|
|
10
11
|
RemoteHeadResult,
|
|
@@ -18,6 +19,7 @@ type Dependencies = {
|
|
|
18
19
|
FileRenamer: FileRenamerPort;
|
|
19
20
|
FileCopier: FileCopierPort;
|
|
20
21
|
DirectoryEnsurer: DirectoryEnsurerPort;
|
|
22
|
+
NonceProvider: NonceProviderPort;
|
|
21
23
|
};
|
|
22
24
|
|
|
23
25
|
type Config = { root: tools.DirectoryPathAbsoluteType };
|
|
@@ -39,7 +41,9 @@ export class RemoteFileStorageDiskAdapter implements RemoteFileStoragePort {
|
|
|
39
41
|
|
|
40
42
|
async putFromPath(input: RemotePutFromPathInput): Promise<RemotePutFromPathResult> {
|
|
41
43
|
const final = this.resolveKeyToAbsoluteFilePath(input.key);
|
|
42
|
-
const temporary = final.withFilename(
|
|
44
|
+
const temporary = final.withFilename(
|
|
45
|
+
final.getFilename().withSuffix(`-part-${this.deps.NonceProvider.generate()}`),
|
|
46
|
+
);
|
|
43
47
|
|
|
44
48
|
await this.deps.DirectoryEnsurer.ensure(final.getDirectory());
|
|
45
49
|
await this.deps.FileCopier.copy(input.path, temporary);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { timingSafeEqual } from "node:crypto";
|
|
1
2
|
import type * as tools from "@bgord/tools";
|
|
2
3
|
import type { HasRequestHeader } from "./request-context.port";
|
|
3
4
|
|
|
@@ -11,6 +12,11 @@ export class ShieldApiKeyStrategy {
|
|
|
11
12
|
constructor(private readonly config: ApiKeyShieldConfig) {}
|
|
12
13
|
|
|
13
14
|
evaluate(context: HasRequestHeader): boolean {
|
|
14
|
-
|
|
15
|
+
const header = context.request.header(ShieldApiKeyStrategy.HEADER_NAME);
|
|
16
|
+
const config = this.config.API_KEY;
|
|
17
|
+
|
|
18
|
+
if (header?.length !== config.length) return false;
|
|
19
|
+
|
|
20
|
+
return timingSafeEqual(Buffer.from(header), Buffer.from(config));
|
|
15
21
|
}
|
|
16
22
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { timingSafeEqual } from "node:crypto";
|
|
1
2
|
import type { BasicAuthPasswordType } from "./basic-auth-password.vo";
|
|
2
3
|
import type { BasicAuthUsernameType } from "./basic-auth-username.vo";
|
|
3
4
|
import type { HasRequestHeader } from "./request-context.port";
|
|
@@ -18,9 +19,10 @@ export class ShieldBasicAuthStrategy {
|
|
|
18
19
|
const [username, password] = credentials.split(":");
|
|
19
20
|
|
|
20
21
|
if (username !== this.config.username) return false;
|
|
21
|
-
if (password !== this.config.password) return false;
|
|
22
22
|
|
|
23
|
-
return
|
|
23
|
+
if (password?.length !== this.config.password.length) return false;
|
|
24
|
+
|
|
25
|
+
return timingSafeEqual(Buffer.from(password), Buffer.from(this.config.password));
|
|
24
26
|
} catch {
|
|
25
27
|
return false;
|
|
26
28
|
}
|
|
@@ -25,7 +25,7 @@ export class ShieldRecaptchaStrategy {
|
|
|
25
25
|
try {
|
|
26
26
|
const header = context.request.header("x-recaptcha-token");
|
|
27
27
|
const query = context.request.query()["recaptchaToken"];
|
|
28
|
-
const remoteip = context.request.header("x-forwarded-for") ?? "";
|
|
28
|
+
const remoteip = context.request.header("x-forwarded-for")?.split(",")[0] ?? "";
|
|
29
29
|
|
|
30
30
|
const token = header ?? query ?? formToken;
|
|
31
31
|
|
package/src/sitemap-entry.vo.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// cspell:ignore apos
|
|
1
2
|
import type * as tools from "@bgord/tools";
|
|
2
3
|
import type { SitemapChangefreqEnum } from "./sitemap-changefreq.vo";
|
|
3
4
|
import type { SitemapPriorityType } from "./sitemap-priority.vo";
|
|
@@ -13,16 +14,22 @@ export type SitemapEntryType = {
|
|
|
13
14
|
export class SitemapEntry {
|
|
14
15
|
constructor(private readonly entry: SitemapEntryType) {}
|
|
15
16
|
|
|
17
|
+
private escapeXml(str: string): string {
|
|
18
|
+
return str
|
|
19
|
+
.replace(/&/g, "&")
|
|
20
|
+
.replace(/</g, "<")
|
|
21
|
+
.replace(/>/g, ">")
|
|
22
|
+
.replace(/"/g, """)
|
|
23
|
+
.replace(/'/g, "'");
|
|
24
|
+
}
|
|
25
|
+
|
|
16
26
|
toXml(): string {
|
|
27
|
+
const loc = `<loc>${this.escapeXml(this.entry.loc)}</loc>`;
|
|
17
28
|
const lastmod = this.entry.lastmod ? `<lastmod>${this.entry.lastmod}</lastmod>` : "";
|
|
18
|
-
|
|
19
29
|
const changefreq = this.entry.changefreq ? `<changefreq>${this.entry.changefreq}</changefreq>` : "";
|
|
20
|
-
|
|
21
30
|
const priority =
|
|
22
31
|
this.entry.priority !== undefined ? `<priority>${this.entry.priority.toFixed(1)}</priority>` : "";
|
|
23
32
|
|
|
24
|
-
const loc = `<loc>${this.entry.loc}</loc>`;
|
|
25
|
-
|
|
26
33
|
return ["<url>", loc, lastmod, changefreq, priority, "</url>"].join("");
|
|
27
34
|
}
|
|
28
35
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
+
|
|
3
|
+
const StandardSchemaValidatorError = {
|
|
4
|
+
NoAsyncSchema: "standard.schema.validate.error.no.async.schema",
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export class StandardSchemaValidator {
|
|
8
|
+
static validate<Output>(schema: StandardSchemaV1<unknown, Output>, raw: unknown): Output {
|
|
9
|
+
const result = schema["~standard"].validate(raw);
|
|
10
|
+
|
|
11
|
+
if (result instanceof Promise) throw new Error(StandardSchemaValidatorError.NoAsyncSchema);
|
|
12
|
+
if (result.issues) throw new Error(result.issues[0]?.message);
|
|
13
|
+
return result.value;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -11,8 +11,6 @@ export const SubjectApplicationResolverError = {
|
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
export class SubjectApplicationResolver {
|
|
14
|
-
private readonly SEPARATOR = "|";
|
|
15
|
-
|
|
16
14
|
constructor(
|
|
17
15
|
private readonly segments: ReadonlyArray<SubjectSegmentApplicationStrategy>,
|
|
18
16
|
private readonly deps: Dependencies,
|
|
@@ -22,10 +20,8 @@ export class SubjectApplicationResolver {
|
|
|
22
20
|
}
|
|
23
21
|
|
|
24
22
|
async resolve(): Promise<{ hex: Hash; raw: ReadonlyArray<SubjectSegmentType> }> {
|
|
25
|
-
const segments = this.segments.map((segment) =>
|
|
26
|
-
|
|
27
|
-
);
|
|
28
|
-
const subject = segments.join(this.SEPARATOR);
|
|
23
|
+
const segments = this.segments.map((segment) => segment.create());
|
|
24
|
+
const subject = JSON.stringify(segments);
|
|
29
25
|
|
|
30
26
|
const hex = await this.deps.HashContent.hash(subject);
|
|
31
27
|
|
|
@@ -11,8 +11,6 @@ export const SubjectRequestResolverError = {
|
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
export class SubjectRequestResolver {
|
|
14
|
-
private readonly SEPARATOR = "|";
|
|
15
|
-
|
|
16
14
|
constructor(
|
|
17
15
|
private readonly segments: ReadonlyArray<SubjectSegmentRequestStrategy>,
|
|
18
16
|
private readonly deps: Dependencies,
|
|
@@ -22,10 +20,8 @@ export class SubjectRequestResolver {
|
|
|
22
20
|
}
|
|
23
21
|
|
|
24
22
|
async resolve(context: RequestContext): Promise<{ hex: Hash; raw: ReadonlyArray<SubjectSegmentType> }> {
|
|
25
|
-
const segments = this.segments.map((segment) =>
|
|
26
|
-
|
|
27
|
-
);
|
|
28
|
-
const subject = segments.join(this.SEPARATOR);
|
|
23
|
+
const segments = this.segments.map((segment) => segment.create(context));
|
|
24
|
+
const subject = JSON.stringify(segments);
|
|
29
25
|
|
|
30
26
|
const hex = await this.deps.HashContent.hash(subject);
|
|
31
27
|
|
|
@@ -2,12 +2,14 @@ import * as tools from "@bgord/tools";
|
|
|
2
2
|
import type { FileCleanerPort } from "./file-cleaner.port";
|
|
3
3
|
import type { FileRenamerPort } from "./file-renamer.port";
|
|
4
4
|
import type { FileWriterPort } from "./file-writer.port";
|
|
5
|
+
import type { NonceProviderPort } from "./nonce-provider.port";
|
|
5
6
|
import type { TemporaryFilePort } from "./temporary-file.port";
|
|
6
7
|
|
|
7
8
|
type Dependencies = {
|
|
8
9
|
FileCleaner: FileCleanerPort;
|
|
9
10
|
FileRenamer: FileRenamerPort;
|
|
10
11
|
FileWriter: FileWriterPort;
|
|
12
|
+
NonceProvider: NonceProviderPort;
|
|
11
13
|
};
|
|
12
14
|
|
|
13
15
|
export class TemporaryFileAbsoluteAdapter implements TemporaryFilePort {
|
|
@@ -17,7 +19,10 @@ export class TemporaryFileAbsoluteAdapter implements TemporaryFilePort {
|
|
|
17
19
|
) {}
|
|
18
20
|
|
|
19
21
|
async write(filename: tools.Filename, content: File): Promise<tools.FilePathAbsolute> {
|
|
20
|
-
const temporary = tools.FilePathAbsolute.fromPartsSafe(
|
|
22
|
+
const temporary = tools.FilePathAbsolute.fromPartsSafe(
|
|
23
|
+
this.directory,
|
|
24
|
+
filename.withSuffix(`-part-${this.deps.NonceProvider.generate()}`),
|
|
25
|
+
);
|
|
21
26
|
const final = tools.FilePathAbsolute.fromPartsSafe(this.directory, filename);
|
|
22
27
|
|
|
23
28
|
await this.deps.FileWriter.write(temporary.get(), content);
|
package/src/timing.middleware.ts
CHANGED
|
@@ -10,9 +10,7 @@ export class TimingMiddleware {
|
|
|
10
10
|
constructor(private readonly deps: Dependencies) {}
|
|
11
11
|
|
|
12
12
|
async measure(context: RequestContext, action: () => void | Promise<void>): Promise<string | null> {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
if (header === "text/event-stream") return null;
|
|
13
|
+
if (context.request.header("accept")?.toLowerCase().startsWith("text/event-stream")) return null;
|
|
16
14
|
|
|
17
15
|
const stopwatch = new Stopwatch(this.deps);
|
|
18
16
|
|