@blinkdotnew/dev-sdk 2.1.1 → 2.1.2

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.mjs CHANGED
@@ -5,33 +5,6 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
5
5
  throw Error('Dynamic require of "' + x + '" is not supported');
6
6
  });
7
7
 
8
- // ../core/src/platform.ts
9
- function detectPlatform() {
10
- if (typeof Deno !== "undefined") {
11
- return "deno";
12
- }
13
- if (typeof process !== "undefined" && process.versions?.node) {
14
- if (typeof navigator !== "undefined" && navigator.product === "ReactNative") {
15
- return "react-native";
16
- }
17
- return "node";
18
- }
19
- if (typeof navigator !== "undefined" && navigator.product === "ReactNative") {
20
- return "react-native";
21
- }
22
- if (typeof window !== "undefined" && typeof document !== "undefined") {
23
- return "web";
24
- }
25
- return "node";
26
- }
27
- var platform = detectPlatform();
28
- var isWeb = platform === "web";
29
- var isReactNative = platform === "react-native";
30
- var isNode = platform === "node";
31
- var isDeno = platform === "deno";
32
- var isBrowser = isWeb || isReactNative;
33
- var isServer = isNode || isDeno;
34
-
35
8
  // ../core/src/storage-adapter.ts
36
9
  var WebStorageAdapter = class {
37
10
  getItem(key) {
@@ -117,9 +90,6 @@ var NoOpStorageAdapter = class {
117
90
  }
118
91
  };
119
92
  function getDefaultStorageAdapter() {
120
- if (isDeno) {
121
- return new NoOpStorageAdapter();
122
- }
123
93
  if (typeof window !== "undefined" && typeof localStorage !== "undefined") {
124
94
  try {
125
95
  localStorage.setItem("__test__", "test");
@@ -131,6 +101,28 @@ function getDefaultStorageAdapter() {
131
101
  return new NoOpStorageAdapter();
132
102
  }
133
103
 
104
+ // ../core/src/platform.ts
105
+ function detectPlatform() {
106
+ if (typeof process !== "undefined" && process.versions?.node) {
107
+ if (typeof navigator !== "undefined" && navigator.product === "ReactNative") {
108
+ return "react-native";
109
+ }
110
+ return "node";
111
+ }
112
+ if (typeof navigator !== "undefined" && navigator.product === "ReactNative") {
113
+ return "react-native";
114
+ }
115
+ if (typeof window !== "undefined" && typeof document !== "undefined") {
116
+ return "web";
117
+ }
118
+ return "node";
119
+ }
120
+ var platform = detectPlatform();
121
+ var isWeb = platform === "web";
122
+ var isReactNative = platform === "react-native";
123
+ var isNode = platform === "node";
124
+ var isBrowser = isWeb || isReactNative;
125
+
134
126
  // ../core/src/types.ts
135
127
  var BlinkError = class extends Error {
136
128
  constructor(message, code, status, details) {
@@ -394,44 +386,17 @@ function convertKeysToCamelCase(obj) {
394
386
  return converted;
395
387
  }
396
388
  var HttpClient = class {
397
- authUrl = "https://blink.new";
398
- coreUrl = "https://core.blink.new";
389
+ authUrl;
390
+ coreUrl;
399
391
  projectId;
400
- publishableKey;
401
- secretKey;
402
- // Permanent, non-expiring key (like Stripe's sk_live_...)
403
392
  getToken;
404
393
  getValidToken;
405
394
  constructor(config, getToken, getValidToken) {
406
395
  this.projectId = config.projectId;
407
- this.publishableKey = config.publishableKey;
408
- this.secretKey = config.secretKey || config.serviceToken;
409
396
  this.getToken = getToken;
410
397
  this.getValidToken = getValidToken;
411
- }
412
- shouldAttachPublishableKey(path, method) {
413
- if (method !== "GET" && method !== "POST") return false;
414
- if (path.includes("/api/analytics/")) return true;
415
- if (path.includes("/api/storage/")) return true;
416
- if (path.includes("/api/db/") && path.includes("/rest/v1/")) return method === "GET";
417
- return false;
418
- }
419
- shouldSkipSecretKey(url) {
420
- try {
421
- const parsed = new URL(url);
422
- return parsed.hostname.endsWith(".functions.blink.new");
423
- } catch {
424
- return false;
425
- }
426
- }
427
- getAuthorizationHeader(url, token) {
428
- if (this.secretKey && !this.shouldSkipSecretKey(url)) {
429
- return `Bearer ${this.secretKey}`;
430
- }
431
- if (token) {
432
- return `Bearer ${token}`;
433
- }
434
- return null;
398
+ this.authUrl = config.auth?.authUrl ?? "https://blink.new";
399
+ this.coreUrl = config.auth?.coreUrl ?? "https://dev.core.blink.new";
435
400
  }
436
401
  /**
437
402
  * Make an authenticated request to the Blink API
@@ -439,23 +404,19 @@ var HttpClient = class {
439
404
  async request(path, options = {}) {
440
405
  const url = this.buildUrl(path, options.searchParams);
441
406
  const token = this.getValidToken ? await this.getValidToken() : this.getToken();
442
- const method = options.method || "GET";
443
407
  const headers = {
444
408
  "Content-Type": "application/json",
445
409
  ...options.headers
446
410
  };
447
- const auth = this.getAuthorizationHeader(url, token);
448
- if (auth) {
449
- headers.Authorization = auth;
450
- } else if (this.publishableKey && !headers["x-blink-publishable-key"] && this.shouldAttachPublishableKey(path, method)) {
451
- headers["x-blink-publishable-key"] = this.publishableKey;
411
+ if (token) {
412
+ headers.Authorization = `Bearer ${token}`;
452
413
  }
453
414
  const requestInit = {
454
- method,
415
+ method: options.method || "GET",
455
416
  headers,
456
417
  signal: options.signal
457
418
  };
458
- if (options.body && method !== "GET") {
419
+ if (options.body && options.method !== "GET") {
459
420
  requestInit.body = typeof options.body === "string" ? options.body : JSON.stringify(options.body);
460
421
  }
461
422
  try {
@@ -609,12 +570,12 @@ var HttpClient = class {
609
570
  throw new BlinkValidationError("Unsupported file type");
610
571
  }
611
572
  formData.append("path", filePath);
573
+ if (options.upsert !== void 0) {
574
+ formData.append("options", JSON.stringify({ upsert: options.upsert }));
575
+ }
612
576
  const headers = {};
613
- const auth = this.getAuthorizationHeader(url, token);
614
- if (auth) {
615
- headers.Authorization = auth;
616
- } else if (this.publishableKey && path.includes("/api/storage/") && !headers["x-blink-publishable-key"]) {
617
- headers["x-blink-publishable-key"] = this.publishableKey;
577
+ if (token) {
578
+ headers.Authorization = `Bearer ${token}`;
618
579
  }
619
580
  try {
620
581
  if (typeof XMLHttpRequest !== "undefined" && options.onProgress) {
@@ -715,7 +676,7 @@ var HttpClient = class {
715
676
  });
716
677
  }
717
678
  /**
718
- * Stream AI text generation - uses Vercel AI SDK's pipeUIMessageStreamToResponse (Data Stream Protocol)
679
+ * Stream AI text generation with Vercel AI SDK data stream format
719
680
  */
720
681
  async streamAiText(prompt, options = {}, onChunk) {
721
682
  const url = this.buildUrl(`/api/ai/${this.projectId}/text`);
@@ -723,8 +684,9 @@ var HttpClient = class {
723
684
  const headers = {
724
685
  "Content-Type": "application/json"
725
686
  };
726
- const auth = this.getAuthorizationHeader(url, token);
727
- if (auth) headers.Authorization = auth;
687
+ if (token) {
688
+ headers.Authorization = `Bearer ${token}`;
689
+ }
728
690
  const body = {
729
691
  prompt,
730
692
  stream: true,
@@ -744,7 +706,7 @@ var HttpClient = class {
744
706
  if (!response.body) {
745
707
  throw new BlinkNetworkError("No response body for streaming");
746
708
  }
747
- return this.parseDataStreamProtocol(response.body, onChunk);
709
+ return this.parseDataStream(response.body, onChunk);
748
710
  } catch (error) {
749
711
  if (error instanceof BlinkError) {
750
712
  throw error;
@@ -769,7 +731,7 @@ var HttpClient = class {
769
731
  });
770
732
  }
771
733
  /**
772
- * Stream AI object generation - uses Vercel AI SDK's pipeTextStreamToResponse
734
+ * Stream AI object generation with Vercel AI SDK data stream format
773
735
  */
774
736
  async streamAiObject(prompt, options = {}, onPartial) {
775
737
  const url = this.buildUrl(`/api/ai/${this.projectId}/object`);
@@ -777,8 +739,9 @@ var HttpClient = class {
777
739
  const headers = {
778
740
  "Content-Type": "application/json"
779
741
  };
780
- const auth = this.getAuthorizationHeader(url, token);
781
- if (auth) headers.Authorization = auth;
742
+ if (token) {
743
+ headers.Authorization = `Bearer ${token}`;
744
+ }
782
745
  const body = {
783
746
  prompt,
784
747
  stream: true,
@@ -798,35 +761,7 @@ var HttpClient = class {
798
761
  if (!response.body) {
799
762
  throw new BlinkNetworkError("No response body for streaming");
800
763
  }
801
- const reader = response.body.getReader();
802
- const decoder = new TextDecoder();
803
- let buffer = "";
804
- let latestObject = {};
805
- try {
806
- while (true) {
807
- const { done, value } = await reader.read();
808
- if (done) break;
809
- const chunk = decoder.decode(value, { stream: true });
810
- buffer += chunk;
811
- try {
812
- const parsed = JSON.parse(buffer);
813
- latestObject = parsed;
814
- if (onPartial) {
815
- onPartial(parsed);
816
- }
817
- } catch {
818
- }
819
- }
820
- if (buffer) {
821
- try {
822
- latestObject = JSON.parse(buffer);
823
- } catch {
824
- }
825
- }
826
- return { object: latestObject };
827
- } finally {
828
- reader.releaseLock();
829
- }
764
+ return this.parseDataStream(response.body, void 0, onPartial);
830
765
  } catch (error) {
831
766
  if (error instanceof BlinkError) {
832
767
  throw error;
@@ -924,38 +859,6 @@ var HttpClient = class {
924
859
  async dataSearch(projectId, request) {
925
860
  return this.post(`/api/data/${projectId}/search`, request);
926
861
  }
927
- /**
928
- * Connector requests
929
- */
930
- formatProviderForPath(provider) {
931
- return provider.replace("_", "-");
932
- }
933
- async connectorStatus(provider) {
934
- return this.request(`/api/connectors/${this.formatProviderForPath(provider)}/${this.projectId}/status`, {
935
- method: "GET"
936
- });
937
- }
938
- async connectorExecute(provider, request) {
939
- const path = request.method.startsWith("/") ? request.method : `/${request.method}`;
940
- const url = `/api/connectors/${this.formatProviderForPath(provider)}/${this.projectId}${path}`;
941
- const method = (request.http_method || "GET").toUpperCase();
942
- if (method === "GET") {
943
- return this.request(url, {
944
- method: "GET",
945
- searchParams: request.params
946
- });
947
- }
948
- return this.request(url, {
949
- method,
950
- body: request.params || {}
951
- });
952
- }
953
- async connectorSaveApiKey(provider, request) {
954
- return this.request(`/api/connectors/${this.formatProviderForPath(provider)}/${this.projectId}/api-key`, {
955
- method: "POST",
956
- body: request
957
- });
958
- }
959
862
  /**
960
863
  * Realtime-specific requests
961
864
  */
@@ -1021,94 +924,93 @@ var HttpClient = class {
1021
924
  }
1022
925
  }
1023
926
  /**
1024
- * Parse Vercel AI SDK v5 Data Stream Protocol (Server-Sent Events)
1025
- * Supports all event types from the UI Message Stream protocol
927
+ * Parse Vercel AI SDK data stream format
928
+ * Handles text chunks (0:"text"), partial objects (2:[...]), and metadata (d:, e:)
1026
929
  */
1027
- async parseDataStreamProtocol(body, onChunk) {
930
+ async parseDataStream(body, onChunk, onPartial) {
1028
931
  const reader = body.getReader();
1029
932
  const decoder = new TextDecoder();
1030
- const finalResult = {
1031
- text: "",
1032
- toolCalls: [],
1033
- toolResults: [],
1034
- sources: [],
1035
- files: [],
1036
- reasoning: []
1037
- };
1038
933
  let buffer = "";
934
+ let finalResult = {};
1039
935
  try {
1040
936
  while (true) {
1041
937
  const { done, value } = await reader.read();
1042
938
  if (done) break;
1043
939
  buffer += decoder.decode(value, { stream: true });
1044
- const lines = buffer.split("\n");
940
+ const lines = buffer.split(/\r?\n/);
1045
941
  buffer = lines.pop() || "";
1046
942
  for (const line of lines) {
1047
943
  if (!line.trim()) continue;
1048
- if (line === "[DONE]") {
1049
- continue;
1050
- }
1051
- if (!line.startsWith("data: ")) continue;
1052
944
  try {
1053
- const jsonStr = line.slice(6);
1054
- const part = JSON.parse(jsonStr);
1055
- switch (part.type) {
1056
- case "text-start":
1057
- break;
1058
- case "text-delta":
1059
- if (part.delta) {
1060
- finalResult.text += part.delta;
1061
- if (onChunk) onChunk(part.delta);
945
+ if (line.startsWith("f:")) {
946
+ const metadata = JSON.parse(line.slice(2));
947
+ finalResult.messageId = metadata.messageId;
948
+ } else if (line.startsWith("0:")) {
949
+ const textChunk = JSON.parse(line.slice(2));
950
+ if (onChunk) {
951
+ onChunk(textChunk);
952
+ }
953
+ finalResult.text = (finalResult.text || "") + textChunk;
954
+ } else if (line.startsWith("2:")) {
955
+ const data = JSON.parse(line.slice(2));
956
+ if (Array.isArray(data) && data.length > 0) {
957
+ const item = data[0];
958
+ if (typeof item === "string") {
959
+ finalResult.status = item;
960
+ } else if (typeof item === "object") {
961
+ if (onPartial) {
962
+ onPartial(item);
963
+ }
964
+ finalResult.object = item;
1062
965
  }
1063
- if (part.textDelta) {
1064
- finalResult.text += part.textDelta;
1065
- if (onChunk) onChunk(part.textDelta);
966
+ }
967
+ } else if (line.startsWith("d:")) {
968
+ const metadata = JSON.parse(line.slice(2));
969
+ if (metadata.usage) {
970
+ finalResult.usage = metadata.usage;
971
+ }
972
+ if (metadata.finishReason) {
973
+ finalResult.finishReason = metadata.finishReason;
974
+ }
975
+ } else if (line.startsWith("e:")) {
976
+ const errorData = JSON.parse(line.slice(2));
977
+ finalResult.error = errorData;
978
+ }
979
+ } catch (error) {
980
+ console.warn("Failed to parse stream line:", line, error);
981
+ }
982
+ }
983
+ }
984
+ if (buffer.trim()) {
985
+ try {
986
+ if (buffer.startsWith("0:")) {
987
+ const textChunk = JSON.parse(buffer.slice(2));
988
+ if (onChunk) {
989
+ onChunk(textChunk);
990
+ }
991
+ finalResult.text = (finalResult.text || "") + textChunk;
992
+ } else if (buffer.startsWith("2:")) {
993
+ const data = JSON.parse(buffer.slice(2));
994
+ if (Array.isArray(data) && data.length > 0) {
995
+ const item = data[0];
996
+ if (typeof item === "object") {
997
+ if (onPartial) {
998
+ onPartial(item);
1066
999
  }
1067
- break;
1068
- case "text-end":
1069
- break;
1070
- case "tool-call":
1071
- finalResult.toolCalls.push({
1072
- toolCallId: part.toolCallId,
1073
- toolName: part.toolName,
1074
- args: part.args
1075
- });
1076
- break;
1077
- case "tool-result":
1078
- finalResult.toolResults.push({
1079
- toolCallId: part.toolCallId,
1080
- toolName: part.toolName,
1081
- result: part.result
1082
- });
1083
- break;
1084
- case "source-url":
1085
- finalResult.sources.push({
1086
- id: part.id,
1087
- url: part.url,
1088
- title: part.title
1089
- });
1090
- break;
1091
- case "file":
1092
- finalResult.files.push(part.file);
1093
- break;
1094
- case "reasoning":
1095
- finalResult.reasoning.push(part.content);
1096
- break;
1097
- case "finish":
1098
- finalResult.finishReason = part.finishReason;
1099
- finalResult.usage = part.usage;
1100
- if (part.response) finalResult.response = part.response;
1101
- break;
1102
- case "error":
1103
- finalResult.error = part.error;
1104
- throw new Error(part.error);
1105
- case "data":
1106
- if (!finalResult.customData) finalResult.customData = [];
1107
- finalResult.customData.push(part.value);
1108
- break;
1000
+ finalResult.object = item;
1001
+ }
1002
+ }
1003
+ } else if (buffer.startsWith("d:")) {
1004
+ const metadata = JSON.parse(buffer.slice(2));
1005
+ if (metadata.usage) {
1006
+ finalResult.usage = metadata.usage;
1007
+ }
1008
+ if (metadata.finishReason) {
1009
+ finalResult.finishReason = metadata.finishReason;
1109
1010
  }
1110
- } catch (e) {
1111
1011
  }
1012
+ } catch (error) {
1013
+ console.warn("Failed to parse final buffer:", buffer, error);
1112
1014
  }
1113
1015
  }
1114
1016
  return finalResult;
@@ -1276,13 +1178,13 @@ var BlinkAuth = class {
1276
1178
  mode: "managed",
1277
1179
  // Default mode
1278
1180
  authUrl: "https://blink.new",
1279
- coreUrl: "https://core.blink.new",
1181
+ coreUrl: "https://dev.core.blink.new",
1280
1182
  detectSessionInUrl: true,
1281
1183
  // Default to true for web compatibility
1282
1184
  ...config.auth
1283
1185
  };
1284
1186
  this.authUrl = this.authConfig.authUrl || "https://blink.new";
1285
- this.coreUrl = this.authConfig.coreUrl || "https://core.blink.new";
1187
+ this.coreUrl = this.authConfig.coreUrl || "https://dev.core.blink.new";
1286
1188
  const hostname = getLocationHostname();
1287
1189
  if (hostname && this.authUrl === "https://blink.new" && (hostname === "localhost" || hostname === "127.0.0.1")) {
1288
1190
  console.warn("\u26A0\uFE0F Using default authUrl in development. Set auth.authUrl to your app origin for headless auth endpoints to work.");
@@ -3035,11 +2937,6 @@ var BlinkAuth = class {
3035
2937
  };
3036
2938
 
3037
2939
  // src/database.ts
3038
- function assertServerOnly(methodName) {
3039
- if (typeof window !== "undefined") {
3040
- throw new Error(`${methodName} is server-only. Use Blink CRUD methods (blink.db.<table>.*) instead.`);
3041
- }
3042
- }
3043
2940
  function camelToSnake3(str) {
3044
2941
  return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
3045
2942
  }
@@ -3258,7 +3155,6 @@ var BlinkTable = class {
3258
3155
  * Raw SQL query on this table (for advanced use cases)
3259
3156
  */
3260
3157
  async sql(query, params) {
3261
- assertServerOnly("blink.db.<table>.sql");
3262
3158
  const response = await this.httpClient.dbSql(query, params);
3263
3159
  return response.data;
3264
3160
  }
@@ -3307,7 +3203,6 @@ var BlinkDatabase = class {
3307
3203
  * Execute raw SQL query
3308
3204
  */
3309
3205
  async sql(query, params) {
3310
- assertServerOnly("blink.db.sql");
3311
3206
  const response = await this.httpClient.dbSql(query, params);
3312
3207
  return response.data;
3313
3208
  }
@@ -3315,7 +3210,6 @@ var BlinkDatabase = class {
3315
3210
  * Execute batch SQL operations
3316
3211
  */
3317
3212
  async batch(statements, mode = "write") {
3318
- assertServerOnly("blink.db.batch");
3319
3213
  const response = await this.httpClient.dbBatch(statements, mode);
3320
3214
  return response.data;
3321
3215
  }
@@ -3378,6 +3272,7 @@ var BlinkStorageImpl = class {
3378
3272
  correctedPath,
3379
3273
  // Use corrected path with proper extension
3380
3274
  {
3275
+ upsert: options.upsert,
3381
3276
  onProgress: options.onProgress,
3382
3277
  contentType: detectedContentType
3383
3278
  // Pass detected content type
@@ -3397,7 +3292,7 @@ var BlinkStorageImpl = class {
3397
3292
  if (error instanceof Error && "status" in error) {
3398
3293
  const status = error.status;
3399
3294
  if (status === 409) {
3400
- throw new BlinkStorageError("File already exists.", 409);
3295
+ throw new BlinkStorageError("File already exists. Set upsert: true to overwrite.", 409);
3401
3296
  }
3402
3297
  if (status === 400) {
3403
3298
  throw new BlinkStorageError("Invalid request parameters", 400);
@@ -3442,6 +3337,7 @@ var BlinkStorageImpl = class {
3442
3337
  detectedContentType
3443
3338
  };
3444
3339
  } catch (error) {
3340
+ console.warn("File type detection failed, using original path:", error);
3445
3341
  return {
3446
3342
  correctedPath: originalPath,
3447
3343
  detectedContentType: "application/octet-stream"
@@ -3831,7 +3727,13 @@ var BlinkAIImpl = class {
3831
3727
  options.prompt || "",
3832
3728
  requestBody
3833
3729
  );
3834
- return response.data;
3730
+ if (response.data?.result) {
3731
+ return response.data.result;
3732
+ } else if (response.data?.text) {
3733
+ return response.data;
3734
+ } else {
3735
+ throw new BlinkAIError("Invalid response format: missing text");
3736
+ }
3835
3737
  } catch (error) {
3836
3738
  if (error instanceof BlinkAIError) {
3837
3739
  throw error;
@@ -3900,14 +3802,9 @@ var BlinkAIImpl = class {
3900
3802
  );
3901
3803
  return {
3902
3804
  text: result.text || "",
3903
- finishReason: result.finishReason || "stop",
3805
+ finishReason: "stop",
3904
3806
  usage: result.usage,
3905
- toolCalls: result.toolCalls,
3906
- toolResults: result.toolResults,
3907
- sources: result.sources,
3908
- files: result.files,
3909
- reasoningDetails: result.reasoning,
3910
- response: result.response
3807
+ ...result
3911
3808
  };
3912
3809
  } catch (error) {
3913
3810
  if (error instanceof BlinkAIError) {
@@ -3986,7 +3883,13 @@ var BlinkAIImpl = class {
3986
3883
  signal: options.signal
3987
3884
  }
3988
3885
  );
3989
- return response.data;
3886
+ if (response.data?.result) {
3887
+ return response.data.result;
3888
+ } else if (response.data?.object) {
3889
+ return response.data;
3890
+ } else {
3891
+ throw new BlinkAIError("Invalid response format: missing object");
3892
+ }
3990
3893
  } catch (error) {
3991
3894
  if (error instanceof BlinkAIError) {
3992
3895
  throw error;
@@ -4048,7 +3951,8 @@ var BlinkAIImpl = class {
4048
3951
  return {
4049
3952
  object: result.object || {},
4050
3953
  finishReason: "stop",
4051
- usage: result.usage
3954
+ usage: result.usage,
3955
+ ...result
4052
3956
  };
4053
3957
  } catch (error) {
4054
3958
  if (error instanceof BlinkAIError) {
@@ -4898,7 +4802,7 @@ var BlinkRealtimeChannel = class {
4898
4802
  return new Promise((resolve, reject) => {
4899
4803
  try {
4900
4804
  const httpClient = this.httpClient;
4901
- const coreUrl = httpClient.coreUrl || "https://core.blink.new";
4805
+ const coreUrl = httpClient.coreUrl || "https://dev.core.blink.new";
4902
4806
  const baseUrl = coreUrl.replace("https://", "wss://").replace("http://", "ws://");
4903
4807
  const wsUrl = `${baseUrl}?project_id=${this.projectId}`;
4904
4808
  console.log(`\u{1F517} Attempting WebSocket connection to: ${wsUrl}`);
@@ -5367,6 +5271,7 @@ var BlinkAnalyticsImpl = class {
5367
5271
  } catch (error) {
5368
5272
  this.queue = [...events, ...this.queue];
5369
5273
  this.persistQueue();
5274
+ console.error("Failed to send analytics events:", error);
5370
5275
  }
5371
5276
  if (this.queue.length > 0) {
5372
5277
  this.timer = setTimeout(() => this.flush(), BATCH_TIMEOUT);
@@ -5557,64 +5462,6 @@ var BlinkAnalyticsImpl = class {
5557
5462
  }
5558
5463
  };
5559
5464
 
5560
- // src/connectors.ts
5561
- var BlinkConnectorsImpl = class {
5562
- constructor(httpClient) {
5563
- this.httpClient = httpClient;
5564
- }
5565
- async status(provider, options) {
5566
- const response = await this.httpClient.connectorStatus(provider);
5567
- return response.data;
5568
- }
5569
- async execute(provider, request) {
5570
- const response = await this.httpClient.connectorExecute(provider, request);
5571
- return response.data;
5572
- }
5573
- async saveApiKey(provider, request) {
5574
- const response = await this.httpClient.connectorSaveApiKey(provider, request);
5575
- return response.data;
5576
- }
5577
- };
5578
-
5579
- // src/functions.ts
5580
- var BlinkFunctionsImpl = class {
5581
- httpClient;
5582
- projectId;
5583
- constructor(httpClient, projectId, _getToken) {
5584
- this.httpClient = httpClient;
5585
- this.projectId = projectId;
5586
- }
5587
- /**
5588
- * Get the project suffix from the full project ID.
5589
- * Project IDs are formatted as: prj_xxxxx
5590
- * The suffix is the last 8 characters used in function URLs.
5591
- */
5592
- getProjectSuffix() {
5593
- return this.projectId.slice(-8);
5594
- }
5595
- /**
5596
- * Build the full function URL
5597
- */
5598
- buildFunctionUrl(functionSlug, searchParams) {
5599
- const suffix = this.getProjectSuffix();
5600
- const baseUrl = `https://${suffix}--${functionSlug}.functions.blink.new`;
5601
- if (!searchParams || Object.keys(searchParams).length === 0) {
5602
- return baseUrl;
5603
- }
5604
- const url = new URL(baseUrl);
5605
- Object.entries(searchParams).forEach(([key, value]) => {
5606
- url.searchParams.set(key, value);
5607
- });
5608
- return url.toString();
5609
- }
5610
- async invoke(functionSlug, options = {}) {
5611
- const { method = "POST", body, headers = {}, searchParams } = options;
5612
- const url = this.buildFunctionUrl(functionSlug, searchParams);
5613
- const res = await this.httpClient.request(url, { method, body, headers });
5614
- return { data: res.data, status: res.status, headers: res.headers };
5615
- }
5616
- };
5617
-
5618
5465
  // src/client.ts
5619
5466
  var BlinkClientImpl = class {
5620
5467
  auth;
@@ -5625,13 +5472,8 @@ var BlinkClientImpl = class {
5625
5472
  realtime;
5626
5473
  notifications;
5627
5474
  analytics;
5628
- connectors;
5629
- functions;
5630
5475
  httpClient;
5631
5476
  constructor(config) {
5632
- if ((config.secretKey || config.serviceToken) && isBrowser) {
5633
- throw new Error("secretKey/serviceToken is server-only. Do not provide it in browser/React Native clients.");
5634
- }
5635
5477
  this.auth = new BlinkAuth(config);
5636
5478
  this.httpClient = new HttpClient(
5637
5479
  config,
@@ -5645,12 +5487,6 @@ var BlinkClientImpl = class {
5645
5487
  this.realtime = new BlinkRealtimeImpl(this.httpClient, config.projectId);
5646
5488
  this.notifications = new BlinkNotificationsImpl(this.httpClient);
5647
5489
  this.analytics = new BlinkAnalyticsImpl(this.httpClient, config.projectId);
5648
- this.connectors = new BlinkConnectorsImpl(this.httpClient);
5649
- this.functions = new BlinkFunctionsImpl(
5650
- this.httpClient,
5651
- config.projectId,
5652
- () => this.auth.getValidToken()
5653
- );
5654
5490
  this.auth.onAuthStateChanged((state) => {
5655
5491
  if (state.isAuthenticated && state.user) {
5656
5492
  this.analytics.setUserId(state.user.id);
@@ -5669,6 +5505,6 @@ function createClient(config) {
5669
5505
  return new BlinkClientImpl(config);
5670
5506
  }
5671
5507
 
5672
- export { AsyncStorageAdapter, BlinkAIImpl, BlinkAnalyticsImpl, BlinkConnectorsImpl, BlinkDataImpl, BlinkDatabase, BlinkRealtimeChannel, BlinkRealtimeImpl, BlinkStorageImpl, BlinkTable, NoOpStorageAdapter, WebStorageAdapter, createClient, getDefaultStorageAdapter, isBrowser, isDeno, isNode, isReactNative, isServer, isWeb, platform };
5508
+ export { AsyncStorageAdapter, BlinkAIImpl, BlinkAnalyticsImpl, BlinkDataImpl, BlinkDatabase, BlinkRealtimeChannel, BlinkRealtimeImpl, BlinkStorageImpl, BlinkTable, NoOpStorageAdapter, WebStorageAdapter, createClient, getDefaultStorageAdapter, isBrowser, isNode, isReactNative, isWeb, platform };
5673
5509
  //# sourceMappingURL=index.mjs.map
5674
5510
  //# sourceMappingURL=index.mjs.map