Packages
lustre
5.5.0
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 { Result$Ok, Result$Error } from "../../../gleam.mjs";
import { Error$ElementNotFound, Error$NotABrowser } from "../../../lustre.mjs";
import { is_browser, Runtime } from "./runtime.ffi.mjs";
import {
Message$isEffectDispatchedMessage,
Message$isEffectEmitEvent,
Message$isSystemRequestedShutdown,
} from "../server/runtime.mjs";
import { document } from "../../internals/constants.ffi.mjs";
//
export class Spa {
#runtime;
constructor(root, [init, effects], update, view) {
this.#runtime = new Runtime(root, [init, effects], view, update);
}
send(message) {
if (Message$isEffectDispatchedMessage(message)) {
this.dispatch(message.message, false);
} else if (Message$isEffectEmitEvent(message)) {
this.emit(message.name, message.data);
} else if (Message$isSystemRequestedShutdown(message)) {
// TODO
}
}
dispatch(msg) {
this.#runtime.dispatch(msg);
}
emit(event, data) {
this.#runtime.emit(event, data);
}
}
export const start = ({ init, update, view }, selector, flags) => {
if (!is_browser()) return Result$Error(Error$NotABrowser());
const root =
selector instanceof HTMLElement
? selector
: document().querySelector(selector);
if (!root) return Result$Error(Error$ElementNotFound(selector));
return Result$Ok(new Spa(root, init(flags), update, view));
};