@happier-dev/relay-server 0.1.2-preview.138.1 → 0.1.2-preview.1771447722.50956

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.
Files changed (30) hide show
  1. package/node_modules/@happier-dev/release-runtime/dist/assets.d.ts +22 -0
  2. package/node_modules/@happier-dev/release-runtime/dist/assets.d.ts.map +1 -0
  3. package/node_modules/@happier-dev/release-runtime/dist/assets.js +44 -0
  4. package/node_modules/@happier-dev/release-runtime/dist/assets.js.map +1 -0
  5. package/node_modules/@happier-dev/release-runtime/dist/checksums.d.ts +5 -0
  6. package/node_modules/@happier-dev/release-runtime/dist/checksums.d.ts.map +1 -0
  7. package/node_modules/@happier-dev/release-runtime/dist/checksums.js +21 -0
  8. package/node_modules/@happier-dev/release-runtime/dist/checksums.js.map +1 -0
  9. package/node_modules/@happier-dev/release-runtime/dist/extractPlan.d.ts +14 -0
  10. package/node_modules/@happier-dev/release-runtime/dist/extractPlan.d.ts.map +1 -0
  11. package/node_modules/@happier-dev/release-runtime/dist/extractPlan.js +39 -0
  12. package/node_modules/@happier-dev/release-runtime/dist/extractPlan.js.map +1 -0
  13. package/node_modules/@happier-dev/release-runtime/dist/github.d.ts +20 -0
  14. package/node_modules/@happier-dev/release-runtime/dist/github.d.ts.map +1 -0
  15. package/node_modules/@happier-dev/release-runtime/dist/github.js +60 -0
  16. package/node_modules/@happier-dev/release-runtime/dist/github.js.map +1 -0
  17. package/node_modules/@happier-dev/release-runtime/dist/index.d.ts +7 -0
  18. package/node_modules/@happier-dev/release-runtime/dist/index.d.ts.map +1 -0
  19. package/node_modules/@happier-dev/release-runtime/dist/index.js +7 -0
  20. package/node_modules/@happier-dev/release-runtime/dist/index.js.map +1 -0
  21. package/node_modules/@happier-dev/release-runtime/dist/minisign.d.ts +7 -0
  22. package/node_modules/@happier-dev/release-runtime/dist/minisign.d.ts.map +1 -0
  23. package/node_modules/@happier-dev/release-runtime/dist/minisign.js +92 -0
  24. package/node_modules/@happier-dev/release-runtime/dist/minisign.js.map +1 -0
  25. package/node_modules/@happier-dev/release-runtime/dist/verifiedDownload.d.ts +26 -0
  26. package/node_modules/@happier-dev/release-runtime/dist/verifiedDownload.d.ts.map +1 -0
  27. package/node_modules/@happier-dev/release-runtime/dist/verifiedDownload.js +53 -0
  28. package/node_modules/@happier-dev/release-runtime/dist/verifiedDownload.js.map +1 -0
  29. package/node_modules/@happier-dev/release-runtime/package.json +38 -0
  30. package/package.json +6 -4
@@ -0,0 +1,22 @@
1
+ export declare function resolveReleaseAssetBundle({ assets, product, os, arch, preferZipOnWindows, }: {
2
+ assets: unknown;
3
+ product: string;
4
+ os: string;
5
+ arch: string;
6
+ preferZipOnWindows?: boolean;
7
+ }): {
8
+ version: string;
9
+ archive: {
10
+ name: string;
11
+ url: string;
12
+ };
13
+ checksums: {
14
+ name: string;
15
+ url: string;
16
+ };
17
+ checksumsSig: {
18
+ name: string;
19
+ url: string;
20
+ };
21
+ };
22
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"AAcA,wBAAgB,yBAAyB,CAAC,EACxC,MAAM,EACN,OAAO,EACP,EAAE,EACF,IAAI,EACJ,kBAAyB,GAC1B,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;;;cAEwC,MAAM;aAAO,MAAM;;;cAAnB,MAAM;aAAO,MAAM;;;cAAnB,MAAM;aAAO,MAAM;;EAoC3D"}
@@ -0,0 +1,44 @@
1
+ function normalizeAsset(asset) {
2
+ const name = String(asset?.name ?? '').trim();
3
+ const url = String(asset?.browser_download_url ?? asset?.url ?? '').trim();
4
+ return name && url ? { name, url } : null;
5
+ }
6
+ const VERSION_RE = '\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?';
7
+ export function resolveReleaseAssetBundle({ assets, product, os, arch, preferZipOnWindows = true, }) {
8
+ const list = Array.isArray(assets) ? assets : [];
9
+ const byName = new Map();
10
+ for (const asset of list) {
11
+ const normalized = normalizeAsset(asset);
12
+ if (!normalized)
13
+ continue;
14
+ byName.set(normalized.name, normalized);
15
+ }
16
+ const checksumsRe = new RegExp(`^checksums-${product}-v(${VERSION_RE})\\.txt$`);
17
+ const checksumsName = [...byName.keys()].find((name) => checksumsRe.test(name)) ?? '';
18
+ if (!checksumsName) {
19
+ throw new Error(`[release-assets] missing checksums-${product}-v<version>.txt asset`);
20
+ }
21
+ const versionMatch = checksumsRe.exec(checksumsName);
22
+ const version = versionMatch?.[1] ?? '';
23
+ if (!version) {
24
+ throw new Error(`[release-assets] unable to derive version from checksums filename: ${checksumsName}`);
25
+ }
26
+ const checksumsSigName = `${checksumsName}.minisig`;
27
+ const base = `${product}-v${version}-${os}-${arch}`;
28
+ const zipName = `${base}.zip`;
29
+ const tgzName = `${base}.tar.gz`;
30
+ const archiveName = os.toLowerCase() === 'windows' && preferZipOnWindows && byName.has(zipName)
31
+ ? zipName
32
+ : tgzName;
33
+ const checksums = byName.get(checksumsName) ?? null;
34
+ const checksumsSig = byName.get(checksumsSigName) ?? null;
35
+ const archive = byName.get(archiveName) ?? null;
36
+ if (!checksums)
37
+ throw new Error(`[release-assets] missing release asset: ${checksumsName}`);
38
+ if (!checksumsSig)
39
+ throw new Error(`[release-assets] missing release asset: ${checksumsSigName}`);
40
+ if (!archive)
41
+ throw new Error(`[release-assets] missing release asset: ${archiveName}`);
42
+ return { version, archive, checksums, checksumsSig };
43
+ }
44
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function lookupSha256(params: Readonly<{
2
+ checksumsText: string;
3
+ filename: string;
4
+ }>): string;
5
+ //# sourceMappingURL=checksums.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checksums.d.ts","sourceRoot":"","sources":["../src/checksums.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAgBlG"}
@@ -0,0 +1,21 @@
1
+ export function lookupSha256(params) {
2
+ const target = String(params.filename ?? '').trim();
3
+ if (!target)
4
+ throw new Error('[checksums] filename is required');
5
+ const text = String(params.checksumsText ?? '');
6
+ const lines = text.split('\n');
7
+ for (const line of lines) {
8
+ const trimmed = line.trim();
9
+ if (!trimmed)
10
+ continue;
11
+ const m = /^([0-9a-fA-F]{8,})\s+(.+)$/.exec(trimmed);
12
+ if (!m)
13
+ continue;
14
+ const hash = m[1].toLowerCase();
15
+ const file = m[2].trim();
16
+ if (file === target)
17
+ return hash;
18
+ }
19
+ throw new Error(`[checksums] sha256 not found for ${target}`);
20
+ }
21
+ //# sourceMappingURL=checksums.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checksums.js","sourceRoot":"","sources":["../src/checksums.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,MAA6D;IACxF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAEjE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,CAAC,GAAG,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;IACnC,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,EAAE,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type PlannedCommand = Readonly<{
2
+ cmd: string;
3
+ args: string[];
4
+ }>;
5
+ export declare function planArchiveExtraction(params: Readonly<{
6
+ archiveName: string;
7
+ archivePath: string;
8
+ destDir: string;
9
+ os: 'linux' | 'darwin' | 'windows';
10
+ }>): Readonly<{
11
+ requiredCommand: 'tar' | 'powershell';
12
+ command: PlannedCommand;
13
+ }>;
14
+ //# sourceMappingURL=extractPlan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractPlan.d.ts","sourceRoot":"","sources":["../src/extractPlan.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC;AAEvE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;CACpC,CAAC,GAAG,QAAQ,CAAC;IAAE,eAAe,EAAE,KAAK,GAAG,YAAY,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,CAAC,CAsChF"}
@@ -0,0 +1,39 @@
1
+ export function planArchiveExtraction(params) {
2
+ const name = String(params.archiveName ?? '').trim();
3
+ const archivePath = String(params.archivePath ?? '').trim();
4
+ const destDir = String(params.destDir ?? '').trim();
5
+ const os = String(params.os ?? '').trim().toLowerCase();
6
+ if (!name)
7
+ throw new Error('[extract] archiveName is required');
8
+ if (!archivePath)
9
+ throw new Error('[extract] archivePath is required');
10
+ if (!destDir)
11
+ throw new Error('[extract] destDir is required');
12
+ if (os !== 'linux' && os !== 'darwin' && os !== 'windows') {
13
+ throw new Error(`[extract] unsupported os: ${os}`);
14
+ }
15
+ if (name.toLowerCase().endsWith('.zip')) {
16
+ if (os !== 'windows') {
17
+ throw new Error(`[extract] .zip archives are supported only on windows (got ${os})`);
18
+ }
19
+ const command = `Expand-Archive -LiteralPath "${archivePath}" -DestinationPath "${destDir}" -Force`;
20
+ return {
21
+ requiredCommand: 'powershell',
22
+ command: {
23
+ cmd: 'powershell',
24
+ args: ['-NoProfile', '-Command', command],
25
+ },
26
+ };
27
+ }
28
+ if (name.toLowerCase().endsWith('.tar.gz')) {
29
+ return {
30
+ requiredCommand: 'tar',
31
+ command: {
32
+ cmd: 'tar',
33
+ args: ['-xzf', archivePath, '-C', destDir],
34
+ },
35
+ };
36
+ }
37
+ throw new Error(`[extract] unsupported archive extension: ${name}`);
38
+ }
39
+ //# sourceMappingURL=extractPlan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractPlan.js","sourceRoot":"","sources":["../src/extractPlan.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,MAKpC;IACA,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAExD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAChE,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvE,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/D,IAAI,EAAE,KAAK,OAAO,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,8DAA8D,EAAE,GAAG,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,OAAO,GAAG,gCAAgC,WAAW,uBAAuB,OAAO,UAAU,CAAC;QACpG,OAAO;YACL,eAAe,EAAE,YAAY;YAC7B,OAAO,EAAE;gBACP,GAAG,EAAE,YAAY;gBACjB,IAAI,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC;aAC1C;SACF,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,OAAO;YACL,eAAe,EAAE,KAAK;YACtB,OAAO,EAAE;gBACP,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC;aAC3C;SACF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,EAAE,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,20 @@
1
+ type FetchImpl = typeof fetch;
2
+ export declare function fetchGitHubReleaseByTag(params: Readonly<{
3
+ githubRepo: string;
4
+ tag: string;
5
+ userAgent?: string;
6
+ githubToken?: string;
7
+ fetchImpl?: FetchImpl;
8
+ }>): Promise<unknown>;
9
+ export declare function fetchFirstGitHubReleaseByTags(params: Readonly<{
10
+ githubRepo: string;
11
+ tags: string[];
12
+ userAgent?: string;
13
+ githubToken?: string;
14
+ fetchImpl?: FetchImpl;
15
+ }>): Promise<Readonly<{
16
+ tag: string;
17
+ release: unknown;
18
+ }>>;
19
+ export {};
20
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG,OAAO,KAAK,CAAC;AAiB9B,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBpB;AAED,wBAAsB,6BAA6B,CAAC,MAAM,EAAE,QAAQ,CAAC;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CA0BxD"}
@@ -0,0 +1,60 @@
1
+ function buildGitHubReleaseTagUrl(githubRepo, tag) {
2
+ const repo = String(githubRepo ?? '').trim();
3
+ const t = String(tag ?? '').trim();
4
+ if (!repo)
5
+ throw new Error('[github] githubRepo is required');
6
+ if (!t)
7
+ throw new Error('[github] tag is required');
8
+ return `https://api.github.com/repos/${repo}/releases/tags/${encodeURIComponent(t)}`;
9
+ }
10
+ function createHttpError(message, status) {
11
+ const err = new Error(message);
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ err.status = status;
14
+ return err;
15
+ }
16
+ export async function fetchGitHubReleaseByTag(params) {
17
+ const userAgent = String(params.userAgent ?? '').trim() || 'happier-release-runtime';
18
+ const token = String(params.githubToken ?? '').trim();
19
+ const fetchImpl = params.fetchImpl ?? fetch;
20
+ const url = buildGitHubReleaseTagUrl(params.githubRepo, params.tag);
21
+ const headers = {
22
+ 'user-agent': userAgent,
23
+ accept: 'application/vnd.github+json',
24
+ };
25
+ if (token)
26
+ headers.authorization = `Bearer ${token}`;
27
+ const response = await fetchImpl(url, { headers });
28
+ if (!response.ok) {
29
+ throw createHttpError(`[github] failed to resolve release tag ${params.tag} (${response.status})`, response.status);
30
+ }
31
+ return response.json();
32
+ }
33
+ export async function fetchFirstGitHubReleaseByTags(params) {
34
+ const tags = Array.isArray(params.tags) ? params.tags : [];
35
+ for (const tag of tags) {
36
+ try {
37
+ // eslint-disable-next-line no-await-in-loop
38
+ const release = await fetchGitHubReleaseByTag({
39
+ githubRepo: params.githubRepo,
40
+ tag,
41
+ userAgent: params.userAgent,
42
+ githubToken: params.githubToken,
43
+ fetchImpl: params.fetchImpl,
44
+ });
45
+ return { tag, release };
46
+ }
47
+ catch (e) {
48
+ const status = typeof e === 'object' && e != null && 'status' in e
49
+ ? Number(
50
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
+ e.status)
52
+ : NaN;
53
+ if (status === 404)
54
+ continue;
55
+ throw e;
56
+ }
57
+ }
58
+ throw createHttpError('[github] no matching release tags found', 404);
59
+ }
60
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { DEFAULT_MINISIGN_PUBLIC_KEY, verifyMinisign } from './minisign.js';
2
+ export { lookupSha256 } from './checksums.js';
3
+ export { resolveReleaseAssetBundle } from './assets.js';
4
+ export { planArchiveExtraction } from './extractPlan.js';
5
+ export { downloadVerifiedReleaseAssetBundle } from './verifiedDownload.js';
6
+ export { fetchGitHubReleaseByTag, fetchFirstGitHubReleaseByTags } from './github.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { DEFAULT_MINISIGN_PUBLIC_KEY, verifyMinisign } from './minisign.js';
2
+ export { lookupSha256 } from './checksums.js';
3
+ export { resolveReleaseAssetBundle } from './assets.js';
4
+ export { planArchiveExtraction } from './extractPlan.js';
5
+ export { downloadVerifiedReleaseAssetBundle } from './verifiedDownload.js';
6
+ export { fetchGitHubReleaseByTag, fetchFirstGitHubReleaseByTags } from './github.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const DEFAULT_MINISIGN_PUBLIC_KEY = "untrusted comment: minisign public key 91AE28177BF6E43C\nRWQ85PZ7FyiukYbL3qv/bKnwgbT68wLVzotapeMFIb8n+c7pBQ7U8W2t\n";
2
+ export declare function verifyMinisign(params: Readonly<{
3
+ message: Buffer;
4
+ pubkeyFile: string;
5
+ sigFile: string;
6
+ }>): boolean;
7
+ //# sourceMappingURL=minisign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minisign.d.ts","sourceRoot":"","sources":["../src/minisign.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,2BAA2B,wHAEvC,CAAC;AAmEF,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,OAAO,CAiClH"}
@@ -0,0 +1,92 @@
1
+ import { createHash, createPublicKey, verify } from 'node:crypto';
2
+ const ED25519_SPKI_PREFIX = Buffer.from('302a300506032b6570032100', 'hex');
3
+ export const DEFAULT_MINISIGN_PUBLIC_KEY = `untrusted comment: minisign public key 91AE28177BF6E43C
4
+ RWQ85PZ7FyiukYbL3qv/bKnwgbT68wLVzotapeMFIb8n+c7pBQ7U8W2t
5
+ `;
6
+ function decodeBase64Line(line, expectedBytes) {
7
+ const bytes = Buffer.from(String(line ?? '').trim(), 'base64');
8
+ if (expectedBytes != null && bytes.length !== expectedBytes) {
9
+ throw new Error(`[minisign] expected ${expectedBytes} bytes, got ${bytes.length}`);
10
+ }
11
+ return bytes;
12
+ }
13
+ function parseMinisignPublicKeyFile(pubkeyFile) {
14
+ const lines = String(pubkeyFile ?? '')
15
+ .split('\n')
16
+ .map((l) => l.trim())
17
+ .filter(Boolean);
18
+ if (lines.length < 2)
19
+ throw new Error('[minisign] invalid public key file');
20
+ const payload = lines[lines.length - 1] ?? '';
21
+ const bytes = decodeBase64Line(payload, 42);
22
+ const signatureAlgorithm = bytes.subarray(0, 2);
23
+ const keyId = bytes.subarray(2, 10);
24
+ const rawPublicKey = bytes.subarray(10, 42);
25
+ return { signatureAlgorithm, keyId, rawPublicKey };
26
+ }
27
+ function parseMinisignSignatureFile(sigFile) {
28
+ const lines = String(sigFile ?? '').split('\n');
29
+ if (lines.length < 4)
30
+ throw new Error('[minisign] invalid signature file');
31
+ const untrustedPayload = String(lines[1] ?? '').trim();
32
+ const trustedComment = String(lines[2] ?? '');
33
+ const globalPayload = String(lines[3] ?? '').trim();
34
+ const untrustedBytes = decodeBase64Line(untrustedPayload, 74);
35
+ const signatureAlgorithm = untrustedBytes.subarray(0, 2);
36
+ const keyId = untrustedBytes.subarray(2, 10);
37
+ const signature = untrustedBytes.subarray(10, 74);
38
+ const globalSignature = decodeBase64Line(globalPayload, 64);
39
+ if (!trustedComment.startsWith('trusted comment: ')) {
40
+ throw new Error('[minisign] unexpected trusted comment format');
41
+ }
42
+ const trustedSuffix = Buffer.from(trustedComment.slice('trusted comment: '.length), 'utf-8');
43
+ return { signatureAlgorithm, keyId, signature, trustedSuffix, globalSignature };
44
+ }
45
+ function createEd25519PublicKey(rawPublicKey) {
46
+ if (!Buffer.isBuffer(rawPublicKey) || rawPublicKey.length !== 32) {
47
+ throw new Error('[minisign] invalid Ed25519 public key length');
48
+ }
49
+ const spki = Buffer.concat([ED25519_SPKI_PREFIX, rawPublicKey]);
50
+ return createPublicKey({ key: spki, format: 'der', type: 'spki' });
51
+ }
52
+ function bytesEqual(a, b) {
53
+ if (!a || !b)
54
+ return false;
55
+ if (a.length !== b.length)
56
+ return false;
57
+ return Buffer.compare(a, b) === 0;
58
+ }
59
+ export function verifyMinisign(params) {
60
+ try {
61
+ const bin = Buffer.isBuffer(params.message) ? params.message : Buffer.from(params.message ?? '');
62
+ const pubkey = parseMinisignPublicKeyFile(params.pubkeyFile);
63
+ const sig = parseMinisignSignatureFile(params.sigFile);
64
+ if (!bytesEqual(pubkey.signatureAlgorithm, Buffer.from('Ed'))) {
65
+ throw new Error('[minisign] incompatible public key signature algorithm');
66
+ }
67
+ if (!bytesEqual(pubkey.keyId, sig.keyId)) {
68
+ throw new Error('[minisign] incompatible key identifiers');
69
+ }
70
+ let prehashed = false;
71
+ if (bytesEqual(sig.signatureAlgorithm, Buffer.from('Ed'))) {
72
+ prehashed = false;
73
+ }
74
+ else if (bytesEqual(sig.signatureAlgorithm, Buffer.from('ED'))) {
75
+ prehashed = true;
76
+ }
77
+ else {
78
+ throw new Error('[minisign] unsupported signature algorithm');
79
+ }
80
+ const publicKey = createEd25519PublicKey(pubkey.rawPublicKey);
81
+ const payload = prehashed ? createHash('blake2b512').update(bin).digest() : bin;
82
+ const okSig = verify(null, payload, publicKey, sig.signature);
83
+ if (!okSig)
84
+ return false;
85
+ const okGlobal = verify(null, Buffer.concat([sig.signature, sig.trustedSuffix]), publicKey, sig.globalSignature);
86
+ return okGlobal;
87
+ }
88
+ catch {
89
+ return false;
90
+ }
91
+ }
92
+ //# sourceMappingURL=minisign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minisign.js","sourceRoot":"","sources":["../src/minisign.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ type ReleaseAsset = Readonly<{
2
+ name: string;
3
+ url: string;
4
+ }>;
5
+ export type ReleaseAssetBundle = Readonly<{
6
+ version: string;
7
+ archive: ReleaseAsset;
8
+ checksums: ReleaseAsset;
9
+ checksumsSig: ReleaseAsset;
10
+ }>;
11
+ export declare function downloadVerifiedReleaseAssetBundle(params: Readonly<{
12
+ bundle: ReleaseAssetBundle;
13
+ destDir: string;
14
+ pubkeyFile: string;
15
+ userAgent?: string;
16
+ }>): Promise<Readonly<{
17
+ version: string;
18
+ archiveName: string;
19
+ archivePath: string;
20
+ source: {
21
+ archiveUrl: string;
22
+ checksumsUrl: string;
23
+ };
24
+ }>>;
25
+ export {};
26
+ //# sourceMappingURL=verifiedDownload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifiedDownload.d.ts","sourceRoot":"","sources":["../src/verifiedDownload.ts"],"names":[],"mappings":"AAOA,KAAK,YAAY,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE5D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,YAAY,CAAC;IACxB,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC,CAAC;AAmBH,wBAAsB,kCAAkC,CAAC,MAAM,EAAE,QAAQ,CAAC;IACxE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD,CAAC,CAAC,CAgCF"}
@@ -0,0 +1,53 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { lookupSha256 } from './checksums.js';
5
+ import { verifyMinisign } from './minisign.js';
6
+ async function fetchText(url, { userAgent = 'happier-release-runtime' } = {}) {
7
+ const res = await fetch(url, { headers: { 'user-agent': userAgent } });
8
+ if (!res.ok)
9
+ throw new Error(`[download] failed: ${url} (${res.status})`);
10
+ return res.text();
11
+ }
12
+ async function fetchBytes(url, { userAgent = 'happier-release-runtime' } = {}) {
13
+ const res = await fetch(url, { headers: { 'user-agent': userAgent } });
14
+ if (!res.ok)
15
+ throw new Error(`[download] failed: ${url} (${res.status})`);
16
+ const ab = await res.arrayBuffer();
17
+ return Buffer.from(ab);
18
+ }
19
+ function sha256Hex(bytes) {
20
+ return createHash('sha256').update(bytes).digest('hex');
21
+ }
22
+ export async function downloadVerifiedReleaseAssetBundle(params) {
23
+ const bundle = params.bundle;
24
+ const destDir = String(params.destDir ?? '').trim();
25
+ const pubkeyFile = String(params.pubkeyFile ?? '');
26
+ const userAgent = String(params.userAgent ?? '').trim() || 'happier-release-runtime';
27
+ if (!destDir)
28
+ throw new Error('[download] destDir is required');
29
+ if (!pubkeyFile.trim())
30
+ throw new Error('[download] pubkeyFile is required');
31
+ await mkdir(destDir, { recursive: true });
32
+ const checksumsText = await fetchText(bundle.checksums.url, { userAgent });
33
+ const sigFile = await fetchText(bundle.checksumsSig.url, { userAgent });
34
+ const ok = verifyMinisign({ message: Buffer.from(checksumsText, 'utf-8'), pubkeyFile, sigFile });
35
+ if (!ok) {
36
+ throw new Error('[download] signature verification failed for checksums file');
37
+ }
38
+ const expected = lookupSha256({ checksumsText, filename: bundle.archive.name });
39
+ const bytes = await fetchBytes(bundle.archive.url, { userAgent });
40
+ const actual = sha256Hex(bytes);
41
+ if (actual !== expected) {
42
+ throw new Error(`[download] checksum verification failed for ${bundle.archive.name}`);
43
+ }
44
+ const archivePath = join(destDir, bundle.archive.name);
45
+ await writeFile(archivePath, bytes);
46
+ return {
47
+ version: String(bundle.version ?? ''),
48
+ archiveName: bundle.archive.name,
49
+ archivePath,
50
+ source: { archiveUrl: bundle.archive.url, checksumsUrl: bundle.checksums.url },
51
+ };
52
+ }
53
+ //# sourceMappingURL=verifiedDownload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifiedDownload.js","sourceRoot":"","sources":["../src/verifiedDownload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@happier-dev/release-runtime",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./minisign": {
14
+ "types": "./dist/minisign.d.ts",
15
+ "default": "./dist/minisign.js"
16
+ },
17
+ "./checksums": {
18
+ "types": "./dist/checksums.d.ts",
19
+ "default": "./dist/checksums.js"
20
+ },
21
+ "./assets": {
22
+ "types": "./dist/assets.d.ts",
23
+ "default": "./dist/assets.js"
24
+ },
25
+ "./extractPlan": {
26
+ "types": "./dist/extractPlan.d.ts",
27
+ "default": "./dist/extractPlan.js"
28
+ },
29
+ "./verifiedDownload": {
30
+ "types": "./dist/verifiedDownload.d.ts",
31
+ "default": "./dist/verifiedDownload.js"
32
+ },
33
+ "./github": {
34
+ "types": "./dist/github.d.ts",
35
+ "default": "./dist/github.js"
36
+ }
37
+ }
38
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happier-dev/relay-server",
3
- "version": "0.1.2-preview.138.1",
3
+ "version": "0.1.2-preview.1771447722.50956",
4
4
  "description": "Happier server runner (downloads and verifies the correct server binary for your platform).",
5
5
  "repository": "https://github.com/happier-dev/happier.git",
6
6
  "author": "Leeroy Brun <leeroy.brun@gmail.com>",
@@ -18,15 +18,17 @@
18
18
  "bundledDependencies": [
19
19
  "@happier-dev/release-runtime"
20
20
  ],
21
+ "dependencies": {
22
+ "@happier-dev/release-runtime": "0.0.0"
23
+ },
21
24
  "engines": {
22
25
  "node": ">=22"
23
26
  },
24
27
  "publishConfig": {
25
- "access": "public",
26
- "provenance": true
28
+ "access": "public"
27
29
  },
28
30
  "scripts": {
29
31
  "prepack": "node ./scripts/bundleWorkspaceDeps.mjs",
30
- "test": "node --test"
32
+ "test": "HAPPIER_FEATURE_POLICY_ENV= node --test"
31
33
  }
32
34
  }