een-api-toolkit 0.3.49 → 0.3.54
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.
- package/.claude/agents/docs-accuracy-reviewer.md +27 -1
- package/.claude/agents/een-events-agent.md +71 -1
- package/CHANGELOG.md +5 -7
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +214 -0
- package/dist/index.js +688 -405
- package/dist/index.js.map +1 -1
- package/docs/AI-CONTEXT.md +1 -1
- package/docs/ai-reference/AI-AUTH.md +1 -1
- package/docs/ai-reference/AI-AUTOMATIONS.md +1 -1
- package/docs/ai-reference/AI-DEVICES.md +1 -1
- package/docs/ai-reference/AI-EVENT-DATA-SCHEMAS.md +311 -0
- package/docs/ai-reference/AI-EVENTS.md +119 -5
- package/docs/ai-reference/AI-GROUPING.md +1 -1
- package/docs/ai-reference/AI-JOBS.md +1 -1
- package/docs/ai-reference/AI-MEDIA.md +1 -1
- package/docs/ai-reference/AI-SETUP.md +1 -1
- package/docs/ai-reference/AI-USERS.md +1 -1
- package/examples/vue-events/src/components/EventsModal.vue +333 -4
- package/package.json +1 -1
|
@@ -132,7 +132,10 @@ assistant: "I'll use the docs-accuracy-reviewer agent to verify the een-* agent
|
|
|
132
132
|
- **Code Examples**: Ensure all code examples use current API patterns and would actually compile
|
|
133
133
|
- **Referenced Examples**: Verify that referenced example directories (`examples/vue-*/`) exist
|
|
134
134
|
- **Referenced Docs**: Verify that referenced documentation files (`docs/ai-reference/AI-*.md`) exist
|
|
135
|
-
- **Version Consistency**:
|
|
135
|
+
- **Version Consistency**: Verify that version numbers in all AI reference documents match `package.json`. Pay special attention to:
|
|
136
|
+
- `docs/ai-reference/AI-EVENT-DATA-SCHEMAS.md` - manually maintained file that must have correct version (line 3)
|
|
137
|
+
- All other `docs/ai-reference/AI-*.md` files are auto-generated and should have consistent versions
|
|
138
|
+
- If versions are mismatched, run `npm run docs:ai-context` to regenerate all docs with current version
|
|
136
139
|
|
|
137
140
|
## Output Format
|
|
138
141
|
|
|
@@ -186,3 +189,26 @@ These are the most common inaccuracies found in agent files:
|
|
|
186
189
|
- Using `startTimestamp` instead of `startTimestamp__gte` for event filters
|
|
187
190
|
- Using `width/height` instead of `targetWidth/targetHeight` for image dimensions
|
|
188
191
|
- Missing `formatTimestamp()` calls for timestamp parameters
|
|
192
|
+
|
|
193
|
+
## AI-EVENT-DATA-SCHEMAS.md Specific Checks
|
|
194
|
+
|
|
195
|
+
The `docs/ai-reference/AI-EVENT-DATA-SCHEMAS.md` file is manually maintained and requires special attention:
|
|
196
|
+
|
|
197
|
+
1. **Version Check**: Verify the version on line 3 matches `package.json` version
|
|
198
|
+
- Pattern: `> **Version:** X.Y.Z`
|
|
199
|
+
- If mismatched, run `npm run docs:ai-context` to update it automatically
|
|
200
|
+
|
|
201
|
+
2. **Event Type Coverage**: Verify documented event types match those exported from `src/events/dataSchemas.ts`
|
|
202
|
+
- Check `EVENT_TYPE_DATA_SCHEMAS` constant has all documented event types
|
|
203
|
+
- Check `KnownEventType` type includes all event type names
|
|
204
|
+
|
|
205
|
+
3. **Data Schema Coverage**: Verify documented data schemas match those in `src/events/dataSchemas.ts`
|
|
206
|
+
- Check `DataSchema` type includes all schema names used in the mapping
|
|
207
|
+
|
|
208
|
+
4. **Function Signatures**: Verify documented utility functions match actual exports:
|
|
209
|
+
- `getIncludeParameterForEventTypes(eventTypes: string[]): string[]`
|
|
210
|
+
- `getDataSchemasForEventType(eventType: string): readonly string[]`
|
|
211
|
+
- `eventTypeHasDataSchemas(eventType: string): boolean`
|
|
212
|
+
- `getEventTypesForDataSchema(schema: string): string[]`
|
|
213
|
+
- `getAllDataSchemas(): string[]`
|
|
214
|
+
- `getAllKnownEventTypes(): string[]`
|
|
@@ -38,6 +38,7 @@ assistant: "I'll use the een-events-agent to help set up SSE (Server-Sent Events
|
|
|
38
38
|
- docs/ai-reference/AI-AUTH.md (auth is required)
|
|
39
39
|
- docs/ai-reference/AI-DEVICES.md (events are per-camera)
|
|
40
40
|
- docs/ai-reference/AI-EVENTS.md (primary reference)
|
|
41
|
+
- docs/ai-reference/AI-EVENT-DATA-SCHEMAS.md (event type to data schema mapping)
|
|
41
42
|
|
|
42
43
|
## Reference Examples
|
|
43
44
|
- examples/vue-events/ (Event listing with bounding boxes)
|
|
@@ -52,6 +53,8 @@ assistant: "I'll use the een-events-agent to help set up SSE (Server-Sent Events
|
|
|
52
53
|
5. List notifications with listNotifications()
|
|
53
54
|
6. Create SSE subscriptions with createEventSubscription()
|
|
54
55
|
7. Connect to real-time streams with connectToEventSubscription()
|
|
56
|
+
8. Build dynamic include parameters with getIncludeParameterForEventTypes()
|
|
57
|
+
9. Map event types to data schemas with EVENT_TYPE_DATA_SCHEMAS
|
|
55
58
|
|
|
56
59
|
## Key Types
|
|
57
60
|
|
|
@@ -86,10 +89,77 @@ interface ListEventsParams {
|
|
|
86
89
|
endTimestamp__lte?: string // Optional: filter by event end time
|
|
87
90
|
pageSize?: number
|
|
88
91
|
pageToken?: string
|
|
89
|
-
include?: string[] //
|
|
92
|
+
include?: string[] // Data schemas to include (see below)
|
|
90
93
|
}
|
|
91
94
|
```
|
|
92
95
|
|
|
96
|
+
### Include Parameter & Data Schemas
|
|
97
|
+
|
|
98
|
+
The `include` parameter controls which data schemas are populated in the `event.data[]` array.
|
|
99
|
+
Include values are derived from the event's `dataSchemas` array by adding the `data.` prefix.
|
|
100
|
+
|
|
101
|
+
**How it works:**
|
|
102
|
+
1. Each event has a `dataSchemas` array listing available schemas (e.g., `['een.objectDetection.v1', 'een.fullFrameImageUrl.v1']`)
|
|
103
|
+
2. To include that data, prefix with `data.` (e.g., `include: ['data.een.objectDetection.v1']`)
|
|
104
|
+
3. Without includes, the event may return with minimal or empty `data[]`
|
|
105
|
+
|
|
106
|
+
**Common data schemas:**
|
|
107
|
+
| Schema | Include Value | Description |
|
|
108
|
+
|--------|---------------|-------------|
|
|
109
|
+
| `een.objectDetection.v1` | `data.een.objectDetection.v1` | Bounding boxes `[x1, y1, x2, y2]` (normalized 0-1) |
|
|
110
|
+
| `een.objectClassification.v1` | `data.een.objectClassification.v1` | Object labels (person, vehicle, etc.) |
|
|
111
|
+
| `een.fullFrameImageUrl.v1` | `data.een.fullFrameImageUrl.v1` | Full frame image URL |
|
|
112
|
+
| `een.croppedFrameImageUrl.v1` | `data.een.croppedFrameImageUrl.v1` | Cropped/zoomed image URL |
|
|
113
|
+
| `een.fullFrameImageUrlWithOverlay.v1` | `data.een.fullFrameImageUrlWithOverlay.v1` | Image URL with bounding box overlay |
|
|
114
|
+
| `een.eevaAttributes.v1` | `data.een.eevaAttributes.v1` | EEVA analytics attributes |
|
|
115
|
+
| `een.customLabels.v1` | `data.een.customLabels.v1` | Custom detection labels |
|
|
116
|
+
|
|
117
|
+
**Fetching full event details:**
|
|
118
|
+
```typescript
|
|
119
|
+
import { getEvent } from 'een-api-toolkit'
|
|
120
|
+
|
|
121
|
+
// Get event with all available data based on its dataSchemas
|
|
122
|
+
const simpleEvent = events.value.find(e => e.id === eventId)
|
|
123
|
+
const includes = simpleEvent?.dataSchemas.map(schema => `data.${schema}`) || []
|
|
124
|
+
|
|
125
|
+
const { data: fullEvent } = await getEvent(eventId, { include: includes })
|
|
126
|
+
// fullEvent.data[] now contains all available data objects
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Event Type to Data Schema Mapping
|
|
130
|
+
|
|
131
|
+
The toolkit provides a static mapping and utility functions for dynamically building the `include` parameter:
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
import {
|
|
135
|
+
getIncludeParameterForEventTypes,
|
|
136
|
+
getDataSchemasForEventType,
|
|
137
|
+
eventTypeHasDataSchemas,
|
|
138
|
+
EVENT_TYPE_DATA_SCHEMAS
|
|
139
|
+
} from 'een-api-toolkit'
|
|
140
|
+
|
|
141
|
+
// Get include values for selected event types (with data. prefix)
|
|
142
|
+
const includeValues = getIncludeParameterForEventTypes([
|
|
143
|
+
'een.personDetectionEvent.v1',
|
|
144
|
+
'een.vehicleDetectionEvent.v1'
|
|
145
|
+
])
|
|
146
|
+
// ['data.een.objectDetection.v1', 'data.een.personAttributes.v1', ...]
|
|
147
|
+
|
|
148
|
+
// Get schemas for a specific event type (without data. prefix)
|
|
149
|
+
const schemas = getDataSchemasForEventType('een.personDetectionEvent.v1')
|
|
150
|
+
// ['een.objectDetection.v1', 'een.personAttributes.v1', ...]
|
|
151
|
+
|
|
152
|
+
// Check if event type has data schemas
|
|
153
|
+
if (eventTypeHasDataSchemas('een.personDetectionEvent.v1')) {
|
|
154
|
+
// Include data schemas in the API call
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Access the complete mapping
|
|
158
|
+
const mapping = EVENT_TYPE_DATA_SCHEMAS['een.motionDetectionEvent.v1']
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
See `docs/ai-reference/AI-EVENT-DATA-SCHEMAS.md` for the complete event type to data schema reference.
|
|
162
|
+
|
|
93
163
|
### EventMetric Interface
|
|
94
164
|
```typescript
|
|
95
165
|
interface EventMetric {
|
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
-
## [0.3.
|
|
5
|
+
## [0.3.54] - 2026-02-03
|
|
6
6
|
|
|
7
7
|
### Release Summary
|
|
8
8
|
|
|
@@ -11,14 +11,12 @@ No PR descriptions available for this release.
|
|
|
11
11
|
### Detailed Changes
|
|
12
12
|
|
|
13
13
|
#### Features
|
|
14
|
-
- feat: Add
|
|
15
|
-
|
|
16
|
-
#### Bug Fixes
|
|
17
|
-
- fix: Correct job file access patterns and download examples
|
|
14
|
+
- feat: Add auto version update for AI-EVENT-DATA-SCHEMAS.md and sanity tests
|
|
15
|
+
- feat: Add event type to data schema mapping for dynamic include parameter
|
|
18
16
|
|
|
19
17
|
### Links
|
|
20
18
|
- [npm package](https://www.npmjs.com/package/een-api-toolkit)
|
|
21
|
-
- [Full Changelog](https://github.com/klaushofrichter/een-api-toolkit/compare/v0.3.
|
|
19
|
+
- [Full Changelog](https://github.com/klaushofrichter/een-api-toolkit/compare/v0.3.51...v0.3.54)
|
|
22
20
|
|
|
23
21
|
---
|
|
24
|
-
*Released: 2026-
|
|
22
|
+
*Released: 2026-02-03 17:39:05 CST*
|
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Ie=require("pinia"),p=require("vue"),Ue={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1},ye=()=>{try{return Ue?.VITE_DEBUG==="true"}catch{return!1}};function s(...e){ye()&&console.log("[een-api-toolkit]",...e)}const Se={localStorage:"persists across sessions",sessionStorage:"per-tab, cleared on tab close",memory:"tokens lost on page refresh"};class ve{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 ne{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 M="localStorage",C=null;function x(){return C||(C=new ve),C}function $e(e){M=e}function De(){return M}function V(){switch(M){case"memory":return x();case"sessionStorage":return typeof sessionStorage<"u"?new ne(sessionStorage):(s("sessionStorage unavailable, falling back to memory storage"),x());default:return typeof localStorage<"u"?new ne(localStorage):(s("localStorage unavailable, falling back to memory storage"),x())}}const $={};let k={};function Oe(e={}){const n=e.storageStrategy??"localStorage";$e(n),k={proxyUrl:e.proxyUrl??$?.VITE_PROXY_URL,clientId:e.clientId??$?.VITE_EEN_CLIENT_ID,redirectUri:e.redirectUri??$?.VITE_REDIRECT_URI,storageStrategy:n,debug:e.debug??$?.VITE_DEBUG==="true"}}function be(){return k}function F(){return k.proxyUrl??$?.VITE_PROXY_URL}function ie(){return k.clientId??$?.VITE_EEN_CLIENT_ID}function K(){return k.redirectUri??$?.VITE_REDIRECT_URI??"http://127.0.0.1:3333"}function l(e){return{data:e,error:null}}function i(e,n,t,r){return{data:null,error:{code:e,message:n,status:t,details:r}}}function T(e){return e.endsWith("+00:00")?e:e.endsWith("Z")?e.replace("Z","+00:00"):e}let W=null;function ke(){return W||(W=Promise.resolve().then(()=>je).then(e=>e.refreshToken)),W}const f=Ie.defineStore("een-auth",()=>{const e=p.ref(null),n=p.ref(null),t=p.ref(null),r=p.ref(null),a=p.ref(null),o=p.ref(443),c=p.ref(null),u=p.ref(null),R=p.ref(!1);let h=null;const A=p.ref(!1),_=p.ref(null),S=p.computed(()=>!!e.value),v=p.computed(()=>a.value?o.value===443?`https://${a.value}`:`https://${a.value}:${o.value}`:null),E=p.computed(()=>n.value?Date.now()>=n.value:!0),H=p.computed(()=>n.value?Math.max(0,n.value-Date.now()):0);function z(d,g){e.value=d,n.value=Date.now()+g*1e3,O(),Q(),s("Token set, expires in",g,"seconds")}function N(d){t.value=d,O()}function y(d){r.value=d,O()}function D(d){if(typeof d=="string")try{const g=new URL(d.startsWith("http")?d:`https://${d}`);a.value=g.hostname,o.value=g.port?parseInt(g.port,10):443}catch(g){s("Failed to parse URL, using as hostname:",g instanceof Error?g.message:String(g)),a.value=d,o.value=443}else a.value=d.hostname,o.value=d.port??443;O(),s("Base URL set:",v.value)}function I(d){c.value=d,O()}function Q(){if(u.value&&(clearTimeout(u.value),u.value=null),!n.value||!e.value)return;const d=Date.now(),b=n.value-d,q=300*1e3,Ee=b/2,Ae=Math.min(q,Ee),Te=Math.max(b-Ae,60*1e3),te=Math.max(Te,5e3);s("Auto-refresh scheduled in",Math.round(te/1e3),"seconds"),u.value=setTimeout(async()=>{await _e()},te)}async function _e(){return h?(s("Refresh already in progress, waiting for existing refresh"),h):(R.value=!0,s("Performing auto-refresh"),h=(async()=>{try{const g=await(await ke())();g.error?(A.value=!0,_.value=g.error.message,s("Auto-refresh failed:",g.error.message)):(A.value=!1,_.value=null,s("Auto-refresh successful"))}catch(d){A.value=!0,_.value=d instanceof Error?d.message:String(d),s("Auto-refresh error:",d)}finally{R.value=!1,h=null}})(),h)}function Re(){A.value=!1,_.value=null}function ee(){u.value&&(clearTimeout(u.value),u.value=null),e.value=null,n.value=null,t.value=null,r.value=null,a.value=null,o.value=443,c.value=null,A.value=!1,_.value=null,pe(),s("Logged out")}function he(){ge(),e.value&&!E.value?(Q(),s("Initialized from storage")):e.value&&E.value&&(s("Stored token expired, clearing"),ee())}function O(){try{const d=V();e.value&&d.setItem("een_token",e.value),n.value&&d.setItem("een_tokenExpiration",String(n.value)),t.value&&d.setItem("een_refreshTokenMarker",t.value),r.value&&d.setItem("een_sessionId",r.value),a.value&&d.setItem("een_hostname",a.value),o.value!==443&&d.setItem("een_port",String(o.value)),c.value&&d.setItem("een_userProfile",JSON.stringify(c.value))}catch(d){s("Failed to save to storage:",d instanceof Error?d.message:String(d))}}function ge(){try{const d=V();e.value=d.getItem("een_token");const g=d.getItem("een_tokenExpiration");n.value=g?parseInt(g,10):null,t.value=d.getItem("een_refreshTokenMarker"),r.value=d.getItem("een_sessionId"),a.value=d.getItem("een_hostname");const b=d.getItem("een_port");o.value=b?parseInt(b,10):443;const q=d.getItem("een_userProfile");c.value=q?JSON.parse(q):null}catch(d){s("Failed to load from storage:",d instanceof Error?d.message:String(d))}}function pe(){try{const d=V();d.removeItem("een_token"),d.removeItem("een_tokenExpiration"),d.removeItem("een_refreshTokenMarker"),d.removeItem("een_sessionId"),d.removeItem("een_hostname"),d.removeItem("een_port"),d.removeItem("een_userProfile")}catch(d){s("Failed to clear storage:",d instanceof Error?d.message:String(d))}}return{token:e,tokenExpiration:n,refreshTokenMarker:t,sessionId:r,hostname:a,port:o,userProfile:c,isRefreshing:R,refreshFailed:A,refreshFailedMessage:_,isAuthenticated:S,baseUrl:v,isTokenExpired:E,tokenExpiresIn:H,setToken:z,setRefreshTokenMarker:N,setSessionId:y,setBaseUrl:D,setUserProfile:I,setupAutoRefresh:Q,clearRefreshFailed:Re,logout:ee,initialize:he}}),we="https://auth.eagleeyenetworks.com/oauth2/authorize";function re(){const e=ie();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:K(),state:n});return s("Generated auth URL with state:",n),`${we}?${t.toString()}`}async function G(e){const n=F();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:K()});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 s("Token received, expires in:",a.expiresIn),l(a)}catch(r){return i("NETWORK_ERROR",`Failed to exchange code: ${String(r)}`)}}async function oe(){const e=F();if(!e)return i("AUTH_FAILED","Proxy URL not configured");const n=f();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),s("Token refreshed, expires in:",a.expiresIn),l(a)}catch(t){return i("NETWORK_ERROR",`Failed to refresh token: ${String(t)}`)}}async function ae(){const e=F();if(!e)return i("AUTH_FAILED","Proxy URL not configured");const n=f();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 s("Token revoked"),l(void 0)}catch(t){return n.logout(),i("NETWORK_ERROR",`Failed to revoke token: ${String(t)}`)}}async function ce(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(!Le(n,t))return i("AUTH_FAILED","Invalid OAuth state. Possible CSRF attack.");s("State validated, exchanging code for token");const r=await G(e);if(r.error)return r;const a=f(),o=r.data;return a.setToken(o.accessToken,o.expiresIn),a.setRefreshTokenMarker("present"),a.setSessionId(o.sessionId),a.setBaseUrl(o.httpsBaseUrl),s("Auth callback complete, user:",o.userEmail),l(o)}function Le(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 je=Object.freeze(Object.defineProperty({__proto__:null,getAccessToken:G,getAuthUrl:re,handleAuthCallback:ce,refreshToken:oe,revokeToken:ae},Symbol.toStringTag,{value:"Module"}));async function Ne(){const e=f();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`;s("Fetching current user:",n);try{const t=await fetch(n,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${e.token}`}});if(!t.ok)return J(t);const r=await t.json();return s("Current user fetched:",r.email),e.setUserProfile(r),l(r)}catch(t){return i("NETWORK_ERROR",`Failed to fetch current user: ${String(t)}`)}}async function qe(e){const n=f();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}`:""}`;s("Fetching users:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return J(o);const c=await o.json();return s("Users fetched:",c.results?.length??0,"users"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch users: ${String(o)}`)}}async function Fe(e,n){const t=f();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}`:""}`;s("Fetching user:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return J(c);const u=await c.json();return s("User fetched:",u.email),l(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch user: ${String(c)}`)}}async function J(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 me(e){const n=f();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}`:""}`;s("Fetching cameras:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return se(o);const c=await o.json();return s("Cameras fetched:",c.results?.length??0,"cameras"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch cameras: ${String(o)}`)}}async function Be(e,n){const t=f();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}`:""}`;s("Fetching camera:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return se(c);const u=await c.json();return s("Camera fetched:",u.name),l(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch camera: ${String(c)}`)}}async function se(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 Pe(e){const n=f();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}`:""}`;s("Fetching bridges:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return ue(o);const c=await o.json();return s("Bridges fetched:",c.results?.length??0,"bridges"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch bridges: ${String(o)}`)}}async function He(e,n){const t=f();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}`:""}`;s("Fetching bridge:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return ue(c);const u=await c.json();return s("Bridge fetched:",u.name),l(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch bridge: ${String(c)}`)}}async function ue(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 ze(e){const n=f();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?.name&&t.append("name",e.name),e?.name__in&&e.name__in.length>0&&t.append("name__in",e.name__in.join(",")),e?.name__contains&&t.append("name__contains",e.name__contains),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.["layoutPanes.cameras.bridgeId"]&&t.append("layoutPanes.cameras.bridgeId",e["layoutPanes.cameras.bridgeId"]),e?.q&&t.append("q",e.q),typeof e?.qRelevance__gte=="number"&&t.append("qRelevance__gte",String(e.qRelevance__gte));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/layouts${r?`?${r}`:""}`;s("Fetching layouts:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return w(o);const c=await o.json();return s("Layouts fetched:",c.results?.length??0,"layouts"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch layouts: ${String(o)}`)}}async function Qe(e,n){const t=f();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","Layout 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/layouts/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching layout:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return w(c);const u=await c.json();return s("Layout fetched:",u.name),l(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch layout: ${String(c)}`)}}async function Ce(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.name)return i("VALIDATION_ERROR","Layout name is required");if(!e.settings)return i("VALIDATION_ERROR","Layout settings are required");const t=`${n.baseUrl}/api/v3.0/layouts`;s("Creating layout:",e.name);const r={name:e.name,settings:e.settings};e.panes&&(r.panes=e.panes);try{const a=await fetch(t,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${n.token}`},body:JSON.stringify(r)});if(!a.ok)return w(a);const o=await a.json();return s("Layout created:",o.id,o.name),l(o)}catch(a){return i("NETWORK_ERROR",`Failed to create layout: ${String(a)}`)}}async function xe(e,n){const t=f();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","Layout ID is required");if(n.name===void 0&&n.settings===void 0&&n.panes===void 0)return i("VALIDATION_ERROR","At least one field (name, settings, or panes) must be provided for update");const r=`${t.baseUrl}/api/v3.0/layouts/${encodeURIComponent(e)}`;s("Updating layout:",e);const a={};n.name!==void 0&&(a.name=n.name),n.settings!==void 0&&(a.settings=n.settings),n.panes!==void 0&&(a.panes=n.panes);try{const o=await fetch(r,{method:"PATCH",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${t.token}`},body:JSON.stringify(a)});return o.ok?(s("Layout updated:",e),l(void 0)):w(o)}catch(o){return i("NETWORK_ERROR",`Failed to update layout: ${String(o)}`)}}async function Ve(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Layout ID is required");const t=`${n.baseUrl}/api/v3.0/layouts/${encodeURIComponent(e)}`;s("Deleting layout:",e);try{const r=await fetch(t,{method:"DELETE",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});return r.ok?(s("Layout deleted:",e),l(void 0)):w(r)}catch(r){return i("NETWORK_ERROR",`Failed to delete layout: ${String(r)}`)}}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){s("Failed to parse error response JSON:",r),t=e.statusText||"Unknown error"}switch(n){case 400:return i("VALIDATION_ERROR",`Bad request: ${t}`,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 We=3e4;function L(e=We){const n=new AbortController,t=setTimeout(()=>n.abort(),e);return{controller:n,timeoutId:t}}function de(e){const n=new Uint8Array(e),t=8192,r=[];for(let o=0;o<n.byteLength;o+=t){const c=n.subarray(o,Math.min(o+t,n.byteLength));let u="";for(let R=0;R<c.length;R++)u+=String.fromCharCode(c[R]);r.push(u)}const a=r.join("");return typeof btoa=="function"?btoa(a):Buffer.from(a,"binary").toString("base64")}async function Me(e){const n=f();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()}`;s("Fetching media intervals:",r);const{controller:a,timeoutId:o}=L();try{const c=await fetch(r,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`},signal:a.signal});if(!c.ok)return m(c);const u=await c.json();return s("Media intervals fetched:",u.results?.length??0,"intervals"),l(u)}catch(c){return c instanceof Error&&c.name==="AbortError"?i("NETWORK_ERROR","Request timed out"):i("NETWORK_ERROR",`Failed to fetch media intervals: ${String(c)}`)}finally{clearTimeout(o)}}async function Ke(e){const n=f();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()}`;s("Fetching live image:",a);const{controller:o,timeoutId:c}=L();try{const u=await fetch(a,{method:"GET",headers:{Accept:"image/jpeg",Authorization:`Bearer ${n.token}`},signal:o.signal}),R=u.headers.get("X-Een-Timestamp"),h=u.headers.get("X-Een-PrevToken");if(!u.ok)return m(u);const A=await u.arrayBuffer(),S=`data:image/jpeg;base64,${de(A)}`;return s("Live image fetched, timestamp:",R),l({imageData:S,timestamp:R,prevToken:h})}catch(u){return u instanceof Error&&u.name==="AbortError"?i("NETWORK_ERROR","Request timed out"):i("NETWORK_ERROR",`Failed to fetch live image: ${String(u)}`)}finally{clearTimeout(c)}}async function Ge(e){const n=f();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()}`;s("Fetching recorded image:",r);const{controller:a,timeoutId:o}=L();try{const c=await fetch(r,{method:"GET",headers:{Accept:"image/jpeg",Authorization:`Bearer ${n.token}`},signal:a.signal}),u=c.headers.get("X-Een-Timestamp"),R=c.headers.get("X-Een-NextToken"),h=c.headers.get("X-Een-PrevToken"),A=c.headers.get("X-Een-OverlaySvg");if(!c.ok)return m(c);const _=await c.arrayBuffer(),v=`data:image/jpeg;base64,${de(_)}`;return s("Recorded image fetched, timestamp:",u),l({imageData:v,timestamp:u,nextToken:R,prevToken:h,overlaySvg:A})}catch(c){return c instanceof Error&&c.name==="AbortError"?i("NETWORK_ERROR","Request timed out"):i("NETWORK_ERROR",`Failed to fetch recorded image: ${String(c)}`)}finally{clearTimeout(o)}}async function m(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 le(){const e=f();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`;s("Fetching media session:",n);const{controller:t,timeoutId:r}=L();try{const a=await fetch(n,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${e.token}`},signal:t.signal});if(!a.ok)return m(a);const o=await a.json();return s("Media session URL received:",o.url),l(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 Je(){const e=f();if(!e.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");const n=await le();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;s("Calling session URL to set cookie:",t);const{controller:r,timeoutId:a}=L();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 c=o.status;let u;try{const R=await o.json();u=R.message??R.error??o.statusText}catch{u=o.statusText||"Unknown error"}return i("API_ERROR",`Failed to set media session cookie: ${u}`,c)}return s("Media session cookie set successfully"),l({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 Xe(e){const n=f();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}`:""}`;s("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 Ye(o);const c=await o.json();return s("Feeds fetched:",c.results?.length??0,"feeds"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch feeds: ${String(o)}`)}}async function Ye(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error}catch(r){s("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)}}async function Ze(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.actor)return i("VALIDATION_ERROR","actor parameter is required");if(!e.type__in||e.type__in.length===0)return i("VALIDATION_ERROR","type__in parameter is required and must not be empty");if(!e.startTimestamp__gte)return i("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",T(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",T(e.startTimestamp__lte)),e.endTimestamp__gte&&t.append("endTimestamp__gte",T(e.endTimestamp__gte)),e.endTimestamp__lte&&t.append("endTimestamp__lte",T(e.endTimestamp__lte)),e.sort&&t.append("sort",e.sort),e.include&&e.include.length>0&&t.append("include",e.include.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/events${r?`?${r}`:""}`;s("Fetching events:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return B(o);const c=await o.json();return s("Events fetched:",c.results?.length??0,"events"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch events: ${String(o)}`)}}async function et(e,n){const t=f();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","Event 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/events/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching event:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return B(c);const u=await c.json();return s("Event fetched:",u.id),l(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch event: ${String(c)}`)}}async function tt(e){const n=f();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?.language&&t.append("language",e.language);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/eventTypes${r?`?${r}`:""}`;s("Fetching event types:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return B(o);const c=await o.json();return s("Event types fetched:",c.results?.length??0,"types"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch event types: ${String(o)}`)}}async function nt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.actor)return i("VALIDATION_ERROR","actor parameter is required");const t=new URLSearchParams;t.append("actor",e.actor);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/events:listFieldValues${r?`?${r}`:""}`;s("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 B(o);const c=await o.json();return s("Event field values fetched:",c.type?.length??0,"types"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch event field values: ${String(o)}`)}}async function B(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 it(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.actor)return i("VALIDATION_ERROR","actor parameter is required");if(!e.eventType)return i("VALIDATION_ERROR","eventType parameter is required");const t=new URLSearchParams;t.append("actor",e.actor),t.append("eventType",e.eventType),e.timestamp__gte&&t.append("timestamp__gte",T(e.timestamp__gte)),e.timestamp__lte&&t.append("timestamp__lte",T(e.timestamp__lte)),e.aggregateByMinutes!==void 0&&t.append("aggregateByMinutes",String(e.aggregateByMinutes));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/eventMetrics${r?`?${r}`:""}`;s("Fetching event metrics:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return rt(o);const c=await o.json();return s("Event metrics fetched:",c.length,"metrics"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch event metrics: ${String(o)}`)}}async function rt(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 ot(e){const n=f();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?.timestamp__lte&&t.append("timestamp__lte",T(e.timestamp__lte)),e?.timestamp__gte&&t.append("timestamp__gte",T(e.timestamp__gte)),e?.creatorId&&t.append("creatorId",e.creatorId),e?.alertType__in&&e.alertType__in.length>0&&t.append("alertType__in",e.alertType__in.join(",")),e?.actorId__in&&e.actorId__in.length>0&&t.append("actorId__in",e.actorId__in.join(",")),e?.actorType__in&&e.actorType__in.length>0&&t.append("actorType__in",e.actorType__in.join(",")),e?.actorAccountId&&t.append("actorAccountId",e.actorAccountId),e?.ruleId&&t.append("ruleId",e.ruleId),e?.ruleId__in&&e.ruleId__in.length>0&&t.append("ruleId__in",e.ruleId__in.join(",")),e?.eventId&&t.append("eventId",e.eventId),e?.locationId__in&&e.locationId__in.length>0&&t.append("locationId__in",e.locationId__in.join(",")),e?.priority__gte!==void 0&&t.append("priority__gte",String(e.priority__gte)),e?.priority__lte!==void 0&&t.append("priority__lte",String(e.priority__lte)),e?.showInvalidAlerts!==void 0&&t.append("showInvalidAlerts",String(e.showInvalidAlerts)),e?.alertActionId__in&&e.alertActionId__in.length>0&&t.append("alertActionId__in",e.alertActionId__in.join(",")),e?.alertActionStatus__in&&e.alertActionStatus__in.length>0&&t.append("alertActionStatus__in",e.alertActionStatus__in.join(",")),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?.language&&t.append("language",e.language);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/alerts${r?`?${r}`:""}`;s("Fetching alerts:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return X(o);const c=await o.json();return s("Alerts fetched:",c.results?.length??0,"alerts"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch alerts: ${String(o)}`)}}async function at(e,n){const t=f();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","Alert 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/alerts/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching alert:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return X(c);const u=await c.json();return s("Alert fetched:",u.id),l(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch alert: ${String(c)}`)}}async function ct(e){const n=f();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);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/alertTypes${r?`?${r}`:""}`;s("Fetching alert types:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return X(o);const c=await o.json();return s("Alert types fetched:",c.results?.length??0,"types"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch alert types: ${String(o)}`)}}async function X(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 st(e){const n=f();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?.timestamp__lte&&t.append("timestamp__lte",T(e.timestamp__lte)),e?.timestamp__gte&&t.append("timestamp__gte",T(e.timestamp__gte)),e?.alertId&&t.append("alertId",e.alertId),e?.alertType&&t.append("alertType",e.alertType),e?.actorId&&t.append("actorId",e.actorId),e?.actorType&&t.append("actorType",e.actorType),e?.actorAccountId&&t.append("actorAccountId",e.actorAccountId),e?.category&&t.append("category",e.category),e?.userId&&t.append("userId",e.userId),e?.read!==void 0&&t.append("read",String(e.read)),e?.status&&t.append("status",e.status),e?.includeV1Notifications!==void 0&&t.append("includeV1Notifications",String(e.includeV1Notifications)),e?.sort&&e.sort.length>0&&t.append("sort",e.sort.join(",")),e?.language&&t.append("language",e.language);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/notifications${r?`?${r}`:""}`;s("Fetching notifications:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return fe(o);const c=await o.json();return s("Notifications fetched:",c.results?.length??0,"notifications"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch notifications: ${String(o)}`)}}async function ut(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Notification ID is required");const t=`${n.baseUrl}/api/v3.0/notifications/${encodeURIComponent(e)}`;s("Fetching notification:",t);try{const r=await fetch(t,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!r.ok)return fe(r);const a=await r.json();return s("Notification fetched:",a.id),l(a)}catch(r){return i("NETWORK_ERROR",`Failed to fetch notification: ${String(r)}`)}}async function fe(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 dt(e){const n=f();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);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/eventSubscriptions${r?`?${r}`:""}`;s("Fetching event subscriptions:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return P(o);const c=await o.json();return s("Event subscriptions fetched:",c.results?.length??0,"subscriptions"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch event subscriptions: ${String(o)}`)}}async function lt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Subscription ID is required");const t=`${n.baseUrl}/api/v3.0/eventSubscriptions/${encodeURIComponent(e)}`;s("Fetching event subscription:",t);try{const r=await fetch(t,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!r.ok)return P(r);const a=await r.json();return s("Event subscription fetched:",a.id),l(a)}catch(r){return i("NETWORK_ERROR",`Failed to fetch event subscription: ${String(r)}`)}}async function ft(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.deliveryConfig)return i("VALIDATION_ERROR","deliveryConfig is required");if(!e.filters||e.filters.length===0)return i("VALIDATION_ERROR","At least one filter is required");for(const r of e.filters){if(!r.actors||r.actors.length===0)return i("VALIDATION_ERROR","Each filter must have at least one actor");if(!r.types||r.types.length===0)return i("VALIDATION_ERROR","Each filter must have at least one event type")}const t=`${n.baseUrl}/api/v3.0/eventSubscriptions`;s("Creating event subscription:",t);try{const r=await fetch(t,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${n.token}`},body:JSON.stringify(e)});if(!r.ok)return P(r);const a=await r.json();return s("Event subscription created:",a.id),l(a)}catch(r){return i("NETWORK_ERROR",`Failed to create event subscription: ${String(r)}`)}}async function _t(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Subscription ID is required");const t=`${n.baseUrl}/api/v3.0/eventSubscriptions/${encodeURIComponent(e)}`;s("Deleting event subscription:",t);try{const r=await fetch(t,{method:"DELETE",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});return r.ok?(s("Event subscription deleted:",e),l(void 0)):P(r)}catch(r){return i("NETWORK_ERROR",`Failed to delete event subscription: ${String(r)}`)}}function Rt(e,n){const t=f();if(!t.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!t.token)return i("AUTH_REQUIRED","Access token not available");if(!e)return i("VALIDATION_ERROR","SSE URL is required");try{const _=new URL(e);if(![".eagleeyenetworks.com",".een.cloud"].some(E=>_.hostname===E.substring(1)||_.hostname.endsWith(E)))return i("VALIDATION_ERROR",`SSE URL domain not allowed: ${_.hostname}`)}catch{return i("VALIDATION_ERROR","Invalid SSE URL format")}const r=1024*1024;let a="connecting",o=new AbortController,c=!1;const u=_=>{a=_,n.onStatusChange?.(a)},R=()=>{c||(c=!0,s("Closing SSE connection"),o?.abort(),o=null,u("disconnected"))};return(async()=>{if(!(c||!o)){u("connecting"),s("Connecting to SSE:",e);try{const _=await fetch(e,{method:"GET",headers:{Accept:"text/event-stream",Authorization:`Bearer ${t.token}`},signal:o.signal});if(!_.ok)throw new Error(`HTTP ${_.status}: ${_.statusText}`);if(!_.body)throw new Error("Response body is not available");u("connected"),s("SSE connected");const S=_.body.getReader(),v=new TextDecoder;let E="";for(;!c;){const{done:H,value:z}=await S.read();if(H){s("SSE stream ended");break}if(E+=v.decode(z,{stream:!0}),E.length>r){s("SSE buffer exceeded maximum size, resetting"),E="";continue}const N=E.split(`
|
|
2
|
-
`);E=
|
|
3
|
-
${I}`:I}else if(D===""&&y){try{const I=JSON.parse(y);s("SSE event received:",I.type,I.actorId),n.onEvent(I)}catch(I){s("Failed to parse SSE event:",I)}y=""}}}catch(_){if(c||_ instanceof Error&&_.name==="AbortError")return;s("SSE error:",_),u("error"),n.onError?.(_ instanceof Error?_:new Error(String(_)))}}})(),l({close:R,get status(){return a}})}async function P(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("Failed to parse error response JSON:",r),t=e.statusText||"Unknown error"}switch(n){case 401:return i("AUTH_REQUIRED",t,n);case 403:return i("FORBIDDEN",t,n);case 404:return i("NOT_FOUND",t,n);case 429:return i("RATE_LIMITED",t,n);default:return i("API_ERROR",t,n)}}async function ht(e){const n=f();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?.enabled!==void 0&&t.append("enabled",String(e.enabled)),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.outputAlertType__in&&e.outputAlertType__in.length>0&&t.append("outputAlertType__in",e.outputAlertType__in.join(",")),e?.priority__gte!==void 0&&t.append("priority__gte",String(e.priority__gte)),e?.priority__lte!==void 0&&t.append("priority__lte",String(e.priority__lte));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/eventAlertConditionRules${r?`?${r}`:""}`;s("Fetching event alert condition rules:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return U(o);const c=await o.json();return s("Event alert condition rules fetched:",c.results?.length??0,"rules"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch event alert condition rules: ${String(o)}`)}}async function gt(e){const n=f();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?.enabled!==void 0&&t.append("enabled",String(e.enabled));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/eventAlertConditionRules:listFieldValues${r?`?${r}`:""}`;s("Fetching event alert condition rule field values:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return U(o);const c=await o.json();return s("Event alert condition rule field values fetched"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch field values: ${String(o)}`)}}async function pt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Rule ID is required");const t=`${n.baseUrl}/api/v3.0/eventAlertConditionRules/${encodeURIComponent(e)}`;s("Fetching event alert condition rule:",t);try{const r=await fetch(t,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!r.ok)return U(r);const a=await r.json();return s("Event alert condition rule fetched:",a.id),l(a)}catch(r){return i("NETWORK_ERROR",`Failed to fetch event alert condition rule: ${String(r)}`)}}async function Et(e){const n=f();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?.enabled!==void 0&&t.append("enabled",String(e.enabled)),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.actorId__in&&e.actorId__in.length>0&&t.append("actorId__in",e.actorId__in.join(",")),e?.inputEventType__in&&e.inputEventType__in.length>0&&t.append("inputEventType__in",e.inputEventType__in.join(",")),e?.outputAlertType&&t.append("outputAlertType",e.outputAlertType),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/alertConditionRules${r?`?${r}`:""}`;s("Fetching alert condition rules:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return U(o);const c=await o.json();return s("Alert condition rules fetched:",c.results?.length??0,"rules"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch alert condition rules: ${String(o)}`)}}async function At(e,n){const t=f();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","Rule 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/alertConditionRules/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching alert condition rule:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return U(c);const u=await c.json();return s("Alert condition rule fetched:",u.id),l(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch alert condition rule: ${String(c)}`)}}async function Tt(e){const n=f();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?.enabled!==void 0&&t.append("enabled",String(e.enabled)),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.alertType__in&&e.alertType__in.length>0&&t.append("alertType__in",e.alertType__in.join(",")),e?.actorId__in&&e.actorId__in.length>0&&t.append("actorId__in",e.actorId__in.join(",")),e?.alertActionId__in&&e.alertActionId__in.length>0&&t.append("alertActionId__in",e.alertActionId__in.join(",")),e?.ruleId__in&&e.ruleId__in.length>0&&t.append("ruleId__in",e.ruleId__in.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/alertActionRules${r?`?${r}`:""}`;s("Fetching alert action rules:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return U(o);const c=await o.json();return s("Alert action rules fetched:",c.results?.length??0,"rules"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch alert action rules: ${String(o)}`)}}async function It(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Rule ID is required");const t=`${n.baseUrl}/api/v3.0/alertActionRules/${encodeURIComponent(e)}`;s("Fetching alert action rule:",t);try{const r=await fetch(t,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!r.ok)return U(r);const a=await r.json();return s("Alert action rule fetched:",a.id),l(a)}catch(r){return i("NETWORK_ERROR",`Failed to fetch alert action rule: ${String(r)}`)}}async function Ut(e){const n=f();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?.enabled!==void 0&&t.append("enabled",String(e.enabled)),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.type__in&&e.type__in.length>0&&t.append("type__in",e.type__in.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/alertActions${r?`?${r}`:""}`;s("Fetching alert actions:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return U(o);const c=await o.json();return s("Alert actions fetched:",c.results?.length??0,"actions"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch alert actions: ${String(o)}`)}}async function yt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Action ID is required");const t=`${n.baseUrl}/api/v3.0/alertActions/${encodeURIComponent(e)}`;s("Fetching alert action:",t);try{const r=await fetch(t,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!r.ok)return U(r);const a=await r.json();return s("Alert action fetched:",a.id),l(a)}catch(r){return i("NETWORK_ERROR",`Failed to fetch alert action: ${String(r)}`)}}async function U(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 St(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.cameraId)return i("VALIDATION_ERROR","Camera ID is required");if(!e.type)return i("VALIDATION_ERROR","Export type is required");if(!e.startTimestamp)return i("VALIDATION_ERROR","Start timestamp is required");if(!e.endTimestamp)return i("VALIDATION_ERROR","End timestamp is required");const t=`${n.baseUrl}/api/v3.0/exports`;if(s("Creating export job:",t),(e.type==="timeLapse"||e.type==="bundle")&&!e.playbackMultiplier)return i("VALIDATION_ERROR","Playback multiplier is required for timeLapse and bundle exports");if(e.playbackMultiplier!==void 0&&(e.playbackMultiplier<1||e.playbackMultiplier>48))return i("VALIDATION_ERROR","Playback multiplier must be between 1 and 48");const r={name:e.name||`Export-${Date.now()}`,directory:e.directory||"/"};e.notes&&(r.notes=e.notes),e.tags&&e.tags.length>0&&(r.tags=e.tags);const a={startTimestamp:e.startTimestamp,endTimestamp:e.endTimestamp},o={deviceId:e.cameraId,type:e.type,info:r,period:a};e.playbackMultiplier!==void 0&&(o.playbackMultiplier=e.playbackMultiplier),e.autoDelete!==void 0&&(o.autoDelete=e.autoDelete);try{const c=await fetch(t,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${n.token}`},body:JSON.stringify(o)});if(!c.ok)return vt(c);const u=await c.json();return s("Export job created:",u.id),l(u)}catch(c){return i("NETWORK_ERROR",`Failed to create export job: ${String(c)}`)}}async function vt(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 $t(e){const n=f();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?.state__in&&e.state__in.length>0&&t.append("state__in",e.state__in.join(",")),e?.type&&t.append("type",e.type),e?.type__in&&e.type__in.length>0&&t.append("type__in",e.type__in.join(",")),e?.createTimestamp__gte&&t.append("createTimestamp__gte",e.createTimestamp__gte),e?.createTimestamp__lte&&t.append("createTimestamp__lte",e.createTimestamp__lte),e?.userId&&t.append("userId",e.userId),e?.sort&&e.sort.length>0&&t.append("sort",e.sort.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/jobs${r?`?${r}`:""}`;s("Fetching jobs:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return Y(o);const c=await o.json();return s("Jobs fetched:",c.results?.length??0,"jobs"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch jobs: ${String(o)}`)}}async function Dt(e,n){const t=f();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","Job 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/jobs/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching job:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return Y(c);const u=await c.json();return s("Job fetched:",u.arguments?.originalRequest?.name||u.id,"state:",u.state),l(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch job: ${String(c)}`)}}async function Ot(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Job ID is required");const t=`${n.baseUrl}/api/v3.0/jobs/${encodeURIComponent(e)}`;s("Deleting job:",t);try{const r=await fetch(t,{method:"DELETE",headers:{Authorization:`Bearer ${n.token}`}});return r.ok?(s("Job deleted:",e),l(void 0)):Y(r)}catch(r){return i("NETWORK_ERROR",`Failed to delete job: ${String(r)}`)}}async function Y(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 bt(e){const n=f();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?.type__in&&e.type__in.length>0&&t.append("type__in",e.type__in.join(",")),e?.cameraId&&t.append("cameraId",e.cameraId),e?.cameraId__in&&e.cameraId__in.length>0&&t.append("cameraId__in",e.cameraId__in.join(",")),e?.jobId&&t.append("jobId",e.jobId),e?.createTimestamp__gte&&t.append("createTimestamp__gte",e.createTimestamp__gte),e?.createTimestamp__lte&&t.append("createTimestamp__lte",e.createTimestamp__lte),e?.tags__contains&&e.tags__contains.length>0&&t.append("tags__contains",e.tags__contains.join(",")),e?.q&&t.append("q",e.q),e?.sort&&e.sort.length>0&&t.append("sort",e.sort.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/files${r?`?${r}`:""}`;s("Fetching files:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return j(o);const c=await o.json();return s("Files fetched:",c.results?.length??0,"files"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch files: ${String(o)}`)}}async function kt(e,n){const t=f();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","File 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/files/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching file:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return j(c);const u=await c.json();return s("File fetched:",u.name),l(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch file: ${String(c)}`)}}async function wt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.name)return i("VALIDATION_ERROR","File name is required");const t=`${n.baseUrl}/api/v3.0/files`;s("Creating file:",t);const r={name:e.name};e.type&&(r.type=e.type),e.filename&&(r.filename=e.filename),e.description&&(r.description=e.description),e.tags&&e.tags.length>0&&(r.tags=e.tags),e.cameraId&&(r.cameraId=e.cameraId);try{const a=await fetch(t,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${n.token}`},body:JSON.stringify(r)});if(!a.ok)return j(a);const o=await a.json();return s("File created:",o.id),l(o)}catch(a){return i("NETWORK_ERROR",`Failed to create file: ${String(a)}`)}}async function Lt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","File ID is required");const t=`${n.baseUrl}/api/v3.0/files/${encodeURIComponent(e)}:download`;s("Downloading file:",t);try{const r=await fetch(t,{method:"GET",headers:{Authorization:`Bearer ${n.token}`}});if(!r.ok)return j(r);const a=await r.blob(),o=r.headers.get("Content-Disposition");let c="download";if(o){const h=o.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);h&&h[1]&&(c=h[1].replace(/['"]/g,""))}const u=r.headers.get("Content-Type")||"application/octet-stream",R={blob:a,filename:c,contentType:u,size:a.size};return s("File downloaded:",c,a.size,"bytes"),l(R)}catch(r){return i("NETWORK_ERROR",`Failed to download file: ${String(r)}`)}}async function jt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","File ID is required");const t=`${n.baseUrl}/api/v3.0/files/${encodeURIComponent(e)}`;s("Deleting file:",t);try{const r=await fetch(t,{method:"DELETE",headers:{Authorization:`Bearer ${n.token}`}});return r.ok?(s("File deleted (recycled):",e),l(void 0)):j(r)}catch(r){return i("NETWORK_ERROR",`Failed to delete file: ${String(r)}`)}}async function j(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 Nt(e){const n=f();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?.status__in&&e.status__in.length>0&&t.append("status__in",e.status__in.join(",")),e?.cameraId&&t.append("cameraId",e.cameraId),e?.cameraId__in&&e.cameraId__in.length>0&&t.append("cameraId__in",e.cameraId__in.join(",")),e?.jobId&&t.append("jobId",e.jobId),e?.fileId&&t.append("fileId",e.fileId),e?.createTimestamp__gte&&t.append("createTimestamp__gte",e.createTimestamp__gte),e?.createTimestamp__lte&&t.append("createTimestamp__lte",e.createTimestamp__lte),e?.q&&t.append("q",e.q),e?.sort&&e.sort.length>0&&t.append("sort",e.sort.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/downloads${r?`?${r}`:""}`;s("Fetching downloads:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return Z(o);const c=await o.json();return s("Downloads fetched:",c.results?.length??0,"downloads"),l(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch downloads: ${String(o)}`)}}async function qt(e,n){const t=f();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","Download 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/downloads/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching download:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return Z(c);const u=await c.json();return s("Download fetched:",u.name,"status:",u.status),l(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch download: ${String(c)}`)}}async function Ft(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Download ID is required");const t=`${n.baseUrl}/api/v3.0/downloads/${encodeURIComponent(e)}:download`;s("Downloading:",t);try{const r=await fetch(t,{method:"GET",headers:{Authorization:`Bearer ${n.token}`}});if(!r.ok)return Z(r);const a=await r.blob(),o=r.headers.get("Content-Disposition");let c="download";if(o){const h=o.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);h&&h[1]&&(c=h[1].replace(/['"]/g,""))}const u=r.headers.get("Content-Type")||"application/octet-stream",R={blob:a,filename:c,contentType:u,size:a.size};return s("Downloaded:",c,a.size,"bytes"),l(R)}catch(r){return i("NETWORK_ERROR",`Failed to download: ${String(r)}`)}}async function Z(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)}}exports.STORAGE_STRATEGY_DESCRIPTIONS=Se;exports.addFile=wt;exports.connectToEventSubscription=Rt;exports.createEventSubscription=ft;exports.createExportJob=St;exports.createLayout=Ce;exports.deleteEventSubscription=_t;exports.deleteFile=jt;exports.deleteJob=Ot;exports.deleteLayout=Ve;exports.downloadDownload=Ft;exports.downloadFile=Lt;exports.failure=i;exports.formatTimestamp=T;exports.getAccessToken=G;exports.getAlert=at;exports.getAlertAction=yt;exports.getAlertActionRule=It;exports.getAlertConditionRule=At;exports.getAuthUrl=re;exports.getBridge=He;exports.getBridges=Pe;exports.getCamera=Be;exports.getCameras=me;exports.getClientId=ie;exports.getConfig=be;exports.getCurrentUser=Ne;exports.getDownload=qt;exports.getEvent=et;exports.getEventAlertConditionRule=pt;exports.getEventAlertConditionRuleFieldValues=gt;exports.getEventMetrics=it;exports.getEventSubscription=lt;exports.getFile=kt;exports.getJob=Dt;exports.getLayout=Qe;exports.getLayouts=ze;exports.getLiveImage=Ke;exports.getMediaSession=le;exports.getNotification=ut;exports.getProxyUrl=F;exports.getRecordedImage=Ge;exports.getRedirectUri=K;exports.getStorageStrategy=De;exports.getUser=Fe;exports.getUsers=qe;exports.handleAuthCallback=ce;exports.initEenToolkit=Oe;exports.initMediaSession=Je;exports.listAlertActionRules=Tt;exports.listAlertActions=Ut;exports.listAlertConditionRules=Et;exports.listAlertTypes=ct;exports.listAlerts=ot;exports.listDownloads=Nt;exports.listEventAlertConditionRules=ht;exports.listEventFieldValues=nt;exports.listEventSubscriptions=dt;exports.listEventTypes=tt;exports.listEvents=Ze;exports.listFeeds=Xe;exports.listFiles=bt;exports.listJobs=$t;exports.listMedia=Me;exports.listNotifications=st;exports.refreshToken=oe;exports.revokeToken=ae;exports.success=l;exports.updateLayout=xe;exports.useAuthStore=f;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Ue=require("pinia"),p=require("vue"),ye={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1},Se=()=>{try{return ye?.VITE_DEBUG==="true"}catch{return!1}};function s(...e){Se()&&console.log("[een-api-toolkit]",...e)}const De={localStorage:"persists across sessions",sessionStorage:"per-tab, cleared on tab close",memory:"tokens lost on page refresh"};class be{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 re{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 K="localStorage",x=null;function V(){return x||(x=new be),x}function $e(e){K=e}function Oe(){return K}function M(){switch(K){case"memory":return V();case"sessionStorage":return typeof sessionStorage<"u"?new re(sessionStorage):(s("sessionStorage unavailable, falling back to memory storage"),V());default:return typeof localStorage<"u"?new re(localStorage):(s("localStorage unavailable, falling back to memory storage"),V())}}const D={};let m={};function me(e={}){const n=e.storageStrategy??"localStorage";$e(n),m={proxyUrl:e.proxyUrl??D?.VITE_PROXY_URL,clientId:e.clientId??D?.VITE_EEN_CLIENT_ID,redirectUri:e.redirectUri??D?.VITE_REDIRECT_URI,storageStrategy:n,debug:e.debug??D?.VITE_DEBUG==="true"}}function ke(){return m}function q(){return m.proxyUrl??D?.VITE_PROXY_URL}function oe(){return m.clientId??D?.VITE_EEN_CLIENT_ID}function G(){return m.redirectUri??D?.VITE_REDIRECT_URI??"http://127.0.0.1:3333"}function d(e){return{data:e,error:null}}function i(e,n,t,r){return{data:null,error:{code:e,message:n,status:t,details:r}}}function v(e){return e.endsWith("+00:00")?e:e.endsWith("Z")?e.replace("Z","+00:00"):e}let W=null;function we(){return W||(W=Promise.resolve().then(()=>Le).then(e=>e.refreshToken)),W}const f=Ue.defineStore("een-auth",()=>{const e=p.ref(null),n=p.ref(null),t=p.ref(null),r=p.ref(null),a=p.ref(null),o=p.ref(443),c=p.ref(null),u=p.ref(null),_=p.ref(!1);let h=null;const A=p.ref(!1),g=p.ref(null),y=p.computed(()=>!!e.value),S=p.computed(()=>a.value?o.value===443?`https://${a.value}`:`https://${a.value}:${o.value}`:null),E=p.computed(()=>n.value?Date.now()>=n.value:!0),C=p.computed(()=>n.value?Math.max(0,n.value-Date.now()):0);function z(l,R){e.value=l,n.value=Date.now()+R*1e3,$(),Q(),s("Token set, expires in",R,"seconds")}function L(l){t.value=l,$()}function U(l){r.value=l,$()}function b(l){if(typeof l=="string")try{const R=new URL(l.startsWith("http")?l:`https://${l}`);a.value=R.hostname,o.value=R.port?parseInt(R.port,10):443}catch(R){s("Failed to parse URL, using as hostname:",R instanceof Error?R.message:String(R)),a.value=l,o.value=443}else a.value=l.hostname,o.value=l.port??443;$(),s("Base URL set:",S.value)}function T(l){c.value=l,$()}function Q(){if(u.value&&(clearTimeout(u.value),u.value=null),!n.value||!e.value)return;const l=Date.now(),O=n.value-l,N=300*1e3,ve=O/2,Te=Math.min(N,ve),Ie=Math.max(O-Te,60*1e3),ie=Math.max(Ie,5e3);s("Auto-refresh scheduled in",Math.round(ie/1e3),"seconds"),u.value=setTimeout(async()=>{await he()},ie)}async function he(){return h?(s("Refresh already in progress, waiting for existing refresh"),h):(_.value=!0,s("Performing auto-refresh"),h=(async()=>{try{const R=await(await we())();R.error?(A.value=!0,g.value=R.error.message,s("Auto-refresh failed:",R.error.message)):(A.value=!1,g.value=null,s("Auto-refresh successful"))}catch(l){A.value=!0,g.value=l instanceof Error?l.message:String(l),s("Auto-refresh error:",l)}finally{_.value=!1,h=null}})(),h)}function Re(){A.value=!1,g.value=null}function ne(){u.value&&(clearTimeout(u.value),u.value=null),e.value=null,n.value=null,t.value=null,r.value=null,a.value=null,o.value=443,c.value=null,A.value=!1,g.value=null,Ae(),s("Logged out")}function pe(){Ee(),e.value&&!E.value?(Q(),s("Initialized from storage")):e.value&&E.value&&(s("Stored token expired, clearing"),ne())}function $(){try{const l=M();e.value&&l.setItem("een_token",e.value),n.value&&l.setItem("een_tokenExpiration",String(n.value)),t.value&&l.setItem("een_refreshTokenMarker",t.value),r.value&&l.setItem("een_sessionId",r.value),a.value&&l.setItem("een_hostname",a.value),o.value!==443&&l.setItem("een_port",String(o.value)),c.value&&l.setItem("een_userProfile",JSON.stringify(c.value))}catch(l){s("Failed to save to storage:",l instanceof Error?l.message:String(l))}}function Ee(){try{const l=M();e.value=l.getItem("een_token");const R=l.getItem("een_tokenExpiration");n.value=R?parseInt(R,10):null,t.value=l.getItem("een_refreshTokenMarker"),r.value=l.getItem("een_sessionId"),a.value=l.getItem("een_hostname");const O=l.getItem("een_port");o.value=O?parseInt(O,10):443;const N=l.getItem("een_userProfile");c.value=N?JSON.parse(N):null}catch(l){s("Failed to load from storage:",l instanceof Error?l.message:String(l))}}function Ae(){try{const l=M();l.removeItem("een_token"),l.removeItem("een_tokenExpiration"),l.removeItem("een_refreshTokenMarker"),l.removeItem("een_sessionId"),l.removeItem("een_hostname"),l.removeItem("een_port"),l.removeItem("een_userProfile")}catch(l){s("Failed to clear storage:",l instanceof Error?l.message:String(l))}}return{token:e,tokenExpiration:n,refreshTokenMarker:t,sessionId:r,hostname:a,port:o,userProfile:c,isRefreshing:_,refreshFailed:A,refreshFailedMessage:g,isAuthenticated:y,baseUrl:S,isTokenExpired:E,tokenExpiresIn:C,setToken:z,setRefreshTokenMarker:L,setSessionId:U,setBaseUrl:b,setUserProfile:T,setupAutoRefresh:Q,clearRefreshFailed:Re,logout:ne,initialize:pe}}),je="https://auth.eagleeyenetworks.com/oauth2/authorize";function ae(){const e=oe();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:G(),state:n});return s("Generated auth URL with state:",n),`${je}?${t.toString()}`}async function J(e){const n=q();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:G()});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 s("Token received, expires in:",a.expiresIn),d(a)}catch(r){return i("NETWORK_ERROR",`Failed to exchange code: ${String(r)}`)}}async function ce(){const e=q();if(!e)return i("AUTH_FAILED","Proxy URL not configured");const n=f();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),s("Token refreshed, expires in:",a.expiresIn),d(a)}catch(t){return i("NETWORK_ERROR",`Failed to refresh token: ${String(t)}`)}}async function se(){const e=q();if(!e)return i("AUTH_FAILED","Proxy URL not configured");const n=f();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 s("Token revoked"),d(void 0)}catch(t){return n.logout(),i("NETWORK_ERROR",`Failed to revoke token: ${String(t)}`)}}async function ue(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(!Fe(n,t))return i("AUTH_FAILED","Invalid OAuth state. Possible CSRF attack.");s("State validated, exchanging code for token");const r=await J(e);if(r.error)return r;const a=f(),o=r.data;return a.setToken(o.accessToken,o.expiresIn),a.setRefreshTokenMarker("present"),a.setSessionId(o.sessionId),a.setBaseUrl(o.httpsBaseUrl),s("Auth callback complete, user:",o.userEmail),d(o)}function Fe(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 Le=Object.freeze(Object.defineProperty({__proto__:null,getAccessToken:J,getAuthUrl:ae,handleAuthCallback:ue,refreshToken:ce,revokeToken:se},Symbol.toStringTag,{value:"Module"}));async function Ne(){const e=f();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`;s("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 r=await t.json();return s("Current user fetched:",r.email),e.setUserProfile(r),d(r)}catch(t){return i("NETWORK_ERROR",`Failed to fetch current user: ${String(t)}`)}}async function qe(e){const n=f();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}`:""}`;s("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 c=await o.json();return s("Users fetched:",c.results?.length??0,"users"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch users: ${String(o)}`)}}async function Be(e,n){const t=f();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}`:""}`;s("Fetching user:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return X(c);const u=await c.json();return s("User fetched:",u.email),d(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch user: ${String(c)}`)}}async function X(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 Pe(e){const n=f();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}`:""}`;s("Fetching cameras:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return le(o);const c=await o.json();return s("Cameras fetched:",c.results?.length??0,"cameras"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch cameras: ${String(o)}`)}}async function He(e,n){const t=f();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}`:""}`;s("Fetching camera:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return le(c);const u=await c.json();return s("Camera fetched:",u.name),d(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch camera: ${String(c)}`)}}async function le(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 Ce(e){const n=f();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}`:""}`;s("Fetching bridges:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return de(o);const c=await o.json();return s("Bridges fetched:",c.results?.length??0,"bridges"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch bridges: ${String(o)}`)}}async function ze(e,n){const t=f();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}`:""}`;s("Fetching bridge:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return de(c);const u=await c.json();return s("Bridge fetched:",u.name),d(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch bridge: ${String(c)}`)}}async function de(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 Qe(e){const n=f();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?.name&&t.append("name",e.name),e?.name__in&&e.name__in.length>0&&t.append("name__in",e.name__in.join(",")),e?.name__contains&&t.append("name__contains",e.name__contains),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.["layoutPanes.cameras.bridgeId"]&&t.append("layoutPanes.cameras.bridgeId",e["layoutPanes.cameras.bridgeId"]),e?.q&&t.append("q",e.q),typeof e?.qRelevance__gte=="number"&&t.append("qRelevance__gte",String(e.qRelevance__gte));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/layouts${r?`?${r}`:""}`;s("Fetching layouts:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return k(o);const c=await o.json();return s("Layouts fetched:",c.results?.length??0,"layouts"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch layouts: ${String(o)}`)}}async function xe(e,n){const t=f();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","Layout 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/layouts/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching layout:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return k(c);const u=await c.json();return s("Layout fetched:",u.name),d(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch layout: ${String(c)}`)}}async function Ve(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.name)return i("VALIDATION_ERROR","Layout name is required");if(!e.settings)return i("VALIDATION_ERROR","Layout settings are required");const t=`${n.baseUrl}/api/v3.0/layouts`;s("Creating layout:",e.name);const r={name:e.name,settings:e.settings};e.panes&&(r.panes=e.panes);try{const a=await fetch(t,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${n.token}`},body:JSON.stringify(r)});if(!a.ok)return k(a);const o=await a.json();return s("Layout created:",o.id,o.name),d(o)}catch(a){return i("NETWORK_ERROR",`Failed to create layout: ${String(a)}`)}}async function Me(e,n){const t=f();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","Layout ID is required");if(n.name===void 0&&n.settings===void 0&&n.panes===void 0)return i("VALIDATION_ERROR","At least one field (name, settings, or panes) must be provided for update");const r=`${t.baseUrl}/api/v3.0/layouts/${encodeURIComponent(e)}`;s("Updating layout:",e);const a={};n.name!==void 0&&(a.name=n.name),n.settings!==void 0&&(a.settings=n.settings),n.panes!==void 0&&(a.panes=n.panes);try{const o=await fetch(r,{method:"PATCH",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${t.token}`},body:JSON.stringify(a)});return o.ok?(s("Layout updated:",e),d(void 0)):k(o)}catch(o){return i("NETWORK_ERROR",`Failed to update layout: ${String(o)}`)}}async function We(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Layout ID is required");const t=`${n.baseUrl}/api/v3.0/layouts/${encodeURIComponent(e)}`;s("Deleting layout:",e);try{const r=await fetch(t,{method:"DELETE",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});return r.ok?(s("Layout deleted:",e),d(void 0)):k(r)}catch(r){return i("NETWORK_ERROR",`Failed to delete layout: ${String(r)}`)}}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){s("Failed to parse error response JSON:",r),t=e.statusText||"Unknown error"}switch(n){case 400:return i("VALIDATION_ERROR",`Bad request: ${t}`,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 Ke=3e4;function w(e=Ke){const n=new AbortController,t=setTimeout(()=>n.abort(),e);return{controller:n,timeoutId:t}}function fe(e){const n=new Uint8Array(e),t=8192,r=[];for(let o=0;o<n.byteLength;o+=t){const c=n.subarray(o,Math.min(o+t,n.byteLength));let u="";for(let _=0;_<c.length;_++)u+=String.fromCharCode(c[_]);r.push(u)}const a=r.join("");return typeof btoa=="function"?btoa(a):Buffer.from(a,"binary").toString("base64")}async function Ge(e){const n=f();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()}`;s("Fetching media intervals:",r);const{controller:a,timeoutId:o}=w();try{const c=await fetch(r,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`},signal:a.signal});if(!c.ok)return B(c);const u=await c.json();return s("Media intervals fetched:",u.results?.length??0,"intervals"),d(u)}catch(c){return c instanceof Error&&c.name==="AbortError"?i("NETWORK_ERROR","Request timed out"):i("NETWORK_ERROR",`Failed to fetch media intervals: ${String(c)}`)}finally{clearTimeout(o)}}async function Je(e){const n=f();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()}`;s("Fetching live image:",a);const{controller:o,timeoutId:c}=w();try{const u=await fetch(a,{method:"GET",headers:{Accept:"image/jpeg",Authorization:`Bearer ${n.token}`},signal:o.signal}),_=u.headers.get("X-Een-Timestamp"),h=u.headers.get("X-Een-PrevToken");if(!u.ok)return B(u);const A=await u.arrayBuffer(),y=`data:image/jpeg;base64,${fe(A)}`;return s("Live image fetched, timestamp:",_),d({imageData:y,timestamp:_,prevToken:h})}catch(u){return u instanceof Error&&u.name==="AbortError"?i("NETWORK_ERROR","Request timed out"):i("NETWORK_ERROR",`Failed to fetch live image: ${String(u)}`)}finally{clearTimeout(c)}}async function Xe(e){const n=f();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()}`;s("Fetching recorded image:",r);const{controller:a,timeoutId:o}=w();try{const c=await fetch(r,{method:"GET",headers:{Accept:"image/jpeg",Authorization:`Bearer ${n.token}`},signal:a.signal}),u=c.headers.get("X-Een-Timestamp"),_=c.headers.get("X-Een-NextToken"),h=c.headers.get("X-Een-PrevToken"),A=c.headers.get("X-Een-OverlaySvg");if(!c.ok)return B(c);const g=await c.arrayBuffer(),S=`data:image/jpeg;base64,${fe(g)}`;return s("Recorded image fetched, timestamp:",u),d({imageData:S,timestamp:u,nextToken:_,prevToken:h,overlaySvg:A})}catch(c){return c instanceof Error&&c.name==="AbortError"?i("NETWORK_ERROR","Request timed out"):i("NETWORK_ERROR",`Failed to fetch recorded image: ${String(c)}`)}finally{clearTimeout(o)}}async function B(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 ge(){const e=f();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`;s("Fetching media session:",n);const{controller:t,timeoutId:r}=w();try{const a=await fetch(n,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${e.token}`},signal:t.signal});if(!a.ok)return B(a);const o=await a.json();return s("Media session URL received:",o.url),d(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 Ye(){const e=f();if(!e.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");const n=await ge();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;s("Calling session URL to set cookie:",t);const{controller:r,timeoutId:a}=w();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 c=o.status;let u;try{const _=await o.json();u=_.message??_.error??o.statusText}catch{u=o.statusText||"Unknown error"}return i("API_ERROR",`Failed to set media session cookie: ${u}`,c)}return s("Media session cookie set successfully"),d({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 Ze(e){const n=f();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}`:""}`;s("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 et(o);const c=await o.json();return s("Feeds fetched:",c.results?.length??0,"feeds"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch feeds: ${String(o)}`)}}async function et(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error}catch(r){s("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)}}async function tt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.actor)return i("VALIDATION_ERROR","actor parameter is required");if(!e.type__in||e.type__in.length===0)return i("VALIDATION_ERROR","type__in parameter is required and must not be empty");if(!e.startTimestamp__gte)return i("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",v(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",v(e.startTimestamp__lte)),e.endTimestamp__gte&&t.append("endTimestamp__gte",v(e.endTimestamp__gte)),e.endTimestamp__lte&&t.append("endTimestamp__lte",v(e.endTimestamp__lte)),e.sort&&t.append("sort",e.sort),e.include&&e.include.length>0&&t.append("include",e.include.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/events${r?`?${r}`:""}`;s("Fetching events:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return P(o);const c=await o.json();return s("Events fetched:",c.results?.length??0,"events"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch events: ${String(o)}`)}}async function nt(e,n){const t=f();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","Event 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/events/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching event:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return P(c);const u=await c.json();return s("Event fetched:",u.id),d(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch event: ${String(c)}`)}}async function it(e){const n=f();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?.language&&t.append("language",e.language);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/eventTypes${r?`?${r}`:""}`;s("Fetching event types:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return P(o);const c=await o.json();return s("Event types fetched:",c.results?.length??0,"types"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch event types: ${String(o)}`)}}async function rt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.actor)return i("VALIDATION_ERROR","actor parameter is required");const t=new URLSearchParams;t.append("actor",e.actor);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/events:listFieldValues${r?`?${r}`:""}`;s("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 P(o);const c=await o.json();return s("Event field values fetched:",c.type?.length??0,"types"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch event field values: ${String(o)}`)}}async function P(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 j={"een.motionDetectionEvent.v1":["een.objectDetection.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1","een.displayOverlay.boundingBox.v1","een.fullFrameImageUrlWithOverlay.v1"],"een.motionInRegionDetectionEvent.v1":["een.motionRegion.v1","een.objectDetection.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1"],"een.personDetectionEvent.v1":["een.objectDetection.v1","een.personAttributes.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1","een.objectClassification.v1","een.objectRegionMapping.v1","een.geoLocation.v1"],"een.animalDetectionEvent.v1":["een.objectDetection.v1","een.animalAttributes.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1","een.objectClassification.v1","een.objectRegionMapping.v1"],"een.faceDetectionEvent.v1":["een.objectDetection.v1","een.personAttributes.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1","een.objectClassification.v1","een.objectRegionMapping.v1"],"een.vehicleDetectionEvent.v1":["een.objectDetection.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1","een.objectClassification.v1","een.vehicleAttributes.v1","een.objectRegionMapping.v1"],"een.gunDetectionEvent.v1":["een.objectDetection.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1","een.motionRegion.v1","een.objectClassification.v1","een.personAttributes.v1","een.weaponAttributes.v1","een.humanValidationDetails.v1"],"een.fallDetectionEvent.v1":["een.objectDetection.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1"],"een.fireDetectionEvent.v1":["een.objectDetection.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1","een.objectClassification.v1"],"een.spillDetectionEvent.v1":["een.objectDetection.v1","een.objectClassification.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1","een.displayOverlay.boundingBox.v1","een.fullFrameImageUrlWithOverlay.v1"],"een.crowdFormationDetectionEvent.v1":["een.objectDetection.v1","een.objectClassification.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1","een.displayOverlay.boundingBox.v1","een.fullFrameImageUrlWithOverlay.v1"],"een.tamperDetectionEvent.v1":["een.fullFrameImageUrl.v1"],"een.loiterDetectionEvent.v1":["een.loiterArea.v1","een.objectDetection.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1"],"een.objectLineCrossEvent.v1":["een.lineCrossLine.v1","een.objectDetection.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1","een.entryDirection.v1"],"een.objectIntrusionEvent.v1":["een.intrusionArea.v1","een.objectDetection.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1","een.entryDirection.v1"],"een.objectRemovalEvent.v1":["een.monitoredArea.v1","een.objectDetection.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1"],"een.personTailgateEvent.v1":["een.objectDetection.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1"],"een.ppeViolationEvent.v1":["een.objectDetection.v1","een.personAttributes.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1","een.objectClassification.v1","een.objectRegionMapping.v1"],"een.sceneLabelEvent.v1":["een.objectDetection.v1","een.personAttributes.v1","een.vehicleAttributes.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1","een.objectClassification.v1","een.objectRegionMapping.v1","een.eevaAttributes.v1","een.customLabels.v1"],"een.eevaQueryEvent.v1":["een.eevaAttributes.v1","een.customLabels.v1"],"een.lprPlateReadEvent.v1":["een.lprDetection.v1","een.lprAccessType.v1","een.vehicleAttributes.v1","een.objectDetection.v1","een.userData.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1"],"een.fleetCodeRecognitionEvent.v1":["een.objectDetection.v1","een.dotNumberRecognition.v1","een.truckNumberRecognition.v1","een.trailerNumberRecognition.v1","een.recognizedText.v1","een.croppedFrameImageUrl.v1","een.fullFrameImageUrl.v1"],"een.gunShotAudioDetectionEvent.v1":["een.audioDetection.v1","een.geoLocation.v1"],"een.t3AlarmAudioDetectionEvent.v1":["een.audioDetection.v1"],"een.t4AlarmAudioDetectionEvent.v1":["een.audioDetection.v1"],"een.posTransactionEvent.v1":["een.posTransactionStart.v1","een.posTransactionEnd.v1","een.posTransactionItem.v1","een.posTransactionPayment.v1","een.posTransactionCartChangeTrail.v1","een.posTransactionCardLoadSummary.v1","een.posTransactionFlag.v1","een.posTransactionLabel.v1"],"een.deviceCloudStatusUpdateEvent.v1":["een.deviceCloudStatusUpdate.v1","een.deviceCloudPreviousStatus.v1"],"een.deviceIOEvent.v1":["een.deviceIO.v1"],"een.deviceOperationEvent.v1":["een.deviceOperationDetails.v1","een.deviceOperationSubStep.v1"],"een.ptzPositionUpdateEvent.v1":["een.ptzPositionUpdate.v1"],"een.doorStatusEvent.v1":["een.measurementStringValueUpdate.v1"],"een.batteryLevelUpdateEvent.v1":["een.batteryLevelUpdate.v1"],"een.measurementThresholdStatusEvent.v1":["een.measurementThresholdStatus.v1","een.measurementValueUpdate.v1"],"een.thermalCameraThresholdStatusEvent.v1":["een.thermalCameraValueUpdate.v1","een.thermalMonitoredArea.v1"],"een.layoutCreationEvent.v1":["een.resourceDetails.v1"],"een.layoutUpdateEvent.v1":["een.resourceDetails.v1"],"een.layoutDeletionEvent.v1":["een.resourceDetails.v1"],"een.deviceCreationEvent.v1":["een.resourceDetails.v1"],"een.deviceUpdateEvent.v1":["een.resourceDetails.v1"],"een.deviceDeletionEvent.v1":["een.resourceDetails.v1"],"een.userCreationEvent.v1":["een.resourceDetails.v1"],"een.userUpdateEvent.v1":["een.resourceDetails.v1"],"een.userDeletionEvent.v1":["een.resourceDetails.v1"],"een.accountCreationEvent.v1":["een.resourceDetails.v1"],"een.accountUpdateEvent.v1":["een.resourceDetails.v1"],"een.accountDeletionEvent.v1":["een.resourceDetails.v1"],"een.jobCreationEvent.v1":["een.jobDetails.v1","een.ownerDetails.v1"],"een.jobUpdateEvent.v1":["een.jobDetails.v1","een.ownerDetails.v1"],"een.jobDeletionEvent.v1":["een.ownerDetails.v1"],"een.panicButtonEvent.v1":["een.geoLocation.v1"],"een.evacuateProtocolEvent.v1":[],"een.holdProtocolEvent.v1":[],"een.lockdownProtocolEvent.v1":[],"een.secureProtocolEvent.v1":[],"een.shelterProtocolEvent.v1":[],"een.violenceDetectionEvent.v1":[],"een.fightDetectionEvent.v1":[],"een.handsUpDetectionEvent.v1":[],"een.vapeDetectionEvent.v1":[]};function Y(e){return j[e]??[]}function ot(e){const n=new Set;for(const t of e){const r=Y(t);for(const a of r)n.add(`data.${a}`)}return Array.from(n)}function at(e){return Y(e).length>0}function ct(e){const n=[];for(const[t,r]of Object.entries(j))r.includes(e)&&n.push(t);return n}function st(){const e=new Set;for(const n of Object.values(j))for(const t of n)e.add(t);return Array.from(e)}function ut(){return Object.keys(j)}async function lt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.actor)return i("VALIDATION_ERROR","actor parameter is required");if(!e.eventType)return i("VALIDATION_ERROR","eventType parameter is required");const t=new URLSearchParams;t.append("actor",e.actor),t.append("eventType",e.eventType),e.timestamp__gte&&t.append("timestamp__gte",v(e.timestamp__gte)),e.timestamp__lte&&t.append("timestamp__lte",v(e.timestamp__lte)),e.aggregateByMinutes!==void 0&&t.append("aggregateByMinutes",String(e.aggregateByMinutes));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/eventMetrics${r?`?${r}`:""}`;s("Fetching event metrics:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return dt(o);const c=await o.json();return s("Event metrics fetched:",c.length,"metrics"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch event metrics: ${String(o)}`)}}async function dt(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 ft(e){const n=f();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?.timestamp__lte&&t.append("timestamp__lte",v(e.timestamp__lte)),e?.timestamp__gte&&t.append("timestamp__gte",v(e.timestamp__gte)),e?.creatorId&&t.append("creatorId",e.creatorId),e?.alertType__in&&e.alertType__in.length>0&&t.append("alertType__in",e.alertType__in.join(",")),e?.actorId__in&&e.actorId__in.length>0&&t.append("actorId__in",e.actorId__in.join(",")),e?.actorType__in&&e.actorType__in.length>0&&t.append("actorType__in",e.actorType__in.join(",")),e?.actorAccountId&&t.append("actorAccountId",e.actorAccountId),e?.ruleId&&t.append("ruleId",e.ruleId),e?.ruleId__in&&e.ruleId__in.length>0&&t.append("ruleId__in",e.ruleId__in.join(",")),e?.eventId&&t.append("eventId",e.eventId),e?.locationId__in&&e.locationId__in.length>0&&t.append("locationId__in",e.locationId__in.join(",")),e?.priority__gte!==void 0&&t.append("priority__gte",String(e.priority__gte)),e?.priority__lte!==void 0&&t.append("priority__lte",String(e.priority__lte)),e?.showInvalidAlerts!==void 0&&t.append("showInvalidAlerts",String(e.showInvalidAlerts)),e?.alertActionId__in&&e.alertActionId__in.length>0&&t.append("alertActionId__in",e.alertActionId__in.join(",")),e?.alertActionStatus__in&&e.alertActionStatus__in.length>0&&t.append("alertActionStatus__in",e.alertActionStatus__in.join(",")),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?.language&&t.append("language",e.language);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/alerts${r?`?${r}`:""}`;s("Fetching alerts:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return Z(o);const c=await o.json();return s("Alerts fetched:",c.results?.length??0,"alerts"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch alerts: ${String(o)}`)}}async function gt(e,n){const t=f();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","Alert 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/alerts/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching alert:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return Z(c);const u=await c.json();return s("Alert fetched:",u.id),d(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch alert: ${String(c)}`)}}async function _t(e){const n=f();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);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/alertTypes${r?`?${r}`:""}`;s("Fetching alert types:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return Z(o);const c=await o.json();return s("Alert types fetched:",c.results?.length??0,"types"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch alert types: ${String(o)}`)}}async function Z(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 ht(e){const n=f();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?.timestamp__lte&&t.append("timestamp__lte",v(e.timestamp__lte)),e?.timestamp__gte&&t.append("timestamp__gte",v(e.timestamp__gte)),e?.alertId&&t.append("alertId",e.alertId),e?.alertType&&t.append("alertType",e.alertType),e?.actorId&&t.append("actorId",e.actorId),e?.actorType&&t.append("actorType",e.actorType),e?.actorAccountId&&t.append("actorAccountId",e.actorAccountId),e?.category&&t.append("category",e.category),e?.userId&&t.append("userId",e.userId),e?.read!==void 0&&t.append("read",String(e.read)),e?.status&&t.append("status",e.status),e?.includeV1Notifications!==void 0&&t.append("includeV1Notifications",String(e.includeV1Notifications)),e?.sort&&e.sort.length>0&&t.append("sort",e.sort.join(",")),e?.language&&t.append("language",e.language);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/notifications${r?`?${r}`:""}`;s("Fetching notifications:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return _e(o);const c=await o.json();return s("Notifications fetched:",c.results?.length??0,"notifications"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch notifications: ${String(o)}`)}}async function Rt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Notification ID is required");const t=`${n.baseUrl}/api/v3.0/notifications/${encodeURIComponent(e)}`;s("Fetching notification:",t);try{const r=await fetch(t,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!r.ok)return _e(r);const a=await r.json();return s("Notification fetched:",a.id),d(a)}catch(r){return i("NETWORK_ERROR",`Failed to fetch notification: ${String(r)}`)}}async function _e(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 pt(e){const n=f();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);const r=t.toString(),a=`${n.baseUrl}/api/v3.0/eventSubscriptions${r?`?${r}`:""}`;s("Fetching event subscriptions:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return H(o);const c=await o.json();return s("Event subscriptions fetched:",c.results?.length??0,"subscriptions"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch event subscriptions: ${String(o)}`)}}async function Et(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Subscription ID is required");const t=`${n.baseUrl}/api/v3.0/eventSubscriptions/${encodeURIComponent(e)}`;s("Fetching event subscription:",t);try{const r=await fetch(t,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!r.ok)return H(r);const a=await r.json();return s("Event subscription fetched:",a.id),d(a)}catch(r){return i("NETWORK_ERROR",`Failed to fetch event subscription: ${String(r)}`)}}async function At(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.deliveryConfig)return i("VALIDATION_ERROR","deliveryConfig is required");if(!e.filters||e.filters.length===0)return i("VALIDATION_ERROR","At least one filter is required");for(const r of e.filters){if(!r.actors||r.actors.length===0)return i("VALIDATION_ERROR","Each filter must have at least one actor");if(!r.types||r.types.length===0)return i("VALIDATION_ERROR","Each filter must have at least one event type")}const t=`${n.baseUrl}/api/v3.0/eventSubscriptions`;s("Creating event subscription:",t);try{const r=await fetch(t,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${n.token}`},body:JSON.stringify(e)});if(!r.ok)return H(r);const a=await r.json();return s("Event subscription created:",a.id),d(a)}catch(r){return i("NETWORK_ERROR",`Failed to create event subscription: ${String(r)}`)}}async function vt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Subscription ID is required");const t=`${n.baseUrl}/api/v3.0/eventSubscriptions/${encodeURIComponent(e)}`;s("Deleting event subscription:",t);try{const r=await fetch(t,{method:"DELETE",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});return r.ok?(s("Event subscription deleted:",e),d(void 0)):H(r)}catch(r){return i("NETWORK_ERROR",`Failed to delete event subscription: ${String(r)}`)}}function Tt(e,n){const t=f();if(!t.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!t.token)return i("AUTH_REQUIRED","Access token not available");if(!e)return i("VALIDATION_ERROR","SSE URL is required");try{const g=new URL(e);if(![".eagleeyenetworks.com",".een.cloud"].some(E=>g.hostname===E.substring(1)||g.hostname.endsWith(E)))return i("VALIDATION_ERROR",`SSE URL domain not allowed: ${g.hostname}`)}catch{return i("VALIDATION_ERROR","Invalid SSE URL format")}const r=1024*1024;let a="connecting",o=new AbortController,c=!1;const u=g=>{a=g,n.onStatusChange?.(a)},_=()=>{c||(c=!0,s("Closing SSE connection"),o?.abort(),o=null,u("disconnected"))};return(async()=>{if(!(c||!o)){u("connecting"),s("Connecting to SSE:",e);try{const g=await fetch(e,{method:"GET",headers:{Accept:"text/event-stream",Authorization:`Bearer ${t.token}`},signal:o.signal});if(!g.ok)throw new Error(`HTTP ${g.status}: ${g.statusText}`);if(!g.body)throw new Error("Response body is not available");u("connected"),s("SSE connected");const y=g.body.getReader(),S=new TextDecoder;let E="";for(;!c;){const{done:C,value:z}=await y.read();if(C){s("SSE stream ended");break}if(E+=S.decode(z,{stream:!0}),E.length>r){s("SSE buffer exceeded maximum size, resetting"),E="";continue}const L=E.split(`
|
|
2
|
+
`);E=L.pop()||"";let U="";for(const b of L)if(b.startsWith("data:")){const T=b.substring(5).trimStart();U=U?`${U}
|
|
3
|
+
${T}`:T}else if(b===""&&U){try{const T=JSON.parse(U);s("SSE event received:",T.type,T.actorId),n.onEvent(T)}catch(T){s("Failed to parse SSE event:",T)}U=""}}}catch(g){if(c||g instanceof Error&&g.name==="AbortError")return;s("SSE error:",g),u("error"),n.onError?.(g instanceof Error?g:new Error(String(g)))}}})(),d({close:_,get status(){return a}})}async function H(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("Failed to parse error response JSON:",r),t=e.statusText||"Unknown error"}switch(n){case 401:return i("AUTH_REQUIRED",t,n);case 403:return i("FORBIDDEN",t,n);case 404:return i("NOT_FOUND",t,n);case 429:return i("RATE_LIMITED",t,n);default:return i("API_ERROR",t,n)}}async function It(e){const n=f();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?.enabled!==void 0&&t.append("enabled",String(e.enabled)),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.outputAlertType__in&&e.outputAlertType__in.length>0&&t.append("outputAlertType__in",e.outputAlertType__in.join(",")),e?.priority__gte!==void 0&&t.append("priority__gte",String(e.priority__gte)),e?.priority__lte!==void 0&&t.append("priority__lte",String(e.priority__lte));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/eventAlertConditionRules${r?`?${r}`:""}`;s("Fetching event alert condition rules:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return I(o);const c=await o.json();return s("Event alert condition rules fetched:",c.results?.length??0,"rules"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch event alert condition rules: ${String(o)}`)}}async function Ut(e){const n=f();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?.enabled!==void 0&&t.append("enabled",String(e.enabled));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/eventAlertConditionRules:listFieldValues${r?`?${r}`:""}`;s("Fetching event alert condition rule field values:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return I(o);const c=await o.json();return s("Event alert condition rule field values fetched"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch field values: ${String(o)}`)}}async function yt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Rule ID is required");const t=`${n.baseUrl}/api/v3.0/eventAlertConditionRules/${encodeURIComponent(e)}`;s("Fetching event alert condition rule:",t);try{const r=await fetch(t,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!r.ok)return I(r);const a=await r.json();return s("Event alert condition rule fetched:",a.id),d(a)}catch(r){return i("NETWORK_ERROR",`Failed to fetch event alert condition rule: ${String(r)}`)}}async function St(e){const n=f();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?.enabled!==void 0&&t.append("enabled",String(e.enabled)),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.actorId__in&&e.actorId__in.length>0&&t.append("actorId__in",e.actorId__in.join(",")),e?.inputEventType__in&&e.inputEventType__in.length>0&&t.append("inputEventType__in",e.inputEventType__in.join(",")),e?.outputAlertType&&t.append("outputAlertType",e.outputAlertType),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/alertConditionRules${r?`?${r}`:""}`;s("Fetching alert condition rules:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return I(o);const c=await o.json();return s("Alert condition rules fetched:",c.results?.length??0,"rules"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch alert condition rules: ${String(o)}`)}}async function Dt(e,n){const t=f();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","Rule 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/alertConditionRules/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching alert condition rule:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return I(c);const u=await c.json();return s("Alert condition rule fetched:",u.id),d(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch alert condition rule: ${String(c)}`)}}async function bt(e){const n=f();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?.enabled!==void 0&&t.append("enabled",String(e.enabled)),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.alertType__in&&e.alertType__in.length>0&&t.append("alertType__in",e.alertType__in.join(",")),e?.actorId__in&&e.actorId__in.length>0&&t.append("actorId__in",e.actorId__in.join(",")),e?.alertActionId__in&&e.alertActionId__in.length>0&&t.append("alertActionId__in",e.alertActionId__in.join(",")),e?.ruleId__in&&e.ruleId__in.length>0&&t.append("ruleId__in",e.ruleId__in.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/alertActionRules${r?`?${r}`:""}`;s("Fetching alert action rules:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return I(o);const c=await o.json();return s("Alert action rules fetched:",c.results?.length??0,"rules"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch alert action rules: ${String(o)}`)}}async function $t(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Rule ID is required");const t=`${n.baseUrl}/api/v3.0/alertActionRules/${encodeURIComponent(e)}`;s("Fetching alert action rule:",t);try{const r=await fetch(t,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!r.ok)return I(r);const a=await r.json();return s("Alert action rule fetched:",a.id),d(a)}catch(r){return i("NETWORK_ERROR",`Failed to fetch alert action rule: ${String(r)}`)}}async function Ot(e){const n=f();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?.enabled!==void 0&&t.append("enabled",String(e.enabled)),e?.id__in&&e.id__in.length>0&&t.append("id__in",e.id__in.join(",")),e?.type__in&&e.type__in.length>0&&t.append("type__in",e.type__in.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/alertActions${r?`?${r}`:""}`;s("Fetching alert actions:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return I(o);const c=await o.json();return s("Alert actions fetched:",c.results?.length??0,"actions"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch alert actions: ${String(o)}`)}}async function mt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Action ID is required");const t=`${n.baseUrl}/api/v3.0/alertActions/${encodeURIComponent(e)}`;s("Fetching alert action:",t);try{const r=await fetch(t,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!r.ok)return I(r);const a=await r.json();return s("Alert action fetched:",a.id),d(a)}catch(r){return i("NETWORK_ERROR",`Failed to fetch alert action: ${String(r)}`)}}async function I(e){const n=e.status;let t;try{const r=await e.json();t=r.message??r.error??e.statusText}catch(r){s("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 kt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.cameraId)return i("VALIDATION_ERROR","Camera ID is required");if(!e.type)return i("VALIDATION_ERROR","Export type is required");if(!e.startTimestamp)return i("VALIDATION_ERROR","Start timestamp is required");if(!e.endTimestamp)return i("VALIDATION_ERROR","End timestamp is required");const t=`${n.baseUrl}/api/v3.0/exports`;if(s("Creating export job:",t),(e.type==="timeLapse"||e.type==="bundle")&&!e.playbackMultiplier)return i("VALIDATION_ERROR","Playback multiplier is required for timeLapse and bundle exports");if(e.playbackMultiplier!==void 0&&(e.playbackMultiplier<1||e.playbackMultiplier>48))return i("VALIDATION_ERROR","Playback multiplier must be between 1 and 48");const r={name:e.name||`Export-${Date.now()}`,directory:e.directory||"/"};e.notes&&(r.notes=e.notes),e.tags&&e.tags.length>0&&(r.tags=e.tags);const a={startTimestamp:e.startTimestamp,endTimestamp:e.endTimestamp},o={deviceId:e.cameraId,type:e.type,info:r,period:a};e.playbackMultiplier!==void 0&&(o.playbackMultiplier=e.playbackMultiplier),e.autoDelete!==void 0&&(o.autoDelete=e.autoDelete);try{const c=await fetch(t,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${n.token}`},body:JSON.stringify(o)});if(!c.ok)return wt(c);const u=await c.json();return s("Export job created:",u.id),d(u)}catch(c){return i("NETWORK_ERROR",`Failed to create export job: ${String(c)}`)}}async function wt(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 jt(e){const n=f();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?.state__in&&e.state__in.length>0&&t.append("state__in",e.state__in.join(",")),e?.type&&t.append("type",e.type),e?.type__in&&e.type__in.length>0&&t.append("type__in",e.type__in.join(",")),e?.createTimestamp__gte&&t.append("createTimestamp__gte",e.createTimestamp__gte),e?.createTimestamp__lte&&t.append("createTimestamp__lte",e.createTimestamp__lte),e?.userId&&t.append("userId",e.userId),e?.sort&&e.sort.length>0&&t.append("sort",e.sort.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/jobs${r?`?${r}`:""}`;s("Fetching jobs:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return ee(o);const c=await o.json();return s("Jobs fetched:",c.results?.length??0,"jobs"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch jobs: ${String(o)}`)}}async function Ft(e,n){const t=f();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","Job 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/jobs/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching job:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return ee(c);const u=await c.json();return s("Job fetched:",u.arguments?.originalRequest?.name||u.id,"state:",u.state),d(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch job: ${String(c)}`)}}async function Lt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Job ID is required");const t=`${n.baseUrl}/api/v3.0/jobs/${encodeURIComponent(e)}`;s("Deleting job:",t);try{const r=await fetch(t,{method:"DELETE",headers:{Authorization:`Bearer ${n.token}`}});return r.ok?(s("Job deleted:",e),d(void 0)):ee(r)}catch(r){return i("NETWORK_ERROR",`Failed to delete job: ${String(r)}`)}}async function ee(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 Nt(e){const n=f();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?.type__in&&e.type__in.length>0&&t.append("type__in",e.type__in.join(",")),e?.cameraId&&t.append("cameraId",e.cameraId),e?.cameraId__in&&e.cameraId__in.length>0&&t.append("cameraId__in",e.cameraId__in.join(",")),e?.jobId&&t.append("jobId",e.jobId),e?.createTimestamp__gte&&t.append("createTimestamp__gte",e.createTimestamp__gte),e?.createTimestamp__lte&&t.append("createTimestamp__lte",e.createTimestamp__lte),e?.tags__contains&&e.tags__contains.length>0&&t.append("tags__contains",e.tags__contains.join(",")),e?.q&&t.append("q",e.q),e?.sort&&e.sort.length>0&&t.append("sort",e.sort.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/files${r?`?${r}`:""}`;s("Fetching files:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return F(o);const c=await o.json();return s("Files fetched:",c.results?.length??0,"files"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch files: ${String(o)}`)}}async function qt(e,n){const t=f();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","File 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/files/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching file:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return F(c);const u=await c.json();return s("File fetched:",u.name),d(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch file: ${String(c)}`)}}async function Bt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e.name)return i("VALIDATION_ERROR","File name is required");const t=`${n.baseUrl}/api/v3.0/files`;s("Creating file:",t);const r={name:e.name};e.type&&(r.type=e.type),e.filename&&(r.filename=e.filename),e.description&&(r.description=e.description),e.tags&&e.tags.length>0&&(r.tags=e.tags),e.cameraId&&(r.cameraId=e.cameraId);try{const a=await fetch(t,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${n.token}`},body:JSON.stringify(r)});if(!a.ok)return F(a);const o=await a.json();return s("File created:",o.id),d(o)}catch(a){return i("NETWORK_ERROR",`Failed to create file: ${String(a)}`)}}async function Pt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","File ID is required");const t=`${n.baseUrl}/api/v3.0/files/${encodeURIComponent(e)}:download`;s("Downloading file:",t);try{const r=await fetch(t,{method:"GET",headers:{Authorization:`Bearer ${n.token}`}});if(!r.ok)return F(r);const a=await r.blob(),o=r.headers.get("Content-Disposition");let c="download";if(o){const h=o.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);h&&h[1]&&(c=h[1].replace(/['"]/g,""))}const u=r.headers.get("Content-Type")||"application/octet-stream",_={blob:a,filename:c,contentType:u,size:a.size};return s("File downloaded:",c,a.size,"bytes"),d(_)}catch(r){return i("NETWORK_ERROR",`Failed to download file: ${String(r)}`)}}async function Ht(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","File ID is required");const t=`${n.baseUrl}/api/v3.0/files/${encodeURIComponent(e)}`;s("Deleting file:",t);try{const r=await fetch(t,{method:"DELETE",headers:{Authorization:`Bearer ${n.token}`}});return r.ok?(s("File deleted (recycled):",e),d(void 0)):F(r)}catch(r){return i("NETWORK_ERROR",`Failed to delete file: ${String(r)}`)}}async function F(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 Ct(e){const n=f();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?.status__in&&e.status__in.length>0&&t.append("status__in",e.status__in.join(",")),e?.cameraId&&t.append("cameraId",e.cameraId),e?.cameraId__in&&e.cameraId__in.length>0&&t.append("cameraId__in",e.cameraId__in.join(",")),e?.jobId&&t.append("jobId",e.jobId),e?.fileId&&t.append("fileId",e.fileId),e?.createTimestamp__gte&&t.append("createTimestamp__gte",e.createTimestamp__gte),e?.createTimestamp__lte&&t.append("createTimestamp__lte",e.createTimestamp__lte),e?.q&&t.append("q",e.q),e?.sort&&e.sort.length>0&&t.append("sort",e.sort.join(","));const r=t.toString(),a=`${n.baseUrl}/api/v3.0/downloads${r?`?${r}`:""}`;s("Fetching downloads:",a);try{const o=await fetch(a,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${n.token}`}});if(!o.ok)return te(o);const c=await o.json();return s("Downloads fetched:",c.results?.length??0,"downloads"),d(c)}catch(o){return i("NETWORK_ERROR",`Failed to fetch downloads: ${String(o)}`)}}async function zt(e,n){const t=f();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","Download 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/downloads/${encodeURIComponent(e)}${a?`?${a}`:""}`;s("Fetching download:",o);try{const c=await fetch(o,{method:"GET",headers:{Accept:"application/json",Authorization:`Bearer ${t.token}`}});if(!c.ok)return te(c);const u=await c.json();return s("Download fetched:",u.name,"status:",u.status),d(u)}catch(c){return i("NETWORK_ERROR",`Failed to fetch download: ${String(c)}`)}}async function Qt(e){const n=f();if(!n.isAuthenticated)return i("AUTH_REQUIRED","Authentication required");if(!n.baseUrl)return i("AUTH_REQUIRED","Base URL not configured");if(!e)return i("VALIDATION_ERROR","Download ID is required");const t=`${n.baseUrl}/api/v3.0/downloads/${encodeURIComponent(e)}:download`;s("Downloading:",t);try{const r=await fetch(t,{method:"GET",headers:{Authorization:`Bearer ${n.token}`}});if(!r.ok)return te(r);const a=await r.blob(),o=r.headers.get("Content-Disposition");let c="download";if(o){const h=o.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);h&&h[1]&&(c=h[1].replace(/['"]/g,""))}const u=r.headers.get("Content-Type")||"application/octet-stream",_={blob:a,filename:c,contentType:u,size:a.size};return s("Downloaded:",c,a.size,"bytes"),d(_)}catch(r){return i("NETWORK_ERROR",`Failed to download: ${String(r)}`)}}async function te(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)}}exports.EVENT_TYPE_DATA_SCHEMAS=j;exports.STORAGE_STRATEGY_DESCRIPTIONS=De;exports.addFile=Bt;exports.connectToEventSubscription=Tt;exports.createEventSubscription=At;exports.createExportJob=kt;exports.createLayout=Ve;exports.deleteEventSubscription=vt;exports.deleteFile=Ht;exports.deleteJob=Lt;exports.deleteLayout=We;exports.downloadDownload=Qt;exports.downloadFile=Pt;exports.eventTypeHasDataSchemas=at;exports.failure=i;exports.formatTimestamp=v;exports.getAccessToken=J;exports.getAlert=gt;exports.getAlertAction=mt;exports.getAlertActionRule=$t;exports.getAlertConditionRule=Dt;exports.getAllDataSchemas=st;exports.getAllKnownEventTypes=ut;exports.getAuthUrl=ae;exports.getBridge=ze;exports.getBridges=Ce;exports.getCamera=He;exports.getCameras=Pe;exports.getClientId=oe;exports.getConfig=ke;exports.getCurrentUser=Ne;exports.getDataSchemasForEventType=Y;exports.getDownload=zt;exports.getEvent=nt;exports.getEventAlertConditionRule=yt;exports.getEventAlertConditionRuleFieldValues=Ut;exports.getEventMetrics=lt;exports.getEventSubscription=Et;exports.getEventTypesForDataSchema=ct;exports.getFile=qt;exports.getIncludeParameterForEventTypes=ot;exports.getJob=Ft;exports.getLayout=xe;exports.getLayouts=Qe;exports.getLiveImage=Je;exports.getMediaSession=ge;exports.getNotification=Rt;exports.getProxyUrl=q;exports.getRecordedImage=Xe;exports.getRedirectUri=G;exports.getStorageStrategy=Oe;exports.getUser=Be;exports.getUsers=qe;exports.handleAuthCallback=ue;exports.initEenToolkit=me;exports.initMediaSession=Ye;exports.listAlertActionRules=bt;exports.listAlertActions=Ot;exports.listAlertConditionRules=St;exports.listAlertTypes=_t;exports.listAlerts=ft;exports.listDownloads=Ct;exports.listEventAlertConditionRules=It;exports.listEventFieldValues=rt;exports.listEventSubscriptions=pt;exports.listEventTypes=it;exports.listEvents=tt;exports.listFeeds=Ze;exports.listFiles=Nt;exports.listJobs=jt;exports.listMedia=Ge;exports.listNotifications=ht;exports.refreshToken=ce;exports.revokeToken=se;exports.success=d;exports.updateLayout=Me;exports.useAuthStore=f;
|
|
4
4
|
//# sourceMappingURL=index.cjs.map
|