'use strict'; const test = require('node:test'); const assert = require('node:assert/strict'); const { VERSION, compareVersions, parseChiakiLog, validateArchiveEntries, validateReleaseMetadata, } = require('../../remote-play-worker/worker'); function releaseFixture(overrides = {}) { const name = 'chiaki-ng-win_x64-MSYS2-Release-portable.zip'; return { tag_name: 'v1.10.0', draft: false, prerelease: false, assets: [{ name, size: 101_237_965, digest: `sha256:${'ab'.repeat(32)}`, browser_download_url: `https://github.com/streetpea/chiaki-ng/releases/download/v1.10.0/${name}`, }], ...overrides, }; } test('Remote Play worker validates only the expected stable upstream portable asset', () => { const release = validateReleaseMetadata(releaseFixture(), 'x64'); assert.equal(release.version, '1.10.0'); assert.equal(release.size, 101_237_965); assert.match(release.sha256, /^[a-f0-9]{64}$/); assert.throws(() => validateReleaseMetadata(releaseFixture({ prerelease: true }), 'x64'), /stabiele/); const wrongHost = releaseFixture(); wrongHost.assets[0].browser_download_url = wrongHost.assets[0].browser_download_url.replace('github.com', 'example.test'); assert.throws(() => validateReleaseMetadata(wrongHost, 'x64'), /officiƫle releasepad/); const noDigest = releaseFixture(); noDigest.assets[0].digest = null; assert.throws(() => validateReleaseMetadata(noDigest, 'x64'), /SHA-256/); }); test('Remote Play worker rejects archive traversal before extraction', () => { assert.deepEqual(validateArchiveEntries('chiaki-ng-Win/\nchiaki-ng-Win/chiaki.exe\n'), ['chiaki-ng-Win/', 'chiaki-ng-Win/chiaki.exe']); assert.throws(() => validateArchiveEntries('../outside.exe\n'), /onveilig pad/); assert.throws(() => validateArchiveEntries('C:\\Windows\\outside.exe\n'), /onveilig pad/); assert.throws(() => validateArchiveEntries('/absolute/outside.exe\n'), /onveilig pad/); }); test('Remote Play worker reports only aggregate non-secret stream health', () => { const health = parseChiakiLog(` Using hardware decoder "vulkan" with pix_fmt=vulkan Switched to profile 0, resolution: 1920x1080 Senkusha determined average RTT = 5.602 ms Detected missing or corrupt frame(s) FEC failed Missing unit Received duplicate unit AVCodec internal buffer is full removing frames before pushing AVCodec internal buffer is full removing frames before pushing `, 1234); assert.deepEqual(health, { checkedAt: 1234, resolution: '1920x1080', rttMs: 5.6, decoder: 'vulkan', packetErrors: 3, duplicateUnits: 1, decoderDrops: 2, status: 'degraded', }); assert.doesNotMatch(JSON.stringify(health), /account|regist|192\.168\./i); }); test('Remote Play worker uses semantic client versions', () => { assert.equal(VERSION, '1.1.0'); assert.equal(compareVersions('1.10.0', '1.9.9'), 1); assert.equal(compareVersions('1.10.0.0', 'v1.10.0'), 0); assert.equal(compareVersions('invalid', '1.10.0'), null); });