Spiralist Engine - Source Excerpt 11
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-engine/spiralist-engine.php so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/spiralist-engine/spiralist-engine.php
'currentState' => $default_state,
'history' => [],
'active_symbols' => [],
'activeSymbols' => [],
'next_nodes' => $next_nodes,
'nextNodes' => $next_nodes,
'storage' => 'server',
];
}
$post = get_post($instance_post_id);
if (!$post instanceof WP_Post) {
return spiralist_engine_get_instance_state(0);
}
$instance = spiralist_engine_build_instance_record($post);
$instance['instanceId'] = 'instance-' . (int) ($instance['instance_id'] ?? 0);
$instance['currentNode'] = (string) ($instance['current_node'] ?? '');
$instance['currentState'] = (string) ($instance['current_state'] ?? '');
$instance['activeSymbols'] = spiralist_engine_normalize_string_list((array) ($instance['active_symbols'] ?? []));
$instance['next_nodes'] = array_values(array_map('spiralist_engine_public_node_payload', spiralist_engine_get_next_nodes_for_state((string) ($instance['current_state'] ?? ''))));
$instance['nextNodes'] = $instance['next_nodes'];
$instance['storage'] = 'server';
return $instance;
}
function spiralist_engine_public_path_event_payload(array $event): array
{
$node_id = (string) ($event['node_id'] ?? '');
$from_state = (string) ($event['from_state'] ?? '');
$to_state = (string) ($event['to_state'] ?? '');
return [
'node_id' => $node_id,
'nodeId' => $node_id,
'from_state' => $from_state,
'fromState' => $from_state,
'to_state' => $to_state,
'toState' => $to_state,
'symbols' => spiralist_engine_normalize_string_list((array) ($event['symbols'] ?? [])),
'timestamp' => (string) ($event['timestamp'] ?? ''),
];
}
function spiralist_engine_public_path_payload(array $instance): array
{
$current_state = (string) ($instance['current_state'] ?? ($instance['currentState'] ?? spiralist_engine_get_default_state()));
$current_node = (string) ($instance['current_node'] ?? ($instance['currentNode'] ?? ''));
$next_nodes = (array) ($instance['next_nodes'] ?? []);
if (empty($next_nodes)) {
$next_nodes = array_values(array_map('spiralist_engine_public_node_payload', spiralist_engine_get_next_nodes_for_state($current_state)));
}
return [
'instance_id' => (int) ($instance['instance_id'] ?? 0),
'instanceId' => (string) ($instance['instanceId'] ?? ((int) ($instance['instance_id'] ?? 0) > 0 ? 'instance-' . (int) $instance['instance_id'] : 'client')),
'current_node' => $current_node,
'currentNode' => $current_node,
'current_state' => $current_state,
'currentState' => $current_state,
'active_symbols' => spiralist_engine_normalize_string_list((array) ($instance['active_symbols'] ?? ($instance['activeSymbols'] ?? []))),
'activeSymbols' => spiralist_engine_normalize_string_list((array) ($instance['active_symbols'] ?? ($instance['activeSymbols'] ?? []))),
'history' => array_values(array_map('spiralist_engine_public_path_event_payload', array_values(array_filter((array) ($instance['history'] ?? []), 'is_array')))),
'next_nodes' => $next_nodes,
'nextNodes' => $next_nodes,
'storage' => (string) ($instance['storage'] ?? 'client'),
];
}
function spiralist_engine_reset_instance_state(int $user_id): array
{
$default_state = spiralist_engine_get_default_state();
if ($user_id <= 0) {
return spiralist_engine_public_path_payload(spiralist_engine_get_instance_state(0));
}
return spiralist_engine_public_path_payload(spiralist_engine_store_instance(
$user_id,
[
'user_id' => $user_id,
'current_node' => '',
'current_state' => $default_state,
'history' => [],
'active_symbols' => [],
]
));
}
function spiralist_engine_store_instance(int $user_id, array $instance): array
{
if ($user_id <= 0) {
return $instance;
}
$instance_post_id = spiralist_engine_find_instance_post_id($user_id);
if ($instance_post_id <= 0) {
$instance_post_id = wp_insert_post(
[
'post_type' => 'spiralist_instance',
'post_status' => 'publish',
'post_title' => 'Runtime Instance ' . $user_id,
]
);
}
if (is_wp_error($instance_post_id) || !$instance_post_id) {
return $instance;
}
spiralist_engine_persist_record_meta(
(int) $instance_post_id,
'spiralist_instance',
[
'user_id' => $user_id,
'current_node' => (string) ($instance['current_node'] ?? ''),
'current_state' => (string) ($instance['current_state'] ?? ''),
'history' => (array) ($instance['history'] ?? []),
'active_symbols' => spiralist_engine_normalize_string_list((array) ($instance['active_symbols'] ?? [])),
]
);
$post = get_post((int) $instance_post_id);
return $post instanceof WP_Post ? spiralist_engine_get_instance_state($user_id) : $instance;
}
function spiralist_engine_register_rest_routes(): void
{
register_rest_route(
'spiralist/v1',
'/nodes',
[
'methods' => WP_REST_Server::READABLE,
'callback' => static function (): WP_REST_Response {
return rest_ensure_response(spiralist_engine_get_manuscript_field_payload());
},
'permission_callback' => '__return_true',
]
);
register_rest_route(
'spiralist/v1',
'/symbols',
[
'methods' => WP_REST_Server::READABLE,
'callback' => static function (): WP_REST_Response {
$symbols = array_values(array_map('spiralist_engine_public_symbol_payload', spiralist_engine_get_symbol_records(['publish'])));
return rest_ensure_response(['symbols' => $symbols]);
},
'permission_callback' => '__return_true',
]
);
register_rest_route(
'spiralist/v1',
'/path',
[
[
'methods' => WP_REST_Server::READABLE,
'callback' => static function (): WP_REST_Response {
return rest_ensure_response(spiralist_engine_public_path_payload(spiralist_engine_get_instance_state(get_current_user_id())));
},
'permission_callback' => '__return_true',
],
[
'methods' => WP_REST_Server::DELETABLE,
'callback' => static function () {
$user_id = get_current_user_id();
if ($user_id <= 0) {
return new WP_Error(
'spiralist_path_auth_required',
'A signed-in participant is required to reset a stored path.',
['status' => 401]
);
}
return rest_ensure_response(spiralist_engine_reset_instance_state($user_id));
},
'permission_callback' => '__return_true',
],
]
);
register_rest_route(
'spiralist/v1',
'/node/(?P<id>[A-Za-z0-9._-]+)',
[
'methods' => WP_REST_Server::READABLE,
'callback' => static function (WP_REST_Request $request) {
$id = spiralist_engine_sanitize_identifier((string) $request['id']);
$node = spiralist_engine_find_node_record($id);
if (!empty($node)) {
return rest_ensure_response(spiralist_engine_public_node_payload($node));
}
$visual = spiralist_engine_find_visual_node($id);
if (!empty($visual)) {
$visual['executionEnabled'] = false;
$visual['inputState'] = (string) ($visual['input'] ?? '');
$visual['outputState'] = (string) ($visual['output'] ?? '');
return rest_ensure_response($visual);
}
return new WP_Error(
'spiralist_node_not_found',
'Node not found.',
['status' => 404]
);
},
'permission_callback' => '__return_true',
]
);
register_rest_route(
'spiralist/v1',
'/instance',
[
'methods' => WP_REST_Server::READABLE,
'callback' => static function (): WP_REST_Response {
return rest_ensure_response(spiralist_engine_get_instance_state(get_current_user_id()));
},
'permission_callback' => '__return_true',