UNPKG

@harlem/plugin-ssr

Version:

The official server-side rendering plugin for Harlem

57 lines (55 loc) 1.57 kB
// src/constants.ts var SENDER = "plugin:ssr"; var SERIALIZER = (snapshot2) => JSON.stringify(snapshot2); var MUTATIONS = { init: "plugin:ssr:init" }; // src/index.ts import { EVENTS } from "@harlem/core"; import { objectOverwrite } from "@harlem/utilities"; var snapshot = {}; function onStoreEvent(stores, payload, callback) { if (!payload) { return; } const store = stores.get(payload.store); if (store) { callback(store); } } function getBridgingScript(serializer = SERIALIZER) { return `window.__harlemState = ${serializer(snapshot)};`; } function getBridgingScriptBlock(serializer = SERIALIZER) { return `<script>${getBridgingScript(serializer)}</script>`; } function createServerSSRPlugin() { return (app, eventEmitter, stores) => { stores.forEach((store) => store.flags.set("ssr:server", true)); eventEmitter.on(EVENTS.ssr.initServer, (payload) => onStoreEvent(stores, payload, (store) => { snapshot[store.name] = store.state; })); }; } function createClientSSRPlugin() { return (app, eventEmitter, stores) => { const data = window.__harlemState; stores.forEach((store) => store.flags.set("ssr:client", true)); eventEmitter.on(EVENTS.ssr.initClient, (payload) => onStoreEvent(stores, payload, (store) => { if (store.name in data) { store.write(MUTATIONS.init, SENDER, (state) => objectOverwrite(state, data[store.name])); delete data[store.name]; } })); }; } export { createClientSSRPlugin, createServerSSRPlugin, getBridgingScript, getBridgingScriptBlock };