een-api-toolkit 0.3.10 → 0.3.13

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.
Files changed (47) hide show
  1. package/CHANGELOG.md +36 -7
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.ts +411 -0
  5. package/dist/index.js +536 -393
  6. package/dist/index.js.map +1 -1
  7. package/docs/AI-CONTEXT.md +68 -6
  8. package/examples/vue-events/.env.example +14 -0
  9. package/examples/vue-events/README.md +175 -0
  10. package/examples/vue-events/e2e/app.spec.ts +74 -0
  11. package/examples/vue-events/e2e/auth.spec.ts +332 -0
  12. package/examples/vue-events/events-screenshot.png +0 -0
  13. package/examples/vue-events/index.html +13 -0
  14. package/examples/vue-events/package-lock.json +1719 -0
  15. package/examples/vue-events/package.json +28 -0
  16. package/examples/vue-events/playwright.config.ts +46 -0
  17. package/examples/vue-events/src/App.vue +108 -0
  18. package/examples/vue-events/src/components/EventsModal.vue +570 -0
  19. package/examples/vue-events/src/main.ts +23 -0
  20. package/examples/vue-events/src/router/index.ts +61 -0
  21. package/examples/vue-events/src/views/Callback.vue +76 -0
  22. package/examples/vue-events/src/views/Cameras.vue +291 -0
  23. package/examples/vue-events/src/views/Home.vue +166 -0
  24. package/examples/vue-events/src/views/Login.vue +33 -0
  25. package/examples/vue-events/src/views/Logout.vue +66 -0
  26. package/examples/vue-events/src/vite-env.d.ts +12 -0
  27. package/examples/vue-events/tsconfig.json +21 -0
  28. package/examples/vue-events/tsconfig.node.json +10 -0
  29. package/examples/vue-events/vite.config.ts +12 -0
  30. package/examples/vue-media/README.md +154 -85
  31. package/examples/vue-media/e2e/app.spec.ts +8 -0
  32. package/examples/vue-media/e2e/auth.spec.ts +154 -2
  33. package/examples/vue-media/media-screenshot.png +0 -0
  34. package/examples/vue-media/package-lock.json +8 -1
  35. package/examples/vue-media/package.json +1 -0
  36. package/examples/vue-media/src/App.vue +3 -2
  37. package/examples/vue-media/src/composables/useSelectedDateTime.ts +102 -0
  38. package/examples/vue-media/src/router/index.ts +7 -0
  39. package/examples/vue-media/src/utils/timestamp.ts +263 -0
  40. package/examples/vue-media/src/views/HLS.vue +645 -0
  41. package/examples/vue-media/src/views/Home.vue +6 -2
  42. package/examples/vue-media/src/views/LiveCamera.vue +8 -27
  43. package/examples/vue-media/src/views/RecordedImage.vue +214 -77
  44. package/examples/vue-users/e2e/auth.spec.ts +3 -3
  45. package/examples/vue-users/package-lock.json +2 -2
  46. package/examples/vue-users/package.json +1 -1
  47. package/package.json +3 -1
package/CHANGELOG.md CHANGED
@@ -2,24 +2,53 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
- ## [0.3.10] - 2026-01-09
5
+ ## [0.3.13] - 2026-01-17
6
6
 
7
7
  ### Release Summary
8
8
 
9
- No PR descriptions available for this release.
9
+ #### PR #56: docs: Add multipartUrl guidance for small camera grids
10
+ ## Summary
11
+
12
+ - Add documentation clarifying that `multipartUrl` is suitable for camera grids with fewer than 20 cameras
13
+ - Note that multipartUrl provides automatic image updates with low frequency polling recommended (every 3 seconds)
14
+ - Updated "Choosing the Right Preview Method" table and quick reference in AI-CONTEXT.md
15
+
16
+ ## Commits
17
+
18
+ - `8bbc558` docs: Add multipartUrl guidance for small camera grids
19
+
20
+ ## Test Results
21
+
22
+ - **Linting**: Passed (1 warning)
23
+ - **Unit Tests**: 188 passed
24
+ - **Build**: Successful
25
+
26
+ ## Version
27
+
28
+ `0.3.11`
29
+
10
30
 
11
31
  ### Detailed Changes
12
32
 
13
33
  #### Features
14
- - feat: Add STORAGE_STRATEGY_DESCRIPTIONS constant for dynamic UI display
15
- - feat: Add debug logging for storage fallback and display storage strategy on login pages
34
+ - feat: Add Events API support with vue-events example app
35
+
36
+ #### Bug Fixes
37
+ - fix: Address code review recommendations
16
38
 
17
39
  #### Other Changes
18
- - refactor: Move storage strategy display from Login to Home pages
40
+ - chore: Add Events to AI-CONTEXT generator, screenshot, and PR check step
41
+ - docs: Add error checking to listEventTypes example
42
+ - docs: Add README for vue-events example
43
+ - docs: Add Events API documentation
44
+ - chore: Add security review step to PR-and-check skill
45
+ - chore: Add E2E tests for example apps to PR-and-check skill
46
+ - docs: Fix multipartUrl description per Gemini review
47
+ - docs: Add multipartUrl guidance for small camera grids
19
48
 
20
49
  ### Links
21
50
  - [npm package](https://www.npmjs.com/package/een-api-toolkit)
22
- - [Full Changelog](https://github.com/klaushofrichter/een-api-toolkit/compare/v0.3.8...v0.3.10)
51
+ - [Full Changelog](https://github.com/klaushofrichter/een-api-toolkit/compare/v0.3.11...v0.3.13)
23
52
 
24
53
  ---
25
- *Released: 2026-01-09 20:49:25 CST*
54
+ *Released: 2026-01-17 07:36:25 CST*
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const de=require("pinia"),h=require("vue"),fe={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1},ge=()=>{try{return fe?.VITE_DEBUG==="true"}catch{return!1}};function u(...e){ge()&&console.log("[een-api-toolkit]",...e)}const _e={localStorage:"persists across sessions",sessionStorage:"per-tab, cleared on tab close",memory:"tokens lost on page refresh"};class he{store=new Map;getItem(n){return this.store.get(n)??null}setItem(n,t){this.store.set(n,t)}removeItem(n){this.store.delete(n)}}class C{constructor(n){this.storage=n}getItem(n){return this.storage.getItem(n)}setItem(n,t){this.storage.setItem(n,t)}removeItem(n){this.storage.removeItem(n)}}let N="localStorage",b=null;function w(){return b||(b=new he),b}function Re(e){N=e}function Ie(){return N}function L(){switch(N){case"memory":return w();case"sessionStorage":return typeof sessionStorage<"u"?new C(sessionStorage):(u("sessionStorage unavailable, falling back to memory storage"),w());default:return typeof localStorage<"u"?new C(localStorage):(u("localStorage unavailable, falling back to memory storage"),w())}}const p={};let U={};function Ee(e={}){const n=e.storageStrategy??"localStorage";Re(n),U={proxyUrl:e.proxyUrl??p?.VITE_PROXY_URL,clientId:e.clientId??p?.VITE_EEN_CLIENT_ID,redirectUri:e.redirectUri??p?.VITE_REDIRECT_URI,storageStrategy:n,debug:e.debug??p?.VITE_DEBUG==="true"}}function pe(){return U}function k(){return U.proxyUrl??p?.VITE_PROXY_URL}function H(){return U.clientId??p?.VITE_EEN_CLIENT_ID}function F(){return U.redirectUri??p?.VITE_REDIRECT_URI??"http://127.0.0.1:3333"}function f(e){return{data:e,error:null}}function i(e,n,t,r){return{data:null,error:{code:e,message:n,status:t,details:r}}}let j=null;function Te(){return j||(j=Promise.resolve().then(()=>ve).then(e=>e.refreshToken)),j}const g=de.defineStore("een-auth",()=>{const e=h.ref(null),n=h.ref(null),t=h.ref(null),r=h.ref(null),a=h.ref(null),o=h.ref(443),s=h.ref(null),l=h.ref(null),_=h.ref(!1);let I=null;const R=h.ref(!1),E=h.ref(null),y=h.computed(()=>!!e.value),S=h.computed(()=>a.value?o.value===443?`https://${a.value}`:`https://${a.value}:${o.value}`:null),D=h.computed(()=>n.value?Date.now()>=n.value:!0),J=h.computed(()=>n.value?Math.max(0,n.value-Date.now()):0);function Y(c,d){e.value=c,n.value=Date.now()+d*1e3,T(),$(),u("Token set, expires in",d,"seconds")}function Z(c){t.value=c,T()}function ee(c){r.value=c,T()}function te(c){if(typeof c=="string")try{const d=new URL(c.startsWith("http")?c:`https://${c}`);a.value=d.hostname,o.value=d.port?parseInt(d.port,10):443}catch(d){u("Failed to parse URL, using as hostname:",d instanceof Error?d.message:String(d)),a.value=c,o.value=443}else a.value=c.hostname,o.value=c.port??443;T(),u("Base URL set:",S.value)}function ne(c){s.value=c,T()}function $(){if(l.value&&(clearTimeout(l.value),l.value=null),!n.value||!e.value)return;const c=Date.now(),A=n.value-c,m=300*1e3,ce=A/2,ue=Math.min(m,ce),le=Math.max(A-ue,60*1e3),B=Math.max(le,5e3);u("Auto-refresh scheduled in",Math.round(B/1e3),"seconds"),l.value=setTimeout(async()=>{await re()},B)}async function re(){return I?(u("Refresh already in progress, waiting for existing refresh"),I):(_.value=!0,u("Performing auto-refresh"),I=(async()=>{try{const d=await(await Te())();d.error?(R.value=!0,E.value=d.error.message,u("Auto-refresh failed:",d.error.message)):(R.value=!1,E.value=null,u("Auto-refresh successful"))}catch(c){R.value=!0,E.value=c instanceof Error?c.message:String(c),u("Auto-refresh error:",c)}finally{_.value=!1,I=null}})(),I)}function ie(){R.value=!1,E.value=null}function x(){l.value&&(clearTimeout(l.value),l.value=null),e.value=null,n.value=null,t.value=null,r.value=null,a.value=null,o.value=443,s.value=null,R.value=!1,E.value=null,se(),u("Logged out")}function oe(){ae(),e.value&&!D.value?($(),u("Initialized from storage")):e.value&&D.value&&(u("Stored token expired, clearing"),x())}function T(){try{const c=L();e.value&&c.setItem("een_token",e.value),n.value&&c.setItem("een_tokenExpiration",String(n.value)),t.value&&c.setItem("een_refreshTokenMarker",t.value),r.value&&c.setItem("een_sessionId",r.value),a.value&&c.setItem("een_hostname",a.value),o.value!==443&&c.setItem("een_port",String(o.value)),s.value&&c.setItem("een_userProfile",JSON.stringify(s.value))}catch(c){u("Failed to save to storage:",c instanceof Error?c.message:String(c))}}function ae(){try{const c=L();e.value=c.getItem("een_token");const d=c.getItem("een_tokenExpiration");n.value=d?parseInt(d,10):null,t.value=c.getItem("een_refreshTokenMarker"),r.value=c.getItem("een_sessionId"),a.value=c.getItem("een_hostname");const A=c.getItem("een_port");o.value=A?parseInt(A,10):443;const m=c.getItem("een_userProfile");s.value=m?JSON.parse(m):null}catch(c){u("Failed to load from storage:",c instanceof Error?c.message:String(c))}}function se(){try{const c=L();c.removeItem("een_token"),c.removeItem("een_tokenExpiration"),c.removeItem("een_refreshTokenMarker"),c.removeItem("een_sessionId"),c.removeItem("een_hostname"),c.removeItem("een_port"),c.removeItem("een_userProfile")}catch(c){u("Failed to clear storage:",c instanceof Error?c.message:String(c))}}return{token:e,tokenExpiration:n,refreshTokenMarker:t,sessionId:r,hostname:a,port:o,userProfile:s,isRefreshing:_,refreshFailed:R,refreshFailedMessage:E,isAuthenticated:y,baseUrl:S,isTokenExpired:D,tokenExpiresIn:J,setToken:Y,setRefreshTokenMarker:Z,setSessionId:ee,setBaseUrl:te,setUserProfile:ne,setupAutoRefresh:$,clearRefreshFailed:ie,logout:x,initialize:oe}}),Ae="https://auth.eagleeyenetworks.com/oauth2/authorize";function M(){const e=H();if(!e)throw new Error("Client ID not configured. Call initEenToolkit() or set VITE_EEN_CLIENT_ID");const n=crypto.randomUUID();try{sessionStorage.setItem("een_oauth_state",n)}catch{}const t=new URLSearchParams({client_id:e,response_type:"code",scope:"vms.all",redirect_uri:F(),state:n});return u("Generated auth URL with state:",n),`${Ae}?${t.toString()}`}async function P(e){const n=k();if(!n)return i("AUTH_FAILED","Proxy URL not configured. Call initEenToolkit() or set VITE_PROXY_URL");const t=new URLSearchParams({code:e,redirect_uri:F()});try{const r=await fetch(`${n}/proxy/getAccessToken?${t.toString()}`,{method:"POST",credentials:"include",headers:{Accept:"application/json"}});if(!r.ok){const o=await r.text().catch(()=>"Unknown error");return i("AUTH_FAILED",`Token exchange failed: ${o}`,r.status)}const a=await r.json();return u("Token received, expires in:",a.expiresIn),f(a)}catch(r){return i("NETWORK_ERROR",`Failed to exchange code: ${String(r)}`)}}async function z(){const e=k();if(!e)return i("AUTH_FAILED","Proxy URL not configured");const n=g();try{const t={Accept:"application/json"};n.sessionId&&(t.Authorization=`Bearer ${n.sessionId}`);const r=await fetch(`${e}/proxy/refreshAccessToken`,{method:"POST",credentials:"include",headers:t});if(!r.ok){const o=await r.text().catch(()=>"Unknown error");return i("AUTH_FAILED",`Token refresh failed: ${o}`,r.status)}const a=await r.json();return n.setToken(a.accessToken,a.expiresIn),u("Token refreshed, expires in:",a.expiresIn),f(a)}catch(t){return i("NETWORK_ERROR",`Failed to refresh token: ${String(t)}`)}}async function Q(){const e=k();if(!e)return i("AUTH_FAILED","Proxy URL not configured");const n=g();try{const t={Accept:"application/json"};n.sessionId&&(t.Authorization=`Bearer ${n.sessionId}`);const r=await fetch(`${e}/proxy/revoke`,{method:"POST",credentials:"include",headers:t});if(n.logout(),!r.ok){const a=await r.text().catch(()=>"Unknown error");return i("AUTH_FAILED",`Token revocation failed: ${a}`,r.status)}return u("Token revoked"),f(void 0)}catch(t){return n.logout(),i("NETWORK_ERROR",`Failed to revoke token: ${String(t)}`)}}async function V(e,n){let t=null;try{t=sessionStorage.getItem("een_oauth_state"),sessionStorage.removeItem("een_oauth_state")}catch{}if(!t)return i("AUTH_FAILED","No OAuth state found. Please restart the login process.");if(!Ue(n,t))return i("AUTH_FAILED","Invalid OAuth state. Possible CSRF attack.");u("State validated, exchanging code for token");const r=await P(e);if(r.error)return r;const a=g(),o=r.data;return a.setToken(o.accessToken,o.expiresIn),a.setRefreshTokenMarker("present"),a.setSessionId(o.sessionId),a.setBaseUrl(o.httpsBaseUrl),u("Auth callback complete, user:",o.userEmail),f(o)}function Ue(e,n){if(e.length!==n.length)return!1;let t=0;for(let r=0;r<e.length;r++)t|=e.charCodeAt(r)^n.charCodeAt(r);return t===0}const ve=Object.freeze(Object.defineProperty({__proto__:null,getAccessToken:P,getAuthUrl:M,handleAuthCallback:V,refreshToken:z,revokeToken:Q},Symbol.toStringTag,{value:"Module"}));async function ye(){const e=g();if(!e.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!e.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");const n=`${e.baseUrl}/api/v3.0/users/self`;u("Fetching current user:",n);try{const t=await fetch(n,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${e.token}`}});if(!t.ok)return q(t);const r=await t.json();return u("Current user fetched:",r.email),e.setUserProfile(r),f(r)}catch(t){return i("NETWORK_ERROR",`Failed to fetch current user: ${String(t)}`)}}async function Se(e){const n=g();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");const t=new URLSearchParams;e?.pageSize&&t.append("pageSize",String(e.pageSize)),e?.pageToken&&t.append("pageToken",e.pageToken),e?.include&&e.include.length>0&&t.append("include",e.include.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/users${r?`?${r}`:""}`;u("Fetching users:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return q(o);const s=await o.json();return u("Users fetched:",s.results?.length??0,"users"),f(s)}catch(o){return i("NETWORK_ERROR",`Failed to fetch users: ${String(o)}`)}}async function me(e,n){const t=g();if(!t.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!t.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","User ID is required");const r=new URLSearchParams;n?.include&&n.include.length>0&&r.append("include",n.include.join(","));const a=r.toString(),o=`${t.baseUrl}/api/v3.0/users/${encodeURIComponent(e)}${a?`?${a}`:""}`;u("Fetching user:",o);try{const s=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!s.ok)return q(s);const l=await s.json();return u("User fetched:",l.email),f(l)}catch(s){return i("NETWORK_ERROR",`Failed to fetch user: ${String(s)}`)}}async function q(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch{t=e.statusText||"Unknown error"}switch(n){case 401:return i("AUTH_REQUIRED",`Authentication failed: ${t}`,n);case 403:return i("FORBIDDEN",`Access denied: ${t}`,n);case 404:return i("NOT_FOUND",`Not found: ${t}`,n);case 429:return i("RATE_LIMITED",`Rate limited: ${t}`,n);default:return i("API_ERROR",`API error: ${t}`,n)}}async function ke(e){const n=g();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");const t=new URLSearchParams;e?.pageSize&&t.append("pageSize",String(e.pageSize)),e?.pageToken&&t.append("pageToken",e.pageToken),e?.include&&e.include.length>0&&t.append("include",e.include.join(",")),e?.sort&&e.sort.length>0&&t.append("sort",e.sort.join(",")),e?.locationId__in&&e.locationId__in.length>0&&t.append("locationId__in",e.locationId__in.join(",")),e?.bridgeId__in&&e.bridgeId__in.length>0&&t.append("bridgeId__in",e.bridgeId__in.join(",")),e?.multiCameraId&&t.append("multiCameraId",e.multiCameraId),e?.multiCameraId__ne&&t.append("multiCameraId__ne",e.multiCameraId__ne),e?.multiCameraId__in&&e.multiCameraId__in.length>0&&t.append("multiCameraId__in",e.multiCameraId__in.join(",")),e?.tags__contains&&e.tags__contains.length>0&&t.append("tags__contains",e.tags__contains.join(",")),e?.tags__any&&e.tags__any.length>0&&t.append("tags__any",e.tags__any.join(",")),e?.packages__contains&&e.packages__contains.length>0&&t.append("packages__contains",e.packages__contains.join(",")),e?.name&&t.append("name",e.name),e?.name__contains&&t.append("name__contains",e.name__contains),e?.name__in&&e.name__in.length>0&&t.append("name__in",e.name__in.join(",")),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.id__notIn&&e.id__notIn.length>0&&t.append("id__notIn",e.id__notIn.join(",")),e?.id__contains&&t.append("id__contains",e.id__contains),e?.layoutId&&t.append("layoutId",e.layoutId),typeof e?.shared=="boolean"&&t.append("shareDetails.shared",String(e.shared)),e?.sharedCameraAccount&&t.append("shareDetails.accountId",e.sharedCameraAccount),typeof e?.firstResponder=="boolean"&&t.append("shareDetails.firstResponder",String(e.firstResponder)),typeof e?.directToCloud=="boolean"&&t.append("deviceInfo.directToCloud",String(e.directToCloud)),e?.speakerId__in&&e.speakerId__in.length>0&&t.append("speakerId__in",e.speakerId__in.join(",")),e?.q&&t.append("q",e.q),typeof e?.qRelevance__gte=="number"&&t.append("qRelevance__gte",String(e.qRelevance__gte)),e?.enabledAnalytics__contains&&e.enabledAnalytics__contains.length>0&&t.append("enabledAnalytics__contains",e.enabledAnalytics__contains.join(",")),e?.status__in&&e.status__in.length>0&&t.append("status__in",e.status__in.join(",")),e?.status__ne&&t.append("status__ne",e.status__ne);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/cameras${r?`?${r}`:""}`;u("Fetching cameras:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return W(o);const s=await o.json();return u("Cameras fetched:",s.results?.length??0,"cameras"),f(s)}catch(o){return i("NETWORK_ERROR",`Failed to fetch cameras: ${String(o)}`)}}async function Oe(e,n){const t=g();if(!t.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!t.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Camera ID is required");const r=new URLSearchParams;n?.include&&n.include.length>0&&r.append("include",n.include.join(","));const a=r.toString(),o=`${t.baseUrl}/api/v3.0/cameras/${encodeURIComponent(e)}${a?`?${a}`:""}`;u("Fetching camera:",o);try{const s=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!s.ok)return W(s);const l=await s.json();return u("Camera fetched:",l.name),f(l)}catch(s){return i("NETWORK_ERROR",`Failed to fetch camera: ${String(s)}`)}}async function W(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){u("Failed to parse error response JSON:",r),t=e.statusText||"Unknown error"}switch(n){case 401:return i("AUTH_REQUIRED",`Authentication failed: ${t}`,n);case 403:return i("FORBIDDEN",`Access denied: ${t}`,n);case 404:return i("NOT_FOUND",`Not found: ${t}`,n);case 429:return i("RATE_LIMITED",`Rate limited: ${t}`,n);default:return i("API_ERROR",`API error: ${t}`,n)}}async function De(e){const n=g();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");const t=new URLSearchParams;e?.pageSize&&t.append("pageSize",String(e.pageSize)),e?.pageToken&&t.append("pageToken",e.pageToken),e?.include&&e.include.length>0&&t.append("include",e.include.join(",")),e?.sort&&e.sort.length>0&&t.append("sort",e.sort.join(",")),e?.locationId__in&&e.locationId__in.length>0&&t.append("locationId__in",e.locationId__in.join(",")),e?.tags__contains&&e.tags__contains.length>0&&t.append("tags__contains",e.tags__contains.join(",")),e?.tags__any&&e.tags__any.length>0&&t.append("tags__any",e.tags__any.join(",")),e?.name&&t.append("name",e.name),e?.name__contains&&t.append("name__contains",e.name__contains),e?.name__in&&e.name__in.length>0&&t.append("name__in",e.name__in.join(",")),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.id__notIn&&e.id__notIn.length>0&&t.append("id__notIn",e.id__notIn.join(",")),e?.q&&t.append("q",e.q),typeof e?.qRelevance__gte=="number"&&t.append("qRelevance__gte",String(e.qRelevance__gte)),e?.status__in&&e.status__in.length>0&&t.append("status__in",e.status__in.join(",")),e?.status__ne&&t.append("status__ne",e.status__ne);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/bridges${r?`?${r}`:""}`;u("Fetching bridges:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return K(o);const s=await o.json();return u("Bridges fetched:",s.results?.length??0,"bridges"),f(s)}catch(o){return i("NETWORK_ERROR",`Failed to fetch bridges: ${String(o)}`)}}async function $e(e,n){const t=g();if(!t.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!t.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Bridge ID is required");const r=new URLSearchParams;n?.include&&n.include.length>0&&r.append("include",n.include.join(","));const a=r.toString(),o=`${t.baseUrl}/api/v3.0/bridges/${encodeURIComponent(e)}${a?`?${a}`:""}`;u("Fetching bridge:",o);try{const s=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!s.ok)return K(s);const l=await s.json();return u("Bridge fetched:",l.name),f(l)}catch(s){return i("NETWORK_ERROR",`Failed to fetch bridge: ${String(s)}`)}}async function K(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){u("Failed to parse error response JSON:",r),t=e.statusText||"Unknown error"}switch(n){case 401:return i("AUTH_REQUIRED",`Authentication failed: ${t}`,n);case 403:return i("FORBIDDEN",`Access denied: ${t}`,n);case 404:return i("NOT_FOUND",`Not found: ${t}`,n);case 429:return i("RATE_LIMITED",`Rate limited: ${t}`,n);default:return i("API_ERROR",`API error: ${t}`,n)}}const be=3e4;function v(e=be){const n=new AbortController,t=setTimeout(()=>n.abort(),e);return{controller:n,timeoutId:t}}function G(e){const n=new Uint8Array(e),t=8192,r=[];for(let o=0;o<n.byteLength;o+=t){const s=n.subarray(o,Math.min(o+t,n.byteLength));let l="";for(let _=0;_<s.length;_++)l+=String.fromCharCode(s[_]);r.push(l)}const a=r.join("");return typeof btoa=="function"?btoa(a):Buffer.from(a,"binary").toString("base64")}async function we(e){const n=g();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.deviceId)return i("VALIDATION_ERROR","Device ID is required");if(!e.type)return i("VALIDATION_ERROR","Stream type is required (preview or main)");if(!e.mediaType)return i("VALIDATION_ERROR","Media type is required (video or image)");if(!e.startTimestamp)return i("VALIDATION_ERROR","Start timestamp is required");const t=new URLSearchParams;t.append("deviceId",e.deviceId),t.append("type",e.type),t.append("mediaType",e.mediaType),t.append("startTimestamp__gte",e.startTimestamp),e.endTimestamp&&t.append("endTimestamp__lte",e.endTimestamp),typeof e.coalesce=="boolean"&&t.append("coalesce",String(e.coalesce)),e.include&&e.include.length>0&&t.append("include",e.include.join(",")),e.pageToken&&t.append("pageToken",e.pageToken),typeof e.pageSize=="number"&&t.append("pageSize",String(e.pageSize));const r=`${n.baseUrl}/api/v3.0/media?${t.toString()}`;u("Fetching media intervals:",r);const{controller:a,timeoutId:o}=v();try{const s=await fetch(r,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`},signal:a.signal});if(!s.ok)return O(s);const l=await s.json();return u("Media intervals fetched:",l.results?.length??0,"intervals"),f(l)}catch(s){return s instanceof Error&&s.name==="AbortError"?i("NETWORK_ERROR","Request timed out"):i("NETWORK_ERROR",`Failed to fetch media intervals: ${String(s)}`)}finally{clearTimeout(o)}}async function Le(e){const n=g();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.deviceId)return i("VALIDATION_ERROR","Device ID is required");const t=e.type??"preview",r=new URLSearchParams;r.append("deviceId",e.deviceId),r.append("type",t);const a=`${n.baseUrl}/api/v3.0/media/liveImage.jpeg?${r.toString()}`;u("Fetching live image:",a);const{controller:o,timeoutId:s}=v();try{const l=await fetch(a,{method:"GET",headers:{Accept:"image/jpeg",Authorization:`Bearer ${n.token}`},signal:o.signal}),_=l.headers.get("X-Een-Timestamp"),I=l.headers.get("X-Een-PrevToken");if(!l.ok)return O(l);const R=await l.arrayBuffer(),y=`data:image/jpeg;base64,${G(R)}`;return u("Live image fetched, timestamp:",_),f({imageData:y,timestamp:_,prevToken:I})}catch(l){return l instanceof Error&&l.name==="AbortError"?i("NETWORK_ERROR","Request timed out"):i("NETWORK_ERROR",`Failed to fetch live image: ${String(l)}`)}finally{clearTimeout(s)}}async function je(e){const n=g();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.deviceId&&!e.pageToken)return i("VALIDATION_ERROR","Either deviceId or pageToken is required");if(!e.pageToken&&!(e.timestamp__lt||e.timestamp__lte||e.timestamp||e.timestamp__gte||e.timestamp__gt))return i("VALIDATION_ERROR","At least one timestamp parameter is required");if(e.include?.includes("overlaySvgHeader")&&(!e.overlayId__in||e.overlayId__in.length===0))return i("VALIDATION_ERROR","At least one overlayId must be provided when requesting overlay headers");const t=new URLSearchParams;e.deviceId&&t.append("deviceId",e.deviceId),e.pageToken&&t.append("pageToken",e.pageToken),e.type&&t.append("type",e.type),e.timestamp__lt&&t.append("timestamp__lt",e.timestamp__lt),e.timestamp__lte&&t.append("timestamp__lte",e.timestamp__lte),e.timestamp&&t.append("timestamp",e.timestamp),e.timestamp__gte&&t.append("timestamp__gte",e.timestamp__gte),e.timestamp__gt&&t.append("timestamp__gt",e.timestamp__gt),e.overlayId__in&&e.overlayId__in.length>0&&t.append("overlayId__in",e.overlayId__in.join(",")),e.include&&e.include.length>0&&t.append("include",e.include.join(",")),typeof e.targetWidth=="number"&&t.append("targetWidth",String(e.targetWidth)),typeof e.targetHeight=="number"&&t.append("targetHeight",String(e.targetHeight));const r=`${n.baseUrl}/api/v3.0/media/recordedImage.jpeg?${t.toString()}`;u("Fetching recorded image:",r);const{controller:a,timeoutId:o}=v();try{const s=await fetch(r,{method:"GET",headers:{Accept:"image/jpeg",Authorization:`Bearer ${n.token}`},signal:a.signal}),l=s.headers.get("X-Een-Timestamp"),_=s.headers.get("X-Een-NextToken"),I=s.headers.get("X-Een-PrevToken"),R=s.headers.get("X-Een-OverlaySvg");if(!s.ok)return O(s);const E=await s.arrayBuffer(),S=`data:image/jpeg;base64,${G(E)}`;return u("Recorded image fetched, timestamp:",l),f({imageData:S,timestamp:l,nextToken:_,prevToken:I,overlaySvg:R})}catch(s){return s instanceof Error&&s.name==="AbortError"?i("NETWORK_ERROR","Request timed out"):i("NETWORK_ERROR",`Failed to fetch recorded image: ${String(s)}`)}finally{clearTimeout(o)}}async function O(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch{t=e.statusText||"Unknown error"}switch(n){case 401:return i("AUTH_REQUIRED",`Authentication failed: ${t}`,n);case 403:return i("FORBIDDEN",`Access denied: ${t}`,n);case 404:return i("NOT_FOUND",`Not found: ${t}`,n);case 429:return i("RATE_LIMITED",`Rate limited: ${t}`,n);case 503:return i("SERVICE_UNAVAILABLE",`Service unavailable: ${t}`,n);default:return i("API_ERROR",`API error: ${t}`,n)}}async function X(){const e=g();if(!e.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!e.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");const n=`${e.baseUrl}/api/v3.0/media/session`;u("Fetching media session:",n);const{controller:t,timeoutId:r}=v();try{const a=await fetch(n,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${e.token}`},signal:t.signal});if(!a.ok)return O(a);const o=await a.json();return u("Media session URL received:",o.url),f(o)}catch(a){return a instanceof Error&&a.name==="AbortError"?i("NETWORK_ERROR","Request timed out"):i("NETWORK_ERROR",`Failed to fetch media session: ${String(a)}`)}finally{clearTimeout(r)}}async function Ne(){const e=g();if(!e.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");const n=await X();if(n.error)return i(n.error.code,`Failed to get media session: ${n.error.message}`,n.error.status);if(!n.data?.url)return i("API_ERROR","No session URL returned from media session endpoint");const t=n.data.url;u("Calling session URL to set cookie:",t);const{controller:r,timeoutId:a}=v();try{const o=await fetch(t,{method:"GET",credentials:"include",headers:{Accept:"*/*",Authorization:`Bearer ${e.token}`},signal:r.signal});if(!o.ok&&o.status!==204){const s=o.status;let l;try{const _=await o.json();l=_.message??_.error??o.statusText}catch{l=o.statusText||"Unknown error"}return i("API_ERROR",`Failed to set media session cookie: ${l}`,s)}return u("Media session cookie set successfully"),f({success:!0,sessionUrl:t})}catch(o){return o instanceof Error&&o.name==="AbortError"?i("NETWORK_ERROR","Request timed out while setting session cookie"):i("NETWORK_ERROR",`Failed to set media session cookie: ${String(o)}`)}finally{clearTimeout(a)}}async function Fe(e){const n=g();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");const t=new URLSearchParams;typeof e?.pageSize=="number"&&t.append("pageSize",String(e.pageSize)),e?.pageToken&&t.append("pageToken",e.pageToken),e?.deviceId&&t.append("deviceId",e.deviceId),e?.deviceId__in&&e.deviceId__in.length>0&&t.append("deviceId__in",e.deviceId__in.join(",")),e?.type&&t.append("type",e.type),e?.include&&e.include.length>0&&t.append("include",e.include.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/feeds${r?`?${r}`:""}`;u("Fetching feeds:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`},signal:e?.signal});if(!o.ok)return Pe(o);const s=await o.json();return u("Feeds fetched:",s.results?.length??0,"feeds"),f(s)}catch(o){return i("NETWORK_ERROR",`Failed to fetch feeds: ${String(o)}`)}}async function Pe(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error}catch(r){u("Failed to parse error response JSON:",r)}switch(n){case 401:return i("AUTH_REQUIRED",t||"Authentication failed",n);case 403:return i("FORBIDDEN",t||"Access denied",n);case 404:return i("NOT_FOUND",t||"Not found",n);case 429:return i("RATE_LIMITED",t||"Rate limited",n);case 503:return i("SERVICE_UNAVAILABLE",t||"Service unavailable",n);default:return i("API_ERROR",t||e.statusText||"API error",n)}}exports.STORAGE_STRATEGY_DESCRIPTIONS=_e;exports.failure=i;exports.getAccessToken=P;exports.getAuthUrl=M;exports.getBridge=$e;exports.getBridges=De;exports.getCamera=Oe;exports.getCameras=ke;exports.getClientId=H;exports.getConfig=pe;exports.getCurrentUser=ye;exports.getLiveImage=Le;exports.getMediaSession=X;exports.getProxyUrl=k;exports.getRecordedImage=je;exports.getRedirectUri=F;exports.getStorageStrategy=Ie;exports.getUser=me;exports.getUsers=Se;exports.handleAuthCallback=V;exports.initEenToolkit=Ee;exports.initMediaSession=Ne;exports.listFeeds=Fe;exports.listMedia=we;exports.refreshToken=z;exports.revokeToken=Q;exports.success=f;exports.useAuthStore=g;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const ge=require("pinia"),h=require("vue"),_e={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1},he=()=>{try{return _e?.VITE_DEBUG==="true"}catch{return!1}};function c(...e){he()&&console.log("[een-api-toolkit]",...e)}const Re={localStorage:"persists across sessions",sessionStorage:"per-tab, cleared on tab close",memory:"tokens lost on page refresh"};class pe{store=new Map;getItem(n){return this.store.get(n)??null}setItem(n,t){this.store.set(n,t)}removeItem(n){this.store.delete(n)}}class z{constructor(n){this.storage=n}getItem(n){return this.storage.getItem(n)}setItem(n,t){this.storage.setItem(n,t)}removeItem(n){this.storage.removeItem(n)}}let q="localStorage",L=null;function j(){return L||(L=new pe),L}function Ee(e){q=e}function Te(){return q}function N(){switch(q){case"memory":return j();case"sessionStorage":return typeof sessionStorage<"u"?new z(sessionStorage):(c("sessionStorage unavailable, falling back to memory storage"),j());default:return typeof localStorage<"u"?new z(localStorage):(c("localStorage unavailable, falling back to memory storage"),j())}}const T={};let U={};function Ie(e={}){const n=e.storageStrategy??"localStorage";Ee(n),U={proxyUrl:e.proxyUrl??T?.VITE_PROXY_URL,clientId:e.clientId??T?.VITE_EEN_CLIENT_ID,redirectUri:e.redirectUri??T?.VITE_REDIRECT_URI,storageStrategy:n,debug:e.debug??T?.VITE_DEBUG==="true"}}function Ae(){return U}function O(){return U.proxyUrl??T?.VITE_PROXY_URL}function M(){return U.clientId??T?.VITE_EEN_CLIENT_ID}function P(){return U.redirectUri??T?.VITE_REDIRECT_URI??"http://127.0.0.1:3333"}function d(e){return{data:e,error:null}}function r(e,n,t,i){return{data:null,error:{code:e,message:n,status:t,details:i}}}let F=null;function Ue(){return F||(F=Promise.resolve().then(()=>Se).then(e=>e.refreshToken)),F}const f=ge.defineStore("een-auth",()=>{const e=h.ref(null),n=h.ref(null),t=h.ref(null),i=h.ref(null),a=h.ref(null),o=h.ref(443),s=h.ref(null),l=h.ref(null),_=h.ref(!1);let p=null;const R=h.ref(!1),E=h.ref(null),y=h.computed(()=>!!e.value),S=h.computed(()=>a.value?o.value===443?`https://${a.value}`:`https://${a.value}:${o.value}`:null),w=h.computed(()=>n.value?Date.now()>=n.value:!0),Z=h.computed(()=>n.value?Math.max(0,n.value-Date.now()):0);function ee(u,g){e.value=u,n.value=Date.now()+g*1e3,I(),b(),c("Token set, expires in",g,"seconds")}function te(u){t.value=u,I()}function ne(u){i.value=u,I()}function re(u){if(typeof u=="string")try{const g=new URL(u.startsWith("http")?u:`https://${u}`);a.value=g.hostname,o.value=g.port?parseInt(g.port,10):443}catch(g){c("Failed to parse URL, using as hostname:",g instanceof Error?g.message:String(g)),a.value=u,o.value=443}else a.value=u.hostname,o.value=u.port??443;I(),c("Base URL set:",S.value)}function ie(u){s.value=u,I()}function b(){if(l.value&&(clearTimeout(l.value),l.value=null),!n.value||!e.value)return;const u=Date.now(),A=n.value-u,m=300*1e3,le=A/2,de=Math.min(m,le),fe=Math.max(A-de,60*1e3),H=Math.max(fe,5e3);c("Auto-refresh scheduled in",Math.round(H/1e3),"seconds"),l.value=setTimeout(async()=>{await oe()},H)}async function oe(){return p?(c("Refresh already in progress, waiting for existing refresh"),p):(_.value=!0,c("Performing auto-refresh"),p=(async()=>{try{const g=await(await Ue())();g.error?(R.value=!0,E.value=g.error.message,c("Auto-refresh failed:",g.error.message)):(R.value=!1,E.value=null,c("Auto-refresh successful"))}catch(u){R.value=!0,E.value=u instanceof Error?u.message:String(u),c("Auto-refresh error:",u)}finally{_.value=!1,p=null}})(),p)}function ae(){R.value=!1,E.value=null}function C(){l.value&&(clearTimeout(l.value),l.value=null),e.value=null,n.value=null,t.value=null,i.value=null,a.value=null,o.value=443,s.value=null,R.value=!1,E.value=null,ue(),c("Logged out")}function se(){ce(),e.value&&!w.value?(b(),c("Initialized from storage")):e.value&&w.value&&(c("Stored token expired, clearing"),C())}function I(){try{const u=N();e.value&&u.setItem("een_token",e.value),n.value&&u.setItem("een_tokenExpiration",String(n.value)),t.value&&u.setItem("een_refreshTokenMarker",t.value),i.value&&u.setItem("een_sessionId",i.value),a.value&&u.setItem("een_hostname",a.value),o.value!==443&&u.setItem("een_port",String(o.value)),s.value&&u.setItem("een_userProfile",JSON.stringify(s.value))}catch(u){c("Failed to save to storage:",u instanceof Error?u.message:String(u))}}function ce(){try{const u=N();e.value=u.getItem("een_token");const g=u.getItem("een_tokenExpiration");n.value=g?parseInt(g,10):null,t.value=u.getItem("een_refreshTokenMarker"),i.value=u.getItem("een_sessionId"),a.value=u.getItem("een_hostname");const A=u.getItem("een_port");o.value=A?parseInt(A,10):443;const m=u.getItem("een_userProfile");s.value=m?JSON.parse(m):null}catch(u){c("Failed to load from storage:",u instanceof Error?u.message:String(u))}}function ue(){try{const u=N();u.removeItem("een_token"),u.removeItem("een_tokenExpiration"),u.removeItem("een_refreshTokenMarker"),u.removeItem("een_sessionId"),u.removeItem("een_hostname"),u.removeItem("een_port"),u.removeItem("een_userProfile")}catch(u){c("Failed to clear storage:",u instanceof Error?u.message:String(u))}}return{token:e,tokenExpiration:n,refreshTokenMarker:t,sessionId:i,hostname:a,port:o,userProfile:s,isRefreshing:_,refreshFailed:R,refreshFailedMessage:E,isAuthenticated:y,baseUrl:S,isTokenExpired:w,tokenExpiresIn:Z,setToken:ee,setRefreshTokenMarker:te,setSessionId:ne,setBaseUrl:re,setUserProfile:ie,setupAutoRefresh:b,clearRefreshFailed:ae,logout:C,initialize:se}}),ve="https://auth.eagleeyenetworks.com/oauth2/authorize";function Q(){const e=M();if(!e)throw new Error("Client ID not configured. Call initEenToolkit() or set VITE_EEN_CLIENT_ID");const n=crypto.randomUUID();try{sessionStorage.setItem("een_oauth_state",n)}catch{}const t=new URLSearchParams({client_id:e,response_type:"code",scope:"vms.all",redirect_uri:P(),state:n});return c("Generated auth URL with state:",n),`${ve}?${t.toString()}`}async function B(e){const n=O();if(!n)return r("AUTH_FAILED","Proxy URL not configured. Call initEenToolkit() or set VITE_PROXY_URL");const t=new URLSearchParams({code:e,redirect_uri:P()});try{const i=await fetch(`${n}/proxy/getAccessToken?${t.toString()}`,{method:"POST",credentials:"include",headers:{Accept:"application/json"}});if(!i.ok){const o=await i.text().catch(()=>"Unknown error");return r("AUTH_FAILED",`Token exchange failed: ${o}`,i.status)}const a=await i.json();return c("Token received, expires in:",a.expiresIn),d(a)}catch(i){return r("NETWORK_ERROR",`Failed to exchange code: ${String(i)}`)}}async function V(){const e=O();if(!e)return r("AUTH_FAILED","Proxy URL not configured");const n=f();try{const t={Accept:"application/json"};n.sessionId&&(t.Authorization=`Bearer ${n.sessionId}`);const i=await fetch(`${e}/proxy/refreshAccessToken`,{method:"POST",credentials:"include",headers:t});if(!i.ok){const o=await i.text().catch(()=>"Unknown error");return r("AUTH_FAILED",`Token refresh failed: ${o}`,i.status)}const a=await i.json();return n.setToken(a.accessToken,a.expiresIn),c("Token refreshed, expires in:",a.expiresIn),d(a)}catch(t){return r("NETWORK_ERROR",`Failed to refresh token: ${String(t)}`)}}async function W(){const e=O();if(!e)return r("AUTH_FAILED","Proxy URL not configured");const n=f();try{const t={Accept:"application/json"};n.sessionId&&(t.Authorization=`Bearer ${n.sessionId}`);const i=await fetch(`${e}/proxy/revoke`,{method:"POST",credentials:"include",headers:t});if(n.logout(),!i.ok){const a=await i.text().catch(()=>"Unknown error");return r("AUTH_FAILED",`Token revocation failed: ${a}`,i.status)}return c("Token revoked"),d(void 0)}catch(t){return n.logout(),r("NETWORK_ERROR",`Failed to revoke token: ${String(t)}`)}}async function K(e,n){let t=null;try{t=sessionStorage.getItem("een_oauth_state"),sessionStorage.removeItem("een_oauth_state")}catch{}if(!t)return r("AUTH_FAILED","No OAuth state found. Please restart the login process.");if(!ye(n,t))return r("AUTH_FAILED","Invalid OAuth state. Possible CSRF attack.");c("State validated, exchanging code for token");const i=await B(e);if(i.error)return i;const a=f(),o=i.data;return a.setToken(o.accessToken,o.expiresIn),a.setRefreshTokenMarker("present"),a.setSessionId(o.sessionId),a.setBaseUrl(o.httpsBaseUrl),c("Auth callback complete, user:",o.userEmail),d(o)}function ye(e,n){if(e.length!==n.length)return!1;let t=0;for(let i=0;i<e.length;i++)t|=e.charCodeAt(i)^n.charCodeAt(i);return t===0}const Se=Object.freeze(Object.defineProperty({__proto__:null,getAccessToken:B,getAuthUrl:Q,handleAuthCallback:K,refreshToken:V,revokeToken:W},Symbol.toStringTag,{value:"Module"}));async function me(){const e=f();if(!e.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!e.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");const n=`${e.baseUrl}/api/v3.0/users/self`;c("Fetching current user:",n);try{const t=await fetch(n,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${e.token}`}});if(!t.ok)return x(t);const i=await t.json();return c("Current user fetched:",i.email),e.setUserProfile(i),d(i)}catch(t){return r("NETWORK_ERROR",`Failed to fetch current user: ${String(t)}`)}}async function ke(e){const n=f();if(!n.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");const t=new URLSearchParams;e?.pageSize&&t.append("pageSize",String(e.pageSize)),e?.pageToken&&t.append("pageToken",e.pageToken),e?.include&&e.include.length>0&&t.append("include",e.include.join(","));const i=t.toString(),a=`${n.baseUrl}/api/v3.0/users${i?`?${i}`:""}`;c("Fetching users:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return x(o);const s=await o.json();return c("Users fetched:",s.results?.length??0,"users"),d(s)}catch(o){return r("NETWORK_ERROR",`Failed to fetch users: ${String(o)}`)}}async function Oe(e,n){const t=f();if(!t.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!t.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");if(!e)return r("VALIDATION_ERROR","User ID is required");const i=new URLSearchParams;n?.include&&n.include.length>0&&i.append("include",n.include.join(","));const a=i.toString(),o=`${t.baseUrl}/api/v3.0/users/${encodeURIComponent(e)}${a?`?${a}`:""}`;c("Fetching user:",o);try{const s=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!s.ok)return x(s);const l=await s.json();return c("User fetched:",l.email),d(l)}catch(s){return r("NETWORK_ERROR",`Failed to fetch user: ${String(s)}`)}}async function x(e){const n=e.status;let t;try{const i=await e.json();t=i.message??i.error??e.statusText}catch{t=e.statusText||"Unknown error"}switch(n){case 401:return r("AUTH_REQUIRED",`Authentication failed: ${t}`,n);case 403:return r("FORBIDDEN",`Access denied: ${t}`,n);case 404:return r("NOT_FOUND",`Not found: ${t}`,n);case 429:return r("RATE_LIMITED",`Rate limited: ${t}`,n);default:return r("API_ERROR",`API error: ${t}`,n)}}async function $e(e){const n=f();if(!n.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");const t=new URLSearchParams;e?.pageSize&&t.append("pageSize",String(e.pageSize)),e?.pageToken&&t.append("pageToken",e.pageToken),e?.include&&e.include.length>0&&t.append("include",e.include.join(",")),e?.sort&&e.sort.length>0&&t.append("sort",e.sort.join(",")),e?.locationId__in&&e.locationId__in.length>0&&t.append("locationId__in",e.locationId__in.join(",")),e?.bridgeId__in&&e.bridgeId__in.length>0&&t.append("bridgeId__in",e.bridgeId__in.join(",")),e?.multiCameraId&&t.append("multiCameraId",e.multiCameraId),e?.multiCameraId__ne&&t.append("multiCameraId__ne",e.multiCameraId__ne),e?.multiCameraId__in&&e.multiCameraId__in.length>0&&t.append("multiCameraId__in",e.multiCameraId__in.join(",")),e?.tags__contains&&e.tags__contains.length>0&&t.append("tags__contains",e.tags__contains.join(",")),e?.tags__any&&e.tags__any.length>0&&t.append("tags__any",e.tags__any.join(",")),e?.packages__contains&&e.packages__contains.length>0&&t.append("packages__contains",e.packages__contains.join(",")),e?.name&&t.append("name",e.name),e?.name__contains&&t.append("name__contains",e.name__contains),e?.name__in&&e.name__in.length>0&&t.append("name__in",e.name__in.join(",")),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.id__notIn&&e.id__notIn.length>0&&t.append("id__notIn",e.id__notIn.join(",")),e?.id__contains&&t.append("id__contains",e.id__contains),e?.layoutId&&t.append("layoutId",e.layoutId),typeof e?.shared=="boolean"&&t.append("shareDetails.shared",String(e.shared)),e?.sharedCameraAccount&&t.append("shareDetails.accountId",e.sharedCameraAccount),typeof e?.firstResponder=="boolean"&&t.append("shareDetails.firstResponder",String(e.firstResponder)),typeof e?.directToCloud=="boolean"&&t.append("deviceInfo.directToCloud",String(e.directToCloud)),e?.speakerId__in&&e.speakerId__in.length>0&&t.append("speakerId__in",e.speakerId__in.join(",")),e?.q&&t.append("q",e.q),typeof e?.qRelevance__gte=="number"&&t.append("qRelevance__gte",String(e.qRelevance__gte)),e?.enabledAnalytics__contains&&e.enabledAnalytics__contains.length>0&&t.append("enabledAnalytics__contains",e.enabledAnalytics__contains.join(",")),e?.status__in&&e.status__in.length>0&&t.append("status__in",e.status__in.join(",")),e?.status__ne&&t.append("status__ne",e.status__ne);const i=t.toString(),a=`${n.baseUrl}/api/v3.0/cameras${i?`?${i}`:""}`;c("Fetching cameras:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return G(o);const s=await o.json();return c("Cameras fetched:",s.results?.length??0,"cameras"),d(s)}catch(o){return r("NETWORK_ERROR",`Failed to fetch cameras: ${String(o)}`)}}async function De(e,n){const t=f();if(!t.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!t.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");if(!e)return r("VALIDATION_ERROR","Camera ID is required");const i=new URLSearchParams;n?.include&&n.include.length>0&&i.append("include",n.include.join(","));const a=i.toString(),o=`${t.baseUrl}/api/v3.0/cameras/${encodeURIComponent(e)}${a?`?${a}`:""}`;c("Fetching camera:",o);try{const s=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!s.ok)return G(s);const l=await s.json();return c("Camera fetched:",l.name),d(l)}catch(s){return r("NETWORK_ERROR",`Failed to fetch camera: ${String(s)}`)}}async function G(e){const n=e.status;let t;try{const i=await e.json();t=i.message??i.error??e.statusText}catch(i){c("Failed to parse error response JSON:",i),t=e.statusText||"Unknown error"}switch(n){case 401:return r("AUTH_REQUIRED",`Authentication failed: ${t}`,n);case 403:return r("FORBIDDEN",`Access denied: ${t}`,n);case 404:return r("NOT_FOUND",`Not found: ${t}`,n);case 429:return r("RATE_LIMITED",`Rate limited: ${t}`,n);default:return r("API_ERROR",`API error: ${t}`,n)}}async function we(e){const n=f();if(!n.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");const t=new URLSearchParams;e?.pageSize&&t.append("pageSize",String(e.pageSize)),e?.pageToken&&t.append("pageToken",e.pageToken),e?.include&&e.include.length>0&&t.append("include",e.include.join(",")),e?.sort&&e.sort.length>0&&t.append("sort",e.sort.join(",")),e?.locationId__in&&e.locationId__in.length>0&&t.append("locationId__in",e.locationId__in.join(",")),e?.tags__contains&&e.tags__contains.length>0&&t.append("tags__contains",e.tags__contains.join(",")),e?.tags__any&&e.tags__any.length>0&&t.append("tags__any",e.tags__any.join(",")),e?.name&&t.append("name",e.name),e?.name__contains&&t.append("name__contains",e.name__contains),e?.name__in&&e.name__in.length>0&&t.append("name__in",e.name__in.join(",")),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.id__notIn&&e.id__notIn.length>0&&t.append("id__notIn",e.id__notIn.join(",")),e?.q&&t.append("q",e.q),typeof e?.qRelevance__gte=="number"&&t.append("qRelevance__gte",String(e.qRelevance__gte)),e?.status__in&&e.status__in.length>0&&t.append("status__in",e.status__in.join(",")),e?.status__ne&&t.append("status__ne",e.status__ne);const i=t.toString(),a=`${n.baseUrl}/api/v3.0/bridges${i?`?${i}`:""}`;c("Fetching bridges:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return X(o);const s=await o.json();return c("Bridges fetched:",s.results?.length??0,"bridges"),d(s)}catch(o){return r("NETWORK_ERROR",`Failed to fetch bridges: ${String(o)}`)}}async function be(e,n){const t=f();if(!t.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!t.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");if(!e)return r("VALIDATION_ERROR","Bridge ID is required");const i=new URLSearchParams;n?.include&&n.include.length>0&&i.append("include",n.include.join(","));const a=i.toString(),o=`${t.baseUrl}/api/v3.0/bridges/${encodeURIComponent(e)}${a?`?${a}`:""}`;c("Fetching bridge:",o);try{const s=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!s.ok)return X(s);const l=await s.json();return c("Bridge fetched:",l.name),d(l)}catch(s){return r("NETWORK_ERROR",`Failed to fetch bridge: ${String(s)}`)}}async function X(e){const n=e.status;let t;try{const i=await e.json();t=i.message??i.error??e.statusText}catch(i){c("Failed to parse error response JSON:",i),t=e.statusText||"Unknown error"}switch(n){case 401:return r("AUTH_REQUIRED",`Authentication failed: ${t}`,n);case 403:return r("FORBIDDEN",`Access denied: ${t}`,n);case 404:return r("NOT_FOUND",`Not found: ${t}`,n);case 429:return r("RATE_LIMITED",`Rate limited: ${t}`,n);default:return r("API_ERROR",`API error: ${t}`,n)}}const Le=3e4;function v(e=Le){const n=new AbortController,t=setTimeout(()=>n.abort(),e);return{controller:n,timeoutId:t}}function J(e){const n=new Uint8Array(e),t=8192,i=[];for(let o=0;o<n.byteLength;o+=t){const s=n.subarray(o,Math.min(o+t,n.byteLength));let l="";for(let _=0;_<s.length;_++)l+=String.fromCharCode(s[_]);i.push(l)}const a=i.join("");return typeof btoa=="function"?btoa(a):Buffer.from(a,"binary").toString("base64")}async function je(e){const n=f();if(!n.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");if(!e.deviceId)return r("VALIDATION_ERROR","Device ID is required");if(!e.type)return r("VALIDATION_ERROR","Stream type is required (preview or main)");if(!e.mediaType)return r("VALIDATION_ERROR","Media type is required (video or image)");if(!e.startTimestamp)return r("VALIDATION_ERROR","Start timestamp is required");const t=new URLSearchParams;t.append("deviceId",e.deviceId),t.append("type",e.type),t.append("mediaType",e.mediaType),t.append("startTimestamp__gte",e.startTimestamp),e.endTimestamp&&t.append("endTimestamp__lte",e.endTimestamp),typeof e.coalesce=="boolean"&&t.append("coalesce",String(e.coalesce)),e.include&&e.include.length>0&&t.append("include",e.include.join(",")),e.pageToken&&t.append("pageToken",e.pageToken),typeof e.pageSize=="number"&&t.append("pageSize",String(e.pageSize));const i=`${n.baseUrl}/api/v3.0/media?${t.toString()}`;c("Fetching media intervals:",i);const{controller:a,timeoutId:o}=v();try{const s=await fetch(i,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`},signal:a.signal});if(!s.ok)return $(s);const l=await s.json();return c("Media intervals fetched:",l.results?.length??0,"intervals"),d(l)}catch(s){return s instanceof Error&&s.name==="AbortError"?r("NETWORK_ERROR","Request timed out"):r("NETWORK_ERROR",`Failed to fetch media intervals: ${String(s)}`)}finally{clearTimeout(o)}}async function Ne(e){const n=f();if(!n.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");if(!e.deviceId)return r("VALIDATION_ERROR","Device ID is required");const t=e.type??"preview",i=new URLSearchParams;i.append("deviceId",e.deviceId),i.append("type",t);const a=`${n.baseUrl}/api/v3.0/media/liveImage.jpeg?${i.toString()}`;c("Fetching live image:",a);const{controller:o,timeoutId:s}=v();try{const l=await fetch(a,{method:"GET",headers:{Accept:"image/jpeg",Authorization:`Bearer ${n.token}`},signal:o.signal}),_=l.headers.get("X-Een-Timestamp"),p=l.headers.get("X-Een-PrevToken");if(!l.ok)return $(l);const R=await l.arrayBuffer(),y=`data:image/jpeg;base64,${J(R)}`;return c("Live image fetched, timestamp:",_),d({imageData:y,timestamp:_,prevToken:p})}catch(l){return l instanceof Error&&l.name==="AbortError"?r("NETWORK_ERROR","Request timed out"):r("NETWORK_ERROR",`Failed to fetch live image: ${String(l)}`)}finally{clearTimeout(s)}}async function Fe(e){const n=f();if(!n.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");if(!e.deviceId&&!e.pageToken)return r("VALIDATION_ERROR","Either deviceId or pageToken is required");if(!e.pageToken&&!(e.timestamp__lt||e.timestamp__lte||e.timestamp||e.timestamp__gte||e.timestamp__gt))return r("VALIDATION_ERROR","At least one timestamp parameter is required");if(e.include?.includes("overlaySvgHeader")&&(!e.overlayId__in||e.overlayId__in.length===0))return r("VALIDATION_ERROR","At least one overlayId must be provided when requesting overlay headers");const t=new URLSearchParams;e.deviceId&&t.append("deviceId",e.deviceId),e.pageToken&&t.append("pageToken",e.pageToken),e.type&&t.append("type",e.type),e.timestamp__lt&&t.append("timestamp__lt",e.timestamp__lt),e.timestamp__lte&&t.append("timestamp__lte",e.timestamp__lte),e.timestamp&&t.append("timestamp",e.timestamp),e.timestamp__gte&&t.append("timestamp__gte",e.timestamp__gte),e.timestamp__gt&&t.append("timestamp__gt",e.timestamp__gt),e.overlayId__in&&e.overlayId__in.length>0&&t.append("overlayId__in",e.overlayId__in.join(",")),e.include&&e.include.length>0&&t.append("include",e.include.join(",")),typeof e.targetWidth=="number"&&t.append("targetWidth",String(e.targetWidth)),typeof e.targetHeight=="number"&&t.append("targetHeight",String(e.targetHeight));const i=`${n.baseUrl}/api/v3.0/media/recordedImage.jpeg?${t.toString()}`;c("Fetching recorded image:",i);const{controller:a,timeoutId:o}=v();try{const s=await fetch(i,{method:"GET",headers:{Accept:"image/jpeg",Authorization:`Bearer ${n.token}`},signal:a.signal}),l=s.headers.get("X-Een-Timestamp"),_=s.headers.get("X-Een-NextToken"),p=s.headers.get("X-Een-PrevToken"),R=s.headers.get("X-Een-OverlaySvg");if(!s.ok)return $(s);const E=await s.arrayBuffer(),S=`data:image/jpeg;base64,${J(E)}`;return c("Recorded image fetched, timestamp:",l),d({imageData:S,timestamp:l,nextToken:_,prevToken:p,overlaySvg:R})}catch(s){return s instanceof Error&&s.name==="AbortError"?r("NETWORK_ERROR","Request timed out"):r("NETWORK_ERROR",`Failed to fetch recorded image: ${String(s)}`)}finally{clearTimeout(o)}}async function $(e){const n=e.status;let t;try{const i=await e.json();t=i.message??i.error??e.statusText}catch{t=e.statusText||"Unknown error"}switch(n){case 401:return r("AUTH_REQUIRED",`Authentication failed: ${t}`,n);case 403:return r("FORBIDDEN",`Access denied: ${t}`,n);case 404:return r("NOT_FOUND",`Not found: ${t}`,n);case 429:return r("RATE_LIMITED",`Rate limited: ${t}`,n);case 503:return r("SERVICE_UNAVAILABLE",`Service unavailable: ${t}`,n);default:return r("API_ERROR",`API error: ${t}`,n)}}async function Y(){const e=f();if(!e.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!e.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");const n=`${e.baseUrl}/api/v3.0/media/session`;c("Fetching media session:",n);const{controller:t,timeoutId:i}=v();try{const a=await fetch(n,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${e.token}`},signal:t.signal});if(!a.ok)return $(a);const o=await a.json();return c("Media session URL received:",o.url),d(o)}catch(a){return a instanceof Error&&a.name==="AbortError"?r("NETWORK_ERROR","Request timed out"):r("NETWORK_ERROR",`Failed to fetch media session: ${String(a)}`)}finally{clearTimeout(i)}}async function qe(){const e=f();if(!e.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");const n=await Y();if(n.error)return r(n.error.code,`Failed to get media session: ${n.error.message}`,n.error.status);if(!n.data?.url)return r("API_ERROR","No session URL returned from media session endpoint");const t=n.data.url;c("Calling session URL to set cookie:",t);const{controller:i,timeoutId:a}=v();try{const o=await fetch(t,{method:"GET",credentials:"include",headers:{Accept:"*/*",Authorization:`Bearer ${e.token}`},signal:i.signal});if(!o.ok&&o.status!==204){const s=o.status;let l;try{const _=await o.json();l=_.message??_.error??o.statusText}catch{l=o.statusText||"Unknown error"}return r("API_ERROR",`Failed to set media session cookie: ${l}`,s)}return c("Media session cookie set successfully"),d({success:!0,sessionUrl:t})}catch(o){return o instanceof Error&&o.name==="AbortError"?r("NETWORK_ERROR","Request timed out while setting session cookie"):r("NETWORK_ERROR",`Failed to set media session cookie: ${String(o)}`)}finally{clearTimeout(a)}}async function Pe(e){const n=f();if(!n.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");const t=new URLSearchParams;typeof e?.pageSize=="number"&&t.append("pageSize",String(e.pageSize)),e?.pageToken&&t.append("pageToken",e.pageToken),e?.deviceId&&t.append("deviceId",e.deviceId),e?.deviceId__in&&e.deviceId__in.length>0&&t.append("deviceId__in",e.deviceId__in.join(",")),e?.type&&t.append("type",e.type),e?.include&&e.include.length>0&&t.append("include",e.include.join(","));const i=t.toString(),a=`${n.baseUrl}/api/v3.0/feeds${i?`?${i}`:""}`;c("Fetching feeds:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`},signal:e?.signal});if(!o.ok)return Be(o);const s=await o.json();return c("Feeds fetched:",s.results?.length??0,"feeds"),d(s)}catch(o){return r("NETWORK_ERROR",`Failed to fetch feeds: ${String(o)}`)}}async function Be(e){const n=e.status;let t;try{const i=await e.json();t=i.message??i.error}catch(i){c("Failed to parse error response JSON:",i)}switch(n){case 401:return r("AUTH_REQUIRED",t||"Authentication failed",n);case 403:return r("FORBIDDEN",t||"Access denied",n);case 404:return r("NOT_FOUND",t||"Not found",n);case 429:return r("RATE_LIMITED",t||"Rate limited",n);case 503:return r("SERVICE_UNAVAILABLE",t||"Service unavailable",n);default:return r("API_ERROR",t||e.statusText||"API error",n)}}function k(e){return e.endsWith("+00:00")?e:e.endsWith("Z")?e.replace("Z","+00:00"):e}async function xe(e){const n=f();if(!n.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");if(!e.actor)return r("VALIDATION_ERROR","actor parameter is required");if(!e.type__in||e.type__in.length===0)return r("VALIDATION_ERROR","type__in parameter is required and must not be empty");if(!e.startTimestamp__gte)return r("VALIDATION_ERROR","startTimestamp__gte parameter is required");const t=new URLSearchParams;t.append("actor",e.actor),t.append("type__in",e.type__in.join(",")),t.append("startTimestamp__gte",k(e.startTimestamp__gte)),e.pageSize&&t.append("pageSize",String(e.pageSize)),e.pageToken&&t.append("pageToken",e.pageToken),e.startTimestamp__lte&&t.append("startTimestamp__lte",k(e.startTimestamp__lte)),e.endTimestamp__gte&&t.append("endTimestamp__gte",k(e.endTimestamp__gte)),e.endTimestamp__lte&&t.append("endTimestamp__lte",k(e.endTimestamp__lte)),e.sort&&t.append("sort",e.sort),e.include&&e.include.length>0&&t.append("include",e.include.join(","));const i=t.toString(),a=`${n.baseUrl}/api/v3.0/events${i?`?${i}`:""}`;c("Fetching events:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return D(o);const s=await o.json();return c("Events fetched:",s.results?.length??0,"events"),d(s)}catch(o){return r("NETWORK_ERROR",`Failed to fetch events: ${String(o)}`)}}async function Ce(e,n){const t=f();if(!t.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!t.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");if(!e)return r("VALIDATION_ERROR","Event ID is required");const i=new URLSearchParams;n?.include&&n.include.length>0&&i.append("include",n.include.join(","));const a=i.toString(),o=`${t.baseUrl}/api/v3.0/events/${encodeURIComponent(e)}${a?`?${a}`:""}`;c("Fetching event:",o);try{const s=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!s.ok)return D(s);const l=await s.json();return c("Event fetched:",l.id),d(l)}catch(s){return r("NETWORK_ERROR",`Failed to fetch event: ${String(s)}`)}}async function He(e){const n=f();if(!n.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");const t=new URLSearchParams;e?.pageSize&&t.append("pageSize",String(e.pageSize)),e?.pageToken&&t.append("pageToken",e.pageToken),e?.language&&t.append("language",e.language);const i=t.toString(),a=`${n.baseUrl}/api/v3.0/eventTypes${i?`?${i}`:""}`;c("Fetching event types:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return D(o);const s=await o.json();return c("Event types fetched:",s.results?.length??0,"types"),d(s)}catch(o){return r("NETWORK_ERROR",`Failed to fetch event types: ${String(o)}`)}}async function ze(e){const n=f();if(!n.isAuthenticated)return r("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return r("AUTH_REQUIRED","Base URL not configured");if(!e.actor)return r("VALIDATION_ERROR","actor parameter is required");const t=new URLSearchParams;t.append("actor",e.actor);const i=t.toString(),a=`${n.baseUrl}/api/v3.0/events:listFieldValues${i?`?${i}`:""}`;c("Fetching event field values:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return D(o);const s=await o.json();return c("Event field values fetched:",s.type?.length??0,"types"),d(s)}catch(o){return r("NETWORK_ERROR",`Failed to fetch event field values: ${String(o)}`)}}async function D(e){const n=e.status;let t;try{const i=await e.json();t=i.message??i.error??e.statusText}catch(i){c("Failed to parse error response JSON:",i),t=e.statusText||"Unknown error"}switch(n){case 401:return r("AUTH_REQUIRED",`Authentication failed: ${t}`,n);case 403:return r("FORBIDDEN",`Access denied: ${t}`,n);case 404:return r("NOT_FOUND",`Not found: ${t}`,n);case 429:return r("RATE_LIMITED",`Rate limited: ${t}`,n);default:return r("API_ERROR",`API error: ${t}`,n)}}exports.STORAGE_STRATEGY_DESCRIPTIONS=Re;exports.failure=r;exports.getAccessToken=B;exports.getAuthUrl=Q;exports.getBridge=be;exports.getBridges=we;exports.getCamera=De;exports.getCameras=$e;exports.getClientId=M;exports.getConfig=Ae;exports.getCurrentUser=me;exports.getEvent=Ce;exports.getLiveImage=Ne;exports.getMediaSession=Y;exports.getProxyUrl=O;exports.getRecordedImage=Fe;exports.getRedirectUri=P;exports.getStorageStrategy=Te;exports.getUser=Oe;exports.getUsers=ke;exports.handleAuthCallback=K;exports.initEenToolkit=Ie;exports.initMediaSession=qe;exports.listEventFieldValues=ze;exports.listEventTypes=He;exports.listEvents=xe;exports.listFeeds=Pe;exports.listMedia=je;exports.refreshToken=V;exports.revokeToken=W;exports.success=d;exports.useAuthStore=f;
2
2
  //# sourceMappingURL=index.cjs.map