Packages
lustre
5.2.1
5.7.1
5.7.0
5.6.0
5.5.2
5.5.1
5.5.0
5.4.0
5.3.5
5.3.4
5.3.3
5.3.2
5.3.1
5.3.0
5.2.1
5.2.0
5.1.1
5.1.0
5.0.3
5.0.2
5.0.1
5.0.0
4.6.4
4.6.3
4.6.2
4.6.1
4.6.0
4.5.1
4.5.0
4.4.4
4.4.3
4.4.1
4.4.0
4.3.6
4.3.5
4.3.4
4.3.3
4.3.2
4.3.1
4.3.0
4.2.6
4.2.5
4.2.4
4.2.3
4.2.2
4.2.1
4.2.0
4.1.8
4.1.7
4.1.6
4.1.5
4.1.4
4.1.3
4.1.2
4.1.1
4.1.0
4.0.0
4.0.0-rc1
4.0.0-rc.2
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.12
3.0.11
3.0.10
3.0.9
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-rc.8
3.0.0-rc.7
3.0.0-rc.6
3.0.0-rc.5
3.0.0-rc.4
3.0.0-rc.3
3.0.0-rc.2
3.0.0-rc.1
2.0.1
2.0.0
1.3.0
1.2.0
1.1.0
1.0.0
Create HTML templates, single page applications, Web Components, and real-time server components in Gleam!
Current section
Files
Jump to
Current section
Files
src/lustre/runtime/client/spa.ffi.mjs
// IMPORTS ---------------------------------------------------------------------
import { Ok, Error } from "../../../gleam.mjs";
import { ElementNotFound, NotABrowser } from "../../../lustre.mjs";
import { is_browser, Runtime } from "./runtime.ffi.mjs";
import {
EffectDispatchedMessage,
EffectEmitEvent,
SystemRequestedShutdown,
} from "../server/runtime.mjs";
import { document } from "../../internals/constants.ffi.mjs";
//
export class Spa {
static start({ init, update, view }, selector, flags) {
if (!is_browser()) return new Error(new NotABrowser());
const root =
selector instanceof HTMLElement
? selector
: document().querySelector(selector);
if (!root) return new Error(new ElementNotFound(selector));
return new Ok(new Spa(root, init(flags), update, view));
}
#runtime;
constructor(root, [init, effects], update, view) {
this.#runtime = new Runtime(root, [init, effects], view, update);
}
send(message) {
switch (message.constructor) {
case EffectDispatchedMessage: {
this.dispatch(message.message, false);
break;
}
case EffectEmitEvent: {
this.emit(message.name, message.data);
break;
}
case SystemRequestedShutdown:
//TODO
break;
}
}
dispatch(msg, immediate) {
this.#runtime.dispatch(msg, immediate);
}
emit(event, data) {
this.#runtime.emit(event, data);
}
}
export const start = Spa.start;