@peers-app/peers-sdk 0.27.2 → 0.27.4
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/contracts/contract-proxy.d.ts +7 -0
- package/dist/contracts/contract-proxy.js +19 -2
- package/dist/contracts/create-local-consumer.js +16 -1
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.js +2 -0
- package/dist/contracts/system/index.d.ts +2 -0
- package/dist/contracts/system/index.js +2 -0
- package/dist/contracts/system/invites-contract.js +2 -1
- package/dist/contracts/system/sync-check-contract.d.ts +97 -0
- package/dist/contracts/system/sync-check-contract.js +115 -0
- package/dist/contracts/tool-arguments.d.ts +15 -0
- package/dist/contracts/tool-arguments.js +41 -0
- package/dist/contracts/tool-catalog-service.js +2 -12
- package/dist/data/change-tracking.d.ts +40 -0
- package/dist/data/change-tracking.js +89 -0
- package/dist/data/orm/types.d.ts +24 -7
- package/dist/data/orm/types.js +97 -24
- package/dist/data/persistent-vars.d.ts +5 -0
- package/dist/data/persistent-vars.js +24 -6
- package/dist/define/manifest.js +6 -34
- package/dist/package-loader/package-loader.js +27 -22
- package/dist/system-ids.d.ts +5 -0
- package/dist/system-ids.js +6 -1
- package/package.json +4 -2
- package/dist/context/user-context-identity.test.d.ts +0 -1
- package/dist/context/user-context-identity.test.js +0 -220
- package/dist/contracts/__tests__/action-dispatch.test.d.ts +0 -1
- package/dist/contracts/__tests__/action-dispatch.test.js +0 -319
- package/dist/contracts/__tests__/also-implements.test.d.ts +0 -1
- package/dist/contracts/__tests__/also-implements.test.js +0 -110
- package/dist/contracts/__tests__/builder.test.d.ts +0 -1
- package/dist/contracts/__tests__/builder.test.js +0 -669
- package/dist/contracts/__tests__/contract-events.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-events.test.js +0 -199
- package/dist/contracts/__tests__/contract-observables.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-observables.test.js +0 -290
- package/dist/contracts/__tests__/contract-provider-router.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-provider-router.test.js +0 -315
- package/dist/contracts/__tests__/contract-proxy.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-proxy.test.js +0 -657
- package/dist/contracts/__tests__/contract-resolvers.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-resolvers.test.js +0 -758
- package/dist/contracts/__tests__/contract-subscription-lifecycle.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-subscription-lifecycle.test.js +0 -353
- package/dist/contracts/__tests__/contract-table-events.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-table-events.test.js +0 -209
- package/dist/contracts/__tests__/contract-transport.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-transport.test.js +0 -163
- package/dist/contracts/__tests__/extract.test.d.ts +0 -1
- package/dist/contracts/__tests__/extract.test.js +0 -145
- package/dist/contracts/__tests__/frozen-contracts.test.d.ts +0 -1
- package/dist/contracts/__tests__/frozen-contracts.test.js +0 -191
- package/dist/contracts/__tests__/generic-tool-dispatch.test.d.ts +0 -1
- package/dist/contracts/__tests__/generic-tool-dispatch.test.js +0 -130
- package/dist/contracts/__tests__/host-contract-client.test.d.ts +0 -1
- package/dist/contracts/__tests__/host-contract-client.test.js +0 -793
- package/dist/contracts/__tests__/host-contract-consumer.test.d.ts +0 -1
- package/dist/contracts/__tests__/host-contract-consumer.test.js +0 -163
- package/dist/contracts/__tests__/host-contract-transport.test.d.ts +0 -1
- package/dist/contracts/__tests__/host-contract-transport.test.js +0 -66
- package/dist/contracts/__tests__/integration.test.d.ts +0 -1
- package/dist/contracts/__tests__/integration.test.js +0 -348
- package/dist/contracts/__tests__/legacy-removal.test.d.ts +0 -1
- package/dist/contracts/__tests__/legacy-removal.test.js +0 -128
- package/dist/contracts/__tests__/persistent-registry.test.d.ts +0 -1
- package/dist/contracts/__tests__/persistent-registry.test.js +0 -109
- package/dist/contracts/__tests__/playground.test.d.ts +0 -1
- package/dist/contracts/__tests__/playground.test.js +0 -216
- package/dist/contracts/__tests__/registry.test.d.ts +0 -1
- package/dist/contracts/__tests__/registry.test.js +0 -238
- package/dist/contracts/__tests__/remote-contract-transport.test.d.ts +0 -1
- package/dist/contracts/__tests__/remote-contract-transport.test.js +0 -119
- package/dist/contracts/__tests__/system-contracts.test.d.ts +0 -1
- package/dist/contracts/__tests__/system-contracts.test.js +0 -247
- package/dist/contracts/__tests__/target-dispatch.d.ts +0 -11
- package/dist/contracts/__tests__/target-dispatch.js +0 -24
- package/dist/contracts/__tests__/tool-catalog-inventory.test.d.ts +0 -1
- package/dist/contracts/__tests__/tool-catalog-inventory.test.js +0 -44
- package/dist/contracts/__tests__/tool-catalog-service.test.d.ts +0 -1
- package/dist/contracts/__tests__/tool-catalog-service.test.js +0 -482
- package/dist/contracts/__tests__/tool-catalog.test.d.ts +0 -1
- package/dist/contracts/__tests__/tool-catalog.test.js +0 -1199
- package/dist/contracts/__tests__/validate.test.d.ts +0 -1
- package/dist/contracts/__tests__/validate.test.js +0 -991
- package/dist/contracts/__tests__/workflow-context.test.d.ts +0 -1
- package/dist/contracts/__tests__/workflow-context.test.js +0 -50
- package/dist/data/access-level.test.d.ts +0 -1
- package/dist/data/access-level.test.js +0 -53
- package/dist/data/change-tracking.test.d.ts +0 -1
- package/dist/data/change-tracking.test.js +0 -62
- package/dist/data/files/files.test.d.ts +0 -1
- package/dist/data/files/files.test.js +0 -770
- package/dist/data/group-members.test.d.ts +0 -1
- package/dist/data/group-members.test.js +0 -336
- package/dist/data/group-share.test.d.ts +0 -1
- package/dist/data/group-share.test.js +0 -110
- package/dist/data/groups.test.d.ts +0 -1
- package/dist/data/groups.test.js +0 -153
- package/dist/data/orm/cursor.test.d.ts +0 -1
- package/dist/data/orm/cursor.test.js +0 -314
- package/dist/data/orm/data-query.mongo.test.d.ts +0 -1
- package/dist/data/orm/data-query.mongo.test.js +0 -367
- package/dist/data/orm/data-query.sqlite.test.d.ts +0 -1
- package/dist/data/orm/data-query.sqlite.test.js +0 -365
- package/dist/data/orm/data-query.test.d.ts +0 -1
- package/dist/data/orm/data-query.test.js +0 -545
- package/dist/data/orm/dependency-injection.test.d.ts +0 -1
- package/dist/data/orm/dependency-injection.test.js +0 -171
- package/dist/data/orm/event-registry.test.d.ts +0 -1
- package/dist/data/orm/event-registry.test.js +0 -44
- package/dist/data/orm/multi-cursors.test.d.ts +0 -1
- package/dist/data/orm/multi-cursors.test.js +0 -463
- package/dist/data/orm/sql.data-source.test.d.ts +0 -1
- package/dist/data/orm/sql.data-source.test.js +0 -731
- package/dist/data/orm/table-container-events.test.d.ts +0 -1
- package/dist/data/orm/table-container-events.test.js +0 -101
- package/dist/data/orm/table-container.test.d.ts +0 -1
- package/dist/data/orm/table-container.test.js +0 -273
- package/dist/data/orm/table.event-source.test.d.ts +0 -1
- package/dist/data/orm/table.event-source.test.js +0 -331
- package/dist/data/orm/types.test.d.ts +0 -1
- package/dist/data/orm/types.test.js +0 -409
- package/dist/data/package-table-identity.test.d.ts +0 -1
- package/dist/data/package-table-identity.test.js +0 -46
- package/dist/data/package-version-permissions.test.d.ts +0 -1
- package/dist/data/package-version-permissions.test.js +0 -107
- package/dist/data/package-version-resolver.test.d.ts +0 -4
- package/dist/data/package-version-resolver.test.js +0 -543
- package/dist/data/package-versions.test.d.ts +0 -1
- package/dist/data/package-versions.test.js +0 -227
- package/dist/data/persistent-vars.conflict.test.d.ts +0 -1
- package/dist/data/persistent-vars.conflict.test.js +0 -126
- package/dist/data/persistent-vars.migration.test.d.ts +0 -1
- package/dist/data/persistent-vars.migration.test.js +0 -133
- package/dist/data/persistent-vars.package-scope.test.d.ts +0 -1
- package/dist/data/persistent-vars.package-scope.test.js +0 -27
- package/dist/data/sync-recovery-queue.test.d.ts +0 -1
- package/dist/data/sync-recovery-queue.test.js +0 -215
- package/dist/data/table-signing.test.d.ts +0 -1
- package/dist/data/table-signing.test.js +0 -118
- package/dist/data/tool-access.test.d.ts +0 -1
- package/dist/data/tool-access.test.js +0 -166
- package/dist/data/user-permissions.test.d.ts +0 -1
- package/dist/data/user-permissions.test.js +0 -305
- package/dist/data/user-trust-levels.test.d.ts +0 -1
- package/dist/data/user-trust-levels.test.js +0 -37
- package/dist/define/also-implements.test.d.ts +0 -1
- package/dist/define/also-implements.test.js +0 -123
- package/dist/define/declare-contract.test.d.ts +0 -1
- package/dist/define/declare-contract.test.js +0 -573
- package/dist/define/define.test.d.ts +0 -1
- package/dist/define/define.test.js +0 -1010
- package/dist/define/empty-fields.test.d.ts +0 -1
- package/dist/define/empty-fields.test.js +0 -55
- package/dist/define/events-observables.test.d.ts +0 -1
- package/dist/define/events-observables.test.js +0 -1013
- package/dist/define/serve-members.test.d.ts +0 -1
- package/dist/define/serve-members.test.js +0 -630
- package/dist/define/vars.test.d.ts +0 -1
- package/dist/define/vars.test.js +0 -39
- package/dist/device/binary-peer-connection-v2.test.d.ts +0 -1
- package/dist/device/binary-peer-connection-v2.test.js +0 -730
- package/dist/device/binary-peer-connection.test.d.ts +0 -1
- package/dist/device/binary-peer-connection.test.js +0 -184
- package/dist/device/connection.test.d.ts +0 -1
- package/dist/device/connection.test.js +0 -613
- package/dist/device/device-election.test.d.ts +0 -1
- package/dist/device/device-election.test.js +0 -516
- package/dist/device/device.test.d.ts +0 -1
- package/dist/device/device.test.js +0 -243
- package/dist/device/frame-cipher.test.d.ts +0 -1
- package/dist/device/frame-cipher.test.js +0 -219
- package/dist/device/get-trust-level-fn.test.d.ts +0 -1
- package/dist/device/get-trust-level-fn.test.js +0 -685
- package/dist/device/streamed-socket.test.d.ts +0 -1
- package/dist/device/streamed-socket.test.js +0 -216
- package/dist/device/tx-encoding.test.d.ts +0 -1
- package/dist/device/tx-encoding.test.js +0 -295
- package/dist/device-pairing/cpace.test.d.ts +0 -1
- package/dist/device-pairing/cpace.test.js +0 -116
- package/dist/device-pairing/device-pairing.test.d.ts +0 -1
- package/dist/device-pairing/device-pairing.test.js +0 -211
- package/dist/hlc.test.d.ts +0 -1
- package/dist/hlc.test.js +0 -45
- package/dist/host-credentials.test.d.ts +0 -1
- package/dist/host-credentials.test.js +0 -88
- package/dist/identity/account-email.test.d.ts +0 -1
- package/dist/identity/account-email.test.js +0 -59
- package/dist/identity/anchor-document.test.d.ts +0 -1
- package/dist/identity/anchor-document.test.js +0 -16
- package/dist/identity/anchor-resolution.test.d.ts +0 -1
- package/dist/identity/anchor-resolution.test.js +0 -130
- package/dist/identity/key-change.test.d.ts +0 -1
- package/dist/identity/key-change.test.js +0 -811
- package/dist/invites/group-approval.test.d.ts +0 -1
- package/dist/invites/group-approval.test.js +0 -223
- package/dist/invites/invite-token.test.d.ts +0 -1
- package/dist/invites/invite-token.test.js +0 -123
- package/dist/keys.test.d.ts +0 -1
- package/dist/keys.test.js +0 -336
- package/dist/logging/console-logger.test.d.ts +0 -1
- package/dist/logging/console-logger.test.js +0 -300
- package/dist/logging/console-logs.table.test.d.ts +0 -1
- package/dist/logging/console-logs.table.test.js +0 -156
- package/dist/observable.test.d.ts +0 -1
- package/dist/observable.test.js +0 -309
- package/dist/package-build/build-package.test.d.ts +0 -1
- package/dist/package-build/build-package.test.js +0 -204
- package/dist/package-build/contract-add.test.d.ts +0 -1
- package/dist/package-build/contract-add.test.js +0 -467
- package/dist/package-build/freeze-contracts.test.d.ts +0 -1
- package/dist/package-build/freeze-contracts.test.js +0 -355
- package/dist/package-installer/package-author-signing.test.d.ts +0 -1
- package/dist/package-installer/package-author-signing.test.js +0 -200
- package/dist/package-installer/package-cloner.test.d.ts +0 -1
- package/dist/package-installer/package-cloner.test.js +0 -278
- package/dist/package-installer/package-creator.test.d.ts +0 -1
- package/dist/package-installer/package-creator.test.js +0 -908
- package/dist/package-installer/package-dev-tools.test.d.ts +0 -1
- package/dist/package-installer/package-dev-tools.test.js +0 -64
- package/dist/package-installer/package-installer.test.d.ts +0 -1
- package/dist/package-installer/package-installer.test.js +0 -882
- package/dist/package-installer/package-propagation.test.d.ts +0 -1
- package/dist/package-installer/package-propagation.test.js +0 -1269
- package/dist/package-installer/package-publisher.test.d.ts +0 -1
- package/dist/package-installer/package-publisher.test.js +0 -153
- package/dist/package-installer/package-remote-checker.test.d.ts +0 -1
- package/dist/package-installer/package-remote-checker.test.js +0 -334
- package/dist/package-installer/package-seed-installer.test.d.ts +0 -1
- package/dist/package-installer/package-seed-installer.test.js +0 -123
- package/dist/package-installer/package-tarball.test.d.ts +0 -1
- package/dist/package-installer/package-tarball.test.js +0 -75
- package/dist/package-installer/peers-core-installer.test.d.ts +0 -1
- package/dist/package-installer/peers-core-installer.test.js +0 -49
- package/dist/package-installer/peers-core-trust-anchor.test.d.ts +0 -1
- package/dist/package-installer/peers-core-trust-anchor.test.js +0 -155
- package/dist/package-loader/contract-package-loader.test.d.ts +0 -1
- package/dist/package-loader/contract-package-loader.test.js +0 -274
- package/dist/package-loader/host-authority-loading.test.d.ts +0 -1
- package/dist/package-loader/host-authority-loading.test.js +0 -104
- package/dist/package-loader/host-dispatch-policy.test.d.ts +0 -1
- package/dist/package-loader/host-dispatch-policy.test.js +0 -56
- package/dist/package-loader/isolated-artifact.test.d.ts +0 -1
- package/dist/package-loader/isolated-artifact.test.js +0 -688
- package/dist/package-loader/isolated-persistent-var-gateway.test.d.ts +0 -1
- package/dist/package-loader/isolated-persistent-var-gateway.test.js +0 -56
- package/dist/package-loader/isolated-table-gateway.test.d.ts +0 -1
- package/dist/package-loader/isolated-table-gateway.test.js +0 -633
- package/dist/package-loader/package-loader.test.d.ts +0 -1
- package/dist/package-loader/package-loader.test.js +0 -1764
- package/dist/package-loader/resolve-consumed-contracts.test.d.ts +0 -1
- package/dist/package-loader/resolve-consumed-contracts.test.js +0 -166
- package/dist/serial-json.compat.test.d.ts +0 -1
- package/dist/serial-json.compat.test.js +0 -369
- package/dist/serial-json.test.d.ts +0 -1
- package/dist/serial-json.test.js +0 -401
- package/dist/testing/mock-host-contract.test.d.ts +0 -1
- package/dist/testing/mock-host-contract.test.js +0 -782
- package/dist/utils.test.d.ts +0 -1
- package/dist/utils.test.js +0 -232
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const file_types_1 = require("../data/files/file.types");
|
|
4
|
-
const keys_1 = require("../keys");
|
|
5
|
-
const utils_1 = require("../utils");
|
|
6
|
-
const package_author_signing_1 = require("./package-author-signing");
|
|
7
|
-
const package_publisher_1 = require("./package-publisher");
|
|
8
|
-
const package_tarball_1 = require("./package-tarball");
|
|
9
|
-
function makeOpts(overrides) {
|
|
10
|
-
const keys = (0, keys_1.newKeys)();
|
|
11
|
-
return {
|
|
12
|
-
packageId: (0, utils_1.newid)(),
|
|
13
|
-
version: "1.0.0",
|
|
14
|
-
bundles: {
|
|
15
|
-
packageBundle: 'console.log("main");',
|
|
16
|
-
},
|
|
17
|
-
publicKey: keys.publicKey,
|
|
18
|
-
sign: (payload) => (0, package_author_signing_1.signPackageAuthor)({ ...payload, packageBundleFileHash: payload.packageBundleFileHash }, keys.secretKey),
|
|
19
|
-
...overrides,
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
describe("package-publisher", () => {
|
|
23
|
-
describe("buildPublishArtifacts", () => {
|
|
24
|
-
it("round-trips through unpackPeersTarball and verifies signature", async () => {
|
|
25
|
-
const keys = (0, keys_1.newKeys)();
|
|
26
|
-
const opts = makeOpts({
|
|
27
|
-
publicKey: keys.publicKey,
|
|
28
|
-
sign: (payload) => (0, package_author_signing_1.signPackageAuthor)(payload, keys.secretKey),
|
|
29
|
-
});
|
|
30
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(opts);
|
|
31
|
-
expect(result.tarball).toBeInstanceOf(Uint8Array);
|
|
32
|
-
expect(result.tarball.length).toBeGreaterThan(0);
|
|
33
|
-
const unpacked = await (0, package_tarball_1.unpackPeersTarball)(result.tarball);
|
|
34
|
-
expect(unpacked.packageBundle).toBe(opts.bundles.packageBundle);
|
|
35
|
-
expect(unpacked.payload.packageId).toBe(opts.packageId);
|
|
36
|
-
expect(unpacked.payload.version).toBe("1.0.0");
|
|
37
|
-
expect(unpacked.payload.versionTag).toBe("stable");
|
|
38
|
-
expect(unpacked.payload.publicKey).toBe(keys.publicKey);
|
|
39
|
-
const sigResult = (0, package_author_signing_1.verifyPackageAuthorSignature)({
|
|
40
|
-
...unpacked.payload,
|
|
41
|
-
packageAuthorSignature: unpacked.payload.packageAuthorSignature,
|
|
42
|
-
}, keys.publicKey);
|
|
43
|
-
expect(sigResult.valid).toBe(true);
|
|
44
|
-
});
|
|
45
|
-
it("pointer SHA-256 matches tarball bytes", async () => {
|
|
46
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(makeOpts());
|
|
47
|
-
const actualHash = (0, keys_1.hashBytes)(result.tarball);
|
|
48
|
-
expect(result.pointer.sha256).toBe(actualHash);
|
|
49
|
-
expect(result.tarballHash).toBe(actualHash);
|
|
50
|
-
});
|
|
51
|
-
it("includes optional routes and UI bundles", async () => {
|
|
52
|
-
const opts = makeOpts({
|
|
53
|
-
bundles: {
|
|
54
|
-
packageBundle: 'console.log("main");',
|
|
55
|
-
routesBundle: 'console.log("routes");',
|
|
56
|
-
uiBundle: 'console.log("ui");',
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(opts);
|
|
60
|
-
const unpacked = await (0, package_tarball_1.unpackPeersTarball)(result.tarball);
|
|
61
|
-
expect(unpacked.routesBundle).toBe('console.log("routes");');
|
|
62
|
-
expect(unpacked.uiBundle).toBe('console.log("ui");');
|
|
63
|
-
expect(unpacked.payload.routesBundleFileHash).toBe((0, file_types_1.computeFileHash)('console.log("routes");'));
|
|
64
|
-
expect(unpacked.payload.uiBundleFileHash).toBe((0, file_types_1.computeFileHash)('console.log("ui");'));
|
|
65
|
-
});
|
|
66
|
-
it("omits optional bundles when not provided", async () => {
|
|
67
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(makeOpts());
|
|
68
|
-
const unpacked = await (0, package_tarball_1.unpackPeersTarball)(result.tarball);
|
|
69
|
-
expect(unpacked.routesBundle).toBeUndefined();
|
|
70
|
-
expect(unpacked.uiBundle).toBeUndefined();
|
|
71
|
-
expect(unpacked.payload.routesBundleFileHash).toBeUndefined();
|
|
72
|
-
expect(unpacked.payload.uiBundleFileHash).toBeUndefined();
|
|
73
|
-
});
|
|
74
|
-
it("rejects tampered bundle hash via signature verification", async () => {
|
|
75
|
-
const keys = (0, keys_1.newKeys)();
|
|
76
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(makeOpts({
|
|
77
|
-
publicKey: keys.publicKey,
|
|
78
|
-
sign: (payload) => (0, package_author_signing_1.signPackageAuthor)(payload, keys.secretKey),
|
|
79
|
-
}));
|
|
80
|
-
const sigResult = (0, package_author_signing_1.verifyPackageAuthorSignature)({
|
|
81
|
-
...result.payload,
|
|
82
|
-
packageBundleFileHash: "tampered-hash",
|
|
83
|
-
}, keys.publicKey);
|
|
84
|
-
expect(sigResult.valid).toBe(false);
|
|
85
|
-
});
|
|
86
|
-
it("rejects wrong key via signature verification", async () => {
|
|
87
|
-
const authorKeys = (0, keys_1.newKeys)();
|
|
88
|
-
const wrongKeys = (0, keys_1.newKeys)();
|
|
89
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(makeOpts({
|
|
90
|
-
publicKey: authorKeys.publicKey,
|
|
91
|
-
sign: (payload) => (0, package_author_signing_1.signPackageAuthor)(payload, authorKeys.secretKey),
|
|
92
|
-
}));
|
|
93
|
-
const sigResult = (0, package_author_signing_1.verifyPackageAuthorSignature)(result.payload, wrongKeys.publicKey);
|
|
94
|
-
expect(sigResult.valid).toBe(false);
|
|
95
|
-
});
|
|
96
|
-
it("signs the package id as createdBy when the caller omits it", async () => {
|
|
97
|
-
const keys = (0, keys_1.newKeys)();
|
|
98
|
-
const opts = makeOpts({
|
|
99
|
-
publicKey: keys.publicKey,
|
|
100
|
-
sign: (payload) => (0, package_author_signing_1.signPackageAuthor)(payload, keys.secretKey),
|
|
101
|
-
});
|
|
102
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(opts);
|
|
103
|
-
const unpacked = await (0, package_tarball_1.unpackPeersTarball)(result.tarball);
|
|
104
|
-
expect(unpacked.payload.createdBy).toBe(opts.packageId);
|
|
105
|
-
expect((0, package_author_signing_1.verifyPackageAuthorSignature)({ ...unpacked.payload, createdBy: opts.packageId }, keys.publicKey).valid).toBe(true);
|
|
106
|
-
});
|
|
107
|
-
it("defaults versionTag to stable", async () => {
|
|
108
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(makeOpts());
|
|
109
|
-
expect(result.pointer.versionTag).toBe("stable");
|
|
110
|
-
expect(result.payload.versionTag).toBe("stable");
|
|
111
|
-
});
|
|
112
|
-
it("respects custom versionTag", async () => {
|
|
113
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(makeOpts({ versionTag: "beta" }));
|
|
114
|
-
expect(result.pointer.versionTag).toBe("beta");
|
|
115
|
-
expect(result.payload.versionTag).toBe("beta");
|
|
116
|
-
expect(result.pointer.path).toBe("v1.0.0-beta.peers-pkg.tar.gz");
|
|
117
|
-
});
|
|
118
|
-
it("uses provided packageVersionId", async () => {
|
|
119
|
-
const pvId = (0, utils_1.newid)();
|
|
120
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(makeOpts({ packageVersionId: pvId }));
|
|
121
|
-
expect(result.pointer.packageVersionId).toBe(pvId);
|
|
122
|
-
expect(result.payload.packageVersionId).toBe(pvId);
|
|
123
|
-
});
|
|
124
|
-
it("generates packageVersionId when not provided", async () => {
|
|
125
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(makeOpts());
|
|
126
|
-
expect(result.pointer.packageVersionId).toHaveLength(25);
|
|
127
|
-
expect(result.payload.packageVersionId).toBe(result.pointer.packageVersionId);
|
|
128
|
-
});
|
|
129
|
-
it("pointer path follows naming convention", async () => {
|
|
130
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(makeOpts({ version: "2.5.1", versionTag: "stable" }));
|
|
131
|
-
expect(result.pointer.path).toBe("v2.5.1-stable.peers-pkg.tar.gz");
|
|
132
|
-
});
|
|
133
|
-
it("pointer contains publishedAt ISO timestamp", async () => {
|
|
134
|
-
const before = new Date().toISOString();
|
|
135
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(makeOpts());
|
|
136
|
-
const after = new Date().toISOString();
|
|
137
|
-
expect(result.pointer.publishedAt).toBeDefined();
|
|
138
|
-
expect(result.pointer.publishedAt >= before).toBe(true);
|
|
139
|
-
expect(result.pointer.publishedAt <= after).toBe(true);
|
|
140
|
-
});
|
|
141
|
-
it("bundle hashes in payload match actual content hashes", async () => {
|
|
142
|
-
const bundles = {
|
|
143
|
-
packageBundle: "const x = 1;",
|
|
144
|
-
routesBundle: "const r = 2;",
|
|
145
|
-
uiBundle: "const u = 3;",
|
|
146
|
-
};
|
|
147
|
-
const result = await (0, package_publisher_1.buildPublishArtifacts)(makeOpts({ bundles }));
|
|
148
|
-
expect(result.payload.packageBundleFileHash).toBe((0, file_types_1.computeFileHash)(bundles.packageBundle));
|
|
149
|
-
expect(result.payload.routesBundleFileHash).toBe((0, file_types_1.computeFileHash)(bundles.routesBundle));
|
|
150
|
-
expect(result.payload.uiBundleFileHash).toBe((0, file_types_1.computeFileHash)(bundles.uiBundle));
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const mockPackageVersionsGet = jest.fn();
|
|
4
|
-
const mockPackageVersionsSignAndSave = jest.fn();
|
|
5
|
-
jest.mock("../data/package-versions", () => {
|
|
6
|
-
const actual = jest.requireActual("../data/package-versions");
|
|
7
|
-
return {
|
|
8
|
-
...actual,
|
|
9
|
-
PackageVersions: (ctx) => ({
|
|
10
|
-
get: (packageVersionId) => mockPackageVersionsGet(ctx, packageVersionId),
|
|
11
|
-
signAndSave: (pv) => mockPackageVersionsSignAndSave(ctx, pv),
|
|
12
|
-
}),
|
|
13
|
-
};
|
|
14
|
-
});
|
|
15
|
-
const mockPackagesGet = jest.fn();
|
|
16
|
-
const mockPackagesSignAndSave = jest.fn();
|
|
17
|
-
jest.mock("../data/packages", () => ({
|
|
18
|
-
Packages: (ctx) => ({
|
|
19
|
-
get: (packageId) => mockPackagesGet(ctx, packageId),
|
|
20
|
-
signAndSave: (pkg) => mockPackagesSignAndSave(ctx, pkg),
|
|
21
|
-
}),
|
|
22
|
-
}));
|
|
23
|
-
const mockSaveBundleFile = jest.fn();
|
|
24
|
-
jest.mock("./package-installer", () => ({
|
|
25
|
-
saveBundleFile: (...args) => mockSaveBundleFile(...args),
|
|
26
|
-
}));
|
|
27
|
-
const mockActivateBestEligibleVersion = jest.fn();
|
|
28
|
-
jest.mock("./package-propagation", () => ({
|
|
29
|
-
activateBestEligibleVersion: (...args) => mockActivateBestEligibleVersion(...args),
|
|
30
|
-
}));
|
|
31
|
-
const mockResolveDevicePackageVersion = jest.fn();
|
|
32
|
-
jest.mock("../data/package-version-resolver", () => ({
|
|
33
|
-
resolveDevicePackageVersion: (...args) => mockResolveDevicePackageVersion(...args),
|
|
34
|
-
}));
|
|
35
|
-
// Pin the host to a fresh "current" peers-core key and revoke a fresh "old" one so the
|
|
36
|
-
// revocation tests do not depend on the real constants.
|
|
37
|
-
jest.mock("../system-ids", () => {
|
|
38
|
-
const actual = jest.requireActual("../system-ids");
|
|
39
|
-
const { newKeys: makeKeys } = jest.requireActual("../keys");
|
|
40
|
-
const revoked = makeKeys();
|
|
41
|
-
const current = makeKeys();
|
|
42
|
-
return {
|
|
43
|
-
...actual,
|
|
44
|
-
peersCorePublishPublicKey: current.publicKey,
|
|
45
|
-
peersCoreRevokedPublishPublicKeys: [revoked.publicKey],
|
|
46
|
-
__testKeys: { revoked, current },
|
|
47
|
-
};
|
|
48
|
-
});
|
|
49
|
-
const file_types_1 = require("../data/files/file.types");
|
|
50
|
-
const keys_1 = require("../keys");
|
|
51
|
-
const systemIds = require("../system-ids");
|
|
52
|
-
const package_author_signing_1 = require("./package-author-signing");
|
|
53
|
-
const package_remote_checker_1 = require("./package-remote-checker");
|
|
54
|
-
const package_tarball_1 = require("./package-tarball");
|
|
55
|
-
// PKG_ID is peers-core's id so the trust-anchor re-pin path is exercised.
|
|
56
|
-
const PKG_ID = "00mh0wlipjixk2gqmurbwee0o";
|
|
57
|
-
const PV_ID = "00mpdg7xstwt3oe51x9brk15i";
|
|
58
|
-
const { revoked: revokedCoreKeys, current: currentCoreKeys } = systemIds.__testKeys;
|
|
59
|
-
function makeContext(dataContextId) {
|
|
60
|
-
return { dataContextId };
|
|
61
|
-
}
|
|
62
|
-
async function makeSignedRemoteResult(secretKey, publicKey, overrides = {}) {
|
|
63
|
-
const bundleCode = overrides.packageBundleFileHash
|
|
64
|
-
? "console.log('different');"
|
|
65
|
-
: "console.log('hello');";
|
|
66
|
-
const bundleHash = (0, file_types_1.computeFileHash)(bundleCode);
|
|
67
|
-
const payloadBase = {
|
|
68
|
-
packageId: PKG_ID,
|
|
69
|
-
packageVersionId: PV_ID,
|
|
70
|
-
version: "1.0.0",
|
|
71
|
-
versionTag: "stable",
|
|
72
|
-
packageBundleFileHash: bundleHash,
|
|
73
|
-
routesBundleFileHash: undefined,
|
|
74
|
-
uiBundleFileHash: undefined,
|
|
75
|
-
...overrides,
|
|
76
|
-
};
|
|
77
|
-
const signature = (0, package_author_signing_1.signPackageAuthor)({
|
|
78
|
-
packageId: payloadBase.packageId,
|
|
79
|
-
packageVersionId: payloadBase.packageVersionId,
|
|
80
|
-
version: payloadBase.version,
|
|
81
|
-
versionTag: payloadBase.versionTag,
|
|
82
|
-
packageBundleFileHash: payloadBase.packageBundleFileHash,
|
|
83
|
-
routesBundleFileHash: payloadBase.routesBundleFileHash,
|
|
84
|
-
uiBundleFileHash: payloadBase.uiBundleFileHash,
|
|
85
|
-
}, secretKey);
|
|
86
|
-
const payload = {
|
|
87
|
-
...payloadBase,
|
|
88
|
-
publicKey,
|
|
89
|
-
packageAuthorSignature: signature,
|
|
90
|
-
};
|
|
91
|
-
const tarball = await (0, package_tarball_1.packPeersTarball)({ payload, packageBundle: bundleCode });
|
|
92
|
-
const pointer = {
|
|
93
|
-
packageVersionId: payload.packageVersionId,
|
|
94
|
-
version: payload.version,
|
|
95
|
-
versionTag: payload.versionTag,
|
|
96
|
-
path: "v1.0.0-stable.peers-pkg.tar.gz",
|
|
97
|
-
sha256: (0, keys_1.hashBytes)(tarball),
|
|
98
|
-
publishedAt: new Date().toISOString(),
|
|
99
|
-
};
|
|
100
|
-
return { payload, bundleCode, bundleHash, tarball, pointer };
|
|
101
|
-
}
|
|
102
|
-
describe("package-remote-checker", () => {
|
|
103
|
-
let keys;
|
|
104
|
-
beforeAll(() => {
|
|
105
|
-
keys = (0, keys_1.newKeys)();
|
|
106
|
-
});
|
|
107
|
-
beforeEach(() => {
|
|
108
|
-
(0, package_remote_checker_1.clearRemoteCheckCache)();
|
|
109
|
-
jest.clearAllMocks();
|
|
110
|
-
mockSaveBundleFile.mockImplementation(async (_ctx, content, name) => ({
|
|
111
|
-
fileId: `file-${name}`,
|
|
112
|
-
fileHash: (0, file_types_1.computeFileHash)(content),
|
|
113
|
-
}));
|
|
114
|
-
mockPackageVersionsSignAndSave.mockImplementation(async (_ctx, pv) => pv);
|
|
115
|
-
mockPackagesSignAndSave.mockImplementation(async (_ctx, pkg) => pkg);
|
|
116
|
-
mockActivateBestEligibleVersion.mockResolvedValue({
|
|
117
|
-
activated: true,
|
|
118
|
-
activePackageVersionId: PV_ID,
|
|
119
|
-
});
|
|
120
|
-
mockResolveDevicePackageVersion.mockResolvedValue({ loaded: true, upgraded: true });
|
|
121
|
-
});
|
|
122
|
-
describe("checkPackageRemoteForNewVersion", () => {
|
|
123
|
-
it("downloads and verifies tarball when new version available", async () => {
|
|
124
|
-
const { pointer, tarball, bundleCode } = await makeSignedRemoteResult(keys.secretKey, keys.publicKey);
|
|
125
|
-
const http = {
|
|
126
|
-
fetchJson: jest.fn().mockResolvedValue(pointer),
|
|
127
|
-
fetchBinary: jest.fn().mockResolvedValue(tarball),
|
|
128
|
-
};
|
|
129
|
-
const result = await (0, package_remote_checker_1.checkPackageRemoteForNewVersion)(PKG_ID, "https://example.com/packages/test", "stable", http);
|
|
130
|
-
expect(result).not.toBeNull();
|
|
131
|
-
expect(result?.packageId).toBe(PKG_ID);
|
|
132
|
-
expect(result?.unpacked.payload.version).toBe("1.0.0");
|
|
133
|
-
expect(result?.unpacked.packageBundle).toBe(bundleCode);
|
|
134
|
-
});
|
|
135
|
-
it("verifies tarball integrity with byte-level hash", async () => {
|
|
136
|
-
const { pointer, tarball } = await makeSignedRemoteResult(keys.secretKey, keys.publicKey);
|
|
137
|
-
const badPointer = { ...pointer, sha256: (0, keys_1.hashValue)(new TextDecoder().decode(tarball)) };
|
|
138
|
-
const http = {
|
|
139
|
-
fetchJson: jest.fn().mockResolvedValue(badPointer),
|
|
140
|
-
fetchBinary: jest.fn().mockResolvedValue(tarball),
|
|
141
|
-
};
|
|
142
|
-
const result = await (0, package_remote_checker_1.checkPackageRemoteForNewVersion)(PKG_ID, "https://example.com/packages/test", "stable", http);
|
|
143
|
-
expect(result).toBeNull();
|
|
144
|
-
});
|
|
145
|
-
it("rejects tarball with invalid author signature", async () => {
|
|
146
|
-
const bundleCode = "console.log('bad');";
|
|
147
|
-
const bundleHash = (0, file_types_1.computeFileHash)(bundleCode);
|
|
148
|
-
const payload = {
|
|
149
|
-
packageId: PKG_ID,
|
|
150
|
-
packageVersionId: PV_ID,
|
|
151
|
-
version: "1.0.0",
|
|
152
|
-
versionTag: "stable",
|
|
153
|
-
packageBundleFileHash: bundleHash,
|
|
154
|
-
publicKey: keys.publicKey,
|
|
155
|
-
packageAuthorSignature: "invalidSignatureHere", // invalid
|
|
156
|
-
};
|
|
157
|
-
const tarball = await (0, package_tarball_1.packPeersTarball)({ payload, packageBundle: bundleCode });
|
|
158
|
-
const pointer = {
|
|
159
|
-
packageVersionId: PV_ID,
|
|
160
|
-
version: "1.0.0",
|
|
161
|
-
versionTag: "stable",
|
|
162
|
-
path: "v1.0.0-stable.peers-pkg.tar.gz",
|
|
163
|
-
sha256: "",
|
|
164
|
-
publishedAt: new Date().toISOString(),
|
|
165
|
-
};
|
|
166
|
-
const http = {
|
|
167
|
-
fetchJson: jest.fn().mockResolvedValue(pointer),
|
|
168
|
-
fetchBinary: jest.fn().mockResolvedValue(tarball),
|
|
169
|
-
};
|
|
170
|
-
// Should return null (error caught internally and logged)
|
|
171
|
-
const result = await (0, package_remote_checker_1.checkPackageRemoteForNewVersion)(PKG_ID, "https://example.com/packages/test", "stable", http);
|
|
172
|
-
expect(result).toBeNull();
|
|
173
|
-
});
|
|
174
|
-
it("memoizes results per (updateUrl, tag)", async () => {
|
|
175
|
-
const { pointer, tarball } = await makeSignedRemoteResult(keys.secretKey, keys.publicKey);
|
|
176
|
-
const http = {
|
|
177
|
-
fetchJson: jest.fn().mockResolvedValue(pointer),
|
|
178
|
-
fetchBinary: jest.fn().mockResolvedValue(tarball),
|
|
179
|
-
};
|
|
180
|
-
await (0, package_remote_checker_1.checkPackageRemoteForNewVersion)(PKG_ID, "https://example.com/pkg", "stable", http);
|
|
181
|
-
await (0, package_remote_checker_1.checkPackageRemoteForNewVersion)(PKG_ID, "https://example.com/pkg", "stable", http);
|
|
182
|
-
expect(http.fetchJson).toHaveBeenCalledTimes(1);
|
|
183
|
-
expect(http.fetchBinary).toHaveBeenCalledTimes(1);
|
|
184
|
-
});
|
|
185
|
-
it("rejects tarball with mismatched bundle hash", async () => {
|
|
186
|
-
const bundleCode = "console.log('real');";
|
|
187
|
-
const fakeHash = "notTheRealHash";
|
|
188
|
-
const signature = (0, package_author_signing_1.signPackageAuthor)({
|
|
189
|
-
packageId: PKG_ID,
|
|
190
|
-
packageVersionId: PV_ID,
|
|
191
|
-
version: "1.0.0",
|
|
192
|
-
versionTag: "stable",
|
|
193
|
-
packageBundleFileHash: fakeHash, // hash in payload doesn't match actual bundle
|
|
194
|
-
}, keys.secretKey);
|
|
195
|
-
const payload = {
|
|
196
|
-
packageId: PKG_ID,
|
|
197
|
-
packageVersionId: PV_ID,
|
|
198
|
-
version: "1.0.0",
|
|
199
|
-
versionTag: "stable",
|
|
200
|
-
packageBundleFileHash: fakeHash,
|
|
201
|
-
publicKey: keys.publicKey,
|
|
202
|
-
packageAuthorSignature: signature,
|
|
203
|
-
};
|
|
204
|
-
const tarball = await (0, package_tarball_1.packPeersTarball)({ payload, packageBundle: bundleCode });
|
|
205
|
-
const http = {
|
|
206
|
-
fetchJson: jest.fn().mockResolvedValue({
|
|
207
|
-
packageVersionId: PV_ID,
|
|
208
|
-
version: "1.0.0",
|
|
209
|
-
versionTag: "stable",
|
|
210
|
-
path: "test.tar.gz",
|
|
211
|
-
sha256: "",
|
|
212
|
-
publishedAt: new Date().toISOString(),
|
|
213
|
-
}),
|
|
214
|
-
fetchBinary: jest.fn().mockResolvedValue(tarball),
|
|
215
|
-
};
|
|
216
|
-
const result = await (0, package_remote_checker_1.checkPackageRemoteForNewVersion)(PKG_ID, "https://example.com/pkg2", "stable", http);
|
|
217
|
-
// Error logged, returns null
|
|
218
|
-
expect(result).toBeNull();
|
|
219
|
-
});
|
|
220
|
-
it("rejects pointer and payload mismatches", async () => {
|
|
221
|
-
const { pointer, tarball } = await makeSignedRemoteResult(keys.secretKey, keys.publicKey);
|
|
222
|
-
const http = {
|
|
223
|
-
fetchJson: jest.fn().mockResolvedValue({ ...pointer, version: "2.0.0" }),
|
|
224
|
-
fetchBinary: jest.fn().mockResolvedValue(tarball),
|
|
225
|
-
};
|
|
226
|
-
const result = await (0, package_remote_checker_1.checkPackageRemoteForNewVersion)(PKG_ID, "https://example.com/pkg3", "stable", http);
|
|
227
|
-
expect(result).toBeNull();
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
describe("checkAndInstallPackageRemoteVersion", () => {
|
|
231
|
-
it("checks local version existence per context outside the remote cache", async () => {
|
|
232
|
-
const groupA = makeContext("group-a");
|
|
233
|
-
const groupB = makeContext("group-b");
|
|
234
|
-
const { pointer, tarball } = await makeSignedRemoteResult(keys.secretKey, keys.publicKey);
|
|
235
|
-
const pkg = {
|
|
236
|
-
packageId: PKG_ID,
|
|
237
|
-
name: "test",
|
|
238
|
-
publishPublicKey: keys.publicKey,
|
|
239
|
-
updateUrl: "https://example.com/pkg",
|
|
240
|
-
};
|
|
241
|
-
const http = {
|
|
242
|
-
fetchJson: jest.fn().mockResolvedValue(pointer),
|
|
243
|
-
fetchBinary: jest.fn().mockResolvedValue(tarball),
|
|
244
|
-
};
|
|
245
|
-
mockPackageVersionsGet.mockImplementation(async (ctx, pvId) => ctx.dataContextId === "group-a" ? { packageVersionId: pvId } : undefined);
|
|
246
|
-
mockPackagesGet.mockResolvedValue(pkg);
|
|
247
|
-
const first = await (0, package_remote_checker_1.checkAndInstallPackageRemoteVersion)(groupA, pkg, "stable", http);
|
|
248
|
-
const second = await (0, package_remote_checker_1.checkAndInstallPackageRemoteVersion)(groupB, pkg, "stable", http);
|
|
249
|
-
expect(first).toBeNull();
|
|
250
|
-
expect(second?.packageVersion.packageVersionId).toBe(PV_ID);
|
|
251
|
-
expect(http.fetchJson).toHaveBeenCalledTimes(1);
|
|
252
|
-
expect(mockSaveBundleFile).toHaveBeenCalled();
|
|
253
|
-
});
|
|
254
|
-
it("re-pins peers-core from a revoked key and installs a release signed by the current key", async () => {
|
|
255
|
-
expect(PKG_ID).toBe(systemIds.peersCorePackageId);
|
|
256
|
-
const ctx = makeContext("user-ctx");
|
|
257
|
-
const { pointer, tarball } = await makeSignedRemoteResult(currentCoreKeys.secretKey, currentCoreKeys.publicKey);
|
|
258
|
-
let pkg = {
|
|
259
|
-
packageId: PKG_ID,
|
|
260
|
-
name: "peers-core",
|
|
261
|
-
publishPublicKey: revokedCoreKeys.publicKey,
|
|
262
|
-
updateUrl: "https://example.com/peers-core",
|
|
263
|
-
};
|
|
264
|
-
const http = {
|
|
265
|
-
fetchJson: jest.fn().mockResolvedValue(pointer),
|
|
266
|
-
fetchBinary: jest.fn().mockResolvedValue(tarball),
|
|
267
|
-
};
|
|
268
|
-
mockPackageVersionsGet.mockResolvedValue(undefined);
|
|
269
|
-
mockPackagesGet.mockImplementation(async () => pkg);
|
|
270
|
-
mockPackagesSignAndSave.mockImplementation(async (_ctx, saved) => {
|
|
271
|
-
pkg = saved;
|
|
272
|
-
});
|
|
273
|
-
const warn = jest.spyOn(console, "warn").mockImplementation(() => { });
|
|
274
|
-
const installed = await (0, package_remote_checker_1.checkAndInstallPackageRemoteVersion)(ctx, pkg, "stable", http);
|
|
275
|
-
expect(installed?.packageVersion.packageVersionId).toBe(PV_ID);
|
|
276
|
-
expect(mockPackagesSignAndSave).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({ packageId: PKG_ID, publishPublicKey: currentCoreKeys.publicKey }));
|
|
277
|
-
expect(pkg.publishPublicKey).toBe(currentCoreKeys.publicKey);
|
|
278
|
-
warn.mockRestore();
|
|
279
|
-
});
|
|
280
|
-
it("rejects a remote release signed by a revoked key", async () => {
|
|
281
|
-
const ctx = makeContext("user-ctx");
|
|
282
|
-
const { pointer, tarball } = await makeSignedRemoteResult(revokedCoreKeys.secretKey, revokedCoreKeys.publicKey);
|
|
283
|
-
const pkg = {
|
|
284
|
-
packageId: PKG_ID,
|
|
285
|
-
name: "peers-core",
|
|
286
|
-
publishPublicKey: currentCoreKeys.publicKey,
|
|
287
|
-
updateUrl: "https://example.com/peers-core-old",
|
|
288
|
-
};
|
|
289
|
-
const http = {
|
|
290
|
-
fetchJson: jest.fn().mockResolvedValue(pointer),
|
|
291
|
-
fetchBinary: jest.fn().mockResolvedValue(tarball),
|
|
292
|
-
};
|
|
293
|
-
mockPackageVersionsGet.mockResolvedValue(undefined);
|
|
294
|
-
mockPackagesGet.mockResolvedValue(pkg);
|
|
295
|
-
const error = jest.spyOn(console, "error").mockImplementation(() => { });
|
|
296
|
-
const installed = await (0, package_remote_checker_1.checkAndInstallPackageRemoteVersion)(ctx, pkg, "stable", http);
|
|
297
|
-
expect(installed).toBeNull();
|
|
298
|
-
expect(mockSaveBundleFile).not.toHaveBeenCalled();
|
|
299
|
-
expect(mockPackageVersionsSignAndSave).not.toHaveBeenCalled();
|
|
300
|
-
error.mockRestore();
|
|
301
|
-
});
|
|
302
|
-
});
|
|
303
|
-
describe("installRemotePackageVersion", () => {
|
|
304
|
-
it("rejects publisher key mismatch before saving files", async () => {
|
|
305
|
-
const { pointer, payload } = await makeSignedRemoteResult(keys.secretKey, keys.publicKey);
|
|
306
|
-
const result = {
|
|
307
|
-
packageId: PKG_ID,
|
|
308
|
-
pointer,
|
|
309
|
-
unpacked: { payload, packageBundle: "console.log('hello');" },
|
|
310
|
-
};
|
|
311
|
-
mockPackagesGet.mockResolvedValue({
|
|
312
|
-
packageId: PKG_ID,
|
|
313
|
-
name: "test",
|
|
314
|
-
publishPublicKey: (0, keys_1.newKeys)().publicKey,
|
|
315
|
-
});
|
|
316
|
-
await expect((0, package_remote_checker_1.installRemotePackageVersion)(makeContext("group-a"), result)).rejects.toThrow("Package publisher key mismatch");
|
|
317
|
-
expect(mockSaveBundleFile).not.toHaveBeenCalled();
|
|
318
|
-
});
|
|
319
|
-
it("establishes TOFU key and activates after installing", async () => {
|
|
320
|
-
const { pointer, payload, bundleCode } = await makeSignedRemoteResult(keys.secretKey, keys.publicKey);
|
|
321
|
-
const pkg = { packageId: PKG_ID, name: "test", publishPublicKey: "" };
|
|
322
|
-
mockPackagesGet.mockResolvedValue(pkg);
|
|
323
|
-
const installed = await (0, package_remote_checker_1.installRemotePackageVersion)(makeContext("group-a"), {
|
|
324
|
-
packageId: PKG_ID,
|
|
325
|
-
pointer,
|
|
326
|
-
unpacked: { payload, packageBundle: bundleCode },
|
|
327
|
-
});
|
|
328
|
-
expect(installed.activated).toBe(true);
|
|
329
|
-
expect(mockPackagesSignAndSave).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({ publishPublicKey: keys.publicKey }));
|
|
330
|
-
expect(mockPackageVersionsSignAndSave).toHaveBeenCalled();
|
|
331
|
-
expect(mockResolveDevicePackageVersion).toHaveBeenCalledWith(expect.objectContaining({ packageId: PKG_ID }), expect.anything(), { force: true });
|
|
332
|
-
});
|
|
333
|
-
});
|
|
334
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const mockPackageVersionsList = jest.fn();
|
|
4
|
-
const mockPackageVersionsSignAndSave = jest.fn();
|
|
5
|
-
jest.mock("../data/package-versions", () => {
|
|
6
|
-
const actual = jest.requireActual("../data/package-versions");
|
|
7
|
-
return {
|
|
8
|
-
...actual,
|
|
9
|
-
PackageVersions: (_ctx) => ({
|
|
10
|
-
list: (filter) => mockPackageVersionsList(filter),
|
|
11
|
-
signAndSave: (pv, opts) => mockPackageVersionsSignAndSave(pv, opts),
|
|
12
|
-
}),
|
|
13
|
-
};
|
|
14
|
-
});
|
|
15
|
-
const mockPackagesGet = jest.fn();
|
|
16
|
-
const mockPackagesSignAndSave = jest.fn();
|
|
17
|
-
jest.mock("../data/packages", () => ({
|
|
18
|
-
Packages: (_ctx) => ({
|
|
19
|
-
get: (packageId) => mockPackagesGet(packageId),
|
|
20
|
-
signAndSave: (pkg, opts) => mockPackagesSignAndSave(pkg, opts),
|
|
21
|
-
}),
|
|
22
|
-
}));
|
|
23
|
-
const mockSaveBundleFile = jest.fn();
|
|
24
|
-
jest.mock("./package-installer", () => ({
|
|
25
|
-
saveBundleFile: (...args) => mockSaveBundleFile(...args),
|
|
26
|
-
}));
|
|
27
|
-
const keys_1 = require("../keys");
|
|
28
|
-
const package_seed_installer_1 = require("./package-seed-installer");
|
|
29
|
-
const PKG_ID = "00mh0wlipjixk2gqmurbwee0o";
|
|
30
|
-
function makeContext() {
|
|
31
|
-
return {
|
|
32
|
-
dataContextId: "ctx",
|
|
33
|
-
packageLoader: {
|
|
34
|
-
loadPackage: jest.fn(),
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
function makeOpts(overrides = {}) {
|
|
39
|
-
return {
|
|
40
|
-
packageId: PKG_ID,
|
|
41
|
-
name: "peers-core",
|
|
42
|
-
description: "Core package",
|
|
43
|
-
createdBy: "00m87fbwu96jzf8qnwllly0fd",
|
|
44
|
-
publishPublicKey: "publish-key",
|
|
45
|
-
versionFollowRange: "latest",
|
|
46
|
-
followVersionTags: "stable",
|
|
47
|
-
updateUrl: "https://example.com/packages/peers-core",
|
|
48
|
-
remoteRepo: "https://github.com/peers-app/peers-core",
|
|
49
|
-
version: "1.2.3",
|
|
50
|
-
versionTag: "stable",
|
|
51
|
-
packageBundleCode: "console.log('package');",
|
|
52
|
-
routesBundleCode: "console.log('routes');",
|
|
53
|
-
uiBundleCode: "console.log('ui');",
|
|
54
|
-
...overrides,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
describe("package-seed-installer", () => {
|
|
58
|
-
beforeEach(() => {
|
|
59
|
-
jest.clearAllMocks();
|
|
60
|
-
mockSaveBundleFile.mockImplementation(async (_ctx, content, name) => ({
|
|
61
|
-
fileId: `file-${name}`,
|
|
62
|
-
fileHash: (0, keys_1.hashValue)(content),
|
|
63
|
-
}));
|
|
64
|
-
mockPackagesSignAndSave.mockImplementation(async (pkg) => pkg);
|
|
65
|
-
mockPackageVersionsSignAndSave.mockImplementation(async (pv) => pv);
|
|
66
|
-
mockPackageVersionsList.mockResolvedValue([]);
|
|
67
|
-
mockPackagesGet.mockResolvedValue(undefined);
|
|
68
|
-
});
|
|
69
|
-
it("creates package and initial active package version", async () => {
|
|
70
|
-
const seeded = await (0, package_seed_installer_1.seedPackageInContext)(makeContext(), makeOpts());
|
|
71
|
-
expect(seeded).toBe(true);
|
|
72
|
-
expect(mockPackagesSignAndSave).toHaveBeenCalledWith(expect.objectContaining({
|
|
73
|
-
packageId: PKG_ID,
|
|
74
|
-
publishPublicKey: "publish-key",
|
|
75
|
-
versionFollowRange: "latest",
|
|
76
|
-
followVersionTags: "stable",
|
|
77
|
-
}), { saveAsSnapshot: true });
|
|
78
|
-
expect(mockPackageVersionsSignAndSave).toHaveBeenCalledWith(expect.objectContaining({
|
|
79
|
-
packageId: PKG_ID,
|
|
80
|
-
version: "1.2.3",
|
|
81
|
-
versionTag: "stable",
|
|
82
|
-
packageBundleFileHash: (0, keys_1.hashValue)("console.log('package');"),
|
|
83
|
-
}), { saveAsSnapshot: true });
|
|
84
|
-
expect(mockPackagesSignAndSave).toHaveBeenLastCalledWith(expect.objectContaining({ activePackageVersionId: expect.any(String) }), { saveAsSnapshot: true });
|
|
85
|
-
});
|
|
86
|
-
it("is a no-op when package already has any version installed", async () => {
|
|
87
|
-
mockPackagesGet.mockResolvedValue({ packageId: PKG_ID, name: "peers-core" });
|
|
88
|
-
mockPackageVersionsList.mockResolvedValue([{ packageVersionId: "existing" }]);
|
|
89
|
-
const seeded = await (0, package_seed_installer_1.seedPackageInContext)(makeContext(), makeOpts());
|
|
90
|
-
expect(seeded).toBe(false);
|
|
91
|
-
expect(mockSaveBundleFile).not.toHaveBeenCalled();
|
|
92
|
-
expect(mockPackageVersionsSignAndSave).not.toHaveBeenCalled();
|
|
93
|
-
});
|
|
94
|
-
it("installs initial version when package exists without versions", async () => {
|
|
95
|
-
mockPackagesGet.mockResolvedValue({
|
|
96
|
-
packageId: PKG_ID,
|
|
97
|
-
name: "peers-core",
|
|
98
|
-
publishPublicKey: "",
|
|
99
|
-
signature: "",
|
|
100
|
-
});
|
|
101
|
-
mockPackageVersionsList.mockResolvedValue([]);
|
|
102
|
-
const seeded = await (0, package_seed_installer_1.seedPackageInContext)(makeContext(), makeOpts());
|
|
103
|
-
expect(seeded).toBe(true);
|
|
104
|
-
expect(mockSaveBundleFile).toHaveBeenCalled();
|
|
105
|
-
expect(mockPackageVersionsSignAndSave).toHaveBeenCalled();
|
|
106
|
-
expect(mockPackagesSignAndSave).toHaveBeenLastCalledWith(expect.objectContaining({
|
|
107
|
-
activePackageVersionId: expect.any(String),
|
|
108
|
-
publishPublicKey: "publish-key",
|
|
109
|
-
updateUrl: "https://example.com/packages/peers-core",
|
|
110
|
-
}), { saveAsSnapshot: true });
|
|
111
|
-
});
|
|
112
|
-
it("loads seeded package and persists appNavs when requested", async () => {
|
|
113
|
-
const ctx = makeContext();
|
|
114
|
-
ctx.packageLoader.loadPackage.mockResolvedValue({
|
|
115
|
-
appNavs: [{ appId: "tasks", label: "Tasks", path: "tasks" }],
|
|
116
|
-
});
|
|
117
|
-
await (0, package_seed_installer_1.seedPackageInContext)(ctx, makeOpts({ loadAfterSeed: true }));
|
|
118
|
-
expect(ctx.packageLoader.loadPackage).toHaveBeenCalledWith(expect.objectContaining({ packageId: PKG_ID }), expect.objectContaining({ force: true, packageVersionId: expect.any(String) }));
|
|
119
|
-
expect(mockPackageVersionsSignAndSave).toHaveBeenLastCalledWith(expect.objectContaining({
|
|
120
|
-
appNavs: [{ appId: "tasks", label: "Tasks", path: "tasks" }],
|
|
121
|
-
}), { saveAsSnapshot: true });
|
|
122
|
-
});
|
|
123
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|