silphius/app/server/worker.js

135 lines
3.9 KiB
JavaScript
Raw Normal View History

2024-06-29 09:52:23 -05:00
import {del, get, set} from 'idb-keyval';
2024-06-15 20:59:11 -05:00
2024-07-20 21:26:00 -05:00
import {encode} from '@/net/packets/index.js';
2024-07-21 02:57:29 -05:00
import Server from '@/net/server.js';
2024-07-22 00:13:03 -05:00
import {withResolvers} from '@/util/promise.js';
2024-06-10 22:42:30 -05:00
2024-07-21 02:57:29 -05:00
import createEcs from './create/ecs.js';
import './create/forest.js';
import './create/homestead.js';
import './create/player.js';
2024-07-23 17:04:17 -05:00
import './create/town.js';
2024-07-02 20:43:55 -05:00
2024-07-21 02:57:29 -05:00
import Engine from './engine.js';
2024-06-10 22:42:30 -05:00
class WorkerServer extends Server {
2024-06-15 20:59:11 -05:00
constructor() {
super();
this.fs = {};
}
static qualify(path) {
return ['UNIVERSE', path].join('/');
}
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-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-29 09:51:10 -05:00
await engine.disconnectPlayer(0);
2024-07-21 03:54:03 -05:00
engine.stop();
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-22 00:13:03 -05:00
const before = withResolvers();
const promises = [before.promise];
2024-07-02 20:43:55 -05:00
import.meta.hot.on('vite:beforeUpdate', async () => {
engine.stop();
2024-06-29 09:52:35 -05:00
await engine.disconnectPlayer(0);
2024-07-08 13:41:43 -05:00
await engine.saveEcses();
2024-07-22 00:13:03 -05:00
before.resolve();
2024-07-02 20:43:55 -05:00
});
2024-07-21 02:57:29 -05:00
import.meta.hot.accept('./engine.js');
import.meta.hot.accept('./create/player.js', async ({default: createPlayer}) => {
2024-07-22 00:13:03 -05:00
const {promise, resolve} = withResolvers();
promises.push(promise);
await before.promise;
2024-07-21 19:44:37 -05:00
const oldPlayer = await engine.loadPlayer(0);
2024-07-21 19:24:05 -05:00
const player = await createPlayer(0);
2024-07-11 16:01:16 -05:00
// Less jarring
player.Ecs = oldPlayer.Ecs;
player.Direction = oldPlayer.Direction;
player.Position = oldPlayer.Position;
2024-07-21 19:44:37 -05:00
await engine.savePlayer(0, player);
2024-07-22 00:13:03 -05:00
resolve();
2024-07-02 20:43:55 -05:00
});
2024-07-21 02:57:29 -05:00
import.meta.hot.accept('./create/forest.js', async ({default: createForest}) => {
2024-07-22 00:13:03 -05:00
const {promise, resolve} = withResolvers();
promises.push(promise);
await before.promise;
2024-07-10 14:59:07 -05:00
delete engine.ecses['forests/0'];
await engine.server.removeData('forests/0');
2024-07-11 16:01:16 -05:00
const forest = createEcs(engine.Ecs);
for (const entity of await createForest()) {
await forest.create(entity);
}
2024-07-10 14:59:07 -05:00
await engine.saveEcs('forests/0', forest);
2024-07-22 00:13:03 -05:00
resolve();
2024-07-10 14:59:07 -05:00
});
2024-07-21 02:57:29 -05:00
import.meta.hot.accept('./create/homestead.js', async ({default: createHomestead}) => {
2024-07-22 00:13:03 -05:00
const {promise, resolve} = withResolvers();
promises.push(promise);
await before.promise;
2024-07-11 16:01:16 -05:00
delete engine.ecses['homesteads/0'];
await engine.server.removeData('homesteads/0');
const homestead = createEcs(engine.Ecs);
for (const entity of await createHomestead('0')) {
await homestead.create(entity);
}
await engine.saveEcs('homesteads/0', homestead);
2024-07-22 00:13:03 -05:00
resolve();
2024-07-02 20:43:55 -05:00
});
2024-07-23 17:04:17 -05:00
import.meta.hot.accept('./create/town.js', async ({default: createTown}) => {
const {promise, resolve} = withResolvers();
promises.push(promise);
await before.promise;
delete engine.ecses['town'];
await engine.server.removeData('town');
const town = createEcs(engine.Ecs);
for (const entity of await createTown()) {
await town.create(entity);
}
await engine.saveEcs('town', town);
resolve();
});
2024-07-02 20:43:55 -05:00
import.meta.hot.on('vite:afterUpdate', async () => {
2024-07-22 00:13:03 -05:00
await Promise.all(promises);
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
}