@dynamic-labs-sdk/client 0.0.1-alpha.1

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.
Files changed (151) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +29 -0
  3. package/index.cjs.d.ts +1 -0
  4. package/index.cjs.js +530 -0
  5. package/index.esm.d.ts +1 -0
  6. package/index.esm.js +522 -0
  7. package/package.json +20 -0
  8. package/src/client/consts.d.ts +5 -0
  9. package/src/client/consts.d.ts.map +1 -0
  10. package/src/client/createCore/createCore.d.ts +7 -0
  11. package/src/client/createCore/createCore.d.ts.map +1 -0
  12. package/src/client/createCore/index.d.ts +2 -0
  13. package/src/client/createCore/index.d.ts.map +1 -0
  14. package/src/client/createCore/types/DynamicCore.d.ts +56 -0
  15. package/src/client/createCore/types/DynamicCore.d.ts.map +1 -0
  16. package/src/client/createCore/types/DynamicCoreConfig.d.ts +6 -0
  17. package/src/client/createCore/types/DynamicCoreConfig.d.ts.map +1 -0
  18. package/src/client/createCore/types/DynamicCoreState.d.ts +30 -0
  19. package/src/client/createCore/types/DynamicCoreState.d.ts.map +1 -0
  20. package/src/client/createCore/types/index.d.ts +4 -0
  21. package/src/client/createCore/types/index.d.ts.map +1 -0
  22. package/src/client/createDynamicClient/createDynamicClient.d.ts +3 -0
  23. package/src/client/createDynamicClient/createDynamicClient.d.ts.map +1 -0
  24. package/src/client/createDynamicClient/index.d.ts +2 -0
  25. package/src/client/createDynamicClient/index.d.ts.map +1 -0
  26. package/src/client/types/DynamicClient.d.ts +25 -0
  27. package/src/client/types/DynamicClient.d.ts.map +1 -0
  28. package/src/client/types/DynamicClientConfig.d.ts +42 -0
  29. package/src/client/types/DynamicClientConfig.d.ts.map +1 -0
  30. package/src/client/types/index.d.ts +3 -0
  31. package/src/client/types/index.d.ts.map +1 -0
  32. package/src/errors/base/BaseError.d.ts +29 -0
  33. package/src/errors/base/BaseError.d.ts.map +1 -0
  34. package/src/errors/base/index.d.ts +2 -0
  35. package/src/errors/base/index.d.ts.map +1 -0
  36. package/src/index.d.ts +9 -0
  37. package/src/index.d.ts.map +1 -0
  38. package/src/modules/apiClient/createApiClient.d.ts +9 -0
  39. package/src/modules/apiClient/createApiClient.d.ts.map +1 -0
  40. package/src/modules/apiClient/index.d.ts +2 -0
  41. package/src/modules/apiClient/index.d.ts.map +1 -0
  42. package/src/modules/auth/logout/index.d.ts +3 -0
  43. package/src/modules/auth/logout/index.d.ts.map +1 -0
  44. package/src/modules/auth/logout/logout.d.ts +3 -0
  45. package/src/modules/auth/logout/logout.d.ts.map +1 -0
  46. package/src/modules/auth/logout/types.d.ts +10 -0
  47. package/src/modules/auth/logout/types.d.ts.map +1 -0
  48. package/src/modules/events/events.d.ts +19 -0
  49. package/src/modules/events/events.d.ts.map +1 -0
  50. package/src/modules/events/index.d.ts +2 -0
  51. package/src/modules/events/index.d.ts.map +1 -0
  52. package/src/modules/events/types.d.ts +12 -0
  53. package/src/modules/events/types.d.ts.map +1 -0
  54. package/src/modules/initializeClient/errors/ClientAlreadyInitializedError.d.ts +5 -0
  55. package/src/modules/initializeClient/errors/ClientAlreadyInitializedError.d.ts.map +1 -0
  56. package/src/modules/initializeClient/index.d.ts +2 -0
  57. package/src/modules/initializeClient/index.d.ts.map +1 -0
  58. package/src/modules/initializeClient/initializeClient.d.ts +7 -0
  59. package/src/modules/initializeClient/initializeClient.d.ts.map +1 -0
  60. package/src/modules/otp/sendEmailOTP/index.d.ts +2 -0
  61. package/src/modules/otp/sendEmailOTP/index.d.ts.map +1 -0
  62. package/src/modules/otp/sendEmailOTP/sendEmailOTP.d.ts +7 -0
  63. package/src/modules/otp/sendEmailOTP/sendEmailOTP.d.ts.map +1 -0
  64. package/src/modules/otp/types.d.ts +19 -0
  65. package/src/modules/otp/types.d.ts.map +1 -0
  66. package/src/modules/otp/verifyOTP/index.d.ts +2 -0
  67. package/src/modules/otp/verifyOTP/index.d.ts.map +1 -0
  68. package/src/modules/otp/verifyOTP/verifyOTP.d.ts +6 -0
  69. package/src/modules/otp/verifyOTP/verifyOTP.d.ts.map +1 -0
  70. package/src/modules/projectSettings/fetchProjectSettings.d.ts +6 -0
  71. package/src/modules/projectSettings/fetchProjectSettings.d.ts.map +1 -0
  72. package/src/modules/projectSettings/index.d.ts +2 -0
  73. package/src/modules/projectSettings/index.d.ts.map +1 -0
  74. package/src/modules/user/types.d.ts +6 -0
  75. package/src/modules/user/types.d.ts.map +1 -0
  76. package/src/services/asyncTrack/createAsyncTrack.d.ts +6 -0
  77. package/src/services/asyncTrack/createAsyncTrack.d.ts.map +1 -0
  78. package/src/services/asyncTrack/errors/CannotTrackError.d.ts +5 -0
  79. package/src/services/asyncTrack/errors/CannotTrackError.d.ts.map +1 -0
  80. package/src/services/asyncTrack/index.d.ts +3 -0
  81. package/src/services/asyncTrack/index.d.ts.map +1 -0
  82. package/src/services/asyncTrack/types.d.ts +45 -0
  83. package/src/services/asyncTrack/types.d.ts.map +1 -0
  84. package/src/services/eventEmitter/createEventEmitter.d.ts +3 -0
  85. package/src/services/eventEmitter/createEventEmitter.d.ts.map +1 -0
  86. package/src/services/eventEmitter/index.d.ts +2 -0
  87. package/src/services/eventEmitter/index.d.ts.map +1 -0
  88. package/src/services/fetch/createWebFetch.d.ts +6 -0
  89. package/src/services/fetch/createWebFetch.d.ts.map +1 -0
  90. package/src/services/fetch/index.d.ts +2 -0
  91. package/src/services/fetch/index.d.ts.map +1 -0
  92. package/src/services/fetch/types.d.ts +5 -0
  93. package/src/services/fetch/types.d.ts.map +1 -0
  94. package/src/services/logger/createLogger/createLogger.d.ts +14 -0
  95. package/src/services/logger/createLogger/createLogger.d.ts.map +1 -0
  96. package/src/services/logger/createLogger/index.d.ts +2 -0
  97. package/src/services/logger/createLogger/index.d.ts.map +1 -0
  98. package/src/services/logger/index.d.ts +2 -0
  99. package/src/services/logger/index.d.ts.map +1 -0
  100. package/src/services/logger/types.d.ts +15 -0
  101. package/src/services/logger/types.d.ts.map +1 -0
  102. package/src/services/openDeeplink/createWebDeeplinkOpener/createWebDeeplinkOpener.d.ts +6 -0
  103. package/src/services/openDeeplink/createWebDeeplinkOpener/createWebDeeplinkOpener.d.ts.map +1 -0
  104. package/src/services/openDeeplink/createWebDeeplinkOpener/index.d.ts +2 -0
  105. package/src/services/openDeeplink/createWebDeeplinkOpener/index.d.ts.map +1 -0
  106. package/src/services/openDeeplink/index.d.ts +2 -0
  107. package/src/services/openDeeplink/index.d.ts.map +1 -0
  108. package/src/services/openDeeplink/types.d.ts +5 -0
  109. package/src/services/openDeeplink/types.d.ts.map +1 -0
  110. package/src/services/storage/createWebStorage/createWebStorage.d.ts +6 -0
  111. package/src/services/storage/createWebStorage/createWebStorage.d.ts.map +1 -0
  112. package/src/services/storage/createWebStorage/formatForStorage/index.d.ts +2 -0
  113. package/src/services/storage/createWebStorage/formatForStorage/index.d.ts.map +1 -0
  114. package/src/services/storage/createWebStorage/formatForStorage/storageFormat.d.ts +3 -0
  115. package/src/services/storage/createWebStorage/formatForStorage/storageFormat.d.ts.map +1 -0
  116. package/src/services/storage/createWebStorage/index.d.ts +2 -0
  117. package/src/services/storage/createWebStorage/index.d.ts.map +1 -0
  118. package/src/services/storage/types.d.ts +24 -0
  119. package/src/services/storage/types.d.ts.map +1 -0
  120. package/src/utils/deferredPromise/createDeferredPromise.d.ts +3 -0
  121. package/src/utils/deferredPromise/createDeferredPromise.d.ts.map +1 -0
  122. package/src/utils/deferredPromise/index.d.ts +3 -0
  123. package/src/utils/deferredPromise/index.d.ts.map +1 -0
  124. package/src/utils/deferredPromise/types.d.ts +6 -0
  125. package/src/utils/deferredPromise/types.d.ts.map +1 -0
  126. package/src/utils/getClient/assignClient.d.ts +3 -0
  127. package/src/utils/getClient/assignClient.d.ts.map +1 -0
  128. package/src/utils/getClient/erros/ClientNotPresentError.d.ts +5 -0
  129. package/src/utils/getClient/erros/ClientNotPresentError.d.ts.map +1 -0
  130. package/src/utils/getClient/getClient.d.ts +2 -0
  131. package/src/utils/getClient/getClient.d.ts.map +1 -0
  132. package/src/utils/getClient/index.d.ts +3 -0
  133. package/src/utils/getClient/index.d.ts.map +1 -0
  134. package/src/utils/getCore/getCore.d.ts +4 -0
  135. package/src/utils/getCore/getCore.d.ts.map +1 -0
  136. package/src/utils/getCore/index.d.ts +2 -0
  137. package/src/utils/getCore/index.d.ts.map +1 -0
  138. package/src/utils/observable/createObservableState/createObservableState.d.ts +3 -0
  139. package/src/utils/observable/createObservableState/createObservableState.d.ts.map +1 -0
  140. package/src/utils/observable/createObservableState/index.d.ts +2 -0
  141. package/src/utils/observable/createObservableState/index.d.ts.map +1 -0
  142. package/src/utils/observable/subscribeWithSelector/index.d.ts +2 -0
  143. package/src/utils/observable/subscribeWithSelector/index.d.ts.map +1 -0
  144. package/src/utils/observable/subscribeWithSelector/isEqualShallow/index.d.ts +2 -0
  145. package/src/utils/observable/subscribeWithSelector/isEqualShallow/index.d.ts.map +1 -0
  146. package/src/utils/observable/subscribeWithSelector/isEqualShallow/isEqualShallow.d.ts +7 -0
  147. package/src/utils/observable/subscribeWithSelector/isEqualShallow/isEqualShallow.d.ts.map +1 -0
  148. package/src/utils/observable/subscribeWithSelector/subscribeWithSelector.d.ts +10 -0
  149. package/src/utils/observable/subscribeWithSelector/subscribeWithSelector.d.ts.map +1 -0
  150. package/src/utils/observable/types.d.ts +28 -0
  151. package/src/utils/observable/types.d.ts.map +1 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ ## 0.0.1-alpha.1 (2025-05-19)
2
+
3
+ ### 🩹 Fixes
4
+
5
+ - make the client package public ([#74](https://github.com/dynamic-labs/dynamic-sdk/pull/74))
6
+
7
+ ## 0.0.1-alpha.0 (2025-05-16)
8
+
9
+ Initial release of the Dynamic SDK.
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Dynamic Client SDK
2
+
3
+ Welcome to the Dynamic Client SDK - a powerful and flexible authentication solution for your applications.
4
+
5
+ ## Overview
6
+
7
+ The Dynamic Client SDK provides a seamless way to integrate authentication and user management into your application. With an easy-to-use API and robust feature set, you can quickly implement secure authentication flows while maintaining a great user experience.
8
+
9
+ The SDK is designed to be lightweight yet powerful, giving you the tools you need without unnecessary bloat.
10
+
11
+ ## Troubleshooting Initialization
12
+
13
+ If you are having issues with your client's initialization, try the following:
14
+
15
+ 1. Disable `autoInitialize`:
16
+
17
+ ```typescript
18
+ const client = createDynamicClient({ autoInitialize: false });
19
+ ```
20
+
21
+ 2. Initialize the client manually and handle the error:
22
+
23
+ ```typescript
24
+ try {
25
+ await initializeClient(client);
26
+ } catch (error) {
27
+ console.log(error);
28
+ }
29
+ ```
package/index.cjs.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./src/index";
package/index.cjs.js ADDED
@@ -0,0 +1,530 @@
1
+ 'use strict';
2
+
3
+ var sdkApiCore = require('@dynamic-labs/sdk-api-core');
4
+ var EventEmitter = require('eventemitter3');
5
+
6
+ const getCore = (client)=>{
7
+ // @ts-expect-error - this was hidden from the public API
8
+ return client.__core;
9
+ };
10
+
11
+ function _extends() {
12
+ _extends = Object.assign || function assign(target) {
13
+ for(var i = 1; i < arguments.length; i++){
14
+ var source = arguments[i];
15
+ for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];
16
+ }
17
+ return target;
18
+ };
19
+ return _extends.apply(this, arguments);
20
+ }
21
+
22
+ var version = "0.0.1-alpha.1";
23
+ var dependencies = {
24
+ "@dynamic-labs/sdk-api-core": "0.0.630"};
25
+
26
+ /**
27
+ * Returns a new instance of the SDK API client.
28
+ *
29
+ * This is not meant for storing, as it is very light we can create it whenever needed.
30
+ */ const createApiClient = (client)=>{
31
+ const core = getCore(client);
32
+ const settings = {
33
+ basePath: core.apiBaseUrl,
34
+ headers: {
35
+ 'Content-Type': 'application/json',
36
+ 'x-dyn-api-version': dependencies['@dynamic-labs/sdk-api-core'],
37
+ 'x-dyn-version': core.version
38
+ }
39
+ };
40
+ if (client.token) {
41
+ settings.headers.Authorization = `Bearer ${client.token}`;
42
+ }
43
+ return new sdkApiCore.SDKApi(new sdkApiCore.Configuration(_extends({}, settings, {
44
+ fetchApi: core.fetch
45
+ })));
46
+ };
47
+
48
+ /**
49
+ * Updates the project settings in the core state to the latest values.
50
+ */ const fetchProjectSettings = async (client)=>{
51
+ const core = getCore(client);
52
+ const apiClient = createApiClient(client);
53
+ const projectSettings = await apiClient.getEnvironmentSettings({
54
+ environmentId: core.environmentId,
55
+ sdkVersion: `WalletKit/${core.version}`
56
+ }, {
57
+ credentials: 'omit'
58
+ });
59
+ core.state.set({
60
+ projectSettings
61
+ });
62
+ return projectSettings;
63
+ };
64
+
65
+ const getDetails = ({ details, cause })=>{
66
+ if (cause instanceof BaseError) {
67
+ return cause.details;
68
+ }
69
+ if (cause == null ? void 0 : cause.message) {
70
+ return cause.message;
71
+ }
72
+ return details;
73
+ };
74
+ /**
75
+ * Formats the error message with all available information
76
+ */ const formatMessage = ({ shortMessage, details, docsUrl, metaMessages })=>{
77
+ return [
78
+ shortMessage,
79
+ '',
80
+ ...metaMessages ? [
81
+ ...metaMessages,
82
+ ''
83
+ ] : [],
84
+ ...docsUrl ? [
85
+ `Docs: ${docsUrl}`
86
+ ] : [],
87
+ ...details ? [
88
+ `Details: ${details}`
89
+ ] : [],
90
+ `Version: ${version}`,
91
+ `Timestamp: ${new Date().toISOString()}`
92
+ ].join('\n');
93
+ };
94
+ /**
95
+ * Base error class that provides structured error handling with detailed information
96
+ */ class BaseError extends Error {
97
+ /**
98
+ * Walks the cause chain of the error and returns the root error
99
+ */ walk() {
100
+ const cause = this.cause;
101
+ if (cause instanceof BaseError) {
102
+ return cause.walk();
103
+ }
104
+ return cause;
105
+ }
106
+ constructor(args){
107
+ const details = getDetails(args);
108
+ super(formatMessage(_extends({}, args, {
109
+ details
110
+ })), args.cause ? {
111
+ cause: args.cause
112
+ } : undefined);
113
+ this.name = 'BaseError';
114
+ this.details = details;
115
+ var _args_name;
116
+ this.name = (_args_name = args.name) != null ? _args_name : this.name;
117
+ var _args_cause;
118
+ this.cause = (_args_cause = args.cause) != null ? _args_cause : this.cause;
119
+ }
120
+ }
121
+
122
+ class ClientAlreadyInitializedError extends BaseError {
123
+ constructor(){
124
+ super({
125
+ cause: null,
126
+ docsUrl: null,
127
+ name: 'ClientAlreadyInitializedError',
128
+ shortMessage: 'Client must not be initialized more than once'
129
+ });
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Orchestrates the initialization of all modules and services of the SDK, and keeps
135
+ * the loading flag updated.
136
+ */ const initializeClient = async (client)=>{
137
+ const core = getCore(client);
138
+ if (core.state.get().initStatus !== 'uninitialized') {
139
+ throw new ClientAlreadyInitializedError();
140
+ }
141
+ core.state.set({
142
+ initStatus: 'in-progress'
143
+ });
144
+ const projectSettingsPromise = fetchProjectSettings(client);
145
+ core.initTrack.track({
146
+ name: 'project-settings',
147
+ promise: projectSettingsPromise
148
+ });
149
+ try {
150
+ await core.initTrack.waitForAll();
151
+ core.state.set({
152
+ initStatus: 'finished'
153
+ });
154
+ } catch (error) {
155
+ core.state.set({
156
+ initStatus: 'failed'
157
+ });
158
+ throw error;
159
+ }
160
+ };
161
+
162
+ const createDeferredPromise = ()=>{
163
+ let resolve;
164
+ let reject;
165
+ const promise = new Promise((_resolve, _reject)=>{
166
+ resolve = _resolve;
167
+ reject = _reject;
168
+ });
169
+ return {
170
+ promise,
171
+ reject: (reason)=>reject == null ? void 0 : reject(reason),
172
+ resolve: (value)=>resolve == null ? void 0 : resolve(value)
173
+ };
174
+ };
175
+
176
+ class CannotTrackError extends BaseError {
177
+ constructor(){
178
+ super({
179
+ cause: null,
180
+ docsUrl: null,
181
+ name: 'CannotTrackError',
182
+ shortMessage: 'All track calls must be performed in the same node tick'
183
+ });
184
+ }
185
+ }
186
+
187
+ /**
188
+ * Creates a tracker that associates names with promises and raises as promises resolve.
189
+ */ const createAsyncTrack = ()=>{
190
+ /**
191
+ * Whether tracking is enabled.
192
+ * All processes must be tracked on the same node tick.
193
+ *
194
+ * This ensures no process is missed (as it would throw when tracked on a different node tick).
195
+ */ let isTrackEnabled = true;
196
+ const eventEmitter = new EventEmitter.EventEmitter();
197
+ const allSettledPromise = createDeferredPromise();
198
+ const tracker = new Map();
199
+ /**
200
+ * Checks if all processes are initialized and resolves the main promise if they are.
201
+ */ const checkIfAllSettled = ()=>{
202
+ const allSettled = Array.from(tracker.values()).every((status)=>status === 'resolved');
203
+ if (!allSettled) return;
204
+ allSettledPromise.resolve();
205
+ };
206
+ const track = ({ name, promise })=>{
207
+ if (!isTrackEnabled) {
208
+ throw new CannotTrackError();
209
+ }
210
+ // Disable tracking in the next node tick
211
+ void Promise.resolve().then(()=>isTrackEnabled = false);
212
+ tracker.set(name, 'pending');
213
+ promise.then(()=>{
214
+ tracker.set(name, 'resolved');
215
+ eventEmitter.emit('resolved', name);
216
+ checkIfAllSettled();
217
+ }).catch((error)=>{
218
+ tracker.set(name, 'failed');
219
+ eventEmitter.emit('failed', name, error);
220
+ allSettledPromise.reject(error);
221
+ });
222
+ };
223
+ const waitForAll = ()=>allSettledPromise.promise;
224
+ const getTracker = ()=>tracker;
225
+ return {
226
+ getTracker,
227
+ off: eventEmitter.off.bind(eventEmitter),
228
+ on: eventEmitter.on.bind(eventEmitter),
229
+ track,
230
+ waitForAll
231
+ };
232
+ };
233
+
234
+ const createEventEmitter = ()=>new EventEmitter();
235
+
236
+ /**
237
+ * Creates a fetch instance that uses the native window.fetch API.
238
+ */ // eslint-disable-next-line no-restricted-globals -- this is the abstraction for fetch
239
+ const createWebFetch = ()=>window.fetch;
240
+
241
+ /**
242
+ * Log levels and their corresponding numeric values
243
+ */ const LOG_LEVELS = {
244
+ debug: 0,
245
+ error: 3,
246
+ info: 1,
247
+ warn: 2
248
+ };
249
+ // Assign to avoid lint errors
250
+ const defaultConsole = console;
251
+ /**
252
+ * Creates a logger instance with configurable log level and event emission capabilities.
253
+ * @returns A logger instance with debug, info, warn, and error methods
254
+ */ const createLogger = (options = {})=>{
255
+ const eventEmitter = new EventEmitter.EventEmitter();
256
+ var _options_level;
257
+ // Default to 'debug' if no level is provided
258
+ const minLevel = (_options_level = options.level) != null ? _options_level : 'warn';
259
+ // Helper to decide if we should log based on current log level
260
+ const shouldLog = (level)=>{
261
+ return LOG_LEVELS[level] >= LOG_LEVELS[minLevel];
262
+ };
263
+ // Helper to format the log message
264
+ const formatMessage = (level, message)=>{
265
+ const timestamp = new Date().toISOString();
266
+ return `[${timestamp}] ${level.toUpperCase()}: ${message}`;
267
+ };
268
+ // Unified logger function that checks the level and calls the appropriate console method
269
+ const log = (level, consoleMethod, message, ...args)=>{
270
+ eventEmitter.emit('log', level, message, ...args);
271
+ if (!shouldLog(level)) return;
272
+ consoleMethod(formatMessage(level, message), ...args);
273
+ };
274
+ return {
275
+ debug: (message, ...args)=>log('debug', defaultConsole.debug, message, ...args),
276
+ error: (message, ...args)=>log('error', defaultConsole.error, message, ...args),
277
+ info: (message, ...args)=>log('info', defaultConsole.info, message, ...args),
278
+ off: eventEmitter.off.bind(eventEmitter),
279
+ on: eventEmitter.on.bind(eventEmitter),
280
+ warn: (message, ...args)=>log('warn', defaultConsole.warn, message, ...args)
281
+ };
282
+ };
283
+
284
+ /**
285
+ * Creates a deeplink opener that uses the native window.open API.
286
+ */ const createWebDeeplinkOpener = ()=>{
287
+ return async (url)=>{
288
+ // eslint-disable-next-line no-restricted-globals -- this is the abstraction for opening a deeplink
289
+ window.open(url, '_blank');
290
+ };
291
+ };
292
+
293
+ const formatForStorage = (value)=>{
294
+ const item = {
295
+ value
296
+ };
297
+ return JSON.stringify(item);
298
+ };
299
+ const parseFromStorage = (value)=>{
300
+ const item = JSON.parse(value);
301
+ return item.value;
302
+ };
303
+
304
+ /**
305
+ * Creates a Storage instance that uses localStorage as the storage model meant for use in the browser.
306
+ */ const createWebStorage = ()=>({
307
+ getItem: async (key)=>{
308
+ const rawItem = localStorage.getItem(key);
309
+ return rawItem ? parseFromStorage(rawItem) : null;
310
+ },
311
+ removeItem: async (key)=>{
312
+ localStorage.removeItem(key);
313
+ },
314
+ setItem: async (key, value)=>{
315
+ const item = formatForStorage(value);
316
+ localStorage.setItem(key, item);
317
+ }
318
+ });
319
+
320
+ const createObservableState = (getInitialState)=>{
321
+ // ===============
322
+ // NOTIFICATIONS
323
+ // ===============
324
+ const subscribers = new Set();
325
+ const notifySubscribers = (value)=>{
326
+ subscribers.forEach((callback)=>callback(value));
327
+ };
328
+ const subscribe = (callback)=>{
329
+ subscribers.add(callback);
330
+ return ()=>unsubscribe(callback);
331
+ };
332
+ const unsubscribe = (callback)=>{
333
+ subscribers.delete(callback);
334
+ };
335
+ // ===============
336
+ // STATE
337
+ // ===============
338
+ const currentValue = getInitialState();
339
+ const get = ()=>currentValue;
340
+ const set = (partial)=>{
341
+ Object.assign(currentValue, partial);
342
+ notifySubscribers(currentValue);
343
+ };
344
+ return {
345
+ get,
346
+ getInitialState,
347
+ set,
348
+ subscribe,
349
+ unsubscribe
350
+ };
351
+ };
352
+
353
+ /**
354
+ * The default API base URL for Dynamic apps in production.
355
+ */ const DEFAULT_API_BASE_URL = 'https://app.dynamic.xyz/api/v0';
356
+
357
+ /**
358
+ * Creates a core instance that contains all the services and state of the Dynamic SDK client.
359
+ */ const createCore = (config)=>{
360
+ var _config_coreConfig, _config_coreConfig1, _config_coreConfig2, _config_coreConfig3, _config_coreConfig4;
361
+ var _config_coreConfig_apiBaseUrl;
362
+ const apiBaseUrl = (_config_coreConfig_apiBaseUrl = (_config_coreConfig = config.coreConfig) == null ? void 0 : _config_coreConfig.apiBaseUrl) != null ? _config_coreConfig_apiBaseUrl : DEFAULT_API_BASE_URL;
363
+ var _config_coreConfig_logger;
364
+ const logger = (_config_coreConfig_logger = (_config_coreConfig1 = config.coreConfig) == null ? void 0 : _config_coreConfig1.logger) != null ? _config_coreConfig_logger : createLogger();
365
+ var _config_coreConfig_storage;
366
+ const storage = (_config_coreConfig_storage = (_config_coreConfig2 = config.coreConfig) == null ? void 0 : _config_coreConfig2.storage) != null ? _config_coreConfig_storage : createWebStorage();
367
+ var _config_coreConfig_fetch;
368
+ const fetch = (_config_coreConfig_fetch = (_config_coreConfig3 = config.coreConfig) == null ? void 0 : _config_coreConfig3.fetch) != null ? _config_coreConfig_fetch : createWebFetch();
369
+ var _config_coreConfig_openDeeplink;
370
+ const openDeeplink = (_config_coreConfig_openDeeplink = (_config_coreConfig4 = config.coreConfig) == null ? void 0 : _config_coreConfig4.openDeeplink) != null ? _config_coreConfig_openDeeplink : createWebDeeplinkOpener();
371
+ const state = createObservableState(()=>({
372
+ initStatus: 'uninitialized',
373
+ loaded: false,
374
+ projectSettings: null,
375
+ token: null,
376
+ user: null
377
+ }));
378
+ const eventEmitter = createEventEmitter();
379
+ const initTrack = createAsyncTrack();
380
+ return {
381
+ apiBaseUrl,
382
+ environmentId: config.environmentId,
383
+ eventEmitter,
384
+ fetch,
385
+ initTrack,
386
+ logger,
387
+ openDeeplink,
388
+ state,
389
+ storage,
390
+ version
391
+ };
392
+ };
393
+
394
+ const createDynamicClient = (config)=>{
395
+ const core = createCore(config);
396
+ const client = {
397
+ get __core () {
398
+ return core;
399
+ },
400
+ get initStatus () {
401
+ return core.state.get().initStatus;
402
+ },
403
+ get projectSettings () {
404
+ return core.state.get().projectSettings;
405
+ },
406
+ get token () {
407
+ return core.state.get().token;
408
+ },
409
+ get user () {
410
+ return core.state.get().user;
411
+ }
412
+ };
413
+ var _config_autoInitialize;
414
+ const autoInitialize = (_config_autoInitialize = config.autoInitialize) != null ? _config_autoInitialize : true;
415
+ if (autoInitialize) {
416
+ void initializeClient(client);
417
+ }
418
+ return client;
419
+ };
420
+
421
+ const logout = async (client)=>{
422
+ const core = getCore(client);
423
+ const apiClient = createApiClient(client);
424
+ await apiClient.revokeSession({
425
+ environmentId: core.environmentId
426
+ });
427
+ core.state.set({
428
+ token: null,
429
+ user: null
430
+ });
431
+ };
432
+
433
+ /**
434
+ * Listen to an event from the client.
435
+ *
436
+ * @returns A function that can be called to remove the listener.
437
+ */ const onEvent = (client, event, listener)=>{
438
+ const { eventEmitter } = getCore(client);
439
+ eventEmitter.on(event, listener);
440
+ return ()=>{
441
+ eventEmitter.off(event, listener);
442
+ };
443
+ };
444
+ /**
445
+ * Remove a listener from an event.
446
+ */ const offEvent = (client, event, listener)=>{
447
+ const { eventEmitter } = getCore(client);
448
+ eventEmitter.off(event, listener);
449
+ };
450
+ /**
451
+ * Listen to an event that will only fire once.
452
+ *
453
+ * @returns A function that can be called to remove the listener.
454
+ */ const onceEvent = (client, event, listener)=>{
455
+ const { eventEmitter } = getCore(client);
456
+ eventEmitter.once(event, listener);
457
+ return ()=>{
458
+ eventEmitter.off(event, listener);
459
+ };
460
+ };
461
+
462
+ const assignClient = (target, client)=>{
463
+ Object.defineProperty(target, '__client', {
464
+ // hide from enumeration
465
+ configurable: true,
466
+ enumerable: false,
467
+ get: ()=>client
468
+ });
469
+ return target;
470
+ };
471
+
472
+ class ClientNotPresentError extends BaseError {
473
+ constructor(){
474
+ super({
475
+ cause: null,
476
+ docsUrl: null,
477
+ name: 'ClientNotPresentError',
478
+ shortMessage: 'The client is not present in the target object.'
479
+ });
480
+ }
481
+ }
482
+
483
+ const getClient = (target)=>{
484
+ if (!Object.prototype.hasOwnProperty.call(target, '__client')) {
485
+ throw new ClientNotPresentError();
486
+ }
487
+ // @ts-expect-error - this was hidden from the public API
488
+ return target.__client;
489
+ };
490
+
491
+ const sendEmailOTP = async (client, { email })=>{
492
+ const core = getCore(client);
493
+ const apiClient = createApiClient(client);
494
+ const { verificationUUID } = await apiClient.createEmailVerification({
495
+ emailVerificationCreateRequest: {
496
+ email
497
+ },
498
+ environmentId: core.environmentId
499
+ });
500
+ return assignClient({
501
+ email,
502
+ verificationUUID
503
+ }, client);
504
+ };
505
+
506
+ const verifyOTP = async (otpVerification, { verificationToken })=>{
507
+ const client = getClient(otpVerification);
508
+ const core = getCore(client);
509
+ const apiClient = createApiClient(client);
510
+ const { user, minifiedJwt } = await apiClient.signInWithEmailVerification({
511
+ emailVerificationVerifyRequest: {
512
+ verificationToken,
513
+ verificationUUID: otpVerification.verificationUUID
514
+ },
515
+ environmentId: core.environmentId
516
+ });
517
+ core.state.set({
518
+ token: minifiedJwt,
519
+ user
520
+ });
521
+ return user;
522
+ };
523
+
524
+ exports.createDynamicClient = createDynamicClient;
525
+ exports.logout = logout;
526
+ exports.offEvent = offEvent;
527
+ exports.onEvent = onEvent;
528
+ exports.onceEvent = onceEvent;
529
+ exports.sendEmailOTP = sendEmailOTP;
530
+ exports.verifyOTP = verifyOTP;
package/index.esm.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./src/index";