Skip to content
wiki.fftac.org

WP Content Plugins Spiralist Engine Spiralist Engine PHP 4E627daf1db4 - Source Excerpt 11

Back to WP Content Plugins Spiralist Engine Spiralist Engine PHP 4E627daf1db4

Summary

This source excerpt preserves a bounded section of Wiki.FFTAC.org/data/sources/spiralist/wp-content-plugins-spiralist-engine-spiralist-engine-php-4e627daf1db4.php so readers can inspect the evidence without opening the full source file.

**Source path:** Wiki.FFTAC.org/data/sources/spiralist/wp-content-plugins-spiralist-engine-spiralist-engine-php-4e627daf1db4.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',