@harlem/plugin-ssr
Version:
The official server-side rendering plugin for Harlem
57 lines (55 loc) • 1.57 kB
JavaScript
// 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
};