This commit is contained in:
2026-10-17 19:08:09 +07:00
parent 8b29b4f24e
commit dc0d82d88a
11 changed files with 1762 additions and 42 deletions
+52
View File
@@ -43,7 +43,40 @@ app.whenReady().then(() => {
screen.getAllDisplays = () => [...original(), targetDisplay]
}
})
let offlinePackage
const seeded = (async () => {
const { PackageStore } = require(root + '/dist-electron/electron/package-store.js')
const { buildScreenPackage } = require(root + '/dist-electron/electron/screen-package.js')
const bytes = require('node:fs').readFileSync(root + '/fixtures/audio.wav')
const pkg = buildScreenPackage('https://offline.invalid', 7, {
game: {
game: {
ID: 7,
name: 'Offline smoke',
scenario: { story: { introduction: { audio: 'audio.wav' } } },
},
},
plan: {},
music: {},
})
const store = new PackageStore(require('node:path').join(app.getPath('userData'), 'packages'), {
fetch: async () =>
new Response(bytes, {
headers: { 'Content-Type': 'audio/wav', 'Content-Length': String(bytes.length) },
}),
})
await store.initialize()
offlinePackage = await store.download(pkg)
})()
seeded.catch((error) => {
console.error('PACKAGE_SEED_FAIL', error)
app.exit(1)
})
// Регистрация протокола выполняется до ready; открытие хранилища ждёт seed.
const whenReady = app.whenReady.bind(app)
app.whenReady = () => whenReady().then(() => seeded)
require(root + '/dist-electron/electron/main.js')
app.whenReady = whenReady
async function poll(check, label) {
for (let i = 0; i < 150; i++) {
const result = await check()
@@ -67,6 +100,24 @@ app.whenReady().then(async () => {
'control UI',
)
const evaluate = (s) => control.webContents.executeJavaScript(s)
await seeded
const asset = offlinePackage.files[0]
const localURL = `screen-app://app/packages/${offlinePackage.key}/${asset.id}`
const offline = await evaluate(`(async () => {
const response = await fetch(${JSON.stringify(localURL)}, { headers: { Range: 'bytes=0-43' } })
const size = (await response.arrayBuffer()).byteLength
const audio = new Audio(${JSON.stringify(localURL)})
await new Promise((resolve, reject) => { audio.onloadedmetadata = resolve; audio.onerror = () => reject(new Error('Offline audio failed')) })
await audio.play()
const playing = !audio.paused
const duration = audio.duration
audio.pause()
return { status: response.status, size, duration, playing }
})()`)
assert.equal(offline.status, 206)
assert.equal(offline.size, 44)
assert.ok(offline.duration > 0)
assert.equal(offline.playing, true)
assert.equal(await evaluate('typeof window.require'), 'undefined')
await evaluate(`window.screenBridge.show(${targetDisplay.id})`)
const output = await poll(
@@ -173,6 +224,7 @@ app.whenReady().then(async () => {
'SCREEN_SMOKE_PASS',
JSON.stringify({
range,
offlinePackage: offline,
display: {
id: targetDisplay.id,
bounds: targetDisplay.bounds,