import {z} from 'zod' export type GetApiWorkersWorkerHandleArgs = {worker_handle: string, include_deleted?: boolean | undefined, from_time?: (string | null) | undefined, to_time?: (string | null) | undefined, date?: (string | null) | undefined, include_summary?: boolean | undefined, include_schedule?: boolean | undefined, include_timeline?: boolean | undefined}; export type GetApiWorkersWorkerHandleOptions = {baseUrl?: string | undefined, BasicAuth?: {username: string, password: string} | undefined, fetch?: typeof fetch | undefined}; export const deviceInfo = z.object({timezone: z.string(), os_name: z.string(), device_brand: z.string(), sdk_version: z.string(), device_model: z.string(), network_operator: z.string().nullable().optional(), os_version: z.string(), os_hardware_identifier: z.string(), app_name: z.string(), app_version_string: z.string().nullable().optional(), app_version_number: z.string().nullable().optional()}); export const driverStatus1 = z.object({tracking: z.boolean(), available: z.boolean()}); export const driverDateSchedule = z.object({start_time: z.string(), end_time: z.string(), date: z.string(), ops_group_handle: z.string().nullable().optional(), priority: z.number().int().nullable().optional()}); export const driverRecurringSchedule = z.object({start_time: z.string(), end_time: z.string(), day_of_week: z.enum(["SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"]), ops_group_handle: z.string().nullable().optional(), priority: z.number().int().nullable().optional()}); export const locationGeometryResponse = z.object({type: z.string(), coordinates: z.array(z.unknown())}); export const locationWithoutRadiusResponse = z.object({address: z.string().nullable().optional(), geometry: locationGeometryResponse}); export const movementLocationResponse = z.object({geometry: locationGeometryResponse, accuracy: z.number().nullable().optional(), bearing: z.number().nullable().optional(), speed: z.number().nullable().optional(), recorded_at: z.string().nullable().optional()}); export const deviceStatus1 = z.object({value: z.string(), data: z.record(z.string(), z.unknown())}); export const driverDevice1 = z.object({device_id: z.string(), start_time: z.string(), end_time: z.string().nullable().optional()}); export const orderSummary1 = z.object({total: z.number().int(), completed: z.number().int(), cancelled: z.number().int(), tracked: z.number().int(), assigned: z.number().int(), completed_tasks: z.number().int()}); export const driverOutageSummary1 = z.object({code: z.string(), label: z.string(), description: z.string(), category: z.enum(["behavioural", "adversarial", "reachability", "os", "sporadic"]), duration: z.number().int(), distance: z.number().int()}); export const driverSummaryStatus1 = z.object({intended_to_track: z.boolean(), tracked: z.boolean(), worked: z.boolean(), available: z.boolean()}); export const driverSummary1 = z.object({orders: orderSummary1, geotags: z.number().int().nullable().optional(), visits: z.number().int().nullable().optional(), intended_track_duration: z.number().int(), outage_duration: z.number().int(), outage_distance: z.number().int(), outage_summary: z.array(driverOutageSummary1), tracked_duration: z.number().int(), tracked_distance: z.number().int(), avg_distance_per_visit: z.number(), drive_duration: z.number().int(), walk_duration: z.number().int(), stop_duration: z.number().int(), order_duration: z.number().int(), visit_duration: z.number().int(), geotag_duration: z.number().int(), tracking_rate: z.number().nullable().optional(), stop_count: z.number().int().nullable().optional(), walk_count: z.number().int().nullable().optional(), drive_count: z.number().int().nullable().optional(), distance: z.number().int().nullable().optional(), available_duration: z.number().int().nullable().optional(), work_duration: z.number().int().nullable().optional(), disconnected_duration: z.number().int().nullable().optional(), status: driverSummaryStatus1}); export const locationPermission1 = z.object({state: z.enum(["always", "foreground_only", "never", "location_imprecise", "unknown"]), recorded_at: z.string().nullable().optional()}); export const locationGeometryModel2 = z.object({type: z.string(), coordinates: z.union([z.array(z.number()), z.array(z.array(z.array(z.number())))])}); export const locationGeometryModel = z.object({type: z.string(), coordinates: z.union([z.array(z.number()), z.array(z.array(z.array(z.number())))])}); export const activityDetail2 = z.object({steps: z.number().int().nullable().optional(), distance: z.number().int().nullable().optional(), duration: z.number().int().nullable().optional()}); export const timelinePolylineGeometry1 = z.object({type: z.string(), coordinates: z.array(z.array(z.number())).nullable().optional()}); export const timelinePolylineProperties1 = z.object({timestamps: z.array(z.string()).nullable().optional()}); export const timelinePolylineGeoJSON1 = z.object({type: z.string(), geometry: timelinePolylineGeometry1, properties: timelinePolylineProperties1}); export const polygonGeometry = z.object({type: z.literal("Polygon"), coordinates: z.array(z.array(z.array(z.number())))}); export const polygonHeatMap = z.object({geometry: polygonGeometry, time_spent: z.number()}); export const timelineActivityBatteryDetails1 = z.object({battery_used: z.number().nullable().optional(), is_battery_usage_high: z.boolean().nullable().optional()}); export const timelineDriverActivityEvent1 = z.object({type: z.literal("driver_activity_event"), recorded_at_start: z.string().nullable().optional(), recorded_at_end: z.string().nullable().optional(), location_start: z.union([locationGeometryModel2, z.unknown()]).optional(), location_end: z.union([locationGeometryModel, z.unknown()]).optional(), detail: z.union([activityDetail2, z.unknown()]).optional(), activity: z.string().nullable().optional(), marker_id: z.string().nullable().optional(), split_marker_id: z.string().nullable().optional(), is_partial: z.boolean(), is_ongoing: z.boolean(), polyline: z.union([timelinePolylineGeoJSON1, z.unknown()]).optional(), address: z.string().nullable().optional(), source_locations: z.string().nullable().optional(), hex_map: z.array(polygonHeatMap).nullable().optional(), driver_handle: z.string().nullable().optional(), worker_handle: z.string().nullable().optional(), device_id: z.string().nullable().optional(), battery_details: z.union([timelineActivityBatteryDetails1, z.unknown()]).optional()}); export const activityDetail = z.object({steps: z.number().int().nullable().optional(), distance: z.number().int().nullable().optional(), duration: z.number().int().nullable().optional()}); export const timelinePolylineGeometry = z.object({type: z.string(), coordinates: z.array(z.array(z.number())).nullable().optional()}); export const timelinePolylineProperties = z.object({timestamps: z.array(z.string()).nullable().optional()}); export const timelinePolylineGeoJSON = z.object({type: z.string(), geometry: timelinePolylineGeometry, properties: timelinePolylineProperties}); export const timelineDriverOutageEvent1 = z.object({type: z.literal("driver_outage_event"), recorded_at_start: z.string().nullable().optional(), recorded_at_end: z.string().nullable().optional(), location_start: z.union([locationGeometryModel, z.unknown()]).optional(), location_end: z.union([locationGeometryModel, z.unknown()]).optional(), marker_id: z.string().nullable().optional(), split_marker_id: z.string().nullable().optional(), outage_code: z.string(), outage_label: z.string(), outage_is_user_generated: z.boolean(), outage_description: z.string(), outage_category: z.enum(["behavioural", "adversarial", "reachability", "os", "sporadic"]), detail: z.union([activityDetail, z.unknown()]).optional(), is_partial: z.boolean(), is_ongoing: z.boolean(), polyline: z.union([timelinePolylineGeoJSON, z.unknown()]).optional(), driver_handle: z.string().nullable().optional(), worker_handle: z.string().nullable().optional(), device_id: z.string().nullable().optional()}); export const statusDetail2 = z.object({actor: z.unknown()}); export const driverStatusUpdatedEvent2 = z.object({type: z.literal("driver_status_updated"), recorded_at: z.string().nullable().optional(), location: z.union([locationGeometryModel, z.unknown()]).optional(), detail: z.union([statusDetail2, z.unknown()]).optional(), tracking: z.boolean().nullable().optional(), available: z.boolean().nullable().optional(), marker_id: z.string().nullable().optional(), driver_handle: z.string().nullable().optional(), worker_handle: z.string().nullable().optional(), device_id: z.string().nullable().optional()}); export const timelineImageAttachment1 = z.object({type: z.literal("image"), url: z.string(), caption: z.string().nullable().optional()}); export const timelineNoteAttachment1 = z.object({type: z.literal("note"), data: z.string()}); export const timelineSignatureAttachment1 = z.object({type: z.literal("signature"), url: z.string()}); export const timelineGeotagEvent1 = z.object({type: z.literal("geotag_event"), recorded_at: z.string().nullable().optional(), location: z.union([locationGeometryModel, z.unknown()]).optional(), geotag_id: z.string().nullable().optional(), address: z.string().nullable().optional(), order_handle: z.string().nullable().optional(), metadata: z.record(z.string(), z.unknown()).nullable().optional(), geotag_type: z.string().nullable().optional(), deviation: z.number().int().nullable().optional(), expected_location: z.union([locationGeometryModel, z.unknown()]).optional(), driver_handle: z.string().nullable().optional(), worker_handle: z.string().nullable().optional(), place_handle: z.string().nullable().optional(), device_id: z.string().nullable().optional(), accuracy: z.number().int().nullable().optional(), attachments: z.array(z.union([timelineImageAttachment1, timelineNoteAttachment1, timelineSignatureAttachment1])).nullable().optional()}); export const orderAssignedEvent2 = z.object({type: z.literal("driver_order_assigned"), recorded_at: z.string().nullable().optional(), location: z.union([locationGeometryModel, z.unknown()]).optional(), order_handle: z.string().nullable().optional(), route_handle: z.string().nullable().optional(), order_type: z.string().nullable().optional(), destination_address: z.string().nullable().optional(), destination_location: z.union([locationGeometryModel, z.unknown()]).optional(), fulfillment_attempt: z.number().int().nullable().optional(), driver_handle: z.string().nullable().optional(), worker_handle: z.string().nullable().optional(), device_id: z.string().nullable().optional()}); export const orderStartedEvent2 = z.object({type: z.literal("driver_order_started"), recorded_at: z.string().nullable().optional(), location: z.union([locationGeometryModel, z.unknown()]).optional(), order_handle: z.string().nullable().optional(), route_handle: z.string().nullable().optional(), order_type: z.string().nullable().optional(), destination_address: z.string().nullable().optional(), destination_location: z.union([locationGeometryModel, z.unknown()]).optional(), fulfillment_attempt: z.number().int().nullable().optional(), driver_handle: z.string().nullable().optional(), worker_handle: z.string().nullable().optional(), device_id: z.string().nullable().optional()}); export const orderCompletedEvent2 = z.object({type: z.literal("driver_order_completed"), recorded_at: z.string().nullable().optional(), location: z.union([locationGeometryModel, z.unknown()]).optional(), order_handle: z.string().nullable().optional(), route_handle: z.string().nullable().optional(), order_type: z.string().nullable().optional(), destination_address: z.string().nullable().optional(), destination_location: z.union([locationGeometryModel, z.unknown()]).optional(), fulfillment_attempt: z.number().int().nullable().optional(), driver_handle: z.string().nullable().optional(), worker_handle: z.string().nullable().optional(), device_id: z.string().nullable().optional(), deviation_from_destination: z.number().int().nullable().optional(), completed_at_destination: z.boolean().nullable().optional()}); export const orderCancelledEvent2 = z.object({type: z.literal("driver_order_cancelled"), recorded_at: z.string().nullable().optional(), location: z.union([locationGeometryModel, z.unknown()]).optional(), order_handle: z.string().nullable().optional(), route_handle: z.string().nullable().optional(), order_type: z.string().nullable().optional(), destination_address: z.string().nullable().optional(), destination_location: z.union([locationGeometryModel, z.unknown()]).optional(), fulfillment_attempt: z.number().int().nullable().optional(), driver_handle: z.string().nullable().optional(), worker_handle: z.string().nullable().optional(), device_id: z.string().nullable().optional(), cancellation_source: z.record(z.string(), z.unknown()).nullable().optional()}); export const orderRescheduledEvent = z.object({type: z.literal("driver_order_rescheduled"), recorded_at: z.string().nullable().optional(), location: z.union([locationGeometryModel, z.unknown()]).optional(), order_handle: z.string().nullable().optional(), route_handle: z.string().nullable().optional(), order_type: z.string().nullable().optional(), destination_address: z.string().nullable().optional(), destination_location: z.union([locationGeometryModel, z.unknown()]).optional(), fulfillment_attempt: z.number().int().nullable().optional(), driver_handle: z.string().nullable().optional(), worker_handle: z.string().nullable().optional(), device_id: z.string().nullable().optional()}); export const pointGeometry = z.object({coordinates: z.array(z.number()), type: z.literal("Point").optional()}); export const geofenceGeometry1 = z.object({type: z.string(), geometry: z.union([pointGeometry, timelinePolylineGeometry]), properties: z.record(z.string(), z.unknown()).nullable().optional()}); export const driverVisitEvent1 = z.object({type: z.literal("driver_visit_event"), recorded_at_start: z.string().nullable().optional(), recorded_at_end: z.string().nullable().optional(), location_start: z.union([locationGeometryModel, z.unknown()]).optional(), location_end: z.union([locationGeometryModel, z.unknown()]).optional(), marker_id: z.string().nullable().optional(), geofence_id: z.string(), geofence_label: z.string().nullable().optional(), geofence_geometry: z.union([geofenceGeometry1, z.unknown()]).optional(), geofence_metadata: z.record(z.string(), z.unknown()).nullable().optional(), address: z.string().nullable().optional(), duration: z.number().int().nullable().optional(), driver_handle: z.string().nullable().optional(), worker_handle: z.string().nullable().optional(), device_id: z.string().nullable().optional(), order_handle: z.string().nullable().optional(), enroute_distance: z.number().int().nullable().optional(), enroute_duration: z.number().int().nullable().optional()}); export const deviceInfo2 = z.object({timezone: z.string(), os_name: z.string(), device_brand: z.string(), sdk_version: z.string(), device_model: z.string(), network_operator: z.string().nullable().optional(), os_version: z.string(), os_hardware_identifier: z.string(), app_name: z.string(), app_version_string: z.string().nullable().optional(), app_version_number: z.string().nullable().optional()}); export const driverDeviceLinkedEvent2 = z.object({type: z.literal("driver_device_linked_event"), recorded_at: z.string(), location: z.union([locationGeometryModel, z.unknown()]).optional(), location_recorded_at: z.string().nullable().optional(), driver_handle: z.string().nullable().optional(), worker_handle: z.string().nullable().optional(), device_id: z.string(), device_info: z.union([deviceInfo2, z.unknown()]).optional(), former_associated_workers: z.array(z.unknown()).nullable().optional()}); export const driverDeviceUnlinkedEvent2 = z.object({type: z.literal("driver_device_unlinked_event"), recorded_at: z.string(), location: z.union([locationGeometryModel, z.unknown()]).optional(), location_recorded_at: z.string().nullable().optional(), driver_handle: z.string().nullable().optional(), worker_handle: z.string().nullable().optional(), device_id: z.string(), device_info: z.union([deviceInfo, z.unknown()]).optional(), unlink_duration: z.number().int().nullable().optional(), unlinked_due_to_logout: z.boolean().nullable().optional()}); export const deviceDisconnectedEvent2 = z.object({type: z.literal("device_disconnected_event"), recorded_at_start: z.string().nullable().optional(), recorded_at_end: z.string().nullable().optional(), location_start: z.union([locationGeometryModel, z.unknown()]).optional(), location_end: z.union([locationGeometryModel, z.unknown()]).optional(), driver_handle: z.string().nullable().optional(), worker_handle: z.string().nullable().optional(), device_id: z.string(), marker_id: z.string().nullable().optional(), split_marker_id: z.string().nullable().optional(), disconnected_code: z.string(), disconnected_label: z.string(), disconnected_description: z.string(), detail: z.union([activityDetail, z.unknown()]).optional(), is_partial: z.boolean(), is_ongoing: z.boolean()}); export const batteryStatus1 = z.object({battery_percent: z.number().int(), recorded_at: z.string()}); export const getWorkerTimelineResponse = z.object({worker_handle: z.string(), name: z.string().nullable().optional(), current_date: z.string(), ops_group_handle: z.string(), product_types: z.array(z.string()).nullable().optional(), device_id: z.string().nullable().optional(), device_info: z.union([deviceInfo, z.unknown()]).optional(), profile: z.record(z.string(), z.unknown()).nullable().optional(), work_status: driverStatus1, schedule: z.array(z.union([driverDateSchedule, driverRecurringSchedule])).nullable().optional(), deleted: z.boolean().nullable().optional(), created_at: z.string(), home: z.union([locationWithoutRadiusResponse, z.unknown()]).optional(), deleted_at: z.string().nullable().optional(), location: z.union([movementLocationResponse, z.unknown()]).optional(), device_status: z.union([deviceStatus1, z.unknown()]).optional(), unavailable_on: z.array(z.string()).nullable().optional(), devices: z.array(driverDevice1).nullable().optional(), summary: z.union([driverSummary1, z.unknown()]).optional(), location_permission: z.union([locationPermission1, z.unknown()]).optional(), timeline: z.array(z.union([timelineDriverActivityEvent1, timelineDriverOutageEvent1, driverStatusUpdatedEvent2, timelineGeotagEvent1, orderAssignedEvent2, orderStartedEvent2, orderCompletedEvent2, orderCancelledEvent2, orderRescheduledEvent, driverVisitEvent1, driverDeviceLinkedEvent2, driverDeviceUnlinkedEvent2, deviceDisconnectedEvent2])).nullable().optional(), battery: z.union([batteryStatus1, z.unknown()]).optional(), timezone: z.string().nullable().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get Worker By Handle * * GET /workers/{worker_handle} * * Also accepts auth: TokenAuth */ export const getApiWorkersWorkerHandle = async (args: GetApiWorkersWorkerHandleArgs, options?: GetApiWorkersWorkerHandleOptions) => { const {baseUrl = "https://v3.api.hypertrack.com", fetch: fetchFn = fetch, BasicAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.include_deleted != null) query.append("include_deleted", String(args.include_deleted)) if (args.from_time != null) query.append("from_time", String(args.from_time)) if (args.to_time != null) query.append("to_time", String(args.to_time)) if (args.date != null) query.append("date", String(args.date)) if (args.include_summary != null) query.append("include_summary", String(args.include_summary)) if (args.include_schedule != null) query.append("include_schedule", String(args.include_schedule)) if (args.include_timeline != null) query.append("include_timeline", String(args.include_timeline)) if (BasicAuth !== undefined) headers.set('authorization', `Basic ${btoa(`${BasicAuth.username}:${BasicAuth.password}`)}`) const url = `${baseUrl.replace(/\/+$/, '')}/workers/${encodeURIComponent(String(args.worker_handle))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getWorkerTimelineResponse, await res.json()) };