{"ast":null,"code":"function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport ReconnectingWebSocket from \"reconnecting-websocket\";\nimport WS from \"ws\";\nimport { Runway } from \"./runway-state\";\nconst clientStores = {\n  Runway\n};\nconsole.log(\"Loaded Client\");\n\nfunction createClient() {\n  const wsClient = new ReconnectingWebSocket(\"ws://localhost:8282\", [], {\n    WebSocket: global.WebSocket || WS,\n    // debug: true,\n    maxReconnectionDelay: 10000,\n    minReconnectionDelay: 1000,\n    minUptime: 5000,\n    reconnectionDelayGrowFactor: 1.3,\n    connectionTimeout: 4000,\n    maxRetries: Infinity\n  });\n\n  wsClient.onopen = () => {\n    console.log(\"Connected to WS server\");\n  };\n\n  wsClient.onmessage = msg => {\n    const payload = JSON.parse(msg.data);\n    console.log(payload);\n    if (payload.t === \"state\") return handleStateUpdate(payload);\n  };\n\n  function send(data) {\n    wsClient.send(JSON.stringify(data));\n  }\n\n  const clientHandlers = {};\n\n  function handleStateUpdate({\n    store,\n    subKey,\n    state\n  }) {\n    const clientSubKey = `${store}:${subKey}`;\n    const handlers = clientHandlers[clientSubKey];\n\n    if (!handlers) {\n      console.warn(\"No state handlers found for subscription \" + subKey);\n    }\n\n    handlers.forEach(handleState => handleState(state));\n  }\n\n  return {\n    subscribe: (storeId, subsDef, handler) => {\n      const store = clientStores[storeId];\n      if (!store) throw new Error(`Store \"${storeId}\" not found.`);\n      const clientSubKey = `${storeId}:${store.defineSubscriptionKey(subsDef)}`;\n      const handlers = clientHandlers[clientSubKey] || (clientHandlers[clientSubKey] = new Set());\n      handlers.add(handler);\n      send({\n        t: \"sub\",\n        store: storeId,\n        sub: subsDef\n      });\n      return () => {\n        handlers.delete(handler);\n        send({\n          t: \"unsub\",\n          store: storeId,\n          sub: subsDef\n        });\n      };\n    }\n  };\n}\n\nconst client = createClient();\nexport function useServerState(storeId, subsDef) {\n  const {\n    0: state,\n    1: setState\n  } = useState(null);\n  useEffect(() => {\n    return client.subscribe(storeId, subsDef, setState);\n  }, [storeId, subsDef]);\n  return state;\n}\nexport function useRunwayState() {\n  const def = useMemo(() => ({}), []);\n  return useServerState(\"Runway\", def);\n}\nexport function useRunwayActions() {\n  return Object.fromEntries(Object.entries(Runway.actions).map(([actionId, actionCreator]) => {\n    function actionDispatcher(input) {\n      const action = actionCreator(input);\n      client.dispatch(_objectSpread(_objectSpread({}, action), {}, {\n        store: \"Runway\"\n      }));\n    }\n\n    return [actionId, actionDispatcher];\n  }));\n}","map":{"version":3,"sources":["/Users/ericvicenti/runway/lib/client.ts"],"names":["useEffect","useMemo","useState","ReconnectingWebSocket","WS","Runway","clientStores","console","log","createClient","wsClient","WebSocket","global","maxReconnectionDelay","minReconnectionDelay","minUptime","reconnectionDelayGrowFactor","connectionTimeout","maxRetries","Infinity","onopen","onmessage","msg","payload","JSON","parse","data","t","handleStateUpdate","send","stringify","clientHandlers","store","subKey","state","clientSubKey","handlers","warn","forEach","handleState","subscribe","storeId","subsDef","handler","Error","defineSubscriptionKey","Set","add","sub","delete","client","useServerState","setState","useRunwayState","def","useRunwayActions","Object","fromEntries","entries","actions","map","actionId","actionCreator","actionDispatcher","input","action","dispatch"],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport ReconnectingWebSocket from \"reconnecting-websocket\";\nimport WS from \"ws\";\nimport { Runway, RunwayState } from \"./runway-state\";\n\nconst clientStores = {\n  Runway,\n};\n\nconsole.log(\"Loaded Client\");\n\nfunction createClient() {\n  const wsClient = new ReconnectingWebSocket(\"ws://localhost:8282\", [], {\n    WebSocket: global.WebSocket || WS,\n    // debug: true,\n    maxReconnectionDelay: 10000,\n    minReconnectionDelay: 1000,\n    minUptime: 5000,\n    reconnectionDelayGrowFactor: 1.3,\n    connectionTimeout: 4000,\n    maxRetries: Infinity,\n  });\n  wsClient.onopen = () => {\n    console.log(\"Connected to WS server\");\n  };\n  wsClient.onmessage = (msg: { data: string }) => {\n    const payload = JSON.parse(msg.data);\n    console.log(payload);\n    if (payload.t === \"state\") return handleStateUpdate(payload);\n  };\n  function send(data: any) {\n    wsClient.send(JSON.stringify(data));\n  }\n  const clientHandlers = {};\n  function handleStateUpdate({ store, subKey, state }) {\n    const clientSubKey = `${store}:${subKey}`;\n    const handlers = clientHandlers[clientSubKey];\n    if (!handlers) {\n      console.warn(\"No state handlers found for subscription \" + subKey);\n    }\n    handlers.forEach((handleState) => handleState(state));\n  }\n\n  return {\n    subscribe: <ExpectedState>(\n      storeId: string,\n      subsDef: any,\n      handler: (s: ExpectedState) => void\n    ): (() => void) => {\n      const store = clientStores[storeId];\n      if (!store) throw new Error(`Store \"${storeId}\" not found.`);\n      const clientSubKey = `${storeId}:${store.defineSubscriptionKey(subsDef)}`;\n      const handlers =\n        clientHandlers[clientSubKey] ||\n        (clientHandlers[clientSubKey] = new Set());\n      handlers.add(handler);\n      send({\n        t: \"sub\",\n        store: storeId,\n        sub: subsDef,\n      });\n      return () => {\n        handlers.delete(handler);\n        send({\n          t: \"unsub\",\n          store: storeId,\n          sub: subsDef,\n        });\n      };\n    },\n  };\n}\n\nconst client = createClient();\n\ntype SubscriptionDefinition = {};\n\nexport function useServerState<State>(\n  storeId: string,\n  subsDef: SubscriptionDefinition\n): null | State {\n  const [state, setState] = useState<null | State>(null);\n  useEffect(() => {\n    return client.subscribe(storeId, subsDef, setState);\n  }, [storeId, subsDef]);\n  return state;\n}\n\nexport function useRunwayState() {\n  const def = useMemo(() => ({}), []);\n  return useServerState<RunwayState>(\"Runway\", def);\n}\n\nexport function useRunwayActions() {\n  return Object.fromEntries(\n    Object.entries(Runway.actions).map(([actionId, actionCreator]) => {\n      function actionDispatcher(input: Parameters<typeof actionCreator>[0]) {\n        const action = actionCreator(input);\n        client.dispatch({\n          ...action,\n          store: \"Runway\",\n        });\n      }\n      return [actionId, actionDispatcher];\n    })\n  );\n}\n"]},"metadata":{},"sourceType":"module"}