skikrumb-api 2.1.8 → 2.1.10
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/dist/index.d.ts +8 -6
- package/dist/index.js +32 -23
- package/package.json +1 -1
- package/.claude/settings.local.json +0 -11
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { apiKeys, Device, Gateways, QueryDevice, RateRequest, Rates, ExternalUserRequest, ExternalUserResponse, ShareLinkRequest, ShareLinkResponse, SharePreviewResponse, ShareAcceptRequest, ShareAcceptResponse } from './models';
|
|
2
|
+
type RealtimeEndpointType = 'user' | 'organization';
|
|
2
3
|
declare class SkiKrumbRealtimeClient {
|
|
3
4
|
private websocket;
|
|
4
|
-
private sessionToken
|
|
5
|
+
private sessionToken?;
|
|
5
6
|
private supabaseToken?;
|
|
6
7
|
private url;
|
|
7
8
|
private userId;
|
|
9
|
+
private endpointType;
|
|
8
10
|
private listeners;
|
|
9
11
|
private isConnecting;
|
|
10
12
|
private reconnectAttempts;
|
|
11
13
|
private maxReconnectAttempts;
|
|
12
14
|
private reconnectDelay;
|
|
13
15
|
private maxReconnectDelay;
|
|
14
|
-
constructor(
|
|
16
|
+
constructor(userId: string, url: string, endpointType: RealtimeEndpointType, sessionToken?: string, supabaseToken?: string);
|
|
15
17
|
connect(): Promise<void>;
|
|
16
18
|
private connectToWebSocket;
|
|
17
19
|
private scheduleReconnect;
|
|
@@ -58,8 +60,8 @@ export declare const skiKrumb: (options?: {
|
|
|
58
60
|
data?: any;
|
|
59
61
|
error?: any;
|
|
60
62
|
}>;
|
|
61
|
-
getReplayData: (serialNumber: string, date: string, size?: number) => Promise<any>;
|
|
62
|
-
getDailyStats: (serialNumber: string, date: string) => Promise<any>;
|
|
63
|
+
getReplayData: (serialNumber: string, date: string, timezone?: string, size?: number) => Promise<any>;
|
|
64
|
+
getDailyStats: (serialNumber: string, date: string, timezone?: string) => Promise<any>;
|
|
63
65
|
getAccessibleProfiles: () => Promise<{
|
|
64
66
|
success: boolean;
|
|
65
67
|
accessibleProfiles: any[];
|
|
@@ -71,6 +73,6 @@ export declare const skiKrumb: (options?: {
|
|
|
71
73
|
data?: any;
|
|
72
74
|
error?: any;
|
|
73
75
|
}>;
|
|
74
|
-
createRealtimeClient: (userId: string, sessionToken?: string, supabaseToken?: string) => SkiKrumbRealtimeClient;
|
|
76
|
+
createRealtimeClient: (userId: string, sessionToken?: string, supabaseToken?: string, endpointType?: RealtimeEndpointType) => SkiKrumbRealtimeClient;
|
|
75
77
|
};
|
|
76
|
-
export type { Device, Gateways, QueryDevice, RateRequest, Rates, apiKeys, ExternalUserRequest, ExternalUserResponse, ShareLinkRequest, ShareLinkResponse, SharePreviewResponse, ShareAcceptRequest, ShareAcceptResponse, };
|
|
78
|
+
export type { Device, Gateways, QueryDevice, RateRequest, Rates, apiKeys, ExternalUserRequest, ExternalUserResponse, ShareLinkRequest, ShareLinkResponse, SharePreviewResponse, ShareAcceptRequest, ShareAcceptResponse, RealtimeEndpointType, };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import ky from 'ky';
|
|
2
2
|
class SkiKrumbRealtimeClient {
|
|
3
|
-
constructor(
|
|
3
|
+
constructor(userId, url, endpointType, sessionToken, supabaseToken) {
|
|
4
4
|
this.websocket = null;
|
|
5
5
|
this.listeners = {};
|
|
6
6
|
this.isConnecting = false;
|
|
@@ -8,10 +8,11 @@ class SkiKrumbRealtimeClient {
|
|
|
8
8
|
this.maxReconnectAttempts = Infinity; // Never stop trying
|
|
9
9
|
this.reconnectDelay = 1000; // 1 second base
|
|
10
10
|
this.maxReconnectDelay = 300000; // 5 minutes max
|
|
11
|
-
this.sessionToken = sessionToken;
|
|
12
|
-
this.supabaseToken = supabaseToken;
|
|
13
11
|
this.userId = userId;
|
|
14
12
|
this.url = url.replace(/\/+$/, ''); // Remove trailing slashes
|
|
13
|
+
this.endpointType = endpointType;
|
|
14
|
+
this.sessionToken = sessionToken;
|
|
15
|
+
this.supabaseToken = supabaseToken;
|
|
15
16
|
}
|
|
16
17
|
async connect() {
|
|
17
18
|
if (this.isConnecting) {
|
|
@@ -42,12 +43,16 @@ class SkiKrumbRealtimeClient {
|
|
|
42
43
|
connectToWebSocket() {
|
|
43
44
|
return new Promise((resolve, reject) => {
|
|
44
45
|
try {
|
|
45
|
-
const baseWsUrl = this.url.replace(/^https/, 'wss').replace(/^http/, 'ws')
|
|
46
|
-
|
|
47
|
-
let
|
|
48
|
-
if (this.supabaseToken) {
|
|
49
|
-
|
|
46
|
+
const baseWsUrl = this.url.replace(/^https/, 'wss').replace(/^http/, 'ws');
|
|
47
|
+
let wsUrl;
|
|
48
|
+
let endpointPath = `/realtime${this.endpointType === 'organization' ? '/organization' : ''}`;
|
|
49
|
+
if (!this.supabaseToken) {
|
|
50
|
+
return reject(new Error('Supabase token is required for organization endpoint.'));
|
|
51
|
+
}
|
|
52
|
+
if (!this.sessionToken) {
|
|
53
|
+
return reject(new Error('Session token is required for user endpoint.'));
|
|
50
54
|
}
|
|
55
|
+
wsUrl = `${baseWsUrl}${endpointPath}?token=${encodeURIComponent(this.sessionToken)}&supabaseToken=${encodeURIComponent(this.supabaseToken)}`;
|
|
51
56
|
this.websocket = new WebSocket(wsUrl);
|
|
52
57
|
this.websocket.onopen = () => {
|
|
53
58
|
// Authentication is handled automatically via query parameters
|
|
@@ -439,7 +444,7 @@ export const skiKrumb = (options = {
|
|
|
439
444
|
.json();
|
|
440
445
|
return response;
|
|
441
446
|
};
|
|
442
|
-
const getReplayData = async (serialNumber, date, size = 10000) => {
|
|
447
|
+
const getReplayData = async (serialNumber, date, timezone = 'America/Vancouver', size = 10000) => {
|
|
443
448
|
const requestWithAuth = ky.create({
|
|
444
449
|
prefixUrl: options.url,
|
|
445
450
|
headers: {
|
|
@@ -451,12 +456,12 @@ export const skiKrumb = (options = {
|
|
|
451
456
|
});
|
|
452
457
|
const response = await requestWithAuth
|
|
453
458
|
.get(`data/replay/${serialNumber}`, {
|
|
454
|
-
searchParams: { date, size },
|
|
459
|
+
searchParams: { date, timezone, size },
|
|
455
460
|
})
|
|
456
461
|
.json();
|
|
457
462
|
return response;
|
|
458
463
|
};
|
|
459
|
-
const getDailyStats = async (serialNumber, date) => {
|
|
464
|
+
const getDailyStats = async (serialNumber, date, timezone = 'America/Vancouver') => {
|
|
460
465
|
const requestWithAuth = ky.create({
|
|
461
466
|
prefixUrl: options.url,
|
|
462
467
|
headers: {
|
|
@@ -468,7 +473,7 @@ export const skiKrumb = (options = {
|
|
|
468
473
|
});
|
|
469
474
|
const response = await requestWithAuth
|
|
470
475
|
.get(`data/stats/${serialNumber}`, {
|
|
471
|
-
searchParams: { date },
|
|
476
|
+
searchParams: { date, timezone },
|
|
472
477
|
})
|
|
473
478
|
.json();
|
|
474
479
|
return response;
|
|
@@ -532,6 +537,20 @@ export const skiKrumb = (options = {
|
|
|
532
537
|
.json();
|
|
533
538
|
return response;
|
|
534
539
|
};
|
|
540
|
+
const createRealtimeClient = (userId, sessionToken, supabaseToken, endpointType = 'user') => {
|
|
541
|
+
if (!userId) {
|
|
542
|
+
throw new Error('User ID is required for realtime client');
|
|
543
|
+
}
|
|
544
|
+
const token = sessionToken || options.apiKey;
|
|
545
|
+
const finalSupabaseToken = supabaseToken || options.supabaseToken;
|
|
546
|
+
if (!finalSupabaseToken) {
|
|
547
|
+
throw new Error('A Supabase token is required for the organization endpoint.');
|
|
548
|
+
}
|
|
549
|
+
if (!token) {
|
|
550
|
+
throw new Error('A session token (or API key) is required for the user endpoint.');
|
|
551
|
+
}
|
|
552
|
+
return new SkiKrumbRealtimeClient(userId, options.url || 'https://api.skikrumb.ca', endpointType, token, finalSupabaseToken);
|
|
553
|
+
};
|
|
535
554
|
return {
|
|
536
555
|
createDevice,
|
|
537
556
|
readDevices,
|
|
@@ -554,16 +573,6 @@ export const skiKrumb = (options = {
|
|
|
554
573
|
getDailyStats,
|
|
555
574
|
getAccessibleProfiles,
|
|
556
575
|
getLatestDeviceData,
|
|
557
|
-
createRealtimeClient
|
|
558
|
-
if (!sessionToken && !options.apiKey) {
|
|
559
|
-
throw new Error('Session token or API key required for realtime client');
|
|
560
|
-
}
|
|
561
|
-
if (!userId) {
|
|
562
|
-
throw new Error('User ID is required for realtime client');
|
|
563
|
-
}
|
|
564
|
-
// Use provided session token or fall back to API key for backward compatibility
|
|
565
|
-
const token = sessionToken || options.apiKey;
|
|
566
|
-
return new SkiKrumbRealtimeClient(token, userId, options.url || 'https://api.skikrumb.ca', supabaseToken);
|
|
567
|
-
},
|
|
576
|
+
createRealtimeClient,
|
|
568
577
|
};
|
|
569
578
|
};
|
package/package.json
CHANGED