clumsy-graphics
Version:
a tool for rapidly developing animations where frames are described using svg elements à la react 🙃
184 lines (183 loc) • 11.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.spawnGraphicsRendererProcess = exports.graphicsRendererProcessManagerSaga = void 0;
const child_process_1 = require("child_process");
const getSpawnedGraphicsRendererProcessEventChannel_1 = require("../externals/getSpawnedGraphicsRendererProcessEventChannel");
const storeEffects_1 = require("../helpers/storeEffects");
function* graphicsRendererProcessManagerSaga(api) {
const { graphicsRendererProcessManagerActionChannel } = api;
while (true) {
const someGraphicsRendererProcessManagerAction = yield* (0, storeEffects_1.takeActionFromChannel)(graphicsRendererProcessManagerActionChannel);
const currentAnimationModuleBundlerState = yield* (0, storeEffects_1.select)((currentAnimationDevelopmentState) => currentAnimationDevelopmentState.animationModuleBundlerState);
if (someGraphicsRendererProcessManagerAction.type ===
'animationModuleBundler_initialBuildSucceeded' ||
someGraphicsRendererProcessManagerAction.type ===
'animationModuleBundler_rebuildSucceeded') {
yield* (0, storeEffects_1.call)(function* () {
if (currentAnimationModuleBundlerState.bundlerStatus === 'bundlerActive') {
terminateActiveGraphicsRendererProcesses({
currentAnimationModuleBundlerState,
});
}
yield* (0, storeEffects_1.put)({
type: 'animationModuleBundlerStateUpdated',
actionPayload: {
nextAnimationModuleBundlerState: {
bundlerStatus: 'bundlerActive',
buildVersion: someGraphicsRendererProcessManagerAction.actionPayload
.nextBuildSessionVersion,
buildStatus: someGraphicsRendererProcessManagerAction.actionPayload
.nextBuildStatus,
animationModule: someGraphicsRendererProcessManagerAction.actionPayload
.nextAnimationModule,
graphicsRendererProcessStates: {},
},
},
});
});
}
else if (someGraphicsRendererProcessManagerAction.type ===
'animationModuleBundler_rebuildFailed') {
yield* (0, storeEffects_1.call)(function* () {
if (
// ??? dont think this check is necessary with better types
currentAnimationModuleBundlerState.bundlerStatus === 'bundlerActive') {
terminateActiveGraphicsRendererProcesses({
currentAnimationModuleBundlerState,
});
}
yield* (0, storeEffects_1.put)({
type: 'animationModuleBundlerStateUpdated',
actionPayload: {
nextAnimationModuleBundlerState: {
bundlerStatus: 'bundlerActive',
buildVersion: someGraphicsRendererProcessManagerAction.actionPayload
.nextBuildSessionVersion,
buildStatus: someGraphicsRendererProcessManagerAction.actionPayload
.nextBuildStatus,
buildErrorMessage: someGraphicsRendererProcessManagerAction.actionPayload
.nextBuildErrorMessage,
graphicsRendererProcessStates: {},
},
},
});
});
}
else if (currentAnimationModuleBundlerState.bundlerStatus === 'bundlerActive' &&
someGraphicsRendererProcessManagerAction.type ===
'spawnGraphicsRendererProcess' &&
currentAnimationModuleBundlerState.buildVersion ===
someGraphicsRendererProcessManagerAction.actionPayload.buildVersion &&
currentAnimationModuleBundlerState.graphicsRendererProcessStates[someGraphicsRendererProcessManagerAction.actionPayload
.graphicsRendererProcessKey] === undefined) {
yield* (0, storeEffects_1.call)(function* () {
const { spawnedGraphicsRendererProcess } = spawnGraphicsRendererProcess({
graphicsRendererProcessCommandString: someGraphicsRendererProcessManagerAction.actionPayload
.graphicsRendererProcessCommandString,
});
const { spawnedGraphicsRendererProcessEventChannel } = (0, getSpawnedGraphicsRendererProcessEventChannel_1.getSpawnedGraphicsRendererProcessEventChannel)({
spawnedGraphicsRendererProcess,
});
yield* (0, storeEffects_1.put)({
type: 'graphicsRendererProcessActive',
actionPayload: {
newGraphicsRendererProcessKey: someGraphicsRendererProcessManagerAction.actionPayload
.graphicsRendererProcessKey,
newGraphicsRendererProcessState: {
graphicsRendererProcessKey: someGraphicsRendererProcessManagerAction.actionPayload
.graphicsRendererProcessKey,
spawnedGraphicsRendererProcess: spawnedGraphicsRendererProcess,
graphicsRendererProcessStatus: 'processActive',
graphicsRendererProcessStdoutLog: '',
},
},
});
yield* (0, storeEffects_1.spawn)(function* () {
let graphicsRendererProcessRunning = true;
while (graphicsRendererProcessRunning) {
const someSpawnedGraphicsRendererProcessEvent = yield* (0, storeEffects_1.takeEvent)(spawnedGraphicsRendererProcessEventChannel);
switch (someSpawnedGraphicsRendererProcessEvent.eventType) {
case 'graphicsRendererProcessStdoutLogUpdated':
yield* (0, storeEffects_1.put)({
type: 'graphicsRendererProcessStdoutLogUpdated',
actionPayload: {
targetGraphicsRendererProcessKey: someGraphicsRendererProcessManagerAction.actionPayload
.graphicsRendererProcessKey,
buildVersion: currentAnimationModuleBundlerState.buildVersion,
targetGraphicsRendererProcessStateUpdates: {
graphicsRendererProcessStdoutLog: someSpawnedGraphicsRendererProcessEvent.eventPayload
.updatedGraphicsRendererProcessStdoutLog,
},
},
});
break;
case 'graphicsRendererProcessSuccessful':
yield* (0, storeEffects_1.put)({
type: 'graphicsRendererProcessSuccessful',
actionPayload: {
targetGraphicAssetKey: someGraphicsRendererProcessManagerAction.actionPayload
.graphicAssetPathKey,
targetGraphicAssetPath: someGraphicsRendererProcessManagerAction.actionPayload
.graphicAssetPath,
targetGraphicsRendererProcessKey: someGraphicsRendererProcessManagerAction.actionPayload
.graphicsRendererProcessKey,
buildVersion: currentAnimationModuleBundlerState.buildVersion,
targetGraphicsRendererProcessStateUpdates: {
graphicAssetUrl: someGraphicsRendererProcessManagerAction.actionPayload
.graphicAssetUrlResult,
graphicsRendererProcessStatus: 'processSuccessful',
},
},
});
break;
case 'graphicsRendererProcessFailed':
yield* (0, storeEffects_1.put)({
type: 'graphicsRendererProcessFailed',
actionPayload: {
targetGraphicsRendererProcessKey: someGraphicsRendererProcessManagerAction.actionPayload
.graphicsRendererProcessKey,
buildVersion: currentAnimationModuleBundlerState.buildVersion,
targetGraphicsRendererProcessStateUpdates: {
graphicsRendererProcessErrorMessage: someSpawnedGraphicsRendererProcessEvent.eventPayload
.graphicsRendererProcessErrorMessage,
graphicsRendererProcessStatus: 'processFailed',
},
},
});
break;
case 'graphicsRendererProcessTerminated':
break;
}
if (someSpawnedGraphicsRendererProcessEvent.eventType ===
'graphicsRendererProcessSuccessful' ||
someSpawnedGraphicsRendererProcessEvent.eventType ===
'graphicsRendererProcessFailed' ||
someSpawnedGraphicsRendererProcessEvent.eventType ===
'graphicsRendererProcessTerminated') {
graphicsRendererProcessRunning = false;
}
}
});
});
}
}
}
exports.graphicsRendererProcessManagerSaga = graphicsRendererProcessManagerSaga;
function terminateActiveGraphicsRendererProcesses(api) {
const { currentAnimationModuleBundlerState } = api;
Object.values(currentAnimationModuleBundlerState.graphicsRendererProcessStates).forEach((someGraphicsRendererProcessState) => {
someGraphicsRendererProcessState.spawnedGraphicsRendererProcess.kill('SIGINT');
});
}
function spawnGraphicsRendererProcess(api) {
const { graphicsRendererProcessCommandString } = api;
const graphicsRendererCommandTokens = graphicsRendererProcessCommandString.split(' ');
const [mainGraphicsRendererCommandToken, ...graphicsRendererCommandArgumentTokens] = graphicsRendererCommandTokens;
const spawnedGraphicsRendererProcess = (0, child_process_1.spawn)(mainGraphicsRendererCommandToken, graphicsRendererCommandArgumentTokens, {
stdio: 'pipe',
});
return {
spawnedGraphicsRendererProcess,
};
}
exports.spawnGraphicsRendererProcess = spawnGraphicsRendererProcess;