2024-06-29 09:52:23 -05:00
|
|
|
import {del, get, set} from 'idb-keyval';
|
2024-06-15 20:59:11 -05:00
|
|
|
|
2024-06-13 12:24:32 -05:00
|
|
|
import {encode} from '@/packets/index.js';
|
2024-06-10 22:42:30 -05:00
|
|
|
|
2024-07-02 20:43:55 -05:00
|
|
|
import '../../create-homestead.js';
|
|
|
|
import '../../create-player.js';
|
|
|
|
|
2024-06-23 07:00:10 -05:00
|
|
|
import Engine from '../../engine.js';
|
2024-06-10 22:42:30 -05:00
|
|
|
import Server from './server.js';
|
|
|
|
|
|
|
|
class WorkerServer extends Server {
|
2024-06-15 20:59:11 -05:00
|
|
|
constructor() {
|
|
|
|
super();
|
|
|
|
this.fs = {};
|
|
|
|
}
|
|
|
|
static qualify(path) {
|
|
|
|
return ['UNIVERSE', path].join('/');
|
|
|
|
}
|
2024-06-22 07:47:19 -05:00
|
|
|
async readAsset(path) {
|
2024-06-27 13:56:43 -05:00
|
|
|
return fetch(path).then((response) => (
|
|
|
|
response.ok ? response.arrayBuffer() : new ArrayBuffer(0)
|
|
|
|
));
|
2024-06-22 07:47:19 -05:00
|
|
|
}
|
2024-06-15 20:59:11 -05:00
|
|
|
async readData(path) {
|
|
|
|
const data = await get(this.constructor.qualify(path));
|
|
|
|
if ('undefined' !== typeof data) {
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
const error = new Error();
|
|
|
|
error.code = 'ENOENT';
|
|
|
|
throw error;
|
|
|
|
}
|
2024-06-29 09:52:23 -05:00
|
|
|
async removeData(path) {
|
|
|
|
await del(this.constructor.qualify(path));
|
|
|
|
}
|
2024-06-15 20:59:11 -05:00
|
|
|
async writeData(path, view) {
|
|
|
|
await set(this.constructor.qualify(path), view);
|
|
|
|
}
|
2024-06-10 22:42:30 -05:00
|
|
|
transmit(connection, packed) { postMessage(packed); }
|
|
|
|
}
|
|
|
|
|
|
|
|
const engine = new Engine(WorkerServer);
|
|
|
|
|
2024-06-15 20:59:11 -05:00
|
|
|
onmessage = async (event) => {
|
|
|
|
if (0 === event.data) {
|
2024-06-21 18:16:41 -05:00
|
|
|
engine.stop();
|
2024-06-29 09:51:10 -05:00
|
|
|
await engine.disconnectPlayer(0);
|
2024-06-21 18:16:41 -05:00
|
|
|
await engine.saveEcses();
|
2024-06-15 20:59:11 -05:00
|
|
|
postMessage(0);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
engine.server.accept(0, event.data);
|
2024-06-10 22:42:30 -05:00
|
|
|
};
|
|
|
|
|
2024-06-12 23:17:24 -05:00
|
|
|
(async () => {
|
|
|
|
await engine.load();
|
|
|
|
engine.start();
|
2024-06-15 20:59:11 -05:00
|
|
|
await engine.connectPlayer(0, 0);
|
2024-06-13 12:24:32 -05:00
|
|
|
postMessage(encode({type: 'ConnectionStatus', payload: 'connected'}));
|
2024-06-12 23:17:24 -05:00
|
|
|
})();
|
2024-06-13 12:24:32 -05:00
|
|
|
|
2024-06-23 03:04:48 -05:00
|
|
|
if (import.meta.hot) {
|
2024-07-02 20:43:55 -05:00
|
|
|
const createResolver = () => {
|
|
|
|
let r;
|
|
|
|
const promise = new Promise((resolve) => {
|
|
|
|
r = resolve;
|
|
|
|
});
|
|
|
|
promise.resolve = r;
|
|
|
|
return promise;
|
|
|
|
};
|
|
|
|
const beforeResolver = createResolver();
|
|
|
|
const resolvers = [];
|
|
|
|
import.meta.hot.on('vite:beforeUpdate', async () => {
|
|
|
|
engine.stop();
|
2024-06-29 09:52:35 -05:00
|
|
|
await engine.disconnectPlayer(0);
|
2024-07-02 20:43:55 -05:00
|
|
|
beforeResolver.resolve();
|
|
|
|
});
|
|
|
|
import.meta.hot.accept('../../engine.js');
|
|
|
|
import.meta.hot.accept('../../create-player.js', async ({default: createPlayer}) => {
|
|
|
|
const resolver = createResolver();
|
|
|
|
resolvers.push(resolver);
|
|
|
|
await beforeResolver;
|
|
|
|
const oldBuffer = await engine.server.readData('players/0');
|
|
|
|
const oldPlayer = JSON.parse((new TextDecoder()).decode(oldBuffer));
|
|
|
|
const buffer = await createPlayer(0);
|
|
|
|
const player = JSON.parse((new TextDecoder()).decode(buffer));
|
|
|
|
// Less jarring
|
|
|
|
player.Ecs = oldPlayer.Ecs;
|
|
|
|
player.Direction = oldPlayer.Direction;
|
|
|
|
player.Position = oldPlayer.Position;
|
|
|
|
await engine.server.writeData('players/0', (new TextEncoder()).encode(JSON.stringify(player)));
|
|
|
|
resolver.resolve();
|
|
|
|
});
|
|
|
|
import.meta.hot.accept('../../create-homestead.js', async ({default: createHomestead}) => {
|
|
|
|
const resolver = createResolver();
|
|
|
|
resolvers.push(resolver);
|
|
|
|
await beforeResolver;
|
|
|
|
delete engine.ecses['homesteads/0'];
|
|
|
|
await engine.server.removeData('homesteads/0');
|
|
|
|
await engine.saveEcs('homesteads/0', await createHomestead(engine.Ecs));
|
|
|
|
resolver.resolve();
|
|
|
|
});
|
|
|
|
import.meta.hot.on('vite:afterUpdate', async () => {
|
|
|
|
await Promise.all(resolvers);
|
2024-06-23 03:04:48 -05:00
|
|
|
postMessage(encode({type: 'ConnectionStatus', payload: 'aborted'}));
|
|
|
|
close();
|
|
|
|
});
|
2024-07-02 20:43:55 -05:00
|
|
|
import.meta.hot.accept();
|
2024-06-23 03:04:48 -05:00
|
|
|
}
|