@benji-money/connect-sdk 1.0.7

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.
@@ -0,0 +1,121 @@
1
+ declare enum BenjiConnectAuthAction {
2
+ Connect = "connect",
3
+ Transfer = "transfer",
4
+ Redeem = "redeem"
5
+ }
6
+
7
+ declare enum BenjiConnectEventType {
8
+ AUTH_SUCCESS = "AUTH_SUCCESS",
9
+ FLOW_EXIT = "FLOW_EXIT",
10
+ FLOW_SUCCESS = "FLOW_SUCCESS",
11
+ EVENT = "EVENT",
12
+ ERROR = "ERROR"
13
+ }
14
+ declare enum BenjiConnectExitTrigger {
15
+ ACTION_BUTTON_CLICKED = "ACTION_BUTTON_CLICKED",
16
+ BACK_TO_MERCHANT_CLICKED = "BACK_TO_MERCHANT_CLICKED",// deprecated
17
+ CLOSE_BUTTON_CLICKED = "CLOSE_BUTTON_CLICKED",
18
+ TAPPED_OUT_OF_BOUNDS = "TAPPED_OUT_OF_BOUNDS"
19
+ }
20
+ declare enum BenjiConnectErrorName {
21
+ UNEXPECTED_ERROR = "unexpected_error",
22
+ PARTNER_CONNECT_ERROR = "partner_connect_error"
23
+ }
24
+ type BenjiConnectErrorID = '400' | '500';
25
+
26
+ interface BenjiConnectTransactionData {
27
+ action: string;
28
+ amount: number;
29
+ trigger_event_id: string;
30
+ trigger_name: string;
31
+ }
32
+
33
+ interface BenjiConnectUserData {
34
+ user: {
35
+ id: number;
36
+ first_name: string;
37
+ last_name: string;
38
+ };
39
+ status: BenjiConnectUserStatusData;
40
+ extra_data?: {
41
+ total_rewards_earned?: number;
42
+ total_rewards_redeemed?: number;
43
+ created_date?: string;
44
+ };
45
+ }
46
+ interface BenjiConnectUserStatusData {
47
+ status_id: string;
48
+ num_of_rewards: number;
49
+ reward_status: string;
50
+ partner_status_tier_id?: number;
51
+ }
52
+
53
+ declare enum BenjiConnectEnvironment {
54
+ DEVELOPMENT = "development",
55
+ SANDBOX = "sandbox",
56
+ PRODUCTION = "production"
57
+ }
58
+ declare enum BenjiConnectMode {
59
+ CONNECT = 1,
60
+ TRANSFER = 3,
61
+ REDEEM = 4
62
+ }
63
+ interface BenjiConnectConfig {
64
+ environment: BenjiConnectEnvironment | string;
65
+ token: string;
66
+ onSuccess?: (token: string, metadata: BenjiConnectOnSuccessMetadata) => void;
67
+ onError?: (error: Error, error_id: string, metadata: BenjiConnectMetadata) => void;
68
+ onExit?: (metadata: BenjiConnectOnExitMetadata) => void;
69
+ onEvent?: (type: BenjiConnectEventType, metadata: BenjiConnectMetadata) => void;
70
+ }
71
+ interface BenjiConnectContext {
72
+ namespace?: string;
73
+ version?: string | number;
74
+ }
75
+ interface BenjiConnectOnSuccessData {
76
+ token: string;
77
+ metadata: BenjiConnectOnSuccessMetadata;
78
+ }
79
+ interface BenjiConnectOnErrorData {
80
+ error: Error;
81
+ error_id: string;
82
+ metadata: BenjiConnectMetadata;
83
+ }
84
+ interface BenjiConnectOnExitData {
85
+ metadata: BenjiConnectOnExitMetadata;
86
+ }
87
+ interface BenjiConnectOnEventData {
88
+ type: BenjiConnectEventType;
89
+ metadata: BenjiConnectMetadata;
90
+ }
91
+ interface BenjiConnectMetadata {
92
+ context: {
93
+ namespace: string;
94
+ version: string;
95
+ };
96
+ [k: string]: unknown;
97
+ }
98
+ interface BenjiConnectOnSuccessMetadata extends BenjiConnectMetadata {
99
+ action?: BenjiConnectAuthAction;
100
+ transaction_data?: BenjiConnectTransactionData | null;
101
+ user_data?: BenjiConnectUserData;
102
+ }
103
+ interface BenjiConnectOnExitMetadata extends BenjiConnectMetadata {
104
+ trigger?: string;
105
+ step?: string;
106
+ }
107
+
108
+ declare class ConnectSDK {
109
+ private sdkConfig;
110
+ private iframe;
111
+ private container;
112
+ constructor(config: BenjiConnectConfig);
113
+ initialize(): Promise<void>;
114
+ open(): Promise<void>;
115
+ openUI(): void;
116
+ close(): void;
117
+ cleanup(): void;
118
+ ping(): string;
119
+ }
120
+
121
+ export { type BenjiConnectConfig, type BenjiConnectContext, BenjiConnectEnvironment, type BenjiConnectErrorID, BenjiConnectErrorName, BenjiConnectEventType, BenjiConnectExitTrigger, type BenjiConnectMetadata, BenjiConnectMode, type BenjiConnectOnErrorData, type BenjiConnectOnEventData, type BenjiConnectOnExitData, type BenjiConnectOnExitMetadata, type BenjiConnectOnSuccessData, type BenjiConnectOnSuccessMetadata, ConnectSDK, ConnectSDK as default };
package/dist/index.js ADDED
@@ -0,0 +1,438 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ // src/config/production.ts
8
+ var production_exports = {};
9
+ __export(production_exports, {
10
+ endpoints: () => endpoints,
11
+ project_environment: () => project_environment
12
+ });
13
+ var project_environment = "production";
14
+ var endpoints = {
15
+ "benji_connect_auth_url": "https://verifyapp.withbenji.com",
16
+ "benji_connect_auth_service_url": "https://authservice.withbenji.com"
17
+ };
18
+
19
+ // src/config/sandbox.ts
20
+ var sandbox_exports = {};
21
+ __export(sandbox_exports, {
22
+ endpoints: () => endpoints2,
23
+ project_environment: () => project_environment2
24
+ });
25
+ var project_environment2 = "sandbox";
26
+ var endpoints2 = {
27
+ "benji_connect_auth_url": "https://verifyapp-staging.withbenji.com",
28
+ "benji_connect_auth_service_url": "https://authservice-staging.withbenji.com"
29
+ };
30
+
31
+ // src/config/development.ts
32
+ var development_exports = {};
33
+ __export(development_exports, {
34
+ endpoints: () => endpoints3,
35
+ project_environment: () => project_environment3
36
+ });
37
+ var project_environment3 = "development";
38
+ var endpoints3 = {
39
+ "benji_connect_auth_url": "http://localhost:3000",
40
+ "benji_connect_auth_service_url": "https://authservice-staging.withbenji.com"
41
+ };
42
+
43
+ // src/types/config.ts
44
+ var BenjiConnectEnvironment = /* @__PURE__ */ ((BenjiConnectEnvironment2) => {
45
+ BenjiConnectEnvironment2["DEVELOPMENT"] = "development";
46
+ BenjiConnectEnvironment2["SANDBOX"] = "sandbox";
47
+ BenjiConnectEnvironment2["PRODUCTION"] = "production";
48
+ return BenjiConnectEnvironment2;
49
+ })(BenjiConnectEnvironment || {});
50
+ var BenjiConnectMode = /* @__PURE__ */ ((BenjiConnectMode2) => {
51
+ BenjiConnectMode2[BenjiConnectMode2["CONNECT"] = 1] = "CONNECT";
52
+ BenjiConnectMode2[BenjiConnectMode2["TRANSFER"] = 3] = "TRANSFER";
53
+ BenjiConnectMode2[BenjiConnectMode2["REDEEM"] = 4] = "REDEEM";
54
+ return BenjiConnectMode2;
55
+ })(BenjiConnectMode || {});
56
+
57
+ // src/config/index.ts
58
+ var env = typeof process !== "undefined" ? process.env : {};
59
+ var data = development_exports;
60
+ var Endpoints = getEndpoints();
61
+ var Environment = "development" /* DEVELOPMENT */;
62
+ function configureConfig(environment) {
63
+ if (environment == "production") {
64
+ console.log("[Connect SDK] configuring with environment production");
65
+ data = production_exports;
66
+ } else if (environment == "sandbox") {
67
+ console.log("[Connect SDK] configuring with environment sandbox");
68
+ data = sandbox_exports;
69
+ } else if (environment == "development") {
70
+ console.log("[Connect SDK] configuring with environment development");
71
+ data = development_exports;
72
+ }
73
+ Endpoints = getEndpoints();
74
+ Environment = getEnvironment();
75
+ }
76
+ function getEndpoints() {
77
+ const entries = Object.entries(data.endpoints).map(([key, value]) => {
78
+ const override = (env == null ? void 0 : env[key]) || value;
79
+ return [key, override];
80
+ });
81
+ return Object.fromEntries(entries);
82
+ }
83
+ function getEnvironment() {
84
+ return data["project_environment"];
85
+ }
86
+
87
+ // src/utils/config.ts
88
+ var buildContext = () => ({
89
+ namespace: "benji-connect-sdk" ? "benji-connect-sdk" : "benji-connect-sdk",
90
+ version: "1.0.7" ? String("1.0.7") : "0.0.0"
91
+ });
92
+ function isBenjiConnectEnvironment(environment) {
93
+ return environment === "development" /* DEVELOPMENT */ || environment === "sandbox" /* SANDBOX */ || environment === "production" /* PRODUCTION */;
94
+ }
95
+ function mapToConnectEnvironment(environment) {
96
+ if (isBenjiConnectEnvironment(environment)) return environment;
97
+ const environments = {
98
+ development: "development" /* DEVELOPMENT */,
99
+ sandbox: "sandbox" /* SANDBOX */,
100
+ production: "production" /* PRODUCTION */
101
+ };
102
+ const mapped = environments[environment];
103
+ if (mapped) return mapped;
104
+ const defaultEnvironment = "development" /* DEVELOPMENT */;
105
+ console.warn(`[Benji Connect SDK] ${environment} not valid environment defaulting to ${defaultEnvironment}`);
106
+ return defaultEnvironment;
107
+ }
108
+
109
+ // src/types/event.ts
110
+ var BenjiConnectEventType = /* @__PURE__ */ ((BenjiConnectEventType2) => {
111
+ BenjiConnectEventType2["AUTH_SUCCESS"] = "AUTH_SUCCESS";
112
+ BenjiConnectEventType2["FLOW_EXIT"] = "FLOW_EXIT";
113
+ BenjiConnectEventType2["FLOW_SUCCESS"] = "FLOW_SUCCESS";
114
+ BenjiConnectEventType2["EVENT"] = "EVENT";
115
+ BenjiConnectEventType2["ERROR"] = "ERROR";
116
+ return BenjiConnectEventType2;
117
+ })(BenjiConnectEventType || {});
118
+ var BenjiConnectExitTrigger = /* @__PURE__ */ ((BenjiConnectExitTrigger2) => {
119
+ BenjiConnectExitTrigger2["ACTION_BUTTON_CLICKED"] = "ACTION_BUTTON_CLICKED";
120
+ BenjiConnectExitTrigger2["BACK_TO_MERCHANT_CLICKED"] = "BACK_TO_MERCHANT_CLICKED";
121
+ BenjiConnectExitTrigger2["CLOSE_BUTTON_CLICKED"] = "CLOSE_BUTTON_CLICKED";
122
+ BenjiConnectExitTrigger2["TAPPED_OUT_OF_BOUNDS"] = "TAPPED_OUT_OF_BOUNDS";
123
+ return BenjiConnectExitTrigger2;
124
+ })(BenjiConnectExitTrigger || {});
125
+ var BenjiConnectErrorName = /* @__PURE__ */ ((BenjiConnectErrorName2) => {
126
+ BenjiConnectErrorName2["UNEXPECTED_ERROR"] = "unexpected_error";
127
+ BenjiConnectErrorName2["PARTNER_CONNECT_ERROR"] = "partner_connect_error";
128
+ return BenjiConnectErrorName2;
129
+ })(BenjiConnectErrorName || {});
130
+
131
+ // src/utils/auth.ts
132
+ var extractAccessToken = (token) => {
133
+ var _a;
134
+ return typeof token === "string" ? token : (_a = token == null ? void 0 : token.access_token) != null ? _a : "";
135
+ };
136
+ var mapEventToConnectToken = (data2) => {
137
+ var _a, _b, _c;
138
+ return {
139
+ access_token: (_a = data2 == null ? void 0 : data2.access_token) != null ? _a : "",
140
+ refresh_token: (_b = data2 == null ? void 0 : data2.refresh_token) != null ? _b : "",
141
+ expires_at: (_c = data2 == null ? void 0 : data2.expires_at) != null ? _c : ""
142
+ };
143
+ };
144
+
145
+ // src/utils/user.ts
146
+ var mapEventToConnectUserData = (data2) => {
147
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
148
+ return {
149
+ user: {
150
+ id: (_b = (_a = data2 == null ? void 0 : data2.user) == null ? void 0 : _a.id) != null ? _b : 0,
151
+ first_name: (_d = (_c = data2 == null ? void 0 : data2.user) == null ? void 0 : _c.first_name) != null ? _d : "",
152
+ last_name: (_f = (_e = data2 == null ? void 0 : data2.user) == null ? void 0 : _e.last_name) != null ? _f : ""
153
+ },
154
+ status: {
155
+ status_id: (_h = (_g = data2 == null ? void 0 : data2.status) == null ? void 0 : _g.status_id) != null ? _h : "",
156
+ num_of_rewards: (_j = (_i = data2 == null ? void 0 : data2.status) == null ? void 0 : _i.num_of_rewards) != null ? _j : 0,
157
+ reward_status: (_l = (_k = data2 == null ? void 0 : data2.status) == null ? void 0 : _k.reward_status) != null ? _l : "",
158
+ partner_status_tier_id: (_m = data2 == null ? void 0 : data2.status) == null ? void 0 : _m.partner_status_tier_id
159
+ },
160
+ extra_data: {
161
+ total_rewards_earned: (_n = data2 == null ? void 0 : data2.extra_data) == null ? void 0 : _n.total_rewards_earned,
162
+ total_rewards_redeemed: (_o = data2 == null ? void 0 : data2.extra_data) == null ? void 0 : _o.total_rewards_redeemed,
163
+ created_date: (_p = data2 == null ? void 0 : data2.extra_data) == null ? void 0 : _p.created_date
164
+ }
165
+ };
166
+ };
167
+
168
+ // src/utils/transaction.ts
169
+ var mapEventToConnectTransactionData = (data2) => {
170
+ if (!data2) return null;
171
+ return {
172
+ action: data2.action,
173
+ amount: data2.amount,
174
+ trigger_event_id: data2.trigger_event_id,
175
+ trigger_name: data2.trigger_name
176
+ };
177
+ };
178
+
179
+ // src/types/router.ts
180
+ var mapToAuthSuccessData = (message, data2) => {
181
+ return {
182
+ type: message.type,
183
+ metadata: {
184
+ context: buildContext(),
185
+ action: data2.action,
186
+ token: mapEventToConnectToken(data2.token),
187
+ transactionData: mapEventToConnectTransactionData(data2.transaction),
188
+ userData: mapEventToConnectUserData(data2.metadata)
189
+ }
190
+ };
191
+ };
192
+ var mapToOnExitData = (data2) => {
193
+ return {
194
+ metadata: {
195
+ context: buildContext(),
196
+ step: data2.step,
197
+ trigger: data2.trigger
198
+ }
199
+ };
200
+ };
201
+ var mapToOnSuccessData = (data2) => {
202
+ const token = extractAccessToken(data2.token);
203
+ let metadata = {
204
+ context: buildContext(),
205
+ action: data2.action,
206
+ user_data: data2.metadata
207
+ };
208
+ if (data2.transaction) {
209
+ metadata.transaction_data = data2.transaction;
210
+ }
211
+ return { token, metadata };
212
+ };
213
+ var mapToOnErrorData = (data2) => {
214
+ return {
215
+ error: data2.error,
216
+ error_id: "500",
217
+ // Placeholder
218
+ metadata: {
219
+ context: buildContext()
220
+ }
221
+ };
222
+ };
223
+ var mapToOnEventData = (message, data2) => {
224
+ return {
225
+ type: message.type,
226
+ metadata: {
227
+ context: buildContext(),
228
+ ...data2
229
+ }
230
+ };
231
+ };
232
+ var BenjiConnectCallbackMapperMap = {
233
+ ["AUTH_SUCCESS" /* AUTH_SUCCESS */]: mapToAuthSuccessData,
234
+ ["FLOW_EXIT" /* FLOW_EXIT */]: mapToOnExitData,
235
+ ["FLOW_SUCCESS" /* FLOW_SUCCESS */]: mapToOnSuccessData,
236
+ ["ERROR" /* ERROR */]: mapToOnErrorData,
237
+ ["EVENT" /* EVENT */]: mapToOnEventData
238
+ };
239
+
240
+ // src/router/message.ts
241
+ var _MessageRouter = class _MessageRouter {
242
+ static configureMessageRouter(config) {
243
+ this.onSuccess = config.onSuccess;
244
+ this.onError = config.onError;
245
+ this.onExit = config.onExit;
246
+ this.onEvent = config.onEvent;
247
+ this.close = config.close;
248
+ }
249
+ static addEventListeners() {
250
+ if (this.configuredListeners) return;
251
+ window.addEventListener("error", this.errorEventHandler);
252
+ window.addEventListener("unhandledrejection", this.errorEventHandler);
253
+ window.addEventListener("message", this.messageEventHandler);
254
+ this.configuredListeners = true;
255
+ }
256
+ static removeEventListeners() {
257
+ window.removeEventListener("error", this.errorEventHandler);
258
+ window.removeEventListener("unhandledrejection", this.errorEventHandler);
259
+ window.removeEventListener("message", this.messageEventHandler);
260
+ this.configuredListeners = false;
261
+ }
262
+ static handleErrorMessage(event) {
263
+ switch (event.type) {
264
+ case "error": {
265
+ const errorEvent = event;
266
+ const error = errorEvent.error || new Error(errorEvent.message);
267
+ break;
268
+ }
269
+ case "unhandledrejection": {
270
+ const rejectionEvent = event;
271
+ const reason = rejectionEvent.reason instanceof Error ? rejectionEvent.reason : new Error(String(rejectionEvent.reason));
272
+ break;
273
+ }
274
+ default: {
275
+ console.error("[Benji Connect SDK] Received Unknown error message", event);
276
+ break;
277
+ }
278
+ }
279
+ }
280
+ static handleMessage(event) {
281
+ var _a, _b, _c, _d, _e, _f;
282
+ console.debug("[Benji Connect SDK] Received message", event);
283
+ const expectedOrigin = new URL(Endpoints.benji_connect_auth_url).origin;
284
+ if (!event || event.origin !== expectedOrigin) {
285
+ console.warn("[Benji Connect SDK] Skipped message, received event from unexpected origin", event.origin, expectedOrigin);
286
+ return;
287
+ }
288
+ const raw = event.data;
289
+ if (!raw || typeof raw !== "object") return;
290
+ const partial = raw;
291
+ if (typeof partial.type !== "string") return;
292
+ const message = partial;
293
+ try {
294
+ switch (message.type) {
295
+ case "AUTH_SUCCESS" /* AUTH_SUCCESS */: {
296
+ const connectMessage = message;
297
+ const callbackData = BenjiConnectCallbackMapperMap.AUTH_SUCCESS(connectMessage, connectMessage.data);
298
+ (_a = this.onEvent) == null ? void 0 : _a.call(this, callbackData.type, callbackData.metadata);
299
+ break;
300
+ }
301
+ case "FLOW_EXIT" /* FLOW_EXIT */: {
302
+ const connectMessage = message;
303
+ const callbackData = BenjiConnectCallbackMapperMap.FLOW_EXIT(connectMessage.data);
304
+ (_b = this.onExit) == null ? void 0 : _b.call(this, callbackData.metadata);
305
+ (_c = this.close) == null ? void 0 : _c.call(this);
306
+ break;
307
+ }
308
+ case "FLOW_SUCCESS" /* FLOW_SUCCESS */: {
309
+ const connectMessage = message;
310
+ const callbackData = BenjiConnectCallbackMapperMap.FLOW_SUCCESS(connectMessage.data);
311
+ (_d = this.onSuccess) == null ? void 0 : _d.call(this, callbackData.token, callbackData.metadata);
312
+ break;
313
+ }
314
+ case "ERROR" /* ERROR */: {
315
+ const connectMessage = message;
316
+ const callbackData = BenjiConnectCallbackMapperMap.ERROR(connectMessage.data);
317
+ (_e = this.onError) == null ? void 0 : _e.call(this, callbackData.error, callbackData.error_id, callbackData.metadata);
318
+ break;
319
+ }
320
+ default: {
321
+ const m = message;
322
+ const callbackData = mapToOnEventData(m, m.data);
323
+ (_f = this.onEvent) == null ? void 0 : _f.call(this, callbackData.type, callbackData.metadata);
324
+ break;
325
+ }
326
+ }
327
+ } finally {
328
+ }
329
+ }
330
+ };
331
+ _MessageRouter.configuredListeners = false;
332
+ _MessageRouter.errorEventHandler = (event) => {
333
+ return _MessageRouter.handleErrorMessage(event);
334
+ };
335
+ _MessageRouter.messageEventHandler = (event) => {
336
+ return _MessageRouter.handleMessage(event);
337
+ };
338
+ var MessageRouter = _MessageRouter;
339
+
340
+ // src/connect-sdk.ts
341
+ var ConnectSDK = class {
342
+ constructor(config) {
343
+ this.iframe = null;
344
+ this.container = null;
345
+ this.sdkConfig = config;
346
+ if (!this.sdkConfig.environment) throw new Error("Environment is required");
347
+ if (!this.sdkConfig.token) throw new Error("Connect token is required");
348
+ const environment = mapToConnectEnvironment(this.sdkConfig.environment);
349
+ this.sdkConfig.environment = environment;
350
+ configureConfig(environment);
351
+ }
352
+ async initialize() {
353
+ MessageRouter.configureMessageRouter({
354
+ onSuccess: this.sdkConfig.onSuccess,
355
+ onError: this.sdkConfig.onError,
356
+ onExit: this.sdkConfig.onExit,
357
+ onEvent: this.sdkConfig.onEvent,
358
+ close: () => this.close()
359
+ });
360
+ }
361
+ async open() {
362
+ await this.initialize();
363
+ this.openUI();
364
+ MessageRouter.addEventListeners();
365
+ }
366
+ openUI() {
367
+ if (this.iframe) return;
368
+ this.container = document.createElement("div");
369
+ Object.assign(this.container.style, {
370
+ position: "fixed",
371
+ top: "0",
372
+ left: "0",
373
+ width: "100%",
374
+ height: "100%",
375
+ backgroundColor: "rgba(0,0,0,0.5)",
376
+ zIndex: "9999",
377
+ display: "flex",
378
+ alignItems: "center",
379
+ justifyContent: "center",
380
+ overflow: "auto"
381
+ });
382
+ console.debug("[Connect SDK] endpoints", Endpoints);
383
+ console.log("[Connect SDK] opeining URL", Endpoints.benji_connect_auth_url);
384
+ const url = new URL(Endpoints.benji_connect_auth_url);
385
+ const connectToken = this.sdkConfig.token;
386
+ url.searchParams.set("connect_token", connectToken);
387
+ url.searchParams.set("t", String(Date.now()));
388
+ this.iframe = document.createElement("iframe");
389
+ Object.assign(this.iframe.style, {
390
+ position: "relative",
391
+ width: "400px",
392
+ height: "645px",
393
+ border: "none",
394
+ borderRadius: "20px",
395
+ overflow: "hidden"
396
+ });
397
+ this.iframe.src = url.toString();
398
+ this.container.appendChild(this.iframe);
399
+ document.body.appendChild(this.container);
400
+ this.container.addEventListener("click", (e) => {
401
+ var _a, _b;
402
+ if (e.target === this.container) {
403
+ (_b = (_a = this.sdkConfig).onExit) == null ? void 0 : _b.call(_a, {
404
+ context: buildContext(),
405
+ trigger: "TAPPED_OUT_OF_BOUNDS" /* TAPPED_OUT_OF_BOUNDS */
406
+ });
407
+ this.close();
408
+ }
409
+ });
410
+ }
411
+ close() {
412
+ if (!this.iframe) return;
413
+ document.body.removeChild(this.container);
414
+ MessageRouter.removeEventListeners();
415
+ this.iframe = null;
416
+ this.container = null;
417
+ }
418
+ cleanup() {
419
+ if (this.iframe) this.close();
420
+ }
421
+ ping() {
422
+ return "pong";
423
+ }
424
+ };
425
+ var connect_sdk_default = ConnectSDK;
426
+
427
+ // src/index.ts
428
+ var src_default = connect_sdk_default;
429
+ export {
430
+ BenjiConnectEnvironment,
431
+ BenjiConnectErrorName,
432
+ BenjiConnectEventType,
433
+ BenjiConnectExitTrigger,
434
+ BenjiConnectMode,
435
+ connect_sdk_default as ConnectSDK,
436
+ src_default as default
437
+ };
438
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/production.ts","../src/config/sandbox.ts","../src/config/development.ts","../src/types/config.ts","../src/config/index.ts","../src/utils/config.ts","../src/types/event.ts","../src/utils/auth.ts","../src/utils/user.ts","../src/utils/transaction.ts","../src/types/router.ts","../src/router/message.ts","../src/connect-sdk.ts","../src/index.ts"],"sourcesContent":["export const project_environment: string = 'production';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url':'https://verifyapp.withbenji.com',\n 'benji_connect_auth_service_url' : 'https://authservice.withbenji.com'\n}","export const project_environment: string = 'sandbox';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url':'https://verifyapp-staging.withbenji.com',\n 'benji_connect_auth_service_url' : 'https://authservice-staging.withbenji.com'\n}","export const project_environment: string = 'development';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url':'http://localhost:3000',\n 'benji_connect_auth_service_url' : 'https://authservice-staging.withbenji.com'\n}","import { BenjiConnectAuthAction } from './auth';\nimport { BenjiConnectEventType } from './event';\nimport { BenjiConnectTransactionData } from './transaction';\nimport { BenjiConnectUserData } from './user';\n\nexport enum BenjiConnectEnvironment {\n DEVELOPMENT = 'development',\n SANDBOX = 'sandbox',\n PRODUCTION = 'production',\n}\n\nexport enum BenjiConnectMode {\n CONNECT = 1,\n TRANSFER = 3,\n REDEEM = 4\n}\n\nexport interface BenjiConnectConfig {\n environment: BenjiConnectEnvironment | string;\n token: string;\n onSuccess?: (\n token: string, \n metadata: BenjiConnectOnSuccessMetadata\n ) => void;\n onError?: (\n error: Error,\n error_id: string,\n metadata: BenjiConnectMetadata\n ) => void;\n onExit?: (\n metadata: BenjiConnectOnExitMetadata\n ) => void;\n onEvent?: (\n type: BenjiConnectEventType, \n metadata: BenjiConnectMetadata\n ) => void;\n}\n\nexport interface BenjiConnectContext {\n namespace?: string; // e.g., 'benji-connect-sdk'\n version?: string | number; // e.g., '1.0.0'\n}\n\n/*\n * SDK config callback structures below\n */\n\nexport interface BenjiConnectOnSuccessData {\n token: string;\n metadata: BenjiConnectOnSuccessMetadata;\n}\n\nexport interface BenjiConnectOnErrorData {\n error: Error;\n error_id: string;\n metadata: BenjiConnectMetadata;\n}\n\nexport interface BenjiConnectOnExitData {\n metadata: BenjiConnectOnExitMetadata;\n}\n\nexport interface BenjiConnectOnEventData {\n type: BenjiConnectEventType;\n metadata: BenjiConnectMetadata;\n}\n\nexport interface BenjiConnectMetadata {\n context: { \n namespace: string; \n version: string \n };\n [k: string]: unknown;\n}\n\nexport interface BenjiConnectOnSuccessMetadata extends BenjiConnectMetadata {\n action?: BenjiConnectAuthAction;\n transaction_data?: BenjiConnectTransactionData | null;\n user_data?: BenjiConnectUserData;\n}\n\nexport interface BenjiConnectOnExitMetadata extends BenjiConnectMetadata {\n trigger?: string;\n step?: string;\n}","import * as productionConfig from './production';\nimport * as sandboxConfig from './sandbox';\nimport * as developmentConfig from './development';\nimport { BenjiConnectEnvironment } from '../types/config';\n\n// Defaults to dev\nconst env = (typeof process !== 'undefined' ? process.env : {});\nlet data = developmentConfig;\n// Derive endpoint type from dev config\ntype EndpointConfig = typeof developmentConfig.endpoints;\nexport let Endpoints: EndpointConfig = getEndpoints();\nexport let Environment = BenjiConnectEnvironment.DEVELOPMENT;\n\n// Configure with environment at runtime \nexport function configureConfig(environment: BenjiConnectEnvironment) {\n if (environment == 'production') {\n console.log('[Connect SDK] configuring with environment production');\n data = productionConfig;\n } else if (environment == 'sandbox') {\n console.log('[Connect SDK] configuring with environment sandbox');\n data = sandboxConfig;\n } else if (environment == 'development') {\n console.log('[Connect SDK] configuring with environment development');\n data = developmentConfig;\n }\n Endpoints = getEndpoints();\n Environment = getEnvironment();\n}\n\nfunction getEndpoints(): EndpointConfig {\n const entries = Object.entries(data.endpoints).map(([key, value]) => {\n const override = env?.[key] || value;\n return [key, override] as const;\n });\n return Object.fromEntries(entries) as EndpointConfig;\n}\n\nfunction getEnvironment(): BenjiConnectEnvironment {\n return data['project_environment'] as BenjiConnectEnvironment;\n}\n\nexport const Namespace = __NAMESPACE__;\nexport const Version = __VERSION__;\n\n","import { BenjiConnectEnvironment } from \"../types/config\";\n\nexport const buildContext = () => ({\n namespace: typeof __NAMESPACE__ !== 'undefined' && __NAMESPACE__ ? __NAMESPACE__ : 'benji-connect-sdk',\n version: typeof __VERSION__ !== 'undefined' && __VERSION__ ? String(__VERSION__) : '0.0.0',\n});\n\nexport function isBenjiConnectEnvironment(\n environment: unknown\n): environment is BenjiConnectEnvironment {\n return (\n environment === BenjiConnectEnvironment.DEVELOPMENT ||\n environment === BenjiConnectEnvironment.SANDBOX ||\n environment === BenjiConnectEnvironment.PRODUCTION\n );\n}\n\nexport function mapToConnectEnvironment(\n environment: BenjiConnectEnvironment | string\n): BenjiConnectEnvironment {\n\n if (isBenjiConnectEnvironment(environment)) return environment;\n\n const environments: Record<string, BenjiConnectEnvironment> = {\n development: BenjiConnectEnvironment.DEVELOPMENT,\n sandbox: BenjiConnectEnvironment.SANDBOX,\n production: BenjiConnectEnvironment.PRODUCTION\n };\n const mapped = environments[environment];\n if (mapped) return mapped;\n\n const defaultEnvironment = BenjiConnectEnvironment.DEVELOPMENT;\n console.warn(`[Benji Connect SDK] ${environment} not valid environment defaulting to ${defaultEnvironment}`);\n\n return defaultEnvironment;\n}","import { BenjiConnectAuthAction } from \"./auth\";\n\n// Known event names coming from the SDK transport (postMessage)\nexport enum BenjiConnectEventType {\n AUTH_SUCCESS = 'AUTH_SUCCESS',\n FLOW_EXIT = 'FLOW_EXIT',\n FLOW_SUCCESS = 'FLOW_SUCCESS',\n EVENT = 'EVENT',\n ERROR = 'ERROR',\n}\n\n// Known exit trigger types coming from the SDK transport (postMessage)\nexport enum BenjiConnectExitTrigger {\n ACTION_BUTTON_CLICKED = 'ACTION_BUTTON_CLICKED',\n BACK_TO_MERCHANT_CLICKED = 'BACK_TO_MERCHANT_CLICKED', // deprecated\n CLOSE_BUTTON_CLICKED = 'CLOSE_BUTTON_CLICKED',\n TAPPED_OUT_OF_BOUNDS = 'TAPPED_OUT_OF_BOUNDS'\n}\n\nexport enum BenjiConnectErrorName {\n UNEXPECTED_ERROR = 'unexpected_error',\n PARTNER_CONNECT_ERROR = 'partner_connect_error'\n}\n\nexport type BenjiConnectErrorID = '400' | '500'; // Placeholders for now\n\n// Transport-layer token (raw, unprocessed from postMessage)\nexport interface BenjiConnectEventToken {\n access_token: string;\n refresh_token: string;\n expires_at?: string | number;\n}\n\nexport interface BenjiConnectEventUserData {\n user: {\n id: number\n first_name: string\n last_name: string\n }\n status: BenjiConnectEventUserStatusData\n extra_data?: {\n total_rewards_earned?: number\n total_rewards_redeemed?: number\n created_date?: string\n }\n}\n\nexport interface BenjiConnectEventTransactionData {\n action: string;\n amount: number;\n trigger_event_id: string;\n trigger_name: string;\n}\n\nexport interface BenjiConnectEventUserStatusData {\n status_id: string\n num_of_rewards: number\n reward_status: string\n partner_status_tier_id?: number\n}\n\n// Basic structure for Benji Connect SDK typed events\nexport interface BenjiConnectEvent {\n type: BenjiConnectEventType;\n data?: BenjiConnectEventData;\n}\n\nexport interface BenjiConnectEventData {\n [k: string]: unknown;\n}\n\nexport interface BenjiConnectEventMessage<K extends BenjiConnectEventType = BenjiConnectEventType> {\n type: K; // discriminant\n data: BenjiConnectEventDataMap[K];\n}\n\nexport interface BenjiConnectAuthSuccessEventData {\n action: BenjiConnectAuthAction;\n metadata?: BenjiConnectEventUserData;\n token?: BenjiConnectEventToken,\n transaction?: BenjiConnectEventTransactionData;\n}\n\nexport interface BenjiConnectFlowExitEventData {\n step: string;\n trigger: BenjiConnectExitTrigger;\n}\n\nexport interface BenjiConnectErrorEventData {\n error: Error;\n}\n\n// Canonical event map \nexport type BenjiConnectEventDataMap = {\n [BenjiConnectEventType.AUTH_SUCCESS]: BenjiConnectAuthSuccessEventData;\n [BenjiConnectEventType.FLOW_EXIT]: BenjiConnectFlowExitEventData;\n [BenjiConnectEventType.FLOW_SUCCESS]: BenjiConnectAuthSuccessEventData;\n [BenjiConnectEventType.EVENT]: BenjiConnectEventData;\n [BenjiConnectEventType.ERROR]: BenjiConnectErrorEventData;\n\n // Optional catch-all fan-out\n '*': { type: BenjiConnectEventType; data: BenjiConnectEventDataMap[BenjiConnectEventType] };\n};","import { BenjiConnectAuthToken } from \"../types/auth\";\nimport { BenjiConnectEventToken } from \"../types/event\";\n\nexport const extractAccessToken = (token?: BenjiConnectEventToken | string): string =>\n typeof token === 'string' ? token : (token?.access_token ?? '');\n\nexport const mapEventToConnectToken = (data?: BenjiConnectEventToken): BenjiConnectAuthToken => ({\n access_token: data?.access_token ?? '',\n refresh_token: data?.refresh_token ?? '',\n expires_at: data?.expires_at ?? ''\n});","import { BenjiConnectEventUserData } from \"../types/event\";\nimport { BenjiConnectUserData } from \"../types/user\";\n\nexport function isConnectUserData (\n input: BenjiConnectUserData | Record<string, any>\n): boolean {\n if (!input) return false;\n const data = mapEventToConnectUserData(input);\n if (data.user.id != 0) return true;\n return false;\n}\n\nexport const mapEventToConnectUserData = (\n data?: BenjiConnectEventUserData | Record<string, any>\n): BenjiConnectUserData => ({\n user: {\n id: data?.user?.id ?? 0,\n first_name: data?.user?.first_name ?? '',\n last_name: data?.user?.last_name ?? ''\n },\n status: {\n status_id: data?.status?.status_id ?? '',\n num_of_rewards: data?.status?.num_of_rewards ?? 0,\n reward_status: data?.status?.reward_status ?? '',\n partner_status_tier_id: data?.status?.partner_status_tier_id\n },\n extra_data: {\n total_rewards_earned: data?.extra_data?.total_rewards_earned,\n total_rewards_redeemed: data?.extra_data?.total_rewards_redeemed,\n created_date: data?.extra_data?.created_date\n }\n});\n","import { BenjiConnectEventTransactionData } from \"../types/event\";\nimport { BenjiConnectTransactionData } from \"../types/transaction\";\n\nexport const mapEventToConnectTransactionData = (data?: BenjiConnectEventTransactionData): BenjiConnectTransactionData | null => {\n if (!data) return null;\n return {\n action: data.action,\n amount: data.amount,\n trigger_event_id: data.trigger_event_id,\n trigger_name: data.trigger_name\n };\n}","import { \n BenjiConnectMetadata, \n BenjiConnectOnErrorData, \n BenjiConnectOnEventData, \n BenjiConnectOnExitData, \n BenjiConnectOnExitMetadata, \n BenjiConnectOnSuccessData, \n BenjiConnectOnSuccessMetadata \n} from './config';\n\nimport { \n extractAccessToken, \n mapEventToConnectToken \n} from '../utils/auth';\n\nimport { buildContext } from '../utils/config';\nimport { mapEventToConnectUserData } from '../utils/user';\n\nimport { \n BenjiConnectAuthSuccessEventData,\n BenjiConnectErrorEventData, \n BenjiConnectEventDataMap, \n BenjiConnectEventMessage, \n BenjiConnectEventType, \n BenjiConnectFlowExitEventData\n} from './event';\nimport { mapEventToConnectTransactionData } from '../utils/transaction';\n\nexport type MessageRouterConfig = {\n onSuccess?: (\n token: string, \n metadata: BenjiConnectOnSuccessMetadata\n ) => void;\n onError?: (\n error: Error,\n error_id: string,\n metadata: BenjiConnectMetadata\n ) => void;\n onExit?: (\n metadata: BenjiConnectOnExitMetadata\n ) => void;\n onEvent?: (\n type: BenjiConnectEventType, \n metadata: BenjiConnectMetadata\n ) => void;\n close?: () => void;\n};\n\nexport const mapToAuthSuccessData = (\n message: BenjiConnectEventMessage<BenjiConnectEventType.AUTH_SUCCESS>,\n data: BenjiConnectAuthSuccessEventData\n): BenjiConnectOnEventData => {\n return {\n type: message.type,\n metadata: {\n context: buildContext(),\n action: data.action,\n token: mapEventToConnectToken(data.token),\n transactionData: mapEventToConnectTransactionData(data.transaction),\n userData: mapEventToConnectUserData(data.metadata)\n }\n };\n};\n\nexport const mapToOnExitData = (data: BenjiConnectFlowExitEventData): BenjiConnectOnExitData => {\n return {\n metadata: {\n context: buildContext(),\n step: data.step,\n trigger: data.trigger\n }\n };\n};\n\nexport const mapToOnSuccessData = (data: BenjiConnectAuthSuccessEventData): BenjiConnectOnSuccessData => {\n \n const token = extractAccessToken(data.token);\n\n let metadata: BenjiConnectOnSuccessMetadata = {\n context: buildContext(),\n action: data.action,\n user_data: data.metadata\n };\n\n if (data.transaction) {\n metadata.transaction_data = data.transaction;\n }\n \n return { token, metadata };\n};\n\nexport const mapToOnErrorData = (data: BenjiConnectErrorEventData): BenjiConnectOnErrorData => {\n return {\n error: data.error,\n error_id: '500', // Placeholder\n metadata: {\n context: buildContext()\n }\n };\n};\n\nexport const mapToOnEventData = <K extends BenjiConnectEventType>(\n message: BenjiConnectEventMessage<K>,\n data: BenjiConnectEventDataMap[K]\n): BenjiConnectOnEventData => {\n return {\n type: message.type,\n metadata: {\n context: buildContext(),\n ...data\n }\n };\n};\n\nexport type BenjiConnectCallbackDataMap = {\n [BenjiConnectEventType.AUTH_SUCCESS]: BenjiConnectOnEventData;\n [BenjiConnectEventType.FLOW_EXIT]: BenjiConnectOnExitData;\n [BenjiConnectEventType.FLOW_SUCCESS]: BenjiConnectOnSuccessData;\n [BenjiConnectEventType.ERROR]: BenjiConnectOnErrorData;\n [BenjiConnectEventType.EVENT]: BenjiConnectOnEventData;\n '*': BenjiConnectOnEventData;\n};\n\nexport const BenjiConnectCallbackMapperMap = {\n [BenjiConnectEventType.AUTH_SUCCESS]: mapToAuthSuccessData,\n [BenjiConnectEventType.FLOW_EXIT]: mapToOnExitData,\n [BenjiConnectEventType.FLOW_SUCCESS]: mapToOnSuccessData,\n [BenjiConnectEventType.ERROR]: mapToOnErrorData,\n [BenjiConnectEventType.EVENT]: mapToOnEventData,\n} as const;\n\n","import { \n Endpoints\n} from '../config';\n\nimport {\n BenjiConnectEventType,\n type BenjiConnectEventData,\n type BenjiConnectEventMessage\n} from '../types/event';\n\nimport type {\n BenjiConnectOnSuccessData,\n BenjiConnectOnExitData,\n BenjiConnectMetadata,\n BenjiConnectOnSuccessMetadata,\n BenjiConnectOnExitMetadata\n} from '../types/config';\n\nimport {\n BenjiConnectCallbackMapperMap,\n MessageRouterConfig,\n mapToOnEventData\n} from '../types/router';\n\nexport class MessageRouter {\n\n static configuredListeners = false;\n static onSuccess?: (\n token: string, \n metadata: BenjiConnectOnSuccessMetadata\n ) => void;\n static onError?: (\n error: Error,\n error_id: string,\n metadata: BenjiConnectMetadata\n ) => void;\n static onExit?: (\n metadata: BenjiConnectOnExitMetadata\n ) => void;\n static onEvent?: (\n type: BenjiConnectEventType, \n metadata: BenjiConnectMetadata\n ) => void;\n static close?: () => void;\n\n static configureMessageRouter(config: MessageRouterConfig) {\n this.onSuccess = config.onSuccess;\n this.onError = config.onError;\n this.onExit = config.onExit;\n this.onEvent = config.onEvent;\n this.close = config.close;\n }\n\n static errorEventHandler = (event: Event) => { \n return MessageRouter.handleErrorMessage(event) \n };\n\n static messageEventHandler = (event: MessageEvent<unknown>) => { \n return MessageRouter.handleMessage(event) \n };\n\n static addEventListeners() {\n if (this.configuredListeners) return;\n window.addEventListener('error', this.errorEventHandler);\n window.addEventListener('unhandledrejection', this.errorEventHandler);\n window.addEventListener('message', this.messageEventHandler);\n this.configuredListeners = true;\n\n // Test uncaught error handling\n // Promise.reject(new Error('[Benji Connect SDK] MessageRouter Test rejection'));\n // throw new Error('[Benji Connect SDK] MessageRouter Test error');\n }\n\n static removeEventListeners() {\n window.removeEventListener('error', this.errorEventHandler);\n window.removeEventListener('unhandledrejection', this.errorEventHandler);\n window.removeEventListener('message', this.messageEventHandler);\n this.configuredListeners = false;\n }\n\n static handleErrorMessage(event: Event) { \n switch(event.type) {\n case 'error': {\n const errorEvent = event as ErrorEvent;\n const error = errorEvent.error || new Error(errorEvent.message);\n // TODO: Track error\n break;\n }\n case 'unhandledrejection': {\n const rejectionEvent = event as PromiseRejectionEvent;\n const reason = rejectionEvent.reason instanceof Error\n ? rejectionEvent.reason\n : new Error(String(rejectionEvent.reason));\n // TODO: Track error (reason)\n break;\n }\n default: {\n console.error('[Benji Connect SDK] Received Unknown error message', event);\n break;\n }\n }\n }\n\n static handleMessage(event: MessageEvent<unknown>) {\n\n console.debug('[Benji Connect SDK] Received message', event);\n \n // Basic origin check\n const expectedOrigin: string = new URL(Endpoints.benji_connect_auth_url).origin;\n if (!event || event.origin !== expectedOrigin) {\n console.warn('[Benji Connect SDK] Skipped message, received event from unexpected origin', event.origin, expectedOrigin);\n return;\n }\n\n const raw = event.data;\n if (!raw || typeof raw !== 'object') return;\n\n const partial = raw as Partial<BenjiConnectEventMessage>;\n if (typeof partial.type !== 'string') return;\n \n const message = partial as BenjiConnectEventMessage;\n\n // TODO: Proper Constraint checks\n // if (Namespace && message.namespace && message.namespace !== Namespace) return;\n // if (Version != null && message.version != null && String(message.version) !== String(Version)) return;\n\n // TODO: Track message received either here or below but not both\n \n try {\n // Type events and route to callbacks\n switch (message.type) {\n\n case BenjiConnectEventType.AUTH_SUCCESS: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.AUTH_SUCCESS>;\n const callbackData = BenjiConnectCallbackMapperMap.AUTH_SUCCESS(connectMessage, connectMessage.data);\n // TODO: Track message received?\n this.onEvent?.(callbackData.type, callbackData.metadata); \n break;\n }\n\n case BenjiConnectEventType.FLOW_EXIT: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.FLOW_EXIT>;\n const callbackData = BenjiConnectCallbackMapperMap.FLOW_EXIT(connectMessage.data) as BenjiConnectOnExitData;\n // TODO: Track message received?\n this.onExit?.(callbackData.metadata);\n this.close?.();\n break;\n }\n\n case BenjiConnectEventType.FLOW_SUCCESS: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.FLOW_SUCCESS>;\n // TODO: Track message received?\n // Forward onSuccess when flow completes for connect, redeem and transfer \n const callbackData = BenjiConnectCallbackMapperMap.FLOW_SUCCESS(connectMessage.data) as BenjiConnectOnSuccessData;\n this.onSuccess?.(callbackData.token, callbackData.metadata); \n break;\n }\n\n case BenjiConnectEventType.ERROR: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.ERROR>;\n // TODO: Track message received?\n const callbackData = BenjiConnectCallbackMapperMap.ERROR(connectMessage.data);\n this.onError?.(callbackData.error, callbackData.error_id, callbackData.metadata);\n break;\n }\n\n default: {\n // Unknown event type (forward generically)\n const m = message as BenjiConnectEventMessage<any>;\n // TODO: Track message received?\n const callbackData = mapToOnEventData(m, m.data as BenjiConnectEventData);\n this.onEvent?.(callbackData.type, callbackData.metadata);\n break;\n }\n }\n } finally {\n // TODO: Any cleanup logic \n }\n }\n\n}","/// <reference path=\"./global.d.ts\" />\n\nimport { \n configureConfig, \n Endpoints\n} from './config';\n\nimport { \n type BenjiConnectConfig, \n BenjiConnectEnvironment\n} from './types/config';\n\nimport { \n buildContext, \n mapToConnectEnvironment \n} from './utils/config';\n\nimport { MessageRouter } from './router/message';\nimport { BenjiConnectExitTrigger } from './types/event';\n\nclass ConnectSDK {\n\n private sdkConfig: BenjiConnectConfig;\n private iframe: HTMLIFrameElement | null = null;\n private container: HTMLDivElement | null = null;\n\n constructor(config: BenjiConnectConfig) {\n\n this.sdkConfig = config;\n\n // Validations\n if (!this.sdkConfig.environment) throw new Error('Environment is required');\n if (!this.sdkConfig.token) throw new Error('Connect token is required');\n\n // Set internal config for environment based on consumer input at runtime\n const environment: BenjiConnectEnvironment = mapToConnectEnvironment(this.sdkConfig.environment);\n this.sdkConfig.environment = environment;\n configureConfig(environment);\n }\n\n async initialize() {\n \n // Configure message router for all postMessage from connect modal and error messages\n MessageRouter.configureMessageRouter({\n onSuccess: this.sdkConfig.onSuccess,\n onError: this.sdkConfig.onError,\n onExit: this.sdkConfig.onExit,\n onEvent: this.sdkConfig.onEvent,\n close: () => this.close()\n });\n\n // TODO: Tracker.configureWithOptions(sdkOptions);\n // TODO: Tracker.trackSDKInitialized();\n }\n\n async open() {\n await this.initialize();\n this.openUI();\n MessageRouter.addEventListeners();\n // TODO: Track SDK Opened Tracker.trackSDKOpened();\n }\n\n openUI() {\n if (this.iframe) return;\n\n // container\n this.container = document.createElement('div');\n Object.assign(this.container.style, {\n position: 'fixed', \n top: '0', \n left: '0', \n width: '100%', \n height: '100%',\n backgroundColor: 'rgba(0,0,0,0.5)', \n zIndex: '9999', \n display: 'flex',\n alignItems: 'center', \n justifyContent: 'center', \n overflow: 'auto'\n } as CSSStyleDeclaration);\n\n // iframe\n console.debug('[Connect SDK] endpoints', Endpoints);\n console.log('[Connect SDK] opeining URL', Endpoints.benji_connect_auth_url);\n const url = new URL(Endpoints.benji_connect_auth_url);\n const connectToken = this.sdkConfig.token;\n url.searchParams.set('connect_token', connectToken);\n url.searchParams.set('t', String(Date.now()));\n\n this.iframe = document.createElement('iframe');\n Object.assign(this.iframe.style, {\n position: 'relative', \n width: '400px', \n height: '645px',\n border: 'none', \n borderRadius: '20px', \n overflow: 'hidden'\n } as CSSStyleDeclaration);\n this.iframe.src = url.toString();\n\n this.container.appendChild(this.iframe);\n document.body.appendChild(this.container);\n\n this.container.addEventListener('click', (e) => {\n if (e.target === this.container) {\n // Trigger exit when user taps outside modal bounds\n this.sdkConfig.onExit?.({\n context: buildContext(),\n trigger: BenjiConnectExitTrigger.TAPPED_OUT_OF_BOUNDS\n });\n this.close();\n }\n });\n }\n\n close() {\n if (!this.iframe) return;\n document.body.removeChild(this.container!);\n MessageRouter.removeEventListeners();\n // TODO: Track SDK Closed Tracker.trackSDKClosed();\n this.iframe = null;\n this.container = null;\n }\n\n cleanup() {\n if (this.iframe) this.close();\n }\n\n ping() { return 'pong'; }\n}\n\nexport default ConnectSDK;","// Import the default export from connect-sdk.ts\nimport ConnectSDK from './connect-sdk';\nimport { BenjiConnectEventType } from './types/event';\n\n// Re-export both default and a named export so consumers can do either:\n// import ConnectSDK from '...'\n// import { ConnectSDK } from '...'\n// Also provide a default export (optional but helpful for JS users)\nexport default ConnectSDK;\nexport { ConnectSDK };\n\n// Expose Public types\nexport * from './types/config';\nexport { \n BenjiConnectErrorID,\n BenjiConnectErrorName,\n BenjiConnectEventType,\n BenjiConnectExitTrigger,\n} from './types/event';"],"mappings":"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","names":["endpoints","project_environment","endpoints","project_environment","BenjiConnectEnvironment","BenjiConnectMode","BenjiConnectEventType","BenjiConnectExitTrigger","BenjiConnectErrorName","data","data","data","data"]}