@magemetrics/core 0.5.4 → 0.6.0

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.js CHANGED
@@ -1,7 +1,7 @@
1
+ import { sha256 } from '@noble/hashes/sha2.js';
1
2
  import z5, { z } from 'zod';
2
3
  import { GoTrueClient } from '@supabase/auth-js';
3
- import createApiClient from 'openapi-fetch';
4
- import { sha256 } from '@noble/hashes/sha2.js';
4
+ import createApiClient2 from 'openapi-fetch';
5
5
  import dayjs from 'dayjs';
6
6
  import customParseFormat from 'dayjs/plugin/customParseFormat.js';
7
7
  import relativeTime from 'dayjs/plugin/relativeTime.js';
@@ -11,6 +11,7 @@ import { DefaultChatTransport } from 'ai';
11
11
 
12
12
  // ../shared/dist/src/api/client/middleware.js
13
13
  var HEADER_CLIENT_VERSION = "X-Client-Version";
14
+ var HEADER_SP_TOKEN = "sp-access-token";
14
15
  var HEADER_API_KEY = "X-Api-Key";
15
16
  var ApiError = class extends Error {
16
17
  extra;
@@ -54,6 +55,102 @@ var addApiKeyHeader = (apiKey) => {
54
55
  };
55
56
  };
56
57
 
58
+ // package.json
59
+ var package_default = {
60
+ version: "0.6.0"};
61
+
62
+ // src/core/MageMetricsEventEmitter.ts
63
+ var MageMetricsEventEmitter = class {
64
+ listeners = /* @__PURE__ */ new Map();
65
+ addEventListener(type, listener, options) {
66
+ if (!this.listeners.has(type)) {
67
+ this.listeners.set(type, /* @__PURE__ */ new Set());
68
+ }
69
+ if (options?.signal) {
70
+ if (options.signal.aborted) {
71
+ return;
72
+ }
73
+ const abortHandler = () => {
74
+ this.removeEventListener(type, listener);
75
+ };
76
+ options.signal.addEventListener("abort", abortHandler, { once: true });
77
+ }
78
+ this.listeners.get(type).add(listener);
79
+ }
80
+ removeEventListener(type, listener) {
81
+ const typeListeners = this.listeners.get(type);
82
+ if (typeListeners) {
83
+ typeListeners.delete(listener);
84
+ if (typeListeners.size === 0) {
85
+ this.listeners.delete(type);
86
+ }
87
+ }
88
+ }
89
+ dispatch(type, detail) {
90
+ const typeListeners = this.listeners.get(type);
91
+ if (typeListeners) {
92
+ const event = { type, detail };
93
+ typeListeners.forEach((listener) => {
94
+ try {
95
+ listener(event);
96
+ } catch (error) {
97
+ console.error(`Error in event listener for "${type}":`, error);
98
+ }
99
+ });
100
+ }
101
+ }
102
+ };
103
+
104
+ // src/core/auth/DirectAuthProvider.ts
105
+ var MM_CLIENT_VERSION = package_default.version;
106
+ var DirectAuthProvider = class {
107
+ state = "initializing";
108
+ jwt;
109
+ events = new MageMetricsEventEmitter();
110
+ constructor(jwt) {
111
+ this.jwt = jwt;
112
+ }
113
+ async initialize() {
114
+ return Promise.resolve(this.setState("ready"));
115
+ }
116
+ async getHeaders() {
117
+ return Promise.resolve({
118
+ [HEADER_CLIENT_VERSION]: MM_CLIENT_VERSION,
119
+ [HEADER_SP_TOKEN]: this.jwt
120
+ });
121
+ }
122
+ getState() {
123
+ return this.state;
124
+ }
125
+ async updateExternalJwt(jwt) {
126
+ this.jwt = jwt;
127
+ return Promise.resolve(this.setState("ready"));
128
+ }
129
+ async logout() {
130
+ return Promise.resolve(this.setState("initializing"));
131
+ }
132
+ getSupabaseClient() {
133
+ return null;
134
+ }
135
+ addEventListener(type, listener, options) {
136
+ this.events.addEventListener(type, listener, options);
137
+ }
138
+ removeEventListener(type, listener) {
139
+ this.events.removeEventListener(type, listener);
140
+ }
141
+ setState(state) {
142
+ this.state = state;
143
+ this.state = state;
144
+ this.events.dispatch("authStateChange", state);
145
+ }
146
+ };
147
+ var hashString = (value) => {
148
+ const encoder = new TextEncoder();
149
+ const data = encoder.encode(value);
150
+ const hash = sha256(data);
151
+ return Array.from(hash).map((b) => b.toString(16).padStart(2, "0")).join("");
152
+ };
153
+
57
154
  // ../../node_modules/.pnpm/@asteasolutions+zod-to-openapi@8.1.0_zod@4.1.13/node_modules/@asteasolutions/zod-to-openapi/dist/index.mjs
58
155
  function __rest(s, e) {
59
156
  var t = {};
@@ -274,114 +371,472 @@ var Metadata = class {
274
371
  }
275
372
  return typeName ? void 0 : schema;
276
373
  }
277
- static getMetadataFromInternalRegistry(zodSchema) {
278
- return zodToOpenAPIRegistry.get(zodSchema);
374
+ static getMetadataFromInternalRegistry(zodSchema) {
375
+ return zodToOpenAPIRegistry.get(zodSchema);
376
+ }
377
+ static getMetadataFromRegistry(zodSchema) {
378
+ const internal = this.getMetadataFromInternalRegistry(zodSchema);
379
+ const general = zodSchema.meta();
380
+ if (!internal) {
381
+ return general;
382
+ }
383
+ const { _internal } = internal, rest = __rest(internal, ["_internal"]);
384
+ const _a = general !== null && general !== void 0 ? general : {}, { id, title } = _a, restGeneral = __rest(_a, ["id", "title"]);
385
+ return Object.assign(Object.assign(Object.assign({ _internal: Object.assign(Object.assign({}, id ? { refId: id } : {}), _internal) }, rest), title ? { description: title } : {}), restGeneral);
386
+ }
387
+ static setMetadataInRegistry(zodSchema, metadata) {
388
+ zodToOpenAPIRegistry.add(zodSchema, metadata);
389
+ }
390
+ };
391
+ function preserveMetadataFromModifier(zodSchema, modifier) {
392
+ const zodModifier = zodSchema[modifier];
393
+ if (typeof zodModifier !== "function") {
394
+ return;
395
+ }
396
+ zodSchema[modifier] = function(...args) {
397
+ const result = zodModifier.apply(this, args);
398
+ const meta = Metadata.getMetadataFromRegistry(this);
399
+ if (meta) {
400
+ Metadata.setMetadataInRegistry(result, meta);
401
+ }
402
+ return result;
403
+ };
404
+ }
405
+ function extendZodWithOpenApi(zod) {
406
+ if (typeof zod.ZodType.prototype.openapi !== "undefined") {
407
+ return;
408
+ }
409
+ zod.ZodType.prototype.openapi = function(...args) {
410
+ const { refId, metadata, options } = getOpenApiConfiguration(...args);
411
+ const _a = metadata !== null && metadata !== void 0 ? metadata : {}, { param } = _a, restOfOpenApi = __rest(_a, ["param"]);
412
+ const allMetadata = Metadata.getMetadataFromRegistry(this);
413
+ const _b = allMetadata !== null && allMetadata !== void 0 ? allMetadata : {}, { _internal: internalMetadata } = _b, currentMetadata = __rest(_b, ["_internal"]);
414
+ const _internal = Object.assign(Object.assign(Object.assign({}, internalMetadata), options), refId ? { refId } : void 0);
415
+ const resultMetadata = Object.assign(Object.assign(Object.assign({}, currentMetadata), restOfOpenApi), (currentMetadata === null || currentMetadata === void 0 ? void 0 : currentMetadata.param) || param ? {
416
+ param: Object.assign(Object.assign({}, currentMetadata === null || currentMetadata === void 0 ? void 0 : currentMetadata.param), param)
417
+ } : void 0);
418
+ const result = new this.constructor(this._def);
419
+ Metadata.setMetadataInRegistry(result, Object.assign(Object.assign({}, Object.keys(_internal).length > 0 ? { _internal } : void 0), resultMetadata));
420
+ if (isZodType(result, "ZodObject")) {
421
+ const currentMetadata2 = Metadata.getMetadataFromRegistry(result);
422
+ const originalExtend = result.extend;
423
+ result.extend = function(...args2) {
424
+ const extendedResult = originalExtend.apply(result, args2);
425
+ const _a2 = currentMetadata2 !== null && currentMetadata2 !== void 0 ? currentMetadata2 : {}, { _internal: _internal2 } = _a2, rest = __rest(_a2, ["_internal"]);
426
+ Metadata.setMetadataInRegistry(extendedResult, {
427
+ _internal: {
428
+ extendedFrom: (_internal2 === null || _internal2 === void 0 ? void 0 : _internal2.refId) ? { refId: _internal2.refId, schema: result } : _internal2 === null || _internal2 === void 0 ? void 0 : _internal2.extendedFrom
429
+ }
430
+ });
431
+ return extendedResult.openapi(rest);
432
+ };
433
+ preserveMetadataFromModifier(result, "catchall");
434
+ }
435
+ preserveMetadataFromModifier(result, "optional");
436
+ preserveMetadataFromModifier(result, "nullable");
437
+ preserveMetadataFromModifier(result, "default");
438
+ preserveMetadataFromModifier(result, "transform");
439
+ preserveMetadataFromModifier(result, "refine");
440
+ preserveMetadataFromModifier(result, "length");
441
+ preserveMetadataFromModifier(result, "min");
442
+ preserveMetadataFromModifier(result, "max");
443
+ const originalMeta = result.meta;
444
+ result.meta = function(...args2) {
445
+ const result2 = originalMeta.apply(this, args2);
446
+ if (args2[0]) {
447
+ const meta = Metadata.getMetadataFromInternalRegistry(this);
448
+ if (meta) {
449
+ Metadata.setMetadataInRegistry(result2, Object.assign(Object.assign({}, meta), args2[0]));
450
+ }
451
+ }
452
+ return result2;
453
+ };
454
+ return result;
455
+ };
456
+ }
457
+ function getOpenApiConfiguration(refOrOpenapi, metadataOrOptions, options) {
458
+ if (typeof refOrOpenapi === "string") {
459
+ return {
460
+ refId: refOrOpenapi,
461
+ metadata: metadataOrOptions,
462
+ options
463
+ };
464
+ }
465
+ return {
466
+ refId: void 0,
467
+ metadata: refOrOpenapi,
468
+ options: metadataOrOptions
469
+ };
470
+ }
471
+ new Set(".\\+*[^]$()");
472
+ var createRoute = (routeConfig) => {
473
+ const route = {
474
+ ...routeConfig,
475
+ getRoutingPath() {
476
+ return routeConfig.path.replaceAll(/\/{(.+?)}/g, "/:$1");
477
+ }
478
+ };
479
+ return Object.defineProperty(route, "getRoutingPath", { enumerable: false });
480
+ };
481
+ extendZodWithOpenApi(z);
482
+
483
+ // ../shared/dist/src/endpoints/auth.routes.js
484
+ var GetApiInformationInputSchema = z.object({
485
+ apiKey: z.string()
486
+ });
487
+ var GetApiInformationOutputSchema = z.object({
488
+ apiUrl: z.string(),
489
+ anonKey: z.string()
490
+ });
491
+ var GetApiInformation = createRoute({
492
+ method: "get",
493
+ path: "/api/v1/auth/apiInformation",
494
+ operationId: "getApiInformation",
495
+ request: {
496
+ query: GetApiInformationInputSchema
497
+ },
498
+ responses: {
499
+ 200: {
500
+ content: {
501
+ "application/json": {
502
+ schema: GetApiInformationOutputSchema
503
+ }
504
+ },
505
+ description: "Retrieve the API URL and anon key"
506
+ },
507
+ 400: {
508
+ content: {
509
+ "application/json": {
510
+ schema: z.object({ error: z.string() })
511
+ }
512
+ },
513
+ description: "Invalid input"
514
+ },
515
+ 500: {
516
+ content: {
517
+ "application/json": {
518
+ schema: z.object({
519
+ error: z.string()
520
+ })
521
+ }
522
+ },
523
+ description: "Unable to retrieve the API URL and anon key"
524
+ }
525
+ }
526
+ });
527
+ createRoute({
528
+ hide: true,
529
+ method: "get",
530
+ path: "/api/auth/apiInformation",
531
+ operationId: "getApiInformation",
532
+ request: {
533
+ query: GetApiInformationInputSchema
534
+ },
535
+ responses: {
536
+ 200: {
537
+ content: {
538
+ "application/json": {
539
+ schema: GetApiInformationOutputSchema
540
+ }
541
+ },
542
+ description: "Retrieve the API URL and anon key"
543
+ },
544
+ 400: {
545
+ content: {
546
+ "application/json": {
547
+ schema: z.object({ error: z.string() })
548
+ }
549
+ },
550
+ description: "Invalid input"
551
+ },
552
+ 500: {
553
+ content: {
554
+ "application/json": {
555
+ schema: z.object({
556
+ error: z.string()
557
+ })
558
+ }
559
+ },
560
+ description: "Unable to retrieve the API URL and anon key"
561
+ }
562
+ }
563
+ });
564
+ var ExchangeExternalTokenInputSchema = z.object({
565
+ apiKey: z.string(),
566
+ externalJWT: z.string()
567
+ });
568
+ var ExchangeExternalTokenOutputSchema = z.object({
569
+ accessToken: z.string(),
570
+ refreshToken: z.string()
571
+ });
572
+ var ExchangeExternalToken = createRoute({
573
+ method: "post",
574
+ path: "/api/v1/auth/exchangeExternalToken",
575
+ operationId: "exchangeExternalToken",
576
+ request: {
577
+ body: {
578
+ required: true,
579
+ content: {
580
+ "application/json": {
581
+ schema: ExchangeExternalTokenInputSchema
582
+ }
583
+ }
584
+ }
585
+ },
586
+ responses: {
587
+ 200: {
588
+ content: {
589
+ "application/json": {
590
+ schema: ExchangeExternalTokenOutputSchema
591
+ }
592
+ },
593
+ description: "Retrieve a JWT for an external user"
594
+ },
595
+ 400: {
596
+ content: {
597
+ "application/json": {
598
+ schema: z.object({ error: z.string() })
599
+ }
600
+ },
601
+ description: "Invalid input"
602
+ },
603
+ 500: {
604
+ content: {
605
+ "application/json": {
606
+ schema: z.object({
607
+ error: z.string()
608
+ })
609
+ }
610
+ },
611
+ description: "Unable to retrieve a JWT for an external user"
612
+ }
613
+ }
614
+ });
615
+
616
+ // src/core/types.ts
617
+ var TOKEN_STORAGE_KEY = "mm-ai-sp-token";
618
+ var CHECK_KEY = "mm-ai-check-key";
619
+
620
+ // src/core/auth/ExternalAuthProvider.ts
621
+ var MM_CLIENT_VERSION2 = package_default.version;
622
+ var ExternalAuthProvider = class {
623
+ config;
624
+ state = "initializing";
625
+ supabaseClient = null;
626
+ noAuthApiClient = null;
627
+ authApiResponse = null;
628
+ processedJwt = Symbol("initial");
629
+ userId = null;
630
+ events = new MageMetricsEventEmitter();
631
+ constructor(config) {
632
+ this.config = config;
633
+ }
634
+ async initialize() {
635
+ try {
636
+ this.setState("initializing");
637
+ const apiInfo = await this.getApiInformation();
638
+ this.initializeSupabaseClient(apiInfo.anonKey, apiInfo.apiUrl);
639
+ await this.handleAuthentication();
640
+ if (this.config.externalJwt) {
641
+ await this.saveCheckKey(this.config.externalJwt, this.config.apiKey);
642
+ }
643
+ this.setState("ready");
644
+ } catch (error) {
645
+ console.error("Authentication flow failed:", error);
646
+ this.setState("error");
647
+ throw error;
648
+ }
649
+ }
650
+ async getHeaders() {
651
+ if (!this.supabaseClient) {
652
+ return {};
653
+ }
654
+ const session = await this.supabaseClient.getSession();
655
+ if (!session.data.session) {
656
+ return {};
657
+ }
658
+ const { access_token } = session.data.session;
659
+ return {
660
+ [HEADER_CLIENT_VERSION]: MM_CLIENT_VERSION2,
661
+ [HEADER_SP_TOKEN]: access_token
662
+ };
663
+ }
664
+ getState() {
665
+ return this.state;
666
+ }
667
+ async updateExternalJwt(jwt) {
668
+ if (this.config.externalJwt === jwt) return;
669
+ this.config.externalJwt = jwt;
670
+ this.processedJwt = Symbol("updating");
671
+ await this.initialize();
672
+ }
673
+ async logout() {
674
+ if (this.supabaseClient) {
675
+ await this.supabaseClient.signOut({ scope: "local" });
676
+ }
677
+ await this.clearStorage();
678
+ }
679
+ getSupabaseClient() {
680
+ return this.supabaseClient;
681
+ }
682
+ addEventListener(type, listener, options) {
683
+ this.events.addEventListener(type, listener, options);
684
+ }
685
+ removeEventListener(type, listener) {
686
+ this.events.removeEventListener(type, listener);
687
+ }
688
+ startAutoRefresh() {
689
+ return this.supabaseClient?.startAutoRefresh();
690
+ }
691
+ stopAutoRefresh() {
692
+ return this.supabaseClient?.stopAutoRefresh();
693
+ }
694
+ async getApiInformation() {
695
+ if (!this.noAuthApiClient || !this.authApiResponse) {
696
+ this.noAuthApiClient = createApiClient2({
697
+ baseUrl: this.config.apiUrl
698
+ });
699
+ this.noAuthApiClient.use(throwOnError);
700
+ this.noAuthApiClient.use(addVersionHeader(MM_CLIENT_VERSION2));
701
+ this.noAuthApiClient.use(addApiKeyHeader(this.config.apiKey));
702
+ const { data } = await this.noAuthApiClient.GET(GetApiInformation.path, {
703
+ params: {
704
+ query: {
705
+ apiKey: this.config.apiKey
706
+ }
707
+ }
708
+ });
709
+ if (!data) {
710
+ throw new Error("Failed to fetch API information");
711
+ }
712
+ this.authApiResponse = data;
713
+ }
714
+ return this.authApiResponse;
715
+ }
716
+ initializeSupabaseClient(anonKey, apiUrl) {
717
+ if (!this.supabaseClient) {
718
+ this.supabaseClient = new GoTrueClient({
719
+ url: `${apiUrl}/auth/v1`,
720
+ storageKey: TOKEN_STORAGE_KEY,
721
+ headers: {
722
+ apiKey: anonKey
723
+ },
724
+ storage: this.config.storage,
725
+ ...this.config.authOptions
726
+ });
727
+ this.supabaseClient.onAuthStateChange((event, session) => {
728
+ console.debug("Supabase auth state change:", event, !!session);
729
+ if (event === "SIGNED_IN" && session?.user) {
730
+ if (this.userId !== session.user.id && this.userId !== null) {
731
+ this.events.dispatch("userChange", { id: session.user.id });
732
+ }
733
+ this.userId = session.user.id;
734
+ }
735
+ if (event === "TOKEN_REFRESHED" && session) {
736
+ console.debug("Token refreshed successfully");
737
+ this.setState("ready");
738
+ } else if (event === "SIGNED_OUT") {
739
+ console.debug("User signed out");
740
+ void this.clearStorage();
741
+ this.setState("initializing");
742
+ }
743
+ });
744
+ }
745
+ }
746
+ async handleAuthentication() {
747
+ if (!this.supabaseClient) {
748
+ throw new Error("Supabase client not initialized");
749
+ }
750
+ if (this.processedJwt === this.config.externalJwt) {
751
+ return;
752
+ }
753
+ try {
754
+ const { data, error } = await this.supabaseClient.getSession();
755
+ if (error) {
756
+ console.error("Error getting session:", error);
757
+ this.processedJwt = this.config.externalJwt || "";
758
+ return;
759
+ }
760
+ const isCheckValid = await this.compareCheckKey(
761
+ this.config.externalJwt ?? "",
762
+ this.config.apiKey
763
+ );
764
+ if (data.session && this.config.externalJwt && isCheckValid) {
765
+ console.debug("Session found, authentication ready");
766
+ this.processedJwt = this.config.externalJwt || "";
767
+ } else if (this.config.externalJwt) {
768
+ console.debug("No session found, exchanging external JWT");
769
+ await this.clearCheckKey();
770
+ await this.exchangeExternalToken();
771
+ this.processedJwt = this.config.externalJwt;
772
+ } else {
773
+ console.debug("No session and no external JWT provided");
774
+ this.processedJwt = this.config.externalJwt || "";
775
+ }
776
+ } catch (error) {
777
+ console.error("Unhandled error during authentication:", error);
778
+ this.processedJwt = this.config.externalJwt || "";
779
+ throw error;
780
+ }
781
+ }
782
+ async exchangeExternalToken() {
783
+ if (!this.noAuthApiClient || !this.supabaseClient || !this.config.externalJwt) {
784
+ throw new Error(
785
+ "Required clients or JWT not available for token exchange"
786
+ );
787
+ }
788
+ const { data } = await this.noAuthApiClient.POST(
789
+ ExchangeExternalToken.path,
790
+ {
791
+ body: {
792
+ apiKey: this.config.apiKey,
793
+ externalJWT: this.config.externalJwt
794
+ },
795
+ headers: this.config.additionalHeaders || {}
796
+ }
797
+ );
798
+ if (!data) {
799
+ throw new Error("Failed to exchange tokens");
800
+ }
801
+ await this.supabaseClient.setSession({
802
+ access_token: data.accessToken,
803
+ refresh_token: data.refreshToken
804
+ });
805
+ console.debug("Token exchange successful, session set");
806
+ }
807
+ setState(state) {
808
+ this.state = state;
809
+ this.events.dispatch("authStateChange", state);
279
810
  }
280
- static getMetadataFromRegistry(zodSchema) {
281
- const internal = this.getMetadataFromInternalRegistry(zodSchema);
282
- const general = zodSchema.meta();
283
- if (!internal) {
284
- return general;
285
- }
286
- const { _internal } = internal, rest = __rest(internal, ["_internal"]);
287
- const _a = general !== null && general !== void 0 ? general : {}, { id, title } = _a, restGeneral = __rest(_a, ["id", "title"]);
288
- return Object.assign(Object.assign(Object.assign({ _internal: Object.assign(Object.assign({}, id ? { refId: id } : {}), _internal) }, rest), title ? { description: title } : {}), restGeneral);
811
+ encodeCheckKey(externalJwt, apiKey) {
812
+ return hashString(
813
+ JSON.stringify({
814
+ externalJwt,
815
+ apiKey
816
+ })
817
+ );
289
818
  }
290
- static setMetadataInRegistry(zodSchema, metadata) {
291
- zodToOpenAPIRegistry.add(zodSchema, metadata);
819
+ async saveCheckKey(externalJwt, apiKey) {
820
+ const encodedKey = this.encodeCheckKey(externalJwt, apiKey);
821
+ await this.config.storage.setItem(CHECK_KEY, encodedKey);
292
822
  }
293
- };
294
- function preserveMetadataFromModifier(zodSchema, modifier) {
295
- const zodModifier = zodSchema[modifier];
296
- if (typeof zodModifier !== "function") {
297
- return;
823
+ async compareCheckKey(externalJwt, apiKey) {
824
+ const storedKey = await this.config.storage.getItem(CHECK_KEY);
825
+ if (!storedKey) return false;
826
+ const newValue = this.encodeCheckKey(externalJwt, apiKey);
827
+ return storedKey === newValue;
298
828
  }
299
- zodSchema[modifier] = function(...args) {
300
- const result = zodModifier.apply(this, args);
301
- const meta = Metadata.getMetadataFromRegistry(this);
302
- if (meta) {
303
- Metadata.setMetadataInRegistry(result, meta);
304
- }
305
- return result;
306
- };
307
- }
308
- function extendZodWithOpenApi(zod) {
309
- if (typeof zod.ZodType.prototype.openapi !== "undefined") {
310
- return;
829
+ async clearCheckKey() {
830
+ await this.config.storage.removeItem(CHECK_KEY);
311
831
  }
312
- zod.ZodType.prototype.openapi = function(...args) {
313
- const { refId, metadata, options } = getOpenApiConfiguration(...args);
314
- const _a = metadata !== null && metadata !== void 0 ? metadata : {}, { param } = _a, restOfOpenApi = __rest(_a, ["param"]);
315
- const allMetadata = Metadata.getMetadataFromRegistry(this);
316
- const _b = allMetadata !== null && allMetadata !== void 0 ? allMetadata : {}, { _internal: internalMetadata } = _b, currentMetadata = __rest(_b, ["_internal"]);
317
- const _internal = Object.assign(Object.assign(Object.assign({}, internalMetadata), options), refId ? { refId } : void 0);
318
- const resultMetadata = Object.assign(Object.assign(Object.assign({}, currentMetadata), restOfOpenApi), (currentMetadata === null || currentMetadata === void 0 ? void 0 : currentMetadata.param) || param ? {
319
- param: Object.assign(Object.assign({}, currentMetadata === null || currentMetadata === void 0 ? void 0 : currentMetadata.param), param)
320
- } : void 0);
321
- const result = new this.constructor(this._def);
322
- Metadata.setMetadataInRegistry(result, Object.assign(Object.assign({}, Object.keys(_internal).length > 0 ? { _internal } : void 0), resultMetadata));
323
- if (isZodType(result, "ZodObject")) {
324
- const currentMetadata2 = Metadata.getMetadataFromRegistry(result);
325
- const originalExtend = result.extend;
326
- result.extend = function(...args2) {
327
- const extendedResult = originalExtend.apply(result, args2);
328
- const _a2 = currentMetadata2 !== null && currentMetadata2 !== void 0 ? currentMetadata2 : {}, { _internal: _internal2 } = _a2, rest = __rest(_a2, ["_internal"]);
329
- Metadata.setMetadataInRegistry(extendedResult, {
330
- _internal: {
331
- extendedFrom: (_internal2 === null || _internal2 === void 0 ? void 0 : _internal2.refId) ? { refId: _internal2.refId, schema: result } : _internal2 === null || _internal2 === void 0 ? void 0 : _internal2.extendedFrom
332
- }
333
- });
334
- return extendedResult.openapi(rest);
335
- };
336
- preserveMetadataFromModifier(result, "catchall");
832
+ async clearStorage() {
833
+ try {
834
+ await this.config.storage.removeItem(TOKEN_STORAGE_KEY);
835
+ await this.config.storage.removeItem(CHECK_KEY);
836
+ } catch {
337
837
  }
338
- preserveMetadataFromModifier(result, "optional");
339
- preserveMetadataFromModifier(result, "nullable");
340
- preserveMetadataFromModifier(result, "default");
341
- preserveMetadataFromModifier(result, "transform");
342
- preserveMetadataFromModifier(result, "refine");
343
- preserveMetadataFromModifier(result, "length");
344
- preserveMetadataFromModifier(result, "min");
345
- preserveMetadataFromModifier(result, "max");
346
- const originalMeta = result.meta;
347
- result.meta = function(...args2) {
348
- const result2 = originalMeta.apply(this, args2);
349
- if (args2[0]) {
350
- const meta = Metadata.getMetadataFromInternalRegistry(this);
351
- if (meta) {
352
- Metadata.setMetadataInRegistry(result2, Object.assign(Object.assign({}, meta), args2[0]));
353
- }
354
- }
355
- return result2;
356
- };
357
- return result;
358
- };
359
- }
360
- function getOpenApiConfiguration(refOrOpenapi, metadataOrOptions, options) {
361
- if (typeof refOrOpenapi === "string") {
362
- return {
363
- refId: refOrOpenapi,
364
- metadata: metadataOrOptions,
365
- options
366
- };
367
838
  }
368
- return {
369
- refId: void 0,
370
- metadata: refOrOpenapi,
371
- options: metadataOrOptions
372
- };
373
- }
374
- new Set(".\\+*[^]$()");
375
- var createRoute = (routeConfig) => {
376
- const route = {
377
- ...routeConfig,
378
- getRoutingPath() {
379
- return routeConfig.path.replaceAll(/\/{(.+?)}/g, "/:$1");
380
- }
381
- };
382
- return Object.defineProperty(route, "getRoutingPath", { enumerable: false });
383
839
  };
384
- extendZodWithOpenApi(z);
385
840
 
386
841
  // ../shared/dist/src/endpoints/admin-console/sqlPreview.routes.js
387
842
  var TanStackColumnSchema = z.object({
@@ -508,7 +963,7 @@ var columnsQueryParams = z.string().transform((str) => {
508
963
  type: "string"
509
964
  });
510
965
  var SupabaseUserHeaderSchema = z.object({
511
- "sp-access-token": z.string()
966
+ [HEADER_SP_TOKEN]: z.string()
512
967
  });
513
968
  var SupabaseHeaderSchema = SupabaseUserHeaderSchema;
514
969
  var FEEDBACK_OPTIONS = [
@@ -601,7 +1056,20 @@ var ReportColumnSchema = z.looseObject({
601
1056
  data_type: z.string(),
602
1057
  null_count: z.number().nullable(),
603
1058
  unique_count: z.number().nullable(),
604
- unique_percentage: z.number().nullable()
1059
+ unique_percentage: z.number().nullable(),
1060
+ // Numeric column statistics
1061
+ min_value: z.number().nullable().optional(),
1062
+ max_value: z.number().nullable().optional(),
1063
+ avg_value: z.number().nullable().optional(),
1064
+ median_value: z.number().nullable().optional(),
1065
+ std_value: z.number().nullable().optional(),
1066
+ // Date column statistics
1067
+ min_date: z.string().nullable().optional(),
1068
+ max_date: z.string().nullable().optional(),
1069
+ // String column statistics
1070
+ min_length: z.number().nullable().optional(),
1071
+ max_length: z.number().nullable().optional(),
1072
+ avg_length: z.number().nullable().optional()
605
1073
  });
606
1074
  var MaterializationStatusSchema = z.enum([
607
1075
  "completed",
@@ -1567,157 +2035,24 @@ createRoute({
1567
2035
  }
1568
2036
  },
1569
2037
  404: {
1570
- description: "Report not found",
1571
- content: {
1572
- "application/json": {
1573
- schema: z.object({
1574
- error: z.string()
1575
- })
1576
- }
1577
- }
1578
- },
1579
- 500: {
1580
- description: "Something wrong happened",
1581
- content: {
1582
- "application/json": {
1583
- schema: z.object({
1584
- error: z.string()
1585
- })
1586
- }
1587
- }
1588
- }
1589
- }
1590
- });
1591
-
1592
- // ../shared/dist/src/endpoints/auth.routes.js
1593
- var GetApiInformationInputSchema = z.object({
1594
- apiKey: z.string()
1595
- });
1596
- var GetApiInformationOutputSchema = z.object({
1597
- apiUrl: z.string(),
1598
- anonKey: z.string()
1599
- });
1600
- var GetApiInformation = createRoute({
1601
- method: "get",
1602
- path: "/api/v1/auth/apiInformation",
1603
- operationId: "getApiInformation",
1604
- request: {
1605
- query: GetApiInformationInputSchema
1606
- },
1607
- responses: {
1608
- 200: {
1609
- content: {
1610
- "application/json": {
1611
- schema: GetApiInformationOutputSchema
1612
- }
1613
- },
1614
- description: "Retrieve the API URL and anon key"
1615
- },
1616
- 400: {
1617
- content: {
1618
- "application/json": {
1619
- schema: z.object({ error: z.string() })
1620
- }
1621
- },
1622
- description: "Invalid input"
1623
- },
1624
- 500: {
1625
- content: {
1626
- "application/json": {
1627
- schema: z.object({
1628
- error: z.string()
1629
- })
1630
- }
1631
- },
1632
- description: "Unable to retrieve the API URL and anon key"
1633
- }
1634
- }
1635
- });
1636
- createRoute({
1637
- hide: true,
1638
- method: "get",
1639
- path: "/api/auth/apiInformation",
1640
- operationId: "getApiInformation",
1641
- request: {
1642
- query: GetApiInformationInputSchema
1643
- },
1644
- responses: {
1645
- 200: {
1646
- content: {
1647
- "application/json": {
1648
- schema: GetApiInformationOutputSchema
1649
- }
1650
- },
1651
- description: "Retrieve the API URL and anon key"
1652
- },
1653
- 400: {
1654
- content: {
1655
- "application/json": {
1656
- schema: z.object({ error: z.string() })
1657
- }
1658
- },
1659
- description: "Invalid input"
1660
- },
1661
- 500: {
1662
- content: {
1663
- "application/json": {
1664
- schema: z.object({
1665
- error: z.string()
1666
- })
1667
- }
1668
- },
1669
- description: "Unable to retrieve the API URL and anon key"
1670
- }
1671
- }
1672
- });
1673
- var ExchangeExternalTokenInputSchema = z.object({
1674
- apiKey: z.string(),
1675
- externalJWT: z.string()
1676
- });
1677
- var ExchangeExternalTokenOutputSchema = z.object({
1678
- accessToken: z.string(),
1679
- refreshToken: z.string()
1680
- });
1681
- var ExchangeExternalToken = createRoute({
1682
- method: "post",
1683
- path: "/api/v1/auth/exchangeExternalToken",
1684
- operationId: "exchangeExternalToken",
1685
- request: {
1686
- body: {
1687
- required: true,
1688
- content: {
1689
- "application/json": {
1690
- schema: ExchangeExternalTokenInputSchema
1691
- }
1692
- }
1693
- }
1694
- },
1695
- responses: {
1696
- 200: {
1697
- content: {
1698
- "application/json": {
1699
- schema: ExchangeExternalTokenOutputSchema
1700
- }
1701
- },
1702
- description: "Retrieve a JWT for an external user"
1703
- },
1704
- 400: {
2038
+ description: "Report not found",
1705
2039
  content: {
1706
2040
  "application/json": {
1707
- schema: z.object({ error: z.string() })
2041
+ schema: z.object({
2042
+ error: z.string()
2043
+ })
1708
2044
  }
1709
- },
1710
- description: "Invalid input"
2045
+ }
1711
2046
  },
1712
2047
  500: {
2048
+ description: "Something wrong happened",
1713
2049
  content: {
1714
2050
  "application/json": {
1715
2051
  schema: z.object({
1716
2052
  error: z.string()
1717
2053
  })
1718
2054
  }
1719
- },
1720
- description: "Unable to retrieve a JWT for an external user"
2055
+ }
1721
2056
  }
1722
2057
  }
1723
2058
  });
@@ -1982,12 +2317,6 @@ var createStorageAdapter = () => {
1982
2317
  return new MemoryStorageAdapter();
1983
2318
  }
1984
2319
  };
1985
- var hashString = (value) => {
1986
- const encoder = new TextEncoder();
1987
- const data = encoder.encode(value);
1988
- const hash = sha256(data);
1989
- return Array.from(hash).map((b) => b.toString(16).padStart(2, "0")).join("");
1990
- };
1991
2320
 
1992
2321
  // ../shared/dist/src/schemas/canvas.js
1993
2322
  var DATA_REPORT_LABEL = "dataReport";
@@ -2798,10 +3127,6 @@ var toSearchParams = ({ cursor, filters, sorting, limit }) => {
2798
3127
  }
2799
3128
  return params;
2800
3129
  };
2801
-
2802
- // package.json
2803
- var package_default = {
2804
- version: "0.5.4"};
2805
3130
  var MageMetricsChatTransport = class extends DefaultChatTransport {
2806
3131
  constructor(apiUrl, flowId, options) {
2807
3132
  super({
@@ -2814,48 +3139,6 @@ var MageMetricsChatTransport = class extends DefaultChatTransport {
2814
3139
  }
2815
3140
  };
2816
3141
 
2817
- // src/core/MageMetricsEventEmitter.ts
2818
- var MageMetricsEventEmitter = class {
2819
- listeners = /* @__PURE__ */ new Map();
2820
- addEventListener(type, listener, options) {
2821
- if (!this.listeners.has(type)) {
2822
- this.listeners.set(type, /* @__PURE__ */ new Set());
2823
- }
2824
- if (options?.signal) {
2825
- if (options.signal.aborted) {
2826
- return;
2827
- }
2828
- const abortHandler = () => {
2829
- this.removeEventListener(type, listener);
2830
- };
2831
- options.signal.addEventListener("abort", abortHandler, { once: true });
2832
- }
2833
- this.listeners.get(type).add(listener);
2834
- }
2835
- removeEventListener(type, listener) {
2836
- const typeListeners = this.listeners.get(type);
2837
- if (typeListeners) {
2838
- typeListeners.delete(listener);
2839
- if (typeListeners.size === 0) {
2840
- this.listeners.delete(type);
2841
- }
2842
- }
2843
- }
2844
- dispatch(type, detail) {
2845
- const typeListeners = this.listeners.get(type);
2846
- if (typeListeners) {
2847
- const event = { type, detail };
2848
- typeListeners.forEach((listener) => {
2849
- try {
2850
- listener(event);
2851
- } catch (error) {
2852
- console.error(`Error in event listener for "${type}":`, error);
2853
- }
2854
- });
2855
- }
2856
- }
2857
- };
2858
-
2859
3142
  // src/core/resolvable.ts
2860
3143
  var resolve = (value) => {
2861
3144
  if (typeof value === "function") {
@@ -2864,45 +3147,54 @@ var resolve = (value) => {
2864
3147
  return Promise.resolve(value);
2865
3148
  };
2866
3149
 
2867
- // src/core/types.ts
2868
- var TOKEN_STORAGE_KEY = "mm-ai-sp-token";
2869
- var CHECK_KEY = "mm-ai-check-key";
2870
-
2871
3150
  // src/core/MageMetricsClient.ts
2872
- var MM_CLIENT_VERSION = package_default.version;
3151
+ var MM_CLIENT_VERSION3 = package_default.version;
2873
3152
  var getPublicApiClient = (apiUrl, apiKey) => {
2874
- const client = createApiClient({ baseUrl: apiUrl });
3153
+ const client = createApiClient2({ baseUrl: apiUrl });
2875
3154
  client.use(throwOnError);
2876
- client.use(addVersionHeader(MM_CLIENT_VERSION));
3155
+ client.use(addVersionHeader(MM_CLIENT_VERSION3));
2877
3156
  client.use(addApiKeyHeader(apiKey));
2878
3157
  return client;
2879
3158
  };
2880
3159
  var MageMetricsClient = class {
2881
3160
  config;
2882
- authState = "initializing";
2883
- supabaseClient = null;
3161
+ authProvider;
2884
3162
  internalApiClient;
2885
- noAuthApiClient = null;
2886
- authApiResponse = null;
2887
3163
  authPromise = null;
2888
- processedJwt = Symbol("initial");
2889
- userId = null;
2890
- storageAdapter;
2891
- events = new MageMetricsEventEmitter();
2892
- authOptions;
2893
- constructor(config, auth) {
3164
+ constructor(config, authProviderOrAuthOptions) {
2894
3165
  this.config = config;
2895
- this.storageAdapter = config.storageAdapter || createStorageAdapter();
2896
- this.internalApiClient = createApiClient({
3166
+ const isAuthProvider = authProviderOrAuthOptions && "initialize" in authProviderOrAuthOptions && "getHeaders" in authProviderOrAuthOptions;
3167
+ if (isAuthProvider) {
3168
+ this.authProvider = authProviderOrAuthOptions;
3169
+ } else {
3170
+ const storageAdapter = config.storageAdapter || createStorageAdapter();
3171
+ this.authProvider = new ExternalAuthProvider({
3172
+ apiUrl: config.apiUrl,
3173
+ apiKey: config.apiKey,
3174
+ externalJwt: config.externalJwt,
3175
+ additionalHeaders: config.additionalHeaders,
3176
+ storage: storageAdapter,
3177
+ applicationName: config.applicationName,
3178
+ authOptions: authProviderOrAuthOptions
3179
+ });
3180
+ }
3181
+ this.internalApiClient = createApiClient2({
2897
3182
  baseUrl: this.config.apiUrl
2898
3183
  });
2899
3184
  this.internalApiClient.use(throwOnError);
2900
3185
  this.internalApiClient.use(this.createSupabaseHeaderMiddleware());
2901
- this.authOptions = auth || {};
2902
3186
  }
3187
+ /* This is used by react-query query keys to identify unique clients
3188
+ * we hash it to make it more digestible and safer to debug/log
3189
+ */
2903
3190
  toJSON() {
2904
3191
  return {
2905
- config: this.encodeCheckKey(this.config.apiKey, this.config.apiUrl)
3192
+ config: hashString(
3193
+ JSON.stringify({
3194
+ apiKey: this.config.apiKey,
3195
+ apiUrl: this.config.apiUrl
3196
+ })
3197
+ )
2906
3198
  };
2907
3199
  }
2908
3200
  get apiConfig() {
@@ -2919,7 +3211,7 @@ var MageMetricsClient = class {
2919
3211
  * @param options.signal an optional AbortSignal to abort the event listener
2920
3212
  */
2921
3213
  addEventListener(type, listener, options) {
2922
- this.events.addEventListener(type, listener, options);
3214
+ this.authProvider.addEventListener(type, listener, options);
2923
3215
  }
2924
3216
  /**
2925
3217
  * Remove an event listener
@@ -2927,60 +3219,42 @@ var MageMetricsClient = class {
2927
3219
  * @param listener the listener to remove
2928
3220
  */
2929
3221
  removeEventListener(type, listener) {
2930
- this.events.removeEventListener(type, listener);
3222
+ this.authProvider.removeEventListener(type, listener);
2931
3223
  }
2932
3224
  async waitForAuth() {
2933
- if (this.authState === "ready") {
3225
+ if (this.authProvider.getState() === "ready") {
2934
3226
  return Promise.resolve();
2935
3227
  }
2936
- if (this.authState === "error") {
3228
+ if (this.authProvider.getState() === "error") {
2937
3229
  throw new Error("Authentication failed");
2938
3230
  }
2939
3231
  if (!this.authPromise) {
2940
- this.authPromise = this.performAuthFlow();
3232
+ this.authPromise = this.authProvider.initialize();
2941
3233
  }
2942
3234
  return this.authPromise;
2943
3235
  }
2944
3236
  async updateExternalJwt(jwt) {
2945
- if (this.config.externalJwt === jwt) return;
2946
- this.config.externalJwt = jwt;
2947
- this.processedJwt = Symbol("updating");
2948
- await this.performAuthFlow();
3237
+ await this.authProvider.updateExternalJwt(jwt);
2949
3238
  }
2950
3239
  get state() {
2951
- return this.authState;
3240
+ return this.authProvider.getState();
2952
3241
  }
2953
3242
  async getHeaders() {
2954
3243
  await this.waitForAuth();
2955
- if (!this.supabaseClient) {
2956
- return {};
2957
- }
2958
- const session = await this.supabaseClient.getSession();
2959
- if (!session.data.session) {
2960
- return {};
2961
- }
2962
- const { access_token } = session.data.session;
2963
- return {
2964
- [HEADER_CLIENT_VERSION]: MM_CLIENT_VERSION,
2965
- "sp-access-token": access_token
2966
- };
2967
- }
2968
- async clearStorage() {
2969
- try {
2970
- await this.storageAdapter.removeItem(TOKEN_STORAGE_KEY);
2971
- await this.storageAdapter.removeItem(CHECK_KEY);
2972
- } catch {
2973
- }
3244
+ return this.authProvider.getHeaders();
2974
3245
  }
2975
3246
  async logout() {
2976
- if (this.supabaseClient) {
2977
- await this.supabaseClient.signOut({ scope: "local" });
2978
- }
2979
- await this.clearStorage();
3247
+ await this.authProvider.logout();
2980
3248
  }
2981
3249
  auth = {
2982
- startAutoRefresh: () => this.supabaseClient?.startAutoRefresh(),
2983
- stopAuthRefresh: () => this.supabaseClient?.startAutoRefresh()
3250
+ startAutoRefresh: () => {
3251
+ const supabaseClient = this.authProvider.getSupabaseClient();
3252
+ return supabaseClient?.startAutoRefresh();
3253
+ },
3254
+ stopAuthRefresh: () => {
3255
+ const supabaseClient = this.authProvider.getSupabaseClient();
3256
+ return supabaseClient?.stopAutoRefresh();
3257
+ }
2984
3258
  };
2985
3259
  /**
2986
3260
  * Public API methods that automatically wait for authentication
@@ -3387,156 +3661,13 @@ var MageMetricsClient = class {
3387
3661
  };
3388
3662
  }
3389
3663
  };
3390
- /**
3391
- * Perform the complete authentication flow
3392
- */
3393
- async performAuthFlow() {
3394
- try {
3395
- this.setState("initializing");
3396
- const apiInfo = await this.getApiInformation();
3397
- this.initializeSupabaseClient(apiInfo.anonKey, apiInfo.apiUrl);
3398
- await this.handleAuthentication();
3399
- if (this.config.externalJwt) {
3400
- await this.saveCheckKey(this.config.externalJwt, this.config.apiKey);
3401
- }
3402
- this.setState("ready");
3403
- } catch (error) {
3404
- console.error("Authentication flow failed:", error);
3405
- this.setState("error");
3406
- throw error;
3407
- }
3408
- }
3409
- async getApiInformation() {
3410
- if (!this.noAuthApiClient || !this.authApiResponse) {
3411
- this.noAuthApiClient = getPublicApiClient(
3412
- this.config.apiUrl,
3413
- this.config.apiKey
3414
- );
3415
- const { data } = await this.noAuthApiClient.GET(GetApiInformation.path, {
3416
- params: {
3417
- query: {
3418
- apiKey: this.config.apiKey
3419
- }
3420
- }
3421
- });
3422
- if (!data) {
3423
- throw new Error("Failed to fetch API information");
3424
- }
3425
- this.authApiResponse = data;
3426
- }
3427
- return this.authApiResponse;
3428
- }
3429
- initializeSupabaseClient(anonKey, apiUrl) {
3430
- if (!this.supabaseClient) {
3431
- this.supabaseClient = new GoTrueClient({
3432
- url: `${apiUrl}/auth/v1`,
3433
- storageKey: TOKEN_STORAGE_KEY,
3434
- headers: {
3435
- apiKey: anonKey
3436
- },
3437
- storage: this.storageAdapter,
3438
- ...this.authOptions
3439
- });
3440
- this.supabaseClient.onAuthStateChange((event, session) => {
3441
- console.debug("Supabase auth state change:", event, !!session);
3442
- if (event === "SIGNED_IN" && session?.user) {
3443
- if (this.userId !== session.user.id && this.userId !== null) {
3444
- this.events.dispatch("userChange", { id: session.user.id });
3445
- }
3446
- this.userId = session.user.id;
3447
- }
3448
- if (event === "TOKEN_REFRESHED" && session) {
3449
- console.debug("Token refreshed successfully");
3450
- this.setState("ready");
3451
- } else if (event === "SIGNED_OUT") {
3452
- console.debug("User signed out");
3453
- void this.clearStorage();
3454
- this.setState("initializing");
3455
- }
3456
- });
3457
- }
3458
- }
3459
3664
  client() {
3460
3665
  return this.internalApiClient;
3461
3666
  }
3462
- /**
3463
- * Handle the authentication logic (check session or exchange token)
3464
- */
3465
- async handleAuthentication() {
3466
- if (!this.supabaseClient) {
3467
- throw new Error("Supabase client not initialized");
3468
- }
3469
- if (this.processedJwt === this.config.externalJwt) {
3470
- return;
3471
- }
3472
- try {
3473
- const { data, error } = await this.supabaseClient.getSession();
3474
- if (error) {
3475
- console.error("Error getting session:", error);
3476
- this.processedJwt = this.config.externalJwt || "";
3477
- return;
3478
- }
3479
- const isCheckValid = await this.compareCheckKey(
3480
- this.config.externalJwt ?? "",
3481
- this.config.apiKey
3482
- );
3483
- if (data.session && this.config.externalJwt && isCheckValid) {
3484
- console.debug("Session found, authentication ready");
3485
- this.processedJwt = this.config.externalJwt || "";
3486
- } else if (this.config.externalJwt) {
3487
- console.debug("No session found, exchanging external JWT");
3488
- await this.clearCheckKey();
3489
- await this.exchangeExternalToken();
3490
- this.processedJwt = this.config.externalJwt;
3491
- } else {
3492
- console.debug("No session and no external JWT provided");
3493
- this.processedJwt = this.config.externalJwt || "";
3494
- }
3495
- } catch (error) {
3496
- console.error("Unhandled error during authentication:", error);
3497
- this.processedJwt = this.config.externalJwt || "";
3498
- throw error;
3499
- }
3500
- }
3501
- /**
3502
- * Exchange external JWT for Supabase tokens
3503
- */
3504
- async exchangeExternalToken() {
3505
- if (!this.noAuthApiClient || !this.supabaseClient || !this.config.externalJwt) {
3506
- throw new Error(
3507
- "Required clients or JWT not available for token exchange"
3508
- );
3509
- }
3510
- const { data } = await this.noAuthApiClient.POST(
3511
- ExchangeExternalToken.path,
3512
- {
3513
- body: {
3514
- apiKey: this.config.apiKey,
3515
- externalJWT: this.config.externalJwt
3516
- },
3517
- headers: this.config.additionalHeaders || {}
3518
- }
3519
- );
3520
- if (!data) {
3521
- throw new Error("Failed to exchange tokens");
3522
- }
3523
- await this.supabaseClient.setSession({
3524
- access_token: data.accessToken,
3525
- refresh_token: data.refreshToken
3526
- });
3527
- console.debug("Token exchange successful, session set");
3528
- }
3529
3667
  createSupabaseHeaderMiddleware() {
3530
3668
  return {
3531
3669
  onRequest: async ({ request }) => {
3532
3670
  const headers = await this.getHeaders();
3533
- if (!this.supabaseClient) {
3534
- return request;
3535
- }
3536
- const session = await this.supabaseClient.getSession();
3537
- if (!session.data.session) {
3538
- return request;
3539
- }
3540
3671
  for (const [key, value] of Object.entries(headers)) {
3541
3672
  request.headers.set(key, value);
3542
3673
  }
@@ -3544,33 +3675,8 @@ var MageMetricsClient = class {
3544
3675
  }
3545
3676
  };
3546
3677
  }
3547
- setState(state) {
3548
- this.authState = state;
3549
- this.events.dispatch("authStateChange", state);
3550
- }
3551
- encodeCheckKey(externalJwt, apiKey) {
3552
- return hashString(
3553
- JSON.stringify({
3554
- externalJwt,
3555
- apiKey
3556
- })
3557
- );
3558
- }
3559
- async saveCheckKey(externalJwt, apiKey) {
3560
- const encodedKey = this.encodeCheckKey(externalJwt, apiKey);
3561
- await this.storageAdapter.setItem(CHECK_KEY, encodedKey);
3562
- }
3563
- async compareCheckKey(externalJwt, apiKey) {
3564
- const storedKey = await this.storageAdapter.getItem(CHECK_KEY);
3565
- if (!storedKey) return false;
3566
- const newValue = this.encodeCheckKey(externalJwt, apiKey);
3567
- return storedKey === newValue;
3568
- }
3569
- async clearCheckKey() {
3570
- await this.storageAdapter.removeItem(CHECK_KEY);
3571
- }
3572
3678
  };
3573
3679
 
3574
- export { BrowserStorageAdapter, CHECK_KEY, MageMetricsClient, MageMetricsEventEmitter, MemoryStorageAdapter, TOKEN_STORAGE_KEY, getPublicApiClient };
3680
+ export { BrowserStorageAdapter, CHECK_KEY, DirectAuthProvider, ExternalAuthProvider, MageMetricsClient, MageMetricsEventEmitter, MemoryStorageAdapter, TOKEN_STORAGE_KEY, getPublicApiClient };
3575
3681
  //# sourceMappingURL=index.js.map
3576
3682
  //# sourceMappingURL=index.js.map