{"version":3,"file":"index.js","names":[],"sources":["esm/platform/motion/index.js"],"sourcesContent":["import { validateListener } from \"./validate\";\nconst emptyAvailability = {\n  accelerometer: false,\n  gyroscope: false,\n  magnetometer: false,\n  deviceMotion: false\n};\nconst availability = { ...emptyAvailability };\nconst listeners = /* @__PURE__ */ new Set();\nlet observing = false;\nlet attitude;\nfunction vector(x, y, z, scale = 1) {\n  return [x, y, z].every((value) => typeof value === \"number\" && Number.isFinite(value)) ? { x: x * scale, y: y * scale, z: z * scale } : void 0;\n}\nfunction receive(event) {\n  const total = event.accelerationIncludingGravity, linear = event.acceleration, rate = event.rotationRate;\n  const acceleration = vector(total?.x, total?.y, total?.z, -1 / 9.80665);\n  const user = vector(linear?.x, linear?.y, linear?.z, -1 / 9.80665);\n  const rotation = vector(rate?.beta, rate?.gamma, rate?.alpha, Math.PI / 180);\n  availability.accelerometer = !!acceleration;\n  availability.gyroscope = !!rotation;\n  availability.deviceMotion = !!user;\n  const gravity = acceleration && user ? {\n    x: acceleration.x - user.x,\n    y: acceleration.y - user.y,\n    z: acceleration.z - user.z\n  } : void 0;\n  for (const listener of [...listeners]) {\n    if (!listeners.has(listener)) continue;\n    const value = listener.sensor === \"accelerometer\" ? acceleration : listener.sensor === \"gyroscope\" ? rotation : listener.sensor === \"deviceMotion\" ? user : void 0;\n    if (!value || event.timeStamp - listener.last < listener.intervalMs) continue;\n    listener.last = event.timeStamp;\n    const reading = {\n      sensor: listener.sensor,\n      timestampMs: performance.timeOrigin + event.timeStamp,\n      value\n    };\n    if (listener.sensor === \"deviceMotion\")\n      Object.assign(reading, {\n        gravity,\n        userAcceleration: user,\n        rotationRate: rotation,\n        attitude\n      });\n    listener.onReading(reading);\n  }\n  if (!listeners.size) stopObserving();\n}\nfunction orient(event) {\n  const a = event.alpha, b = event.beta, c = event.gamma;\n  if (!vector(a, b, c)) {\n    attitude = void 0;\n    return;\n  }\n  const z = a * Math.PI / 180, x = b * Math.PI / 180, y = c * Math.PI / 180;\n  attitude = {\n    x: Math.atan2(Math.sin(x), Math.cos(x) * Math.cos(y)),\n    y: Math.asin(Math.max(-1, Math.min(1, Math.cos(x) * Math.sin(y)))),\n    z: Math.atan2(\n      Math.sin(z) * Math.cos(y) + Math.cos(z) * Math.sin(x) * Math.sin(y),\n      Math.cos(z) * Math.cos(y) - Math.sin(z) * Math.sin(x) * Math.sin(y)\n    )\n  };\n}\nfunction stopObserving() {\n  if (!observing) return;\n  window.removeEventListener(\"devicemotion\", receive);\n  window.removeEventListener(\"deviceorientation\", orient);\n  observing = false;\n  attitude = void 0;\n}\nfunction observe() {\n  if (observing || typeof window === \"undefined\") return;\n  observing = true;\n  window.addEventListener(\"devicemotion\", receive);\n  window.addEventListener(\"deviceorientation\", orient);\n}\nconst Motion = Object.freeze({\n  getAvailability: () => {\n    if (typeof window === \"undefined\" || !window.DeviceMotionEvent)\n      return { ...emptyAvailability };\n    observe();\n    return { ...availability };\n  },\n  addListener: (sensor, intervalMs, onReading, onError) => {\n    validateListener(sensor, intervalMs, onReading, onError);\n    if (typeof window === \"undefined\") return () => {\n    };\n    if (sensor === \"magnetometer\" || !window.DeviceMotionEvent) {\n      onError(\"E_MOTION_UNAVAILABLE\", \"Motion.addListener: sensor is unavailable\");\n      return () => {\n      };\n    }\n    observe();\n    const listener = { sensor, intervalMs, last: -Infinity, onReading, onError };\n    listeners.add(listener);\n    const constructor = window.DeviceMotionEvent;\n    if (constructor.requestPermission) {\n      const fail = (message) => {\n        if (!listeners.delete(listener)) return;\n        if (!listeners.size) stopObserving();\n        onError(\"E_MOTION_PERMISSION\", message);\n      };\n      try {\n        constructor.requestPermission().then((permission) => {\n          if (permission !== \"granted\")\n            fail(\"Motion.addListener: motion permission is required\");\n        }).catch((error) => fail(String(error)));\n      } catch (error) {\n        fail(String(error));\n      }\n    }\n    return () => {\n      listeners.delete(listener);\n      if (!listeners.size) stopObserving();\n    };\n  }\n});\nexport {\n  Motion\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":"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"}