@wandelbots/nova-js 2.1.4-pr.feature-remove-v2-functionallity.113.bfa317e → 2.1.4-pr.feature-add-program-client.114.9d31b54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/v2/index.ts","../../../src/lib/v2/NovaCellAPIClient.ts","../../../src/lib/v2/NovaClient.ts","../../../src/lib/v2/mock/MockNovaInstance.ts"],"sourcesContent":["export * from \"@wandelbots/nova-api/v2\"\nexport * from \"./NovaCellAPIClient\"\nexport * from \"./NovaClient\"\n","import type { Configuration as BaseConfiguration } from \"@wandelbots/nova-api/v2\"\nimport {\n ApplicationApi,\n BUSInputsOutputsApi,\n CellApi,\n ControllerApi,\n ControllerInputsOutputsApi,\n JoggingApi,\n KinematicsApi,\n MotionGroupApi,\n MotionGroupModelsApi,\n StoreCollisionComponentsApi,\n StoreCollisionSetupsApi,\n StoreObjectApi,\n SystemApi,\n TrajectoryCachingApi,\n TrajectoryExecutionApi,\n TrajectoryPlanningApi,\n VirtualControllerApi,\n VirtualControllerBehaviorApi,\n VirtualControllerInputsOutputsApi,\n} from \"@wandelbots/nova-api/v2\"\nimport type { BaseAPI } from \"@wandelbots/nova-api/v2/base\"\nimport type { AxiosInstance } from \"axios\"\nimport axios from \"axios\"\n\ntype OmitFirstArg<F> = F extends (x: any, ...args: infer P) => infer R\n ? (...args: P) => R\n : never\n\ntype UnwrapAxiosResponseReturn<T> = T extends (...a: any) => any\n ? (\n ...a: Parameters<T>\n ) => Promise<Awaited<ReturnType<T>> extends { data: infer D } ? D : never>\n : never\n\nexport type WithCellId<T> = {\n [P in keyof T]: UnwrapAxiosResponseReturn<OmitFirstArg<T[P]>>\n}\n\nexport type WithUnwrappedAxiosResponse<T> = {\n [P in keyof T]: UnwrapAxiosResponseReturn<T[P]>\n}\n\n/**\n * API client providing type-safe access to all the Nova API REST endpoints\n * associated with a specific cell id.\n */\nexport class NovaCellAPIClient {\n constructor(\n readonly cellId: string,\n readonly opts: BaseConfiguration & {\n axiosInstance?: AxiosInstance\n mock?: boolean\n },\n ) {}\n\n /**\n * Some TypeScript sorcery which alters the API class methods so you don't\n * have to pass the cell id to every single one, and de-encapsulates the\n * response data\n */\n private withCellId<T extends BaseAPI>(\n ApiConstructor: new (\n config: BaseConfiguration,\n basePath: string,\n axios: AxiosInstance,\n ) => T,\n ) {\n const apiClient = new ApiConstructor(\n {\n ...this.opts,\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n },\n this.opts.basePath ?? \"\",\n this.opts.axiosInstance ?? axios.create(),\n ) as {\n [key: string | symbol]: any\n }\n\n for (const key of Reflect.ownKeys(Reflect.getPrototypeOf(apiClient)!)) {\n if (key !== \"constructor\" && typeof apiClient[key] === \"function\") {\n const originalFunction = apiClient[key]\n apiClient[key] = (...args: any[]) => {\n return originalFunction\n .apply(apiClient, [this.cellId, ...args])\n .then((res: any) => res.data)\n }\n }\n }\n\n return apiClient as WithCellId<T>\n }\n\n /**\n * As withCellId, but only does the response unwrapping\n */\n private withUnwrappedResponsesOnly<T extends BaseAPI>(\n ApiConstructor: new (\n config: BaseConfiguration,\n basePath: string,\n axios: AxiosInstance,\n ) => T,\n ) {\n const apiClient = new ApiConstructor(\n {\n ...this.opts,\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n },\n this.opts.basePath ?? \"\",\n this.opts.axiosInstance ?? axios.create(),\n ) as {\n [key: string | symbol]: any\n }\n\n for (const key of Reflect.ownKeys(Reflect.getPrototypeOf(apiClient)!)) {\n if (key !== \"constructor\" && typeof apiClient[key] === \"function\") {\n const originalFunction = apiClient[key]\n apiClient[key] = (...args: any[]) => {\n return originalFunction\n .apply(apiClient, args)\n .then((res: any) => res.data)\n }\n }\n }\n\n return apiClient as WithUnwrappedAxiosResponse<T>\n }\n\n readonly system = this.withUnwrappedResponsesOnly(SystemApi)\n readonly cell = this.withUnwrappedResponsesOnly(CellApi)\n\n readonly motionGroup = this.withCellId(MotionGroupApi)\n readonly motionGroupModels = this.withCellId(MotionGroupModelsApi)\n\n readonly controller = this.withCellId(ControllerApi)\n\n readonly controllerIOs = this.withCellId(ControllerInputsOutputsApi)\n\n readonly trajectoryPlanning = this.withCellId(TrajectoryPlanningApi)\n readonly trajectoryExecution = this.withCellId(TrajectoryExecutionApi)\n readonly trajectoryCaching = this.withCellId(TrajectoryCachingApi)\n\n readonly application = this.withCellId(ApplicationApi)\n readonly applicationGlobal = this.withUnwrappedResponsesOnly(ApplicationApi)\n\n readonly jogging = this.withCellId(JoggingApi)\n\n readonly kinematics = this.withCellId(KinematicsApi)\n\n readonly busInputsOutputs = this.withCellId(BUSInputsOutputsApi)\n\n readonly virtualController = this.withCellId(VirtualControllerApi)\n readonly virtualControllerBehavior = this.withCellId(\n VirtualControllerBehaviorApi,\n )\n readonly virtualControllerIOs = this.withCellId(\n VirtualControllerInputsOutputsApi,\n )\n\n readonly storeObject = this.withCellId(StoreObjectApi)\n readonly storeCollisionComponents = this.withCellId(\n StoreCollisionComponentsApi,\n )\n readonly storeCollisionSetups = this.withCellId(StoreCollisionSetupsApi)\n}\n","import type { Configuration as BaseConfiguration } from \"@wandelbots/nova-api/v2\"\nimport type { AxiosRequestConfig } from \"axios\"\nimport axios, { isAxiosError } from \"axios\"\nimport urlJoin from \"url-join\"\nimport { loginWithAuth0 } from \"../../LoginWithAuth0\"\nimport { AutoReconnectingWebsocket } from \"../AutoReconnectingWebsocket\"\nimport { availableStorage } from \"../availableStorage\"\nimport { MockNovaInstance } from \"./mock/MockNovaInstance\"\nimport { NovaCellAPIClient } from \"./NovaCellAPIClient\"\n\nexport type NovaClientConfig = {\n /**\n * Url of the deployed Nova instance to connect to\n * e.g. https://saeattii.instance.wandelbots.io\n */\n instanceUrl: string | \"https://mock.example.com\"\n\n /**\n * Identifier of the cell on the Nova instance to connect this client to.\n * If omitted, the default identifier \"cell\" is used.\n **/\n cellId?: string\n\n /**\n * Username for basic auth to the Nova instance.\n * @deprecated use accessToken instead\n */\n username?: string\n\n /**\n * Password for basic auth to the Nova instance.\n * @deprecated use accessToken instead\n */\n password?: string\n\n /**\n * Access token for Bearer authentication.\n */\n accessToken?: string\n} & Omit<BaseConfiguration, \"isJsonMime\" | \"basePath\">\n\ntype NovaClientConfigWithDefaults = NovaClientConfig & { cellId: string }\n\n/**\n * EXPERIMENTAL\n *\n * This client provides a starting point to migrate NOVA api v2.\n * As v2 is still in development, this client has to be considered unstable\n *\n * Client for connecting to a Nova instance and controlling robots.\n */\nexport class NovaClient {\n readonly api: NovaCellAPIClient\n readonly config: NovaClientConfigWithDefaults\n readonly mock?: MockNovaInstance\n authPromise: Promise<string | null> | null = null\n accessToken: string | null = null\n\n constructor(config: NovaClientConfig) {\n console.warn(\"Using experimental NOVA v2 client\")\n const cellId = config.cellId ?? \"cell\"\n this.config = {\n cellId,\n ...config,\n }\n this.accessToken =\n config.accessToken ||\n availableStorage.getString(\"wbjs.access_token\") ||\n null\n\n if (this.config.instanceUrl === \"https://mock.example.com\") {\n this.mock = new MockNovaInstance()\n }\n\n // Set up Axios instance with interceptor for token fetching\n const axiosInstance = axios.create({\n baseURL: urlJoin(this.config.instanceUrl, \"/api/v2\"),\n // TODO - backend needs to set proper CORS headers for this\n headers:\n typeof window !== \"undefined\" &&\n window.location.origin.includes(\"localhost\")\n ? {}\n : {\n // Identify the client to the backend for logging purposes\n \"X-Wandelbots-Client\": \"Wandelbots-Nova-JS-SDK\",\n },\n })\n\n axiosInstance.interceptors.request.use(async (request) => {\n if (!request.headers.Authorization) {\n if (this.accessToken) {\n request.headers.Authorization = `Bearer ${this.accessToken}`\n } else if (this.config.username && this.config.password) {\n request.headers.Authorization = `Basic ${btoa(config.username + \":\" + config.password)}`\n }\n }\n return request\n })\n\n if (typeof window !== \"undefined\") {\n axiosInstance.interceptors.response.use(\n (r) => r,\n async (error) => {\n if (isAxiosError(error)) {\n if (error.response?.status === 401) {\n // If we hit a 401, attempt to login the user and retry with\n // a new access token\n try {\n await this.renewAuthentication()\n\n if (error.config) {\n if (this.accessToken) {\n error.config.headers.Authorization = `Bearer ${this.accessToken}`\n } else {\n delete error.config.headers.Authorization\n }\n return axiosInstance.request(error.config)\n }\n } catch (err) {\n return Promise.reject(err)\n }\n } else if (error.response?.status === 503) {\n // Check if the server as a whole is down\n const res = await fetch(window.location.href)\n if (res.status === 503) {\n // Go to 503 page\n window.location.reload()\n }\n }\n }\n\n return Promise.reject(error)\n },\n )\n }\n\n this.api = new NovaCellAPIClient(cellId, {\n ...config,\n basePath: urlJoin(this.config.instanceUrl, \"/api/v1\"),\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n baseOptions: {\n ...(this.mock\n ? ({\n adapter: (config) => {\n return this.mock!.handleAPIRequest(config)\n },\n } satisfies AxiosRequestConfig)\n : {}),\n ...config.baseOptions,\n },\n axiosInstance,\n })\n }\n\n async renewAuthentication(): Promise<void> {\n if (this.authPromise) {\n // Don't double up\n return\n }\n\n this.authPromise = loginWithAuth0(this.config.instanceUrl)\n try {\n this.accessToken = await this.authPromise\n if (this.accessToken) {\n // Cache access token so we don't need to log in every refresh\n availableStorage.setString(\"wbjs.access_token\", this.accessToken)\n } else {\n availableStorage.delete(\"wbjs.access_token\")\n }\n } finally {\n this.authPromise = null\n }\n }\n\n makeWebsocketURL(path: string): string {\n const url = new URL(\n urlJoin(\n this.config.instanceUrl,\n `/api/v1/cells/${this.config.cellId}`,\n path,\n ),\n )\n url.protocol = url.protocol.replace(\"http\", \"ws\")\n url.protocol = url.protocol.replace(\"https\", \"wss\")\n\n // If provided, add basic auth credentials to the URL\n // NOTE - basic auth is deprecated on websockets and doesn't work in Safari\n // use tokens instead\n if (this.accessToken) {\n url.searchParams.append(\"token\", this.accessToken)\n } else if (this.config.username && this.config.password) {\n url.username = this.config.username\n url.password = this.config.password\n }\n\n return url.toString()\n }\n\n /**\n * Retrieve an AutoReconnectingWebsocket to the given path on the Nova instance.\n * If you explicitly want to reconnect an existing websocket, call `reconnect`\n * on the returned object.\n */\n openReconnectingWebsocket(path: string) {\n return new AutoReconnectingWebsocket(this.makeWebsocketURL(path), {\n mock: this.mock,\n })\n }\n}\n","import type { MotionGroupState, RobotController } from \"@wandelbots/nova-api/v2\"\nimport type { AxiosResponse, InternalAxiosRequestConfig } from \"axios\"\nimport { AxiosError } from \"axios\"\nimport * as pathToRegexp from \"path-to-regexp\"\nimport type { AutoReconnectingWebsocket } from \"../../AutoReconnectingWebsocket\"\n\n/**\n * EXPERIMENTAL\n * Ultra-simplified mock Nova server for testing stuff\n */\nexport class MockNovaInstance {\n readonly connections: AutoReconnectingWebsocket[] = []\n\n async handleAPIRequest(\n config: InternalAxiosRequestConfig,\n ): Promise<AxiosResponse> {\n const apiHandlers = [\n {\n method: \"GET\",\n path: \"/cells/:cellId/controllers\",\n handle() {\n return {\n controllers: [\n {\n controller: \"mock-ur5e\",\n model_name: \"UniversalRobots::Controller\",\n host: \"mock-ur5e\",\n allow_software_install_on_controller: true,\n motion_groups: [\n {\n motion_group: \"0@mock-ur5e\",\n name_from_controller: \"UR5e\",\n active: false,\n model_from_controller: \"UniversalRobots_UR5e\",\n },\n ],\n has_error: false,\n error_details: \"\",\n },\n ],\n }\n },\n },\n {\n method: \"GET\",\n path: \"/cells/:cellId/controllers/:controllerId\",\n handle() {\n return {\n configuration: {\n kind: \"VirtualController\",\n manufacturer: \"universalrobots\",\n type: \"universalrobots-ur5e\",\n },\n name: \"mock-ur5\",\n } satisfies RobotController\n },\n },\n {\n method: \"GET\",\n path: \"/cells/:cellId/motion-groups/:motionGroupId/specification\",\n handle() {\n return {\n dh_parameters: [\n {\n alpha: 1.5707963267948966,\n theta: 0,\n a: 0,\n d: 162.25,\n reverse_rotation_direction: false,\n },\n {\n alpha: 0,\n theta: 0,\n a: -425,\n d: 0,\n reverse_rotation_direction: false,\n },\n {\n alpha: 0,\n theta: 0,\n a: -392.2,\n d: 0,\n reverse_rotation_direction: false,\n },\n {\n alpha: 1.5707963267948966,\n theta: 0,\n a: 0,\n d: 133.3,\n reverse_rotation_direction: false,\n },\n {\n alpha: -1.5707963267948966,\n theta: 0,\n a: 0,\n d: 99.7,\n reverse_rotation_direction: false,\n },\n {\n alpha: 0,\n theta: 0,\n a: 0,\n d: 99.6,\n reverse_rotation_direction: false,\n },\n ],\n mechanical_joint_limits: [\n {\n joint: \"JOINTNAME_AXIS_1\",\n lower_limit: -6.335545063018799,\n upper_limit: 6.335545063018799,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_2\",\n lower_limit: -6.335545063018799,\n upper_limit: 6.335545063018799,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_3\",\n lower_limit: -6.335545063018799,\n upper_limit: 6.335545063018799,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_4\",\n lower_limit: -6.335545063018799,\n upper_limit: 6.335545063018799,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_5\",\n lower_limit: -6.335545063018799,\n upper_limit: 6.335545063018799,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_6\",\n lower_limit: -6.335545063018799,\n upper_limit: 6.335545063018799,\n unlimited: false,\n },\n ],\n } // Mock motion group specification\n },\n },\n {\n method: \"GET\",\n path: \"/cells/:cellId/motion-groups/:motionGroupId/safety-setup\",\n handle() {\n return {\n safety_settings: [\n {\n safety_state: \"SAFETY_NORMAL\",\n settings: {\n joint_position_limits: [\n {\n joint: \"JOINTNAME_AXIS_1\",\n lower_limit: -2.96705961227417,\n upper_limit: 2.96705961227417,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_2\",\n lower_limit: -1.7453292608261108,\n upper_limit: 2.7925267219543457,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_3\",\n lower_limit: -3.3161256313323975,\n upper_limit: 0.40142571926116943,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_4\",\n lower_limit: -3.4906585216522217,\n upper_limit: 3.4906585216522217,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_5\",\n lower_limit: -2.4434609413146973,\n upper_limit: 2.4434609413146973,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_6\",\n lower_limit: -4.71238899230957,\n upper_limit: 4.71238899230957,\n unlimited: false,\n },\n ],\n joint_velocity_limits: [\n {\n joint: \"JOINTNAME_AXIS_1\",\n limit: 3.1415927410125732,\n },\n {\n joint: \"JOINTNAME_AXIS_2\",\n limit: 3.1415927410125732,\n },\n {\n joint: \"JOINTNAME_AXIS_3\",\n limit: 3.4906585216522217,\n },\n {\n joint: \"JOINTNAME_AXIS_4\",\n limit: 6.108652591705322,\n },\n {\n joint: \"JOINTNAME_AXIS_5\",\n limit: 6.108652591705322,\n },\n {\n joint: \"JOINTNAME_AXIS_6\",\n limit: 6.981317043304443,\n },\n ],\n joint_acceleration_limits: [],\n joint_torque_limits: [],\n tcp_velocity_limit: 1800,\n },\n },\n ],\n safety_zones: [\n {\n id: 1,\n priority: 0,\n geometry: {\n compound: {\n child_geometries: [\n {\n convex_hull: {\n vertices: [\n { vertex: [-800, -1330, -1820] },\n { vertex: [1650, -1330, -1820] },\n { vertex: [1650, 1330, -1820] },\n { vertex: [-800, 1330, -1820] },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"box\",\n },\n {\n convex_hull: {\n vertices: [\n {\n vertex: [-800, -1330, -1820],\n },\n {\n vertex: [1650, -1330, -1820],\n },\n {\n vertex: [1650, -1330, 1500],\n },\n {\n vertex: [-800, -1330, 1500],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"box\",\n },\n {\n convex_hull: {\n vertices: [\n {\n vertex: [-800, -1330, -1820],\n },\n {\n vertex: [-800, 1330, -1820],\n },\n {\n vertex: [-800, 1330, 1500],\n },\n {\n vertex: [-800, -1330, 1500],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"box\",\n },\n {\n convex_hull: {\n vertices: [\n {\n vertex: [1650, 1330, 1500],\n },\n {\n vertex: [-800, 1330, 1500],\n },\n {\n vertex: [-800, -1330, 1500],\n },\n {\n vertex: [1650, -1330, 1500],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"box\",\n },\n {\n convex_hull: {\n vertices: [\n {\n vertex: [1650, 1330, 1500],\n },\n {\n vertex: [-800, 1330, 1500],\n },\n {\n vertex: [-800, 1330, -1820],\n },\n {\n vertex: [1650, 1330, -1820],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"box\",\n },\n {\n convex_hull: {\n vertices: [\n {\n vertex: [1650, 1330, 1500],\n },\n {\n vertex: [1650, -1330, 1500],\n },\n {\n vertex: [1650, -1330, -1820],\n },\n {\n vertex: [1650, 1330, -1820],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"box\",\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"Cell workzone\",\n },\n motion_group_uid: 1,\n },\n {\n id: 2,\n priority: 0,\n geometry: {\n convex_hull: {\n vertices: [\n {\n vertex: [1650, 1330, -1850],\n },\n {\n vertex: [865, 1330, -1850],\n },\n {\n vertex: [865, -720, -1850],\n },\n {\n vertex: [1650, -720, -1850],\n },\n {\n vertex: [1650, 1330, -920],\n },\n {\n vertex: [865, 1330, -920],\n },\n {\n vertex: [865, -720, -920],\n },\n {\n vertex: [1650, -720, -920],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"Transport\",\n },\n motion_group_uid: 1,\n },\n {\n id: 3,\n priority: 0,\n geometry: {\n convex_hull: {\n vertices: [\n {\n vertex: [1650, 1330, -600],\n },\n {\n vertex: [865, 1330, -600],\n },\n {\n vertex: [865, 430, -600],\n },\n {\n vertex: [1650, 430, -600],\n },\n {\n vertex: [1650, 1330, -1250],\n },\n {\n vertex: [865, 1330, -1250],\n },\n {\n vertex: [865, 430, -1250],\n },\n {\n vertex: [1650, 430, -1250],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"Tunel\",\n },\n motion_group_uid: 1,\n },\n {\n id: 4,\n priority: 0,\n geometry: {\n convex_hull: {\n vertices: [\n {\n vertex: [1650, -760, -440],\n },\n {\n vertex: [900, -760, -440],\n },\n {\n vertex: [900, -1330, -440],\n },\n {\n vertex: [1650, -1330, -440],\n },\n {\n vertex: [1650, -760, -1800],\n },\n {\n vertex: [900, -760, -1800],\n },\n {\n vertex: [900, -1330, -1800],\n },\n {\n vertex: [1650, -1330, -1800],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"Fanuc controller\",\n },\n motion_group_uid: 1,\n },\n {\n id: 6,\n priority: 0,\n geometry: {\n convex_hull: {\n vertices: [\n {\n vertex: [-200, -200, -1900],\n },\n {\n vertex: [200, -200, -1900],\n },\n {\n vertex: [200, 200, -1900],\n },\n {\n vertex: [-200, 200, -1900],\n },\n {\n vertex: [-200, -200, -350],\n },\n {\n vertex: [200, -200, -350],\n },\n {\n vertex: [200, 200, -350],\n },\n {\n vertex: [-200, 200, -350],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"Robot base\",\n },\n motion_group_uid: 1,\n },\n ],\n robot_model_geometries: [\n {\n link_index: 1,\n geometry: {\n sphere: {\n radius: 270,\n },\n init_pose: {\n position: [-70, -70, -50],\n orientation: [0, 0, 0, 1],\n },\n id: \"link1_sphere\",\n },\n },\n {\n link_index: 2,\n geometry: {\n capsule: {\n radius: 160,\n cylinder_height: 800,\n },\n init_pose: {\n position: [-450, 40, 170],\n orientation: [\n 0, -0.7071067811865475, 0, 0.7071067811865476,\n ],\n },\n id: \"link2_capsule\",\n },\n },\n {\n link_index: 3,\n geometry: {\n sphere: {\n radius: 270,\n },\n init_pose: {\n position: [-110, 10, -100],\n orientation: [0, 0, 0, 1],\n },\n id: \"link3_sphere\",\n },\n },\n {\n link_index: 4,\n geometry: {\n capsule: {\n radius: 110,\n cylinder_height: 600,\n },\n init_pose: {\n position: [0, 300, 40],\n orientation: [\n -0.7071067811865475, 0, 0, 0.7071067811865476,\n ],\n },\n id: \"link4_capsule\",\n },\n },\n {\n link_index: 5,\n geometry: {\n sphere: {\n radius: 75,\n },\n init_pose: {\n position: [0, 0, -50],\n orientation: [0, 0, 0, 1],\n },\n id: \"link5_sphere\",\n },\n },\n ],\n tool_geometries: [],\n } // Mock safety setup\n },\n },\n {\n method: \"GET\",\n path: \"/cells/:cellId/coordinate-systems\",\n handle() {\n return {\n coordinatesystems: [\n {\n coordinate_system: \"\",\n name: \"world\",\n reference_uid: \"\",\n position: [0, 0, 0],\n rotation: {\n angles: [0, 0, 0],\n type: \"ROTATION_VECTOR\",\n },\n },\n ],\n } //satisfies CoordinateSystems\n },\n },\n {\n method: \"GET\",\n path: \"/cells/:cellId/motion-groups/:motionGroupId/tcps\",\n handle() {\n return {\n tcps: [\n {\n id: \"Flange\",\n readable_name: \"Default-Flange\",\n position: [0, 0, 0],\n rotation: {\n angles: [0, 0, 0, 0],\n type: \"ROTATION_VECTOR\",\n },\n },\n {\n id: \"complex-tcp-position\",\n readable_name: \"Complex TCP Position\",\n position: [-200, 300, 150],\n rotation: {\n angles: [\n -0.12139440409113832, -0.06356210998212003,\n -0.2023240068185639, 0,\n ],\n type: \"ROTATION_VECTOR\",\n },\n },\n ],\n }\n },\n },\n ]\n\n const method = config.method?.toUpperCase() || \"GET\"\n const path = \"/cells\" + config.url?.split(\"/cells\")[1]?.split(\"?\")[0]\n\n for (const handler of apiHandlers) {\n const match = pathToRegexp.match(handler.path)(path || \"\")\n if (method === handler.method && match) {\n const json = handler.handle()\n return {\n status: 200,\n statusText: \"Success\",\n data: JSON.stringify(json),\n headers: {},\n config,\n request: {\n responseURL: config.url,\n },\n }\n }\n }\n\n throw new AxiosError(\n `No mock handler matched this request: ${method} ${path}`,\n \"404\",\n config,\n )\n\n // return {\n // status: 404,\n // statusText: \"Not Found\",\n // data: \"\",\n // headers: {},\n // config,\n // request: {\n // responseURL: config.url,\n // },\n // }\n }\n\n handleWebsocketConnection(socket: AutoReconnectingWebsocket) {\n this.connections.push(socket)\n\n setTimeout(() => {\n socket.dispatchEvent(new Event(\"open\"))\n\n console.log(\"Websocket connection opened from\", socket.url)\n\n if (socket.url.includes(\"/state-stream\")) {\n socket.dispatchEvent(\n new MessageEvent(\"message\", {\n data: JSON.stringify(defaultMotionState),\n }),\n )\n }\n\n if (socket.url.includes(\"/move-joint\")) {\n socket.dispatchEvent(\n new MessageEvent(\"message\", {\n data: JSON.stringify({\n result: {\n motion_group: \"0@ur\",\n state: {\n controller: \"ur\",\n operation_mode: \"OPERATION_MODE_AUTO\",\n safety_state: \"SAFETY_STATE_NORMAL\",\n timestamp: \"2024-09-18T12:48:26.096266444Z\",\n velocity_override: 100,\n motion_groups: [\n {\n motion_group: \"0@ur\",\n controller: \"ur\",\n joint_position: {\n joints: [\n 1.3492152690887451, -1.5659207105636597,\n 1.6653711795806885, -1.0991662740707397,\n -1.829018235206604, 1.264623761177063,\n ],\n },\n joint_velocity: {\n joints: [0, 0, 0, 0, 0, 0],\n },\n flange_pose: {\n position: [\n 6.437331889439328, -628.4123774830913,\n 577.0569957147832,\n ],\n orientation: {\n x: -1.683333649797158,\n y: -1.9783363827298732,\n z: -0.4928031860165713,\n },\n coordinate_system: \"\",\n },\n tcp_pose: {\n position: [\n 6.437331889439328, -628.4123774830913,\n 577.0569957147832,\n ],\n orientation: {\n x: -1.683333649797158,\n y: -1.9783363827298732,\n z: -0.4928031860165713,\n },\n coordinate_system: \"\",\n tcp: \"Flange\",\n },\n velocity: {\n linear: {\n x: 0,\n y: 0,\n z: 0,\n },\n angular: {\n x: -0,\n y: 0,\n z: 0,\n },\n coordinate_system: \"\",\n },\n force: {\n force: {\n x: 0,\n y: 0,\n z: 0,\n },\n moment: {\n x: 0,\n y: 0,\n z: 0,\n },\n coordinate_system: \"\",\n },\n joint_limit_reached: {\n limit_reached: [\n false,\n false,\n false,\n false,\n false,\n false,\n ],\n },\n joint_current: {\n joints: [0, 0, 0, 0, 0, 0],\n },\n sequence_number: \"671259\",\n },\n ],\n sequence_number: \"671259\",\n },\n movement_state: \"MOVEMENT_STATE_MOVING\",\n },\n }),\n }),\n )\n }\n\n if (socket.url.includes(\"/move-tcp\")) {\n socket.dispatchEvent(\n new MessageEvent(\"message\", {\n data: JSON.stringify({\n result: {\n motion_group: \"0@ur\",\n state: {\n controller: \"ur\",\n operation_mode: \"OPERATION_MODE_AUTO\",\n safety_state: \"SAFETY_STATE_NORMAL\",\n timestamp: \"2024-09-18T12:43:12.188335774Z\",\n velocity_override: 100,\n motion_groups: [\n {\n motion_group: \"0@ur\",\n controller: \"ur\",\n joint_position: {\n joints: [\n 1.3352527618408203, -1.5659207105636597,\n 1.6653711795806885, -1.110615611076355,\n -1.829018235206604, 1.264623761177063,\n ],\n },\n joint_velocity: {\n joints: [0, 0, 0, 0, 0, 0],\n },\n flange_pose: {\n position: [\n -2.763015284002938, -630.2151479701106,\n 577.524509114342,\n ],\n orientation: {\n x: -1.704794877102097,\n y: -1.9722372952861567,\n z: -0.4852079204210754,\n },\n coordinate_system: \"\",\n },\n tcp_pose: {\n position: [\n -2.763015284002938, -630.2151479701106,\n 577.524509114342,\n ],\n orientation: {\n x: -1.704794877102097,\n y: -1.9722372952861567,\n z: -0.4852079204210754,\n },\n coordinate_system: \"\",\n tcp: \"Flange\",\n },\n velocity: {\n linear: {\n x: 0,\n y: 0,\n z: 0,\n },\n angular: {\n x: -0,\n y: 0,\n z: 0,\n },\n coordinate_system: \"\",\n },\n force: {\n force: {\n x: 0,\n y: 0,\n z: 0,\n },\n moment: {\n x: 0,\n y: 0,\n z: 0,\n },\n coordinate_system: \"\",\n },\n joint_limit_reached: {\n limit_reached: [\n false,\n false,\n false,\n false,\n false,\n false,\n ],\n },\n joint_current: {\n joints: [0, 0, 0, 0, 0, 0],\n },\n sequence_number: \"627897\",\n },\n ],\n sequence_number: \"627897\",\n },\n movement_state: \"MOVEMENT_STATE_MOVING\",\n },\n }),\n }),\n )\n }\n }, 10)\n }\n\n handleWebsocketMessage(socket: AutoReconnectingWebsocket, message: string) {\n console.log(`Received message on ${socket.url}`, message)\n }\n}\n\nconst defaultMotionState = {\n result: {\n motion_group: \"0@universalrobots-ur5e\",\n controller: \"universalrobots-ur5e\",\n timestamp: new Date().toISOString(),\n sequence_number: 1,\n joint_position: {\n joints: [\n 1.1699999570846558, -1.5700000524520874, 1.3600000143051147,\n 1.0299999713897705, 1.2899999618530273, 1.2799999713897705,\n ],\n },\n joint_limit_reached: {\n limit_reached: [false, false, false, false, false, false],\n },\n standstill: false,\n flange_pose: {\n position: [1.3300010259703043, -409.2680714682808, 531.0203477065281],\n orientation: [\n 1.7564919306270736, -1.7542521568325058, 0.7326972590614671,\n ],\n },\n tcp_pose: {\n position: [1.3300010259703043, -409.2680714682808, 531.0203477065281],\n orientation: [\n 1.7564919306270736, -1.7542521568325058, 0.7326972590614671,\n ],\n },\n } satisfies MotionGroupState,\n}\n"],"mappings":"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","names":["axios","match","axios","_a","config"]}
1
+ {"version":3,"sources":["../../../src/lib/v2/index.ts","../../../src/lib/v2/NovaCellAPIClient.ts","../../../src/lib/v2/ProgramsClient.ts","../../../src/lib/v2/NovaClient.ts","../../../src/lib/v2/mock/MockNovaInstance.ts"],"sourcesContent":["export * from \"@wandelbots/nova-api/v2\"\nexport * from \"./NovaCellAPIClient\"\nexport * from \"./NovaClient\"\nexport * from \"./ProgramsClient\"\n","import type { Configuration as BaseConfiguration } from \"@wandelbots/nova-api/v2\"\nimport {\n ApplicationApi,\n BUSInputsOutputsApi,\n CellApi,\n ControllerApi,\n ControllerInputsOutputsApi,\n JoggingApi,\n KinematicsApi,\n MotionGroupApi,\n MotionGroupModelsApi,\n ProgramApi,\n StoreCollisionComponentsApi,\n StoreCollisionSetupsApi,\n StoreObjectApi,\n SystemApi,\n TrajectoryCachingApi,\n TrajectoryExecutionApi,\n TrajectoryPlanningApi,\n VirtualControllerApi,\n VirtualControllerBehaviorApi,\n VirtualControllerInputsOutputsApi,\n} from \"@wandelbots/nova-api/v2\"\nimport type { BaseAPI } from \"@wandelbots/nova-api/v2/base\"\nimport type { AxiosInstance } from \"axios\"\nimport axios from \"axios\"\nimport { ProgramsClient } from \"./ProgramsClient.js\"\n\ntype OmitFirstArg<F> = F extends (x: any, ...args: infer P) => infer R\n ? (...args: P) => R\n : never\n\ntype UnwrapAxiosResponseReturn<T> = T extends (...a: any) => any\n ? (\n ...a: Parameters<T>\n ) => Promise<Awaited<ReturnType<T>> extends { data: infer D } ? D : never>\n : never\n\nexport type WithCellId<T> = {\n [P in keyof T]: UnwrapAxiosResponseReturn<OmitFirstArg<T[P]>>\n}\n\nexport type WithUnwrappedAxiosResponse<T> = {\n [P in keyof T]: UnwrapAxiosResponseReturn<T[P]>\n}\n\n/**\n * API client providing type-safe access to all the Nova API REST endpoints\n * associated with a specific cell id.\n */\nexport class NovaCellAPIClient {\n constructor(\n readonly cellId: string,\n readonly opts: BaseConfiguration & {\n axiosInstance?: AxiosInstance\n mock?: boolean\n },\n ) {}\n\n /**\n * Some TypeScript sorcery which alters the API class methods so you don't\n * have to pass the cell id to every single one, and de-encapsulates the\n * response data\n */\n private withCellId<T extends BaseAPI>(\n ApiConstructor: new (\n config: BaseConfiguration,\n basePath: string,\n axios: AxiosInstance,\n ) => T,\n ) {\n const apiClient = new ApiConstructor(\n {\n ...this.opts,\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n },\n this.opts.basePath ?? \"\",\n this.opts.axiosInstance ?? axios.create(),\n ) as {\n [key: string | symbol]: any\n }\n\n for (const key of Reflect.ownKeys(Reflect.getPrototypeOf(apiClient)!)) {\n if (key !== \"constructor\" && typeof apiClient[key] === \"function\") {\n const originalFunction = apiClient[key]\n apiClient[key] = (...args: any[]) => {\n return originalFunction\n .apply(apiClient, [this.cellId, ...args])\n .then((res: any) => res.data)\n }\n }\n }\n\n return apiClient as WithCellId<T>\n }\n\n /**\n * As withCellId, but only does the response unwrapping\n */\n private withUnwrappedResponsesOnly<T extends BaseAPI>(\n ApiConstructor: new (\n config: BaseConfiguration,\n basePath: string,\n axios: AxiosInstance,\n ) => T,\n ) {\n const apiClient = new ApiConstructor(\n {\n ...this.opts,\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n },\n this.opts.basePath ?? \"\",\n this.opts.axiosInstance ?? axios.create(),\n ) as {\n [key: string | symbol]: any\n }\n\n for (const key of Reflect.ownKeys(Reflect.getPrototypeOf(apiClient)!)) {\n if (key !== \"constructor\" && typeof apiClient[key] === \"function\") {\n const originalFunction = apiClient[key]\n apiClient[key] = (...args: any[]) => {\n return originalFunction\n .apply(apiClient, args)\n .then((res: any) => res.data)\n }\n }\n }\n\n return apiClient as WithUnwrappedAxiosResponse<T>\n }\n\n readonly system = this.withUnwrappedResponsesOnly(SystemApi)\n readonly cell = this.withUnwrappedResponsesOnly(CellApi)\n\n readonly motionGroup = this.withCellId(MotionGroupApi)\n readonly motionGroupModels = this.withCellId(MotionGroupModelsApi)\n\n readonly controller = this.withCellId(ControllerApi)\n\n readonly controllerIOs = this.withCellId(ControllerInputsOutputsApi)\n\n readonly trajectoryPlanning = this.withCellId(TrajectoryPlanningApi)\n readonly trajectoryExecution = this.withCellId(TrajectoryExecutionApi)\n readonly trajectoryCaching = this.withCellId(TrajectoryCachingApi)\n\n readonly programs = this.withCellId(ProgramApi)\n\n readonly application = this.withCellId(ApplicationApi)\n readonly applicationGlobal = this.withUnwrappedResponsesOnly(ApplicationApi)\n\n readonly jogging = this.withCellId(JoggingApi)\n\n readonly kinematics = this.withCellId(KinematicsApi)\n\n readonly busInputsOutputs = this.withCellId(BUSInputsOutputsApi)\n\n readonly virtualController = this.withCellId(VirtualControllerApi)\n readonly virtualControllerBehavior = this.withCellId(\n VirtualControllerBehaviorApi,\n )\n readonly virtualControllerIOs = this.withCellId(\n VirtualControllerInputsOutputsApi,\n )\n\n readonly storeObject = this.withCellId(StoreObjectApi)\n readonly storeCollisionComponents = this.withCellId(\n StoreCollisionComponentsApi,\n )\n readonly storeCollisionSetups = this.withCellId(StoreCollisionSetupsApi)\n\n // Enhanced programs client with convenient methods\n private _programsClient?: ProgramsClient\n get programsClient(): ProgramsClient {\n if (!this._programsClient) {\n this._programsClient = new ProgramsClient(this)\n }\n return this._programsClient\n }\n}\n","import type {\n Program,\n ProgramRun,\n ProgramRunState,\n ProgramStartRequest,\n ProgramApi,\n} from \"@wandelbots/nova-api/v2\"\nimport type { NovaCellAPIClient, WithCellId } from \"./NovaCellAPIClient.js\"\n\n/**\n * Enhanced client for the Programs API providing intuitive program management\n */\nexport class ProgramsClient {\n constructor(private client: NovaCellAPIClient) {}\n\n /**\n * Get the underlying programs API for direct access\n */\n get api(): WithCellId<ProgramApi> {\n return this.client.programs\n }\n\n /**\n * List all programs available in the cell\n */\n async list(): Promise<Program[]> {\n return await this.api.listPrograms()\n }\n\n /**\n * Get details of a specific program\n */\n async get(programId: string): Promise<Program> {\n return await this.api.getProgram(programId)\n }\n\n /**\n * Start a program with the given arguments\n */\n async start(\n programId: string,\n args: object = {},\n ): Promise<ProgramRun> {\n const startRequest: ProgramStartRequest = {\n arguments: args,\n }\n return await this.api.startProgram(programId, startRequest)\n }\n\n /**\n * Stop a running program\n */\n async stop(programId: string): Promise<void> {\n return await this.api.stopProgram(programId)\n }\n\n /**\n * Execute a program and wait for it to complete\n * \n * Note: This method has limitations due to current API constraints.\n * Real-time program state tracking will be available via NATS messaging\n * in future versions. For now, this provides basic start functionality.\n * \n * @param programId - The program identifier\n * @param args - Arguments to pass to the program\n * @param options - Basic execution options\n */\n async execute(\n programId: string,\n args: object = {},\n options: {\n onStart?: (run: ProgramRun) => void\n } = {},\n ): Promise<ProgramRun> {\n const { onStart } = options\n\n // Start the program\n const run = await this.start(programId, args)\n \n if (onStart) {\n onStart(run)\n }\n\n // Note: Cannot wait for completion due to API limitations\n // Real-time state tracking will be available via NATS messaging\n return run\n }\n\n /**\n * Create a program runner helper for a specific program\n */\n forProgram(programId: string): ProgramRunner {\n return new ProgramRunner(this, programId)\n }\n}\n\n/**\n * Helper class for managing a specific program\n */\nexport class ProgramRunner {\n constructor(\n private programs: ProgramsClient,\n private programId: string,\n ) {}\n\n /**\n * Get program details\n */\n async getDetails(): Promise<Program> {\n return await this.programs.get(this.programId)\n }\n\n /**\n * Start this program\n */\n async start(args: object = {}): Promise<ProgramRun> {\n return await this.programs.start(this.programId, args)\n }\n\n /**\n * Stop this program\n */\n async stop(): Promise<void> {\n return await this.programs.stop(this.programId)\n }\n\n /**\n * Execute this program (start and get initial run information)\n * \n * Note: This method has limitations due to current API constraints.\n * Real-time program state tracking will be available via NATS messaging\n * in future versions.\n */\n async execute(\n args: object = {},\n options: {\n onStart?: (run: ProgramRun) => void\n } = {},\n ): Promise<ProgramRun> {\n return await this.programs.execute(this.programId, args, options)\n }\n}\n\n// Re-export types for convenience\nexport type {\n Program,\n ProgramRun,\n ProgramRunState,\n ProgramStartRequest,\n}\n","import type { Configuration as BaseConfiguration } from \"@wandelbots/nova-api/v2\"\nimport type { AxiosRequestConfig } from \"axios\"\nimport axios, { isAxiosError } from \"axios\"\nimport urlJoin from \"url-join\"\nimport { loginWithAuth0 } from \"../../LoginWithAuth0\"\nimport { AutoReconnectingWebsocket } from \"../AutoReconnectingWebsocket\"\nimport { availableStorage } from \"../availableStorage\"\nimport { MockNovaInstance } from \"./mock/MockNovaInstance\"\nimport { NovaCellAPIClient } from \"./NovaCellAPIClient\"\n\nexport type NovaClientConfig = {\n /**\n * Url of the deployed Nova instance to connect to\n * e.g. https://saeattii.instance.wandelbots.io\n */\n instanceUrl: string | \"https://mock.example.com\"\n\n /**\n * Identifier of the cell on the Nova instance to connect this client to.\n * If omitted, the default identifier \"cell\" is used.\n **/\n cellId?: string\n\n /**\n * Username for basic auth to the Nova instance.\n * @deprecated use accessToken instead\n */\n username?: string\n\n /**\n * Password for basic auth to the Nova instance.\n * @deprecated use accessToken instead\n */\n password?: string\n\n /**\n * Access token for Bearer authentication.\n */\n accessToken?: string\n} & Omit<BaseConfiguration, \"isJsonMime\" | \"basePath\">\n\ntype NovaClientConfigWithDefaults = NovaClientConfig & { cellId: string }\n\n/**\n * EXPERIMENTAL\n *\n * This client provides a starting point to migrate NOVA api v2.\n * As v2 is still in development, this client has to be considered unstable\n *\n * Client for connecting to a Nova instance and controlling robots.\n */\nexport class NovaClient {\n readonly api: NovaCellAPIClient\n readonly config: NovaClientConfigWithDefaults\n readonly mock?: MockNovaInstance\n authPromise: Promise<string | null> | null = null\n accessToken: string | null = null\n\n constructor(config: NovaClientConfig) {\n console.warn(\"Using experimental NOVA v2 client\")\n const cellId = config.cellId ?? \"cell\"\n this.config = {\n cellId,\n ...config,\n }\n this.accessToken =\n config.accessToken ||\n availableStorage.getString(\"wbjs.access_token\") ||\n null\n\n if (this.config.instanceUrl === \"https://mock.example.com\") {\n this.mock = new MockNovaInstance()\n }\n\n // Set up Axios instance with interceptor for token fetching\n const axiosInstance = axios.create({\n baseURL: urlJoin(this.config.instanceUrl, \"/api/v2\"),\n // TODO - backend needs to set proper CORS headers for this\n headers:\n typeof window !== \"undefined\" &&\n window.location.origin.includes(\"localhost\")\n ? {}\n : {\n // Identify the client to the backend for logging purposes\n \"X-Wandelbots-Client\": \"Wandelbots-Nova-JS-SDK\",\n },\n })\n\n axiosInstance.interceptors.request.use(async (request) => {\n if (!request.headers.Authorization) {\n if (this.accessToken) {\n request.headers.Authorization = `Bearer ${this.accessToken}`\n } else if (this.config.username && this.config.password) {\n request.headers.Authorization = `Basic ${btoa(config.username + \":\" + config.password)}`\n }\n }\n return request\n })\n\n if (typeof window !== \"undefined\") {\n axiosInstance.interceptors.response.use(\n (r) => r,\n async (error) => {\n if (isAxiosError(error)) {\n if (error.response?.status === 401) {\n // If we hit a 401, attempt to login the user and retry with\n // a new access token\n try {\n await this.renewAuthentication()\n\n if (error.config) {\n if (this.accessToken) {\n error.config.headers.Authorization = `Bearer ${this.accessToken}`\n } else {\n delete error.config.headers.Authorization\n }\n return axiosInstance.request(error.config)\n }\n } catch (err) {\n return Promise.reject(err)\n }\n } else if (error.response?.status === 503) {\n // Check if the server as a whole is down\n const res = await fetch(window.location.href)\n if (res.status === 503) {\n // Go to 503 page\n window.location.reload()\n }\n }\n }\n\n return Promise.reject(error)\n },\n )\n }\n\n this.api = new NovaCellAPIClient(cellId, {\n ...config,\n basePath: urlJoin(this.config.instanceUrl, \"/api/v1\"),\n isJsonMime: (mime: string) => {\n return mime === \"application/json\"\n },\n baseOptions: {\n ...(this.mock\n ? ({\n adapter: (config) => {\n return this.mock!.handleAPIRequest(config)\n },\n } satisfies AxiosRequestConfig)\n : {}),\n ...config.baseOptions,\n },\n axiosInstance,\n })\n }\n\n async renewAuthentication(): Promise<void> {\n if (this.authPromise) {\n // Don't double up\n return\n }\n\n this.authPromise = loginWithAuth0(this.config.instanceUrl)\n try {\n this.accessToken = await this.authPromise\n if (this.accessToken) {\n // Cache access token so we don't need to log in every refresh\n availableStorage.setString(\"wbjs.access_token\", this.accessToken)\n } else {\n availableStorage.delete(\"wbjs.access_token\")\n }\n } finally {\n this.authPromise = null\n }\n }\n\n makeWebsocketURL(path: string): string {\n const url = new URL(\n urlJoin(\n this.config.instanceUrl,\n `/api/v1/cells/${this.config.cellId}`,\n path,\n ),\n )\n url.protocol = url.protocol.replace(\"http\", \"ws\")\n url.protocol = url.protocol.replace(\"https\", \"wss\")\n\n // If provided, add basic auth credentials to the URL\n // NOTE - basic auth is deprecated on websockets and doesn't work in Safari\n // use tokens instead\n if (this.accessToken) {\n url.searchParams.append(\"token\", this.accessToken)\n } else if (this.config.username && this.config.password) {\n url.username = this.config.username\n url.password = this.config.password\n }\n\n return url.toString()\n }\n\n /**\n * Retrieve an AutoReconnectingWebsocket to the given path on the Nova instance.\n * If you explicitly want to reconnect an existing websocket, call `reconnect`\n * on the returned object.\n */\n openReconnectingWebsocket(path: string) {\n return new AutoReconnectingWebsocket(this.makeWebsocketURL(path), {\n mock: this.mock,\n })\n }\n}\n","import type { MotionGroupState, RobotController } from \"@wandelbots/nova-api/v2\"\nimport type { AxiosResponse, InternalAxiosRequestConfig } from \"axios\"\nimport { AxiosError } from \"axios\"\nimport * as pathToRegexp from \"path-to-regexp\"\nimport type { AutoReconnectingWebsocket } from \"../../AutoReconnectingWebsocket\"\n\n/**\n * EXPERIMENTAL\n * Ultra-simplified mock Nova server for testing stuff\n */\nexport class MockNovaInstance {\n readonly connections: AutoReconnectingWebsocket[] = []\n\n async handleAPIRequest(\n config: InternalAxiosRequestConfig,\n ): Promise<AxiosResponse> {\n const apiHandlers = [\n {\n method: \"GET\",\n path: \"/cells/:cellId/controllers\",\n handle() {\n return {\n controllers: [\n {\n controller: \"mock-ur5e\",\n model_name: \"UniversalRobots::Controller\",\n host: \"mock-ur5e\",\n allow_software_install_on_controller: true,\n motion_groups: [\n {\n motion_group: \"0@mock-ur5e\",\n name_from_controller: \"UR5e\",\n active: false,\n model_from_controller: \"UniversalRobots_UR5e\",\n },\n ],\n has_error: false,\n error_details: \"\",\n },\n ],\n }\n },\n },\n {\n method: \"GET\",\n path: \"/cells/:cellId/controllers/:controllerId\",\n handle() {\n return {\n configuration: {\n kind: \"VirtualController\",\n manufacturer: \"universalrobots\",\n type: \"universalrobots-ur5e\",\n },\n name: \"mock-ur5\",\n } satisfies RobotController\n },\n },\n {\n method: \"GET\",\n path: \"/cells/:cellId/motion-groups/:motionGroupId/specification\",\n handle() {\n return {\n dh_parameters: [\n {\n alpha: 1.5707963267948966,\n theta: 0,\n a: 0,\n d: 162.25,\n reverse_rotation_direction: false,\n },\n {\n alpha: 0,\n theta: 0,\n a: -425,\n d: 0,\n reverse_rotation_direction: false,\n },\n {\n alpha: 0,\n theta: 0,\n a: -392.2,\n d: 0,\n reverse_rotation_direction: false,\n },\n {\n alpha: 1.5707963267948966,\n theta: 0,\n a: 0,\n d: 133.3,\n reverse_rotation_direction: false,\n },\n {\n alpha: -1.5707963267948966,\n theta: 0,\n a: 0,\n d: 99.7,\n reverse_rotation_direction: false,\n },\n {\n alpha: 0,\n theta: 0,\n a: 0,\n d: 99.6,\n reverse_rotation_direction: false,\n },\n ],\n mechanical_joint_limits: [\n {\n joint: \"JOINTNAME_AXIS_1\",\n lower_limit: -6.335545063018799,\n upper_limit: 6.335545063018799,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_2\",\n lower_limit: -6.335545063018799,\n upper_limit: 6.335545063018799,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_3\",\n lower_limit: -6.335545063018799,\n upper_limit: 6.335545063018799,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_4\",\n lower_limit: -6.335545063018799,\n upper_limit: 6.335545063018799,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_5\",\n lower_limit: -6.335545063018799,\n upper_limit: 6.335545063018799,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_6\",\n lower_limit: -6.335545063018799,\n upper_limit: 6.335545063018799,\n unlimited: false,\n },\n ],\n } // Mock motion group specification\n },\n },\n {\n method: \"GET\",\n path: \"/cells/:cellId/motion-groups/:motionGroupId/safety-setup\",\n handle() {\n return {\n safety_settings: [\n {\n safety_state: \"SAFETY_NORMAL\",\n settings: {\n joint_position_limits: [\n {\n joint: \"JOINTNAME_AXIS_1\",\n lower_limit: -2.96705961227417,\n upper_limit: 2.96705961227417,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_2\",\n lower_limit: -1.7453292608261108,\n upper_limit: 2.7925267219543457,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_3\",\n lower_limit: -3.3161256313323975,\n upper_limit: 0.40142571926116943,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_4\",\n lower_limit: -3.4906585216522217,\n upper_limit: 3.4906585216522217,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_5\",\n lower_limit: -2.4434609413146973,\n upper_limit: 2.4434609413146973,\n unlimited: false,\n },\n {\n joint: \"JOINTNAME_AXIS_6\",\n lower_limit: -4.71238899230957,\n upper_limit: 4.71238899230957,\n unlimited: false,\n },\n ],\n joint_velocity_limits: [\n {\n joint: \"JOINTNAME_AXIS_1\",\n limit: 3.1415927410125732,\n },\n {\n joint: \"JOINTNAME_AXIS_2\",\n limit: 3.1415927410125732,\n },\n {\n joint: \"JOINTNAME_AXIS_3\",\n limit: 3.4906585216522217,\n },\n {\n joint: \"JOINTNAME_AXIS_4\",\n limit: 6.108652591705322,\n },\n {\n joint: \"JOINTNAME_AXIS_5\",\n limit: 6.108652591705322,\n },\n {\n joint: \"JOINTNAME_AXIS_6\",\n limit: 6.981317043304443,\n },\n ],\n joint_acceleration_limits: [],\n joint_torque_limits: [],\n tcp_velocity_limit: 1800,\n },\n },\n ],\n safety_zones: [\n {\n id: 1,\n priority: 0,\n geometry: {\n compound: {\n child_geometries: [\n {\n convex_hull: {\n vertices: [\n { vertex: [-800, -1330, -1820] },\n { vertex: [1650, -1330, -1820] },\n { vertex: [1650, 1330, -1820] },\n { vertex: [-800, 1330, -1820] },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"box\",\n },\n {\n convex_hull: {\n vertices: [\n {\n vertex: [-800, -1330, -1820],\n },\n {\n vertex: [1650, -1330, -1820],\n },\n {\n vertex: [1650, -1330, 1500],\n },\n {\n vertex: [-800, -1330, 1500],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"box\",\n },\n {\n convex_hull: {\n vertices: [\n {\n vertex: [-800, -1330, -1820],\n },\n {\n vertex: [-800, 1330, -1820],\n },\n {\n vertex: [-800, 1330, 1500],\n },\n {\n vertex: [-800, -1330, 1500],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"box\",\n },\n {\n convex_hull: {\n vertices: [\n {\n vertex: [1650, 1330, 1500],\n },\n {\n vertex: [-800, 1330, 1500],\n },\n {\n vertex: [-800, -1330, 1500],\n },\n {\n vertex: [1650, -1330, 1500],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"box\",\n },\n {\n convex_hull: {\n vertices: [\n {\n vertex: [1650, 1330, 1500],\n },\n {\n vertex: [-800, 1330, 1500],\n },\n {\n vertex: [-800, 1330, -1820],\n },\n {\n vertex: [1650, 1330, -1820],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"box\",\n },\n {\n convex_hull: {\n vertices: [\n {\n vertex: [1650, 1330, 1500],\n },\n {\n vertex: [1650, -1330, 1500],\n },\n {\n vertex: [1650, -1330, -1820],\n },\n {\n vertex: [1650, 1330, -1820],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"box\",\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"Cell workzone\",\n },\n motion_group_uid: 1,\n },\n {\n id: 2,\n priority: 0,\n geometry: {\n convex_hull: {\n vertices: [\n {\n vertex: [1650, 1330, -1850],\n },\n {\n vertex: [865, 1330, -1850],\n },\n {\n vertex: [865, -720, -1850],\n },\n {\n vertex: [1650, -720, -1850],\n },\n {\n vertex: [1650, 1330, -920],\n },\n {\n vertex: [865, 1330, -920],\n },\n {\n vertex: [865, -720, -920],\n },\n {\n vertex: [1650, -720, -920],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"Transport\",\n },\n motion_group_uid: 1,\n },\n {\n id: 3,\n priority: 0,\n geometry: {\n convex_hull: {\n vertices: [\n {\n vertex: [1650, 1330, -600],\n },\n {\n vertex: [865, 1330, -600],\n },\n {\n vertex: [865, 430, -600],\n },\n {\n vertex: [1650, 430, -600],\n },\n {\n vertex: [1650, 1330, -1250],\n },\n {\n vertex: [865, 1330, -1250],\n },\n {\n vertex: [865, 430, -1250],\n },\n {\n vertex: [1650, 430, -1250],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"Tunel\",\n },\n motion_group_uid: 1,\n },\n {\n id: 4,\n priority: 0,\n geometry: {\n convex_hull: {\n vertices: [\n {\n vertex: [1650, -760, -440],\n },\n {\n vertex: [900, -760, -440],\n },\n {\n vertex: [900, -1330, -440],\n },\n {\n vertex: [1650, -1330, -440],\n },\n {\n vertex: [1650, -760, -1800],\n },\n {\n vertex: [900, -760, -1800],\n },\n {\n vertex: [900, -1330, -1800],\n },\n {\n vertex: [1650, -1330, -1800],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"Fanuc controller\",\n },\n motion_group_uid: 1,\n },\n {\n id: 6,\n priority: 0,\n geometry: {\n convex_hull: {\n vertices: [\n {\n vertex: [-200, -200, -1900],\n },\n {\n vertex: [200, -200, -1900],\n },\n {\n vertex: [200, 200, -1900],\n },\n {\n vertex: [-200, 200, -1900],\n },\n {\n vertex: [-200, -200, -350],\n },\n {\n vertex: [200, -200, -350],\n },\n {\n vertex: [200, 200, -350],\n },\n {\n vertex: [-200, 200, -350],\n },\n ],\n },\n init_pose: {\n position: [0, 0, 0],\n orientation: [0, 0, 0, 1],\n },\n id: \"Robot base\",\n },\n motion_group_uid: 1,\n },\n ],\n robot_model_geometries: [\n {\n link_index: 1,\n geometry: {\n sphere: {\n radius: 270,\n },\n init_pose: {\n position: [-70, -70, -50],\n orientation: [0, 0, 0, 1],\n },\n id: \"link1_sphere\",\n },\n },\n {\n link_index: 2,\n geometry: {\n capsule: {\n radius: 160,\n cylinder_height: 800,\n },\n init_pose: {\n position: [-450, 40, 170],\n orientation: [\n 0, -0.7071067811865475, 0, 0.7071067811865476,\n ],\n },\n id: \"link2_capsule\",\n },\n },\n {\n link_index: 3,\n geometry: {\n sphere: {\n radius: 270,\n },\n init_pose: {\n position: [-110, 10, -100],\n orientation: [0, 0, 0, 1],\n },\n id: \"link3_sphere\",\n },\n },\n {\n link_index: 4,\n geometry: {\n capsule: {\n radius: 110,\n cylinder_height: 600,\n },\n init_pose: {\n position: [0, 300, 40],\n orientation: [\n -0.7071067811865475, 0, 0, 0.7071067811865476,\n ],\n },\n id: \"link4_capsule\",\n },\n },\n {\n link_index: 5,\n geometry: {\n sphere: {\n radius: 75,\n },\n init_pose: {\n position: [0, 0, -50],\n orientation: [0, 0, 0, 1],\n },\n id: \"link5_sphere\",\n },\n },\n ],\n tool_geometries: [],\n } // Mock safety setup\n },\n },\n {\n method: \"GET\",\n path: \"/cells/:cellId/coordinate-systems\",\n handle() {\n return {\n coordinatesystems: [\n {\n coordinate_system: \"\",\n name: \"world\",\n reference_uid: \"\",\n position: [0, 0, 0],\n rotation: {\n angles: [0, 0, 0],\n type: \"ROTATION_VECTOR\",\n },\n },\n ],\n } //satisfies CoordinateSystems\n },\n },\n {\n method: \"GET\",\n path: \"/cells/:cellId/motion-groups/:motionGroupId/tcps\",\n handle() {\n return {\n tcps: [\n {\n id: \"Flange\",\n readable_name: \"Default-Flange\",\n position: [0, 0, 0],\n rotation: {\n angles: [0, 0, 0, 0],\n type: \"ROTATION_VECTOR\",\n },\n },\n {\n id: \"complex-tcp-position\",\n readable_name: \"Complex TCP Position\",\n position: [-200, 300, 150],\n rotation: {\n angles: [\n -0.12139440409113832, -0.06356210998212003,\n -0.2023240068185639, 0,\n ],\n type: \"ROTATION_VECTOR\",\n },\n },\n ],\n }\n },\n },\n ]\n\n const method = config.method?.toUpperCase() || \"GET\"\n const path = \"/cells\" + config.url?.split(\"/cells\")[1]?.split(\"?\")[0]\n\n for (const handler of apiHandlers) {\n const match = pathToRegexp.match(handler.path)(path || \"\")\n if (method === handler.method && match) {\n const json = handler.handle()\n return {\n status: 200,\n statusText: \"Success\",\n data: JSON.stringify(json),\n headers: {},\n config,\n request: {\n responseURL: config.url,\n },\n }\n }\n }\n\n throw new AxiosError(\n `No mock handler matched this request: ${method} ${path}`,\n \"404\",\n config,\n )\n\n // return {\n // status: 404,\n // statusText: \"Not Found\",\n // data: \"\",\n // headers: {},\n // config,\n // request: {\n // responseURL: config.url,\n // },\n // }\n }\n\n handleWebsocketConnection(socket: AutoReconnectingWebsocket) {\n this.connections.push(socket)\n\n setTimeout(() => {\n socket.dispatchEvent(new Event(\"open\"))\n\n console.log(\"Websocket connection opened from\", socket.url)\n\n if (socket.url.includes(\"/state-stream\")) {\n socket.dispatchEvent(\n new MessageEvent(\"message\", {\n data: JSON.stringify(defaultMotionState),\n }),\n )\n }\n\n if (socket.url.includes(\"/move-joint\")) {\n socket.dispatchEvent(\n new MessageEvent(\"message\", {\n data: JSON.stringify({\n result: {\n motion_group: \"0@ur\",\n state: {\n controller: \"ur\",\n operation_mode: \"OPERATION_MODE_AUTO\",\n safety_state: \"SAFETY_STATE_NORMAL\",\n timestamp: \"2024-09-18T12:48:26.096266444Z\",\n velocity_override: 100,\n motion_groups: [\n {\n motion_group: \"0@ur\",\n controller: \"ur\",\n joint_position: {\n joints: [\n 1.3492152690887451, -1.5659207105636597,\n 1.6653711795806885, -1.0991662740707397,\n -1.829018235206604, 1.264623761177063,\n ],\n },\n joint_velocity: {\n joints: [0, 0, 0, 0, 0, 0],\n },\n flange_pose: {\n position: [\n 6.437331889439328, -628.4123774830913,\n 577.0569957147832,\n ],\n orientation: {\n x: -1.683333649797158,\n y: -1.9783363827298732,\n z: -0.4928031860165713,\n },\n coordinate_system: \"\",\n },\n tcp_pose: {\n position: [\n 6.437331889439328, -628.4123774830913,\n 577.0569957147832,\n ],\n orientation: {\n x: -1.683333649797158,\n y: -1.9783363827298732,\n z: -0.4928031860165713,\n },\n coordinate_system: \"\",\n tcp: \"Flange\",\n },\n velocity: {\n linear: {\n x: 0,\n y: 0,\n z: 0,\n },\n angular: {\n x: -0,\n y: 0,\n z: 0,\n },\n coordinate_system: \"\",\n },\n force: {\n force: {\n x: 0,\n y: 0,\n z: 0,\n },\n moment: {\n x: 0,\n y: 0,\n z: 0,\n },\n coordinate_system: \"\",\n },\n joint_limit_reached: {\n limit_reached: [\n false,\n false,\n false,\n false,\n false,\n false,\n ],\n },\n joint_current: {\n joints: [0, 0, 0, 0, 0, 0],\n },\n sequence_number: \"671259\",\n },\n ],\n sequence_number: \"671259\",\n },\n movement_state: \"MOVEMENT_STATE_MOVING\",\n },\n }),\n }),\n )\n }\n\n if (socket.url.includes(\"/move-tcp\")) {\n socket.dispatchEvent(\n new MessageEvent(\"message\", {\n data: JSON.stringify({\n result: {\n motion_group: \"0@ur\",\n state: {\n controller: \"ur\",\n operation_mode: \"OPERATION_MODE_AUTO\",\n safety_state: \"SAFETY_STATE_NORMAL\",\n timestamp: \"2024-09-18T12:43:12.188335774Z\",\n velocity_override: 100,\n motion_groups: [\n {\n motion_group: \"0@ur\",\n controller: \"ur\",\n joint_position: {\n joints: [\n 1.3352527618408203, -1.5659207105636597,\n 1.6653711795806885, -1.110615611076355,\n -1.829018235206604, 1.264623761177063,\n ],\n },\n joint_velocity: {\n joints: [0, 0, 0, 0, 0, 0],\n },\n flange_pose: {\n position: [\n -2.763015284002938, -630.2151479701106,\n 577.524509114342,\n ],\n orientation: {\n x: -1.704794877102097,\n y: -1.9722372952861567,\n z: -0.4852079204210754,\n },\n coordinate_system: \"\",\n },\n tcp_pose: {\n position: [\n -2.763015284002938, -630.2151479701106,\n 577.524509114342,\n ],\n orientation: {\n x: -1.704794877102097,\n y: -1.9722372952861567,\n z: -0.4852079204210754,\n },\n coordinate_system: \"\",\n tcp: \"Flange\",\n },\n velocity: {\n linear: {\n x: 0,\n y: 0,\n z: 0,\n },\n angular: {\n x: -0,\n y: 0,\n z: 0,\n },\n coordinate_system: \"\",\n },\n force: {\n force: {\n x: 0,\n y: 0,\n z: 0,\n },\n moment: {\n x: 0,\n y: 0,\n z: 0,\n },\n coordinate_system: \"\",\n },\n joint_limit_reached: {\n limit_reached: [\n false,\n false,\n false,\n false,\n false,\n false,\n ],\n },\n joint_current: {\n joints: [0, 0, 0, 0, 0, 0],\n },\n sequence_number: \"627897\",\n },\n ],\n sequence_number: \"627897\",\n },\n movement_state: \"MOVEMENT_STATE_MOVING\",\n },\n }),\n }),\n )\n }\n }, 10)\n }\n\n handleWebsocketMessage(socket: AutoReconnectingWebsocket, message: string) {\n console.log(`Received message on ${socket.url}`, message)\n }\n}\n\nconst defaultMotionState = {\n result: {\n motion_group: \"0@universalrobots-ur5e\",\n controller: \"universalrobots-ur5e\",\n timestamp: new Date().toISOString(),\n sequence_number: 1,\n joint_position: [\n 1.1699999570846558, -1.5700000524520874, 1.3600000143051147,\n 1.0299999713897705, 1.2899999618530273, 1.2799999713897705,\n ],\n joint_limit_reached: {\n limit_reached: [false, false, false, false, false, false],\n },\n standstill: false,\n flange_pose: {\n position: [1.3300010259703043, -409.2680714682808, 531.0203477065281],\n orientation: [\n 1.7564919306270736, -1.7542521568325058, 0.7326972590614671,\n ],\n },\n tcp_pose: {\n position: [1.3300010259703043, -409.2680714682808, 531.0203477065281],\n orientation: [\n 1.7564919306270736, -1.7542521568325058, 0.7326972590614671,\n ],\n },\n } satisfies MotionGroupState,\n}\n"],"mappings":"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","names":["axios","match","axios","_a","config"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@wandelbots/nova-js",
3
3
  "type": "module",
4
- "version": "v2.1.4-pr.feature-remove-v2-functionallity.113.bfa317e",
4
+ "version": "v2.1.4-pr.feature-add-program-client.114.9d31b54",
5
5
  "description": "Official JS client for the Wandelbots API",
6
6
  "sideEffects": false,
7
7
  "exports": {
@@ -56,7 +56,7 @@
56
56
  "dependencies": {
57
57
  "@auth0/auth0-spa-js": "^2.1.3",
58
58
  "@types/three": "^0.174.0",
59
- "@wandelbots/nova-api": "^25.7.0",
59
+ "@wandelbots/nova-api": "^25.8.0-dev.66",
60
60
  "axios": "^1.8.1",
61
61
  "mobx": "^6.13.6",
62
62
  "path-to-regexp": "^8.2.0",
@@ -9,6 +9,7 @@ import {
9
9
  KinematicsApi,
10
10
  MotionGroupApi,
11
11
  MotionGroupModelsApi,
12
+ ProgramApi,
12
13
  StoreCollisionComponentsApi,
13
14
  StoreCollisionSetupsApi,
14
15
  StoreObjectApi,
@@ -23,6 +24,7 @@ import {
23
24
  import type { BaseAPI } from "@wandelbots/nova-api/v2/base"
24
25
  import type { AxiosInstance } from "axios"
25
26
  import axios from "axios"
27
+ import { ProgramsClient } from "./ProgramsClient.js"
26
28
 
27
29
  type OmitFirstArg<F> = F extends (x: any, ...args: infer P) => infer R
28
30
  ? (...args: P) => R
@@ -145,6 +147,8 @@ export class NovaCellAPIClient {
145
147
  readonly trajectoryExecution = this.withCellId(TrajectoryExecutionApi)
146
148
  readonly trajectoryCaching = this.withCellId(TrajectoryCachingApi)
147
149
 
150
+ readonly programs = this.withCellId(ProgramApi)
151
+
148
152
  readonly application = this.withCellId(ApplicationApi)
149
153
  readonly applicationGlobal = this.withUnwrappedResponsesOnly(ApplicationApi)
150
154
 
@@ -167,4 +171,13 @@ export class NovaCellAPIClient {
167
171
  StoreCollisionComponentsApi,
168
172
  )
169
173
  readonly storeCollisionSetups = this.withCellId(StoreCollisionSetupsApi)
174
+
175
+ // Enhanced programs client with convenient methods
176
+ private _programsClient?: ProgramsClient
177
+ get programsClient(): ProgramsClient {
178
+ if (!this._programsClient) {
179
+ this._programsClient = new ProgramsClient(this)
180
+ }
181
+ return this._programsClient
182
+ }
170
183
  }
@@ -0,0 +1,150 @@
1
+ import type {
2
+ Program,
3
+ ProgramRun,
4
+ ProgramRunState,
5
+ ProgramStartRequest,
6
+ ProgramApi,
7
+ } from "@wandelbots/nova-api/v2"
8
+ import type { NovaCellAPIClient, WithCellId } from "./NovaCellAPIClient.js"
9
+
10
+ /**
11
+ * Enhanced client for the Programs API providing intuitive program management
12
+ */
13
+ export class ProgramsClient {
14
+ constructor(private client: NovaCellAPIClient) {}
15
+
16
+ /**
17
+ * Get the underlying programs API for direct access
18
+ */
19
+ get api(): WithCellId<ProgramApi> {
20
+ return this.client.programs
21
+ }
22
+
23
+ /**
24
+ * List all programs available in the cell
25
+ */
26
+ async list(): Promise<Program[]> {
27
+ return await this.api.listPrograms()
28
+ }
29
+
30
+ /**
31
+ * Get details of a specific program
32
+ */
33
+ async get(programId: string): Promise<Program> {
34
+ return await this.api.getProgram(programId)
35
+ }
36
+
37
+ /**
38
+ * Start a program with the given arguments
39
+ */
40
+ async start(
41
+ programId: string,
42
+ args: object = {},
43
+ ): Promise<ProgramRun> {
44
+ const startRequest: ProgramStartRequest = {
45
+ arguments: args,
46
+ }
47
+ return await this.api.startProgram(programId, startRequest)
48
+ }
49
+
50
+ /**
51
+ * Stop a running program
52
+ */
53
+ async stop(programId: string): Promise<void> {
54
+ return await this.api.stopProgram(programId)
55
+ }
56
+
57
+ /**
58
+ * Execute a program and wait for it to complete
59
+ *
60
+ * Note: This method has limitations due to current API constraints.
61
+ * Real-time program state tracking will be available via NATS messaging
62
+ * in future versions. For now, this provides basic start functionality.
63
+ *
64
+ * @param programId - The program identifier
65
+ * @param args - Arguments to pass to the program
66
+ * @param options - Basic execution options
67
+ */
68
+ async execute(
69
+ programId: string,
70
+ args: object = {},
71
+ options: {
72
+ onStart?: (run: ProgramRun) => void
73
+ } = {},
74
+ ): Promise<ProgramRun> {
75
+ const { onStart } = options
76
+
77
+ // Start the program
78
+ const run = await this.start(programId, args)
79
+
80
+ if (onStart) {
81
+ onStart(run)
82
+ }
83
+
84
+ // Note: Cannot wait for completion due to API limitations
85
+ // Real-time state tracking will be available via NATS messaging
86
+ return run
87
+ }
88
+
89
+ /**
90
+ * Create a program runner helper for a specific program
91
+ */
92
+ forProgram(programId: string): ProgramRunner {
93
+ return new ProgramRunner(this, programId)
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Helper class for managing a specific program
99
+ */
100
+ export class ProgramRunner {
101
+ constructor(
102
+ private programs: ProgramsClient,
103
+ private programId: string,
104
+ ) {}
105
+
106
+ /**
107
+ * Get program details
108
+ */
109
+ async getDetails(): Promise<Program> {
110
+ return await this.programs.get(this.programId)
111
+ }
112
+
113
+ /**
114
+ * Start this program
115
+ */
116
+ async start(args: object = {}): Promise<ProgramRun> {
117
+ return await this.programs.start(this.programId, args)
118
+ }
119
+
120
+ /**
121
+ * Stop this program
122
+ */
123
+ async stop(): Promise<void> {
124
+ return await this.programs.stop(this.programId)
125
+ }
126
+
127
+ /**
128
+ * Execute this program (start and get initial run information)
129
+ *
130
+ * Note: This method has limitations due to current API constraints.
131
+ * Real-time program state tracking will be available via NATS messaging
132
+ * in future versions.
133
+ */
134
+ async execute(
135
+ args: object = {},
136
+ options: {
137
+ onStart?: (run: ProgramRun) => void
138
+ } = {},
139
+ ): Promise<ProgramRun> {
140
+ return await this.programs.execute(this.programId, args, options)
141
+ }
142
+ }
143
+
144
+ // Re-export types for convenience
145
+ export type {
146
+ Program,
147
+ ProgramRun,
148
+ ProgramRunState,
149
+ ProgramStartRequest,
150
+ }
@@ -1,3 +1,4 @@
1
1
  export * from "@wandelbots/nova-api/v2"
2
2
  export * from "./NovaCellAPIClient"
3
3
  export * from "./NovaClient"
4
+ export * from "./ProgramsClient"
@@ -933,12 +933,10 @@ const defaultMotionState = {
933
933
  controller: "universalrobots-ur5e",
934
934
  timestamp: new Date().toISOString(),
935
935
  sequence_number: 1,
936
- joint_position: {
937
- joints: [
938
- 1.1699999570846558, -1.5700000524520874, 1.3600000143051147,
939
- 1.0299999713897705, 1.2899999618530273, 1.2799999713897705,
940
- ],
941
- },
936
+ joint_position: [
937
+ 1.1699999570846558, -1.5700000524520874, 1.3600000143051147,
938
+ 1.0299999713897705, 1.2899999618530273, 1.2799999713897705,
939
+ ],
942
940
  joint_limit_reached: {
943
941
  limit_reached: [false, false, false, false, false, false],
944
942
  },