@serve.zone/appstore 32.26.0 → 33.0.0
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/.smartconfig.json +4 -1
- package/changelog.md +72 -0
- package/dist_catalog/catalog.digest +1 -0
- package/dist_catalog/catalog.envelope.json +7440 -0
- package/{dist_ts_client/data.generated.js → dist_catalog/catalog.json} +6742 -6741
- package/dist_ts_client/catalog.d.ts +16 -0
- package/dist_ts_client/catalog.js +12 -0
- package/dist_ts_client/index.d.ts +3 -1
- package/dist_ts_client/index.js +4 -2
- package/dist_ts_client/loader.d.ts +69 -0
- package/dist_ts_client/loader.js +361 -0
- package/dist_ts_client/plugins.d.ts +5 -0
- package/dist_ts_client/plugins.js +8 -0
- package/dist_ts_client/projection.d.ts +59 -0
- package/dist_ts_client/projection.js +83 -0
- package/dist_ts_client/storage.d.ts +15 -9
- package/dist_ts_client/storage.js +81 -657
- package/dist_ts_client/types.d.ts +86 -41
- package/dist_ts_client/types.js +1 -1
- package/dist_ts_testing/fixtures.d.ts +83 -0
- package/dist_ts_testing/fixtures.js +146 -0
- package/dist_ts_testing/index.d.ts +1 -0
- package/dist_ts_testing/index.js +2 -0
- package/dist_ts_testing/plugins.d.ts +7 -0
- package/dist_ts_testing/plugins.js +11 -0
- package/package.json +16 -11
- package/readme.md +162 -93
- package/ts_client/catalog.ts +26 -0
- package/ts_client/index.ts +3 -1
- package/ts_client/loader.ts +414 -0
- package/ts_client/plugins.ts +10 -0
- package/ts_client/projection.ts +148 -0
- package/ts_client/readme.md +17 -27
- package/ts_client/storage.ts +93 -882
- package/ts_client/types.ts +102 -42
- package/ts_testing/fixtures.ts +230 -0
- package/ts_testing/index.ts +1 -0
- package/ts_testing/plugins.ts +15 -0
- package/ts_testing/tspublish.json +3 -0
- package/apps/adminer/app.json +0 -10
- package/apps/adminer/versions/1.0.0/config.json +0 -6
- package/apps/cloudly/app.json +0 -14
- package/apps/cloudly/versions/1.0.0/config.json +0 -120
- package/apps/cloudly/versions/1.1.0/config.json +0 -120
- package/apps/cloudly/versions/1.1.1/config.json +0 -120
- package/apps/cloudly/versions/1.1.10/config.json +0 -173
- package/apps/cloudly/versions/1.1.2/config.json +0 -130
- package/apps/cloudly/versions/1.1.3/config.json +0 -130
- package/apps/cloudly/versions/1.1.4/config.json +0 -130
- package/apps/cloudly/versions/1.1.5/config.json +0 -149
- package/apps/cloudly/versions/1.1.6/config.json +0 -149
- package/apps/cloudly/versions/1.1.7/config.json +0 -149
- package/apps/cloudly/versions/1.1.8/config.json +0 -173
- package/apps/cloudly/versions/1.1.9/config.json +0 -173
- package/apps/cloudly/versions/1.10.0/config.json +0 -173
- package/apps/cloudly/versions/1.11.0/config.json +0 -173
- package/apps/cloudly/versions/1.12.0/config.json +0 -173
- package/apps/cloudly/versions/1.13.0/config.json +0 -173
- package/apps/cloudly/versions/1.14.0/config.json +0 -173
- package/apps/cloudly/versions/1.15.0/config.json +0 -173
- package/apps/cloudly/versions/1.16.0/config.json +0 -173
- package/apps/cloudly/versions/1.17.0/config.json +0 -173
- package/apps/cloudly/versions/1.18.0/config.json +0 -173
- package/apps/cloudly/versions/1.19.0/config.json +0 -173
- package/apps/cloudly/versions/1.2.0/config.json +0 -173
- package/apps/cloudly/versions/1.2.1/config.json +0 -173
- package/apps/cloudly/versions/1.20.0/config.json +0 -173
- package/apps/cloudly/versions/1.21.0/config.json +0 -173
- package/apps/cloudly/versions/1.22.0/config.json +0 -173
- package/apps/cloudly/versions/1.23.0/config.json +0 -173
- package/apps/cloudly/versions/1.24.0/config.json +0 -173
- package/apps/cloudly/versions/1.25.0/config.json +0 -173
- package/apps/cloudly/versions/1.26.0/config.json +0 -173
- package/apps/cloudly/versions/1.3.0/config.json +0 -173
- package/apps/cloudly/versions/1.4.0/config.json +0 -173
- package/apps/cloudly/versions/1.5.0/config.json +0 -173
- package/apps/cloudly/versions/1.6.0/config.json +0 -173
- package/apps/cloudly/versions/1.7.0/config.json +0 -173
- package/apps/cloudly/versions/1.8.0/config.json +0 -173
- package/apps/cloudly/versions/1.9.0/config.json +0 -173
- package/apps/ghost/app.json +0 -10
- package/apps/ghost/versions/1.0.0/config.json +0 -18
- package/apps/gitea/app.json +0 -10
- package/apps/gitea/versions/1.0.0/config.json +0 -16
- package/apps/gitops/app.json +0 -14
- package/apps/gitops/versions/1.0.0/config.json +0 -28
- package/apps/grafana/app.json +0 -10
- package/apps/grafana/versions/1.0.0/config.json +0 -9
- package/apps/mariadb/app.json +0 -10
- package/apps/mariadb/versions/1.0.0/config.json +0 -9
- package/apps/mattermost/app.json +0 -10
- package/apps/mattermost/versions/1.0.0/config.json +0 -6
- package/apps/n8n/app.json +0 -10
- package/apps/n8n/versions/1.0.0/config.json +0 -6
- package/apps/nextcloud/app.json +0 -10
- package/apps/nextcloud/versions/1.0.0/config.json +0 -16
- package/apps/nginx/app.json +0 -10
- package/apps/nginx/versions/1.0.0/config.json +0 -6
- package/apps/openbao/app.json +0 -16
- package/apps/openbao/versions/1.0.0/config.json +0 -52
- package/apps/plausible/app.json +0 -10
- package/apps/plausible/versions/1.0.0/config.json +0 -9
- package/apps/portainer/app.json +0 -10
- package/apps/portainer/versions/1.0.0/config.json +0 -6
- package/apps/postgres/app.json +0 -10
- package/apps/postgres/versions/1.0.0/config.json +0 -11
- package/apps/rustdesk-server/app.json +0 -14
- package/apps/rustdesk-server/versions/1.0.0/config.json +0 -19
- package/apps/siprouter/app.json +0 -14
- package/apps/siprouter/versions/1.0.0/config.json +0 -84
- package/apps/uptime-kuma/app.json +0 -10
- package/apps/uptime-kuma/versions/1.0.0/config.json +0 -6
- package/apps/valkey/app.json +0 -10
- package/apps/valkey/versions/1.0.0/config.json +0 -6
- package/apps/vaultwarden/app.json +0 -10
- package/apps/vaultwarden/versions/1.0.0/config.json +0 -6
- package/apps/wordpress/app.json +0 -10
- package/apps/wordpress/versions/1.0.0/config.json +0 -15
- package/appstore.json +0 -194
- package/dist_ts_client/classes.appstoreresolver.d.ts +0 -59
- package/dist_ts_client/classes.appstoreresolver.js +0 -736
- package/dist_ts_client/data.generated.d.ts +0 -2
- package/ts_client/classes.appstoreresolver.ts +0 -896
- package/ts_client/data.generated.ts +0 -7432
|
@@ -1,17 +1,4 @@
|
|
|
1
|
-
import type * as
|
|
2
|
-
export type TAppStoreFetch = typeof fetch;
|
|
3
|
-
export type TAppStoreSourceMode = 'package' | 'remote';
|
|
4
|
-
export type TAppStoreIndex = interfaces.appstore.IAppStoreIndex;
|
|
5
|
-
export type TAppStoreApp = interfaces.appstore.IAppStoreApp;
|
|
6
|
-
export type TAppStoreAppMeta = interfaces.appstore.IAppStoreAppMeta;
|
|
7
|
-
export type TAppStoreVersionConfig = interfaces.appstore.IAppStoreVersionConfig;
|
|
8
|
-
export type TAppStoreDockerImageSource = interfaces.appstore.IAppStoreDockerImageSource;
|
|
9
|
-
export type TAppStoreRepoManifestSource = interfaces.appstore.IAppStoreRepoManifestSource;
|
|
10
|
-
export type TAppStoreResolvedSource = interfaces.appstore.IAppStoreResolvedSource;
|
|
11
|
-
export type TServezoneAppStoreManifest = interfaces.appstore.IServezoneAppStoreManifest;
|
|
12
|
-
export type TAppStoreStorageRequest = interfaces.appstore.TAppStoreStorageRequest;
|
|
13
|
-
export type TAppStoreStorageClass = interfaces.appstore.IAppStoreStorageClass;
|
|
14
|
-
export type TAppStoreStorageFeatureId = interfaces.appstore.TAppStoreStorageFeatureId;
|
|
1
|
+
import type * as plugins from './plugins.js';
|
|
15
2
|
export type TAppStoreStorageRequestOrigin = 'explicit' | 'legacyVolume' | 'legacyS3';
|
|
16
3
|
export interface IAppStoreStorageLegacyCompatibility {
|
|
17
4
|
/**
|
|
@@ -25,11 +12,12 @@ export interface IAppStoreStorageLegacyCompatibility {
|
|
|
25
12
|
environmentOwnership: 'bindingOverridesTemplate';
|
|
26
13
|
};
|
|
27
14
|
}
|
|
15
|
+
/** The canonical storage handoff a fulfillment adapter receives for one version config. */
|
|
28
16
|
export interface INormalizedAppStoreStorageConfig {
|
|
29
|
-
storageClasses: Record<string,
|
|
30
|
-
storageRequests: TAppStoreStorageRequest[];
|
|
17
|
+
storageClasses: Record<string, plugins.servezoneInterfaces.appstore.IAppStoreStorageClass>;
|
|
18
|
+
storageRequests: plugins.servezoneInterfaces.appstore.TAppStoreStorageRequest[];
|
|
31
19
|
requestOrigins: Record<string, TAppStoreStorageRequestOrigin>;
|
|
32
|
-
requiredFeatureIds: TAppStoreStorageFeatureId[];
|
|
20
|
+
requiredFeatureIds: plugins.servezoneInterfaces.appstore.TAppStoreStorageFeatureId[];
|
|
33
21
|
legacyCompatibility?: IAppStoreStorageLegacyCompatibility;
|
|
34
22
|
}
|
|
35
23
|
export interface IAppStoreStorageNormalizationOptions {
|
|
@@ -39,33 +27,90 @@ export interface IAppStoreStorageNormalizationOptions {
|
|
|
39
27
|
*/
|
|
40
28
|
supportedFeatures: Iterable<string>;
|
|
41
29
|
}
|
|
42
|
-
export interface
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
30
|
+
export interface IAppStoreCatalogLoaderOptions {
|
|
31
|
+
/** The catalog signing keys this consumer trusts, shipped with its release, never fetched. */
|
|
32
|
+
trustedKeys: readonly plugins.servezoneInterfaces.appstore.IAppStoreCatalogTrustedKey[];
|
|
33
|
+
/** The feature ids this consumer fulfils (`requiresFeatures`), e.g. `appStoreStorageFeatureIds` values. */
|
|
34
|
+
supportedFeatureIds: Iterable<string>;
|
|
35
|
+
/**
|
|
36
|
+
* npm registries asked for the catalog package, in order, as
|
|
37
|
+
* `appstore.validateAppStoreCatalogRegistries` (`@serve.zone/interfaces`) admits them. Absent or
|
|
38
|
+
* empty means `appstore.appStoreCatalogDefaultRegistries` (npmjs).
|
|
39
|
+
*/
|
|
40
|
+
registries?: readonly string[];
|
|
41
|
+
/** Defaults to the global `fetch`. */
|
|
42
|
+
fetch?: typeof fetch;
|
|
43
|
+
/** Defaults to the system clock. */
|
|
48
44
|
now?: () => Date;
|
|
45
|
+
/** Bound of each registry request, response body included. Defaults to 30 000 ms. */
|
|
46
|
+
requestTimeoutMs?: number;
|
|
47
|
+
/** Largest package tarball the loader downloads. Defaults to 32 MiB. */
|
|
48
|
+
maximumTarballBytes?: number;
|
|
49
|
+
/** Largest size the loader decompresses a package tarball to. Defaults to 256 MiB. */
|
|
50
|
+
maximumUnpackedBytes?: number;
|
|
49
51
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
packageName: string;
|
|
58
|
-
packageVersion: string;
|
|
59
|
-
baseUrl?: string;
|
|
52
|
+
/** Options of one load. */
|
|
53
|
+
export interface IAppStoreCatalogLoadOptions {
|
|
54
|
+
/**
|
|
55
|
+
* Aborting it (the consumer stopping) ends the load at once, in-flight requests included, and
|
|
56
|
+
* rejects it with the signal's reason.
|
|
57
|
+
*/
|
|
58
|
+
signal?: AbortSignal;
|
|
60
59
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
60
|
+
/** What a consumer stored with its last-known-good envelope text, to restore it at start. */
|
|
61
|
+
export interface IAppStoreCatalogStoredRecord {
|
|
62
|
+
origin: plugins.servezoneInterfaces.appstore.TAppStoreCatalogOrigin;
|
|
63
|
+
/** When the consumer first activated it. */
|
|
64
|
+
loadedAt: string;
|
|
65
65
|
}
|
|
66
|
-
|
|
66
|
+
/** What one registry answered during a load. */
|
|
67
|
+
export interface IAppStoreCatalogRegistryReport {
|
|
67
68
|
registry: string;
|
|
68
|
-
|
|
69
|
-
tag
|
|
70
|
-
|
|
69
|
+
outcome: plugins.servezoneInterfaces.appstore.TAppStoreCatalogAttemptOutcome;
|
|
70
|
+
/** The package version the registry's `latest` dist-tag named, once read. */
|
|
71
|
+
packageVersion?: string;
|
|
72
|
+
/** Why a `refused` or `failed` answer ended. */
|
|
73
|
+
message?: string;
|
|
74
|
+
}
|
|
75
|
+
interface IAppStoreCatalogJudgementBase {
|
|
76
|
+
/** The attempt as a consumer records it in its catalog status (`lastAttempt`). */
|
|
77
|
+
attempt: plugins.servezoneInterfaces.appstore.IAppStoreCatalogAttempt;
|
|
78
|
+
}
|
|
79
|
+
/** A verified catalog that succeeds the active one; the consumer stores it as last-known-good. */
|
|
80
|
+
export interface IAppStoreCatalogActivation extends IAppStoreCatalogJudgementBase {
|
|
81
|
+
outcome: 'activated';
|
|
82
|
+
envelope: plugins.servezoneInterfaces.appstore.IAppStoreCatalogEnvelope;
|
|
83
|
+
/** The status `active` member for the activated catalog. */
|
|
84
|
+
active: plugins.servezoneInterfaces.appstore.IAppStoreCatalogActiveState;
|
|
85
|
+
}
|
|
86
|
+
/** The candidate is the active catalog. */
|
|
87
|
+
export interface IAppStoreCatalogUnchanged extends IAppStoreCatalogJudgementBase {
|
|
88
|
+
outcome: 'unchanged';
|
|
89
|
+
}
|
|
90
|
+
/** The candidate was read and refused; the active catalog stays in place. */
|
|
91
|
+
export interface IAppStoreCatalogRefused extends IAppStoreCatalogJudgementBase {
|
|
92
|
+
outcome: 'refused';
|
|
93
|
+
/** The status `refused` member. */
|
|
94
|
+
refused: plugins.servezoneInterfaces.appstore.IAppStoreCatalogRefusalRecord;
|
|
95
|
+
}
|
|
96
|
+
/** No candidate could be read: transport, integrity or packaging failed. */
|
|
97
|
+
export interface IAppStoreCatalogFailure extends IAppStoreCatalogJudgementBase {
|
|
98
|
+
outcome: 'failed';
|
|
99
|
+
message: string;
|
|
100
|
+
}
|
|
101
|
+
/** The judgement of one candidate envelope against the active catalog. */
|
|
102
|
+
export type TAppStoreCatalogJudgement = IAppStoreCatalogActivation | IAppStoreCatalogUnchanged | IAppStoreCatalogRefused;
|
|
103
|
+
/** The result of one registry load: the judgement of the best answer and every registry's answer. */
|
|
104
|
+
export type TAppStoreCatalogLoadResult = (TAppStoreCatalogJudgement | IAppStoreCatalogFailure) & {
|
|
105
|
+
registries: IAppStoreCatalogRegistryReport[];
|
|
106
|
+
};
|
|
107
|
+
/** A stored catalog that verifies today: the consumer activates it at start. */
|
|
108
|
+
export interface IAppStoreCatalogRestored {
|
|
109
|
+
outcome: 'restored';
|
|
110
|
+
envelope: plugins.servezoneInterfaces.appstore.IAppStoreCatalogEnvelope;
|
|
111
|
+
/** The status `active` member: `origin` and `loadedAt` as stored, `keyId` as verified now. */
|
|
112
|
+
active: plugins.servezoneInterfaces.appstore.IAppStoreCatalogActiveState;
|
|
71
113
|
}
|
|
114
|
+
/** The result of restoring a stored catalog: restored, or refused and left inactive. */
|
|
115
|
+
export type TAppStoreCatalogRestoreResult = IAppStoreCatalogRestored | IAppStoreCatalogRefused;
|
|
116
|
+
export {};
|
package/dist_ts_client/types.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19jbGllbnQvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test fixtures for App Store catalog consumers (`@serve.zone/appstore/testing`), never part of the
|
|
3
|
+
* runtime entry: a throwaway signing key, a catalog, its signed envelope, the npm package tarball
|
|
4
|
+
* carrying it, a registry stub and a `fetch` serving it. A consumer's tests drive
|
|
5
|
+
* `AppStoreCatalogLoader` against these exactly as against a registry.
|
|
6
|
+
*/
|
|
7
|
+
import * as plugins from './plugins.js';
|
|
8
|
+
type TCatalog = plugins.servezoneInterfaces.appstore.IAppStoreCatalog;
|
|
9
|
+
type TEnvelope = plugins.servezoneInterfaces.appstore.IAppStoreCatalogEnvelope;
|
|
10
|
+
type TVersionConfig = plugins.servezoneInterfaces.appstore.TAppStoreCatalogVersionConfig;
|
|
11
|
+
type TSigningKey = plugins.servezoneInterfacesRuntime.IAppStoreCatalogSigningKey;
|
|
12
|
+
type TTrustedKey = plugins.servezoneInterfaces.appstore.IAppStoreCatalogTrustedKey;
|
|
13
|
+
/** A throwaway catalog signing key and the trusted-key record a consumer under test is given. */
|
|
14
|
+
export interface IAppStoreTestSigningKey {
|
|
15
|
+
signingKey: TSigningKey;
|
|
16
|
+
trustedKey: TTrustedKey;
|
|
17
|
+
}
|
|
18
|
+
export interface IAppStoreTestVersion {
|
|
19
|
+
version: string;
|
|
20
|
+
config: TVersionConfig;
|
|
21
|
+
withdrawn?: plugins.servezoneInterfaces.appstore.IAppStoreCatalogWithdrawal;
|
|
22
|
+
}
|
|
23
|
+
export interface IAppStoreTestApp {
|
|
24
|
+
info: plugins.servezoneInterfaces.appstore.IServezoneAppStoreAppInfo;
|
|
25
|
+
/** Defaults to the highest version that is not withdrawn (the highest one when all are). */
|
|
26
|
+
latestVersion?: string;
|
|
27
|
+
upgradeStrategy?: plugins.servezoneInterfaces.appstore.TAppStoreCatalogUpgradeStrategy;
|
|
28
|
+
versions: IAppStoreTestVersion[];
|
|
29
|
+
}
|
|
30
|
+
export interface IAppStoreTestCatalogOptions {
|
|
31
|
+
revision: number;
|
|
32
|
+
/** Defaults to `2026-10-08T12:00:00.000Z`. */
|
|
33
|
+
publishedAt?: string;
|
|
34
|
+
/** Defaults to 40 times `c`. */
|
|
35
|
+
sourceRevision?: string;
|
|
36
|
+
apps: IAppStoreTestApp[];
|
|
37
|
+
}
|
|
38
|
+
/** One registry origin's answers: the `latest` version manifest and the tarball it names. */
|
|
39
|
+
export interface IAppStoreTestRegistryStub {
|
|
40
|
+
/** The `latest` version manifest body; `null` answers 404. */
|
|
41
|
+
manifest: unknown;
|
|
42
|
+
tarball?: Uint8Array<ArrayBuffer>;
|
|
43
|
+
/** Never answers until the request is aborted. */
|
|
44
|
+
hang?: boolean;
|
|
45
|
+
/** Answers every request with this HTTP status. */
|
|
46
|
+
status?: number;
|
|
47
|
+
}
|
|
48
|
+
/** A fresh throwaway key; nothing about it is ever stored. */
|
|
49
|
+
export declare const createAppStoreTestSigningKey: () => Promise<IAppStoreTestSigningKey>;
|
|
50
|
+
/** A version config the contract accepts: a digest-pinned `example/<name>` image and one web port. */
|
|
51
|
+
export declare const createAppStoreTestVersionConfig: (nameArg: string, imageDigitArg: string, overridesArg?: Partial<TVersionConfig>) => TVersionConfig;
|
|
52
|
+
/** A catalog the contract accepts, apps in id order, each version with its config digest; throws otherwise. */
|
|
53
|
+
export declare const createAppStoreTestCatalog: (optionsArg: IAppStoreTestCatalogOptions) => Promise<TCatalog>;
|
|
54
|
+
/** The signed envelope of a test catalog, as the publisher would ship it. */
|
|
55
|
+
export declare const signAppStoreTestCatalog: (catalogArg: TCatalog, keyArg: IAppStoreTestSigningKey) => Promise<TEnvelope>;
|
|
56
|
+
export interface IAppStoreTestTarballOptions {
|
|
57
|
+
/** Defaults to `33.0.0`. */
|
|
58
|
+
packageVersion?: string;
|
|
59
|
+
/** Bytes of a filler `dist_catalog/catalog.json` entry ahead of the envelope; defaults to 0. */
|
|
60
|
+
fillerBytes?: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The gzip-compressed npm package tarball (`package/…`) of `@serve.zone/appstore`, carrying
|
|
64
|
+
* `envelopeTextArg` at the envelope's package path, or no envelope for `null`.
|
|
65
|
+
*/
|
|
66
|
+
export declare const createAppStoreTestPackageTarball: (envelopeTextArg: string | null, optionsArg?: IAppStoreTestTarballOptions) => Promise<Uint8Array<ArrayBuffer>>;
|
|
67
|
+
/** The npm `dist.integrity` of a tarball. */
|
|
68
|
+
export declare const computeAppStoreTestIntegrity: (bytesArg: Uint8Array) => string;
|
|
69
|
+
export interface IAppStoreTestRegistryOptions {
|
|
70
|
+
/** Defaults to the tarball's true integrity. */
|
|
71
|
+
integrity?: string;
|
|
72
|
+
/** Defaults to `33.0.0`. */
|
|
73
|
+
packageVersion?: string;
|
|
74
|
+
}
|
|
75
|
+
/** A registry stub at `originArg` whose `latest` names `tarballArg`. */
|
|
76
|
+
export declare const createAppStoreTestRegistry: (originArg: string, tarballArg: Uint8Array<ArrayBuffer>, optionsArg?: IAppStoreTestRegistryOptions) => IAppStoreTestRegistryStub;
|
|
77
|
+
/**
|
|
78
|
+
* A `fetch` serving one stub per registry origin: the `latest` manifest of
|
|
79
|
+
* `@serve.zone/appstore` and its tarball. An origin without a stub fails like an unreachable host;
|
|
80
|
+
* a hanging stub rejects once the request's signal aborts.
|
|
81
|
+
*/
|
|
82
|
+
export declare const createAppStoreTestFetch: (registriesArg: Record<string, IAppStoreTestRegistryStub>) => typeof fetch;
|
|
83
|
+
export {};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test fixtures for App Store catalog consumers (`@serve.zone/appstore/testing`), never part of the
|
|
3
|
+
* runtime entry: a throwaway signing key, a catalog, its signed envelope, the npm package tarball
|
|
4
|
+
* carrying it, a registry stub and a `fetch` serving it. A consumer's tests drive
|
|
5
|
+
* `AppStoreCatalogLoader` against these exactly as against a registry.
|
|
6
|
+
*/
|
|
7
|
+
import * as plugins from './plugins.js';
|
|
8
|
+
import { appStoreCatalogEnvelopePackagePath, appStoreCatalogPackageName } from '../dist_ts_client/catalog.js';
|
|
9
|
+
const tarballPath = '/tarball.tgz';
|
|
10
|
+
/** A fresh throwaway key; nothing about it is ever stored. */
|
|
11
|
+
export const createAppStoreTestSigningKey = async () => {
|
|
12
|
+
const signingKey = await plugins.servezoneInterfacesRuntime.createAppStoreCatalogSigningKey();
|
|
13
|
+
return { signingKey, trustedKey: plugins.servezoneInterfacesRuntime.getAppStoreCatalogTrustedKey(signingKey) };
|
|
14
|
+
};
|
|
15
|
+
/** A version config the contract accepts: a digest-pinned `example/<name>` image and one web port. */
|
|
16
|
+
export const createAppStoreTestVersionConfig = (nameArg, imageDigitArg, overridesArg = {}) => ({
|
|
17
|
+
image: `example/${nameArg}@sha256:${imageDigitArg.repeat(64)}`,
|
|
18
|
+
targetPorts: [{ name: 'web', port: 8080, protocol: 'http', default: true }],
|
|
19
|
+
...overridesArg,
|
|
20
|
+
});
|
|
21
|
+
const compareVersions = (leftArg, rightArg) => {
|
|
22
|
+
const { data } = plugins.servezoneInterfaces;
|
|
23
|
+
const left = data.parseReleaseVersion(leftArg);
|
|
24
|
+
const right = data.parseReleaseVersion(rightArg);
|
|
25
|
+
if (left === null || right === null)
|
|
26
|
+
throw new Error(`test catalog versions must be MAJOR.MINOR.PATCH: ${leftArg}, ${rightArg}`);
|
|
27
|
+
return data.compareReleaseVersions(left, right);
|
|
28
|
+
};
|
|
29
|
+
const defaultLatestVersion = (appArg) => {
|
|
30
|
+
const available = appArg.versions.filter((versionArg) => versionArg.withdrawn === undefined);
|
|
31
|
+
const candidates = (available.length > 0 ? available : appArg.versions).map((versionArg) => versionArg.version);
|
|
32
|
+
const [latest] = [...candidates].sort((leftArg, rightArg) => compareVersions(rightArg, leftArg));
|
|
33
|
+
if (latest === undefined)
|
|
34
|
+
throw new Error(`test catalog app '${appArg.info.id}' lists no version`);
|
|
35
|
+
return latest;
|
|
36
|
+
};
|
|
37
|
+
/** Every feature id the catalog's version configs name. */
|
|
38
|
+
const usedFeatureIds = (catalogArg) => [...new Set(catalogArg.apps.flatMap((appArg) => appArg.versions.flatMap((versionArg) => versionArg.config.requiresFeatures ?? [])))].sort();
|
|
39
|
+
/** A catalog the contract accepts, apps in id order, each version with its config digest; throws otherwise. */
|
|
40
|
+
export const createAppStoreTestCatalog = async (optionsArg) => {
|
|
41
|
+
const { appstore } = plugins.servezoneInterfaces;
|
|
42
|
+
const apps = [];
|
|
43
|
+
const sorted = [...optionsArg.apps].sort((leftArg, rightArg) => leftArg.info.id < rightArg.info.id ? -1 : leftArg.info.id > rightArg.info.id ? 1 : 0);
|
|
44
|
+
for (const app of sorted) {
|
|
45
|
+
const versions = [];
|
|
46
|
+
for (const version of app.versions) {
|
|
47
|
+
const config = structuredClone(version.config);
|
|
48
|
+
versions.push({
|
|
49
|
+
version: version.version,
|
|
50
|
+
config,
|
|
51
|
+
configDigest: await appstore.computeAppStoreCatalogConfigDigest(config),
|
|
52
|
+
...(version.withdrawn === undefined ? {} : { withdrawn: { ...version.withdrawn } }),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
apps.push({
|
|
56
|
+
info: structuredClone(app.info),
|
|
57
|
+
latestVersion: app.latestVersion ?? defaultLatestVersion(app),
|
|
58
|
+
...(app.upgradeStrategy === undefined ? {} : { upgradeStrategy: app.upgradeStrategy }),
|
|
59
|
+
versions,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const contract = appstore.appStoreCatalogContract;
|
|
63
|
+
const catalog = {
|
|
64
|
+
contract: { id: contract.id, major: contract.major, minor: contract.minor },
|
|
65
|
+
revision: optionsArg.revision,
|
|
66
|
+
publishedAt: optionsArg.publishedAt ?? '2026-10-08T12:00:00.000Z',
|
|
67
|
+
sourceRevision: optionsArg.sourceRevision ?? 'c'.repeat(40),
|
|
68
|
+
apps,
|
|
69
|
+
};
|
|
70
|
+
const errors = appstore.validateAppStoreCatalog(catalog, { supportedFeatureIds: usedFeatureIds(catalog) });
|
|
71
|
+
if (errors.length > 0)
|
|
72
|
+
throw new Error(`test catalog refused by the contract: ${errors.join('; ')}`);
|
|
73
|
+
return catalog;
|
|
74
|
+
};
|
|
75
|
+
/** The signed envelope of a test catalog, as the publisher would ship it. */
|
|
76
|
+
export const signAppStoreTestCatalog = async (catalogArg, keyArg) => await plugins.servezoneInterfacesRuntime.signAppStoreCatalog(catalogArg, [keyArg.signingKey], {
|
|
77
|
+
supportedFeatureIds: usedFeatureIds(catalogArg),
|
|
78
|
+
});
|
|
79
|
+
const gzip = async (bytesArg) => new Uint8Array(await new Response(new Blob([bytesArg]).stream().pipeThrough(new CompressionStream('gzip'))).arrayBuffer());
|
|
80
|
+
/**
|
|
81
|
+
* The gzip-compressed npm package tarball (`package/…`) of `@serve.zone/appstore`, carrying
|
|
82
|
+
* `envelopeTextArg` at the envelope's package path, or no envelope for `null`.
|
|
83
|
+
*/
|
|
84
|
+
export const createAppStoreTestPackageTarball = async (envelopeTextArg, optionsArg = {}) => {
|
|
85
|
+
const encoder = new TextEncoder();
|
|
86
|
+
const packageJson = encoder.encode(JSON.stringify({
|
|
87
|
+
name: appStoreCatalogPackageName,
|
|
88
|
+
version: optionsArg.packageVersion ?? '33.0.0',
|
|
89
|
+
}));
|
|
90
|
+
const filler = new Uint8Array(optionsArg.fillerBytes ?? 0).fill(0x20);
|
|
91
|
+
const entries = [
|
|
92
|
+
{ header: { name: 'package/package.json', size: packageJson.byteLength }, body: packageJson },
|
|
93
|
+
{ header: { name: 'package/dist_catalog/catalog.json', size: filler.byteLength }, body: filler },
|
|
94
|
+
];
|
|
95
|
+
if (envelopeTextArg !== null) {
|
|
96
|
+
const envelope = encoder.encode(envelopeTextArg);
|
|
97
|
+
entries.push({
|
|
98
|
+
header: { name: `package/${appStoreCatalogEnvelopePackagePath}`, size: envelope.byteLength },
|
|
99
|
+
body: envelope,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return await gzip(await plugins.modernTar.packTar(entries));
|
|
103
|
+
};
|
|
104
|
+
/** The npm `dist.integrity` of a tarball. */
|
|
105
|
+
export const computeAppStoreTestIntegrity = (bytesArg) => `sha512-${plugins.crypto.createHash('sha512').update(bytesArg).digest('base64')}`;
|
|
106
|
+
/** A registry stub at `originArg` whose `latest` names `tarballArg`. */
|
|
107
|
+
export const createAppStoreTestRegistry = (originArg, tarballArg, optionsArg = {}) => ({
|
|
108
|
+
manifest: {
|
|
109
|
+
name: appStoreCatalogPackageName,
|
|
110
|
+
version: optionsArg.packageVersion ?? '33.0.0',
|
|
111
|
+
dist: { tarball: `${originArg}${tarballPath}`, integrity: optionsArg.integrity ?? computeAppStoreTestIntegrity(tarballArg) },
|
|
112
|
+
},
|
|
113
|
+
tarball: tarballArg,
|
|
114
|
+
});
|
|
115
|
+
/**
|
|
116
|
+
* A `fetch` serving one stub per registry origin: the `latest` manifest of
|
|
117
|
+
* `@serve.zone/appstore` and its tarball. An origin without a stub fails like an unreachable host;
|
|
118
|
+
* a hanging stub rejects once the request's signal aborts.
|
|
119
|
+
*/
|
|
120
|
+
export const createAppStoreTestFetch = (registriesArg) => async (inputArg, initArg) => {
|
|
121
|
+
const url = new URL(inputArg instanceof Request ? inputArg.url : inputArg);
|
|
122
|
+
const stub = registriesArg[url.origin];
|
|
123
|
+
if (stub === undefined)
|
|
124
|
+
throw new TypeError(`fetch failed: no registry at ${url.origin}`);
|
|
125
|
+
const signal = initArg?.signal ?? null;
|
|
126
|
+
if (stub.hang === true) {
|
|
127
|
+
return await new Promise((_resolveArg, rejectArg) => {
|
|
128
|
+
const abort = () => rejectArg(signal?.reason ?? new Error('aborted'));
|
|
129
|
+
if (signal?.aborted === true)
|
|
130
|
+
abort();
|
|
131
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
if (stub.status !== undefined)
|
|
135
|
+
return new Response('unavailable', { status: stub.status });
|
|
136
|
+
if (url.pathname === `/${appStoreCatalogPackageName.replace('/', '%2f')}/latest`) {
|
|
137
|
+
return stub.manifest === null
|
|
138
|
+
? new Response('not found', { status: 404 })
|
|
139
|
+
: new Response(JSON.stringify(stub.manifest), { headers: { 'content-type': 'application/json' } });
|
|
140
|
+
}
|
|
141
|
+
if (url.pathname === tarballPath && stub.tarball !== undefined) {
|
|
142
|
+
return new Response(new Blob([stub.tarball]));
|
|
143
|
+
}
|
|
144
|
+
return new Response('not found', { status: 404 });
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c190ZXN0aW5nL2ZpeHR1cmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBQ0gsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLDBCQUEwQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFnRHpHLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQztBQUVuQyw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsS0FBSyxJQUFzQyxFQUFFO0lBQ3ZGLE1BQU0sVUFBVSxHQUFHLE1BQU0sT0FBTyxDQUFDLDBCQUEwQixDQUFDLCtCQUErQixFQUFFLENBQUM7SUFDOUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLDBCQUEwQixDQUFDLDRCQUE0QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7QUFDakgsQ0FBQyxDQUFDO0FBRUYsc0dBQXNHO0FBQ3RHLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLENBQzdDLE9BQWUsRUFDZixhQUFxQixFQUNyQixZQUFZLEdBQTRCLEVBQUUsRUFDMUIsRUFBRSxDQUFDLENBQUM7SUFDcEIsS0FBSyxFQUFFLFdBQVcsT0FBTyxXQUFXLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDOUQsV0FBVyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDM0UsR0FBRyxZQUFZO0NBQ2hCLENBQUMsQ0FBQztBQUVILE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBZSxFQUFFLFFBQWdCLEVBQVUsRUFBRTtJQUNwRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLG1C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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './fixtures.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as crypto from 'node:crypto';
|
|
2
|
+
export { crypto };
|
|
3
|
+
import * as servezoneInterfaces from '@serve.zone/interfaces';
|
|
4
|
+
import * as servezoneInterfacesRuntime from '@serve.zone/interfaces/runtime';
|
|
5
|
+
export { servezoneInterfaces, servezoneInterfacesRuntime };
|
|
6
|
+
import * as modernTar from 'modern-tar';
|
|
7
|
+
export { modernTar };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// node native
|
|
2
|
+
import * as crypto from 'node:crypto';
|
|
3
|
+
export { crypto };
|
|
4
|
+
// @serve.zone scope
|
|
5
|
+
import * as servezoneInterfaces from '@serve.zone/interfaces';
|
|
6
|
+
import * as servezoneInterfacesRuntime from '@serve.zone/interfaces/runtime';
|
|
7
|
+
export { servezoneInterfaces, servezoneInterfacesRuntime };
|
|
8
|
+
// third party
|
|
9
|
+
import * as modernTar from 'modern-tar';
|
|
10
|
+
export { modernTar };
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3Rlc3RpbmcvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjO0FBQ2QsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBRWxCLG9CQUFvQjtBQUNwQixPQUFPLEtBQUssbUJBQW1CLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxLQUFLLDBCQUEwQixNQUFNLGdDQUFnQyxDQUFDO0FBRTdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBRSxDQUFDO0FBRTNELGNBQWM7QUFDZCxPQUFPLEtBQUssU0FBUyxNQUFNLFlBQVksQ0FBQztBQUV4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,30 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@serve.zone/appstore",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "33.0.0",
|
|
4
4
|
"private": false,
|
|
5
|
-
"description": "serve.zone App Store
|
|
5
|
+
"description": "serve.zone App Store: the signed runtime catalog and its consumer loader.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"exports": {
|
|
8
|
-
".": "./dist_ts_client/index.js"
|
|
8
|
+
".": "./dist_ts_client/index.js",
|
|
9
|
+
"./catalog.envelope.json": "./dist_catalog/catalog.envelope.json",
|
|
10
|
+
"./testing": "./dist_ts_testing/index.js"
|
|
9
11
|
},
|
|
10
12
|
"author": "Task Venture Capital GmbH",
|
|
11
13
|
"license": "MIT",
|
|
12
14
|
"dependencies": {
|
|
13
|
-
"@
|
|
14
|
-
"
|
|
15
|
+
"@serve.zone/interfaces": "32.53.0",
|
|
16
|
+
"modern-tar": "0.8.5"
|
|
15
17
|
},
|
|
16
18
|
"devDependencies": {
|
|
17
|
-
"@git.zone/tsbuild": "^
|
|
19
|
+
"@git.zone/tsbuild": "^6.0.0",
|
|
18
20
|
"@git.zone/tsdoc": "3.0.2",
|
|
19
21
|
"@git.zone/tstest": "7.2.0",
|
|
20
22
|
"@types/node": "26.6.3"
|
|
21
23
|
},
|
|
22
24
|
"files": [
|
|
23
|
-
"apps/**/*",
|
|
24
|
-
"appstore.json",
|
|
25
|
-
"appstore.resolved.json",
|
|
26
25
|
"ts_client/**/*",
|
|
27
26
|
"dist_ts_client/**/*",
|
|
27
|
+
"ts_testing/**/*",
|
|
28
|
+
"dist_ts_testing/**/*",
|
|
29
|
+
"dist_catalog/**/*",
|
|
28
30
|
".smartconfig.json",
|
|
29
31
|
"readme.md",
|
|
30
32
|
"changelog.md",
|
|
@@ -46,8 +48,11 @@
|
|
|
46
48
|
"cloudly"
|
|
47
49
|
],
|
|
48
50
|
"scripts": {
|
|
49
|
-
"test": "
|
|
50
|
-
"build": "node
|
|
51
|
+
"test": "tstest test/ --verbose --logfile --timeout 60",
|
|
52
|
+
"build": "tsbuild tsfolders && node dist_ts_publisher/cli.js build",
|
|
53
|
+
"build:release": "tsbuild tsfolders && node dist_ts_publisher/cli.js build --release",
|
|
54
|
+
"catalog:lock": "tsbuild tsfolders && node dist_ts_publisher/cli.js lock",
|
|
55
|
+
"catalog:trustedkey": "tsbuild tsfolders && node dist_ts_publisher/cli.js trusted-key",
|
|
51
56
|
"buildDocs": "tsdoc"
|
|
52
57
|
}
|
|
53
58
|
}
|