on 8d566ea help sign in
bridge/src/lib/useHostedShip.js
166 lines 3.8 kB history raw
1import { useCallback, useState } from 'react';
3const STATE = {
4 // container states
5 UNKNOWN: 'UNKNOWN',
6 MISSING: 'MISSING',
7 RUNNING: 'RUNNING',
8 PENDING: 'PENDING',
9 // api states
10 QUERYING: 'QUERYING',
11 BOOTING: 'BOOTING',
12 CONNECTING: 'CONNECTING',
13 // connection states
14 CONNECTED: 'CONNECTED',
15};
17export function useHostedShip(client, patp) {
18 const [state, _setState] = useState(STATE.UNKNOWN);
19 const setState = useCallback(
20 s => {
21 console.log(s);
22 _setState(s);
23 },
24 [_setState]
25 );
27 const [sysEvents, setSysEvents] = useState([]);
28 const [newEvents, setNewEvents] = useState([]);
29 const [runEvents, setRunEvents] = useState([]);
31 const [error, _setError] = useState();
32 const setError = useCallback(
33 error => {
34 _setError(error);
35 if (error) {
36 setState(STATE.UNKNOWN);
37 console.error(error);
38 }
39 },
40 [_setError, setState]
41 );
43 const unknown = state === STATE.UNKNOWN;
44 const missing = state === STATE.MISSING;
45 const running = state === STATE.RUNNING;
46 const pending = state === STATE.PENDING;
47 const querying = state === STATE.QUERYING;
48 const booting = state === STATE.BOOTING;
49 const connecting = state === STATE.CONNECTING;
50 const connected = state === STATE.CONNECTED;
52 const resetEvents = useCallback(() => {
53 setSysEvents([]);
54 setNewEvents([]);
55 setRunEvents([]);
56 }, []);
58 const getStatus = useCallback(async () => {
59 try {
60 setError(undefined);
62 resetEvents();
64 setState(STATE.QUERYING);
66 const response = await client.getShipsByPatp(patp);
68 if (response.status === 404) {
69 setState(STATE.MISSING);
70 } else if (!response.ok) {
71 setError(response.statusText);
72 } else {
73 const ship = await response.json();
75 if (ship.status === 'Pending') {
76 setState(STATE.PENDING);
77 } else if (ship.status === 'Running') {
78 setState(STATE.RUNNING);
79 } else {
80 setError(ship);
81 }
82 }
83 } catch (error) {
84 setError(error);
85 }
86 }, [client, patp, resetEvents, setError, setState]);
88 const getEvents = useCallback(() => {
89 try {
90 setError(undefined);
92 resetEvents();
94 setState(STATE.CONNECTING);
96 const url = client.getShipsByPatpUrl(patp) + '/events';
97 const source = new EventSource(url);
99 source.onopen = () => setState(STATE.CONNECTED);
100 // source.onerror = () => setState(STATE.UNKNOWN);
101 // source.onmessage = console.log;
103 source.addEventListener('sys', event => {
104 setSysEvents(previous => [...previous, JSON.parse(event.data)]);
105 });
107 source.addEventListener('new', event => {
108 if (event.data !== '') {
109 setNewEvents(previous => [...previous, event.data]);
110 }
111 });
113 source.addEventListener('run', event => {
114 if (event.data !== '') {
115 setRunEvents(previous => [...previous, event.data]);
116 }
117 });
118 } catch (error) {
119 setError(error);
120 }
121 }, [setError, resetEvents, client, patp, setState]);
123 const create = useCallback(async () => {
124 try {
125 setError(undefined);
127 setState(STATE.BOOTING);
129 const response = await client.postShips({
130 patp,
131 key: '123',
132 });
134 if (!response.ok) {
135 setError(response.statusText);
136 } else {
137 getEvents();
138 }
139 } catch (error) {
140 setError(error);
141 }
142 }, [setError, setState, client, patp, getEvents]);
144 return {
145 error,
146 unknown,
147 missing,
148 running,
149 pending,
150 querying,
151 booting,
152 connecting,
153 connected,
155 sysEvents,
156 newEvents,
157 runEvents,
159 getStatus,
160 getEvents,
161 create,
163 // debugging
164 state,
165 };