Skip to content

Instantly share code, notes, and snippets.

@m-revetria
Last active October 28, 2021 02:41
Show Gist options
  • Select an option

  • Save m-revetria/cbed96eaf4a2cdddd246e17359ec599a to your computer and use it in GitHub Desktop.

Select an option

Save m-revetria/cbed96eaf4a2cdddd246e17359ec599a to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
const encoderStates = {
initial: 'streaming',
states: {
streaming: {
on: {
ENCODER_STOPPED: 'paused',
},
},
paused: {
on: {
ENCODER_RESUMED: 'streaming',
},
},
},
};
const browserStates = {
initial: 'processing',
states: {
processing: {
on: {
PROCESSED: 'streaming',
},
},
streaming: {
on: {
PAUSE: 'paused',
SWITCH_CAM: {
target: 'streaming',
actions: ['assignSwitchCamera'],
},
SWITCHED_CAM: {
target: 'streaming',
actions: ['unassignSwitchCamera'],
},
CAM_COUNT: {
target: 'streaming',
actions: ['assignCamerasCount']
},
ERROR: {
target: 'error',
actions: ['assignError'],
},
},
},
paused: {
on: {
GO_LIVE: 'streaming',
},
},
error: {
on: {
GO_LIVE: 'streaming',
},
},
},
};
const livestreamMachine = Machine(
{
id: 'livestream-hierarchical',
type: 'parallel',
context: {
camerasCount: undefined,
currentCamera: undefined,
error: undefined,
},
states: {
stage: {
initial: 'browserCanStream',
states: {
browserCanStream: {
on: {
GO_LIVE: 'browser',
FROM_ENCODER: 'encoderProcessing',
END: 'completed',
},
},
encoderProcessing: {
on: {
PROCESSED: 'encoderCanStream',
FROM_BROWSER: 'browserCanStream',
END: 'completed',
},
},
encoderCanStream: {
on: {
ENCODER_STARTED: 'encoder',
FROM_BROWSER: 'browserCanStream',
},
},
encoder: {
on: {
ERROR: {
target: 'error',
actions: ['assignError'],
},
END: 'completed',
},
...encoderStates,
},
browser: {
on: {
END: 'completed',
},
...browserStates,
},
error: {
type: 'final',
},
completed: {
type: 'final',
},
},
},
type: {
initial: 'test',
states: {
test: {
on: {
EVENT: 'event',
},
},
event: {
type: 'final',
},
},
},
},
},
{
actions: {
assignError: assign({
error: (_context, event) => event.error,
}),
assignCamerasCount: assign({
camerasCount: (_context, event) => event.camerasCount
}),
assignCurrentCamera: assign({
switchCamera: (_context, _event) => true,
}),
unassignSwitchCamera: assign({
switchCamera: (_context, _event) => undefined,
}),
},
},
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment