@wildix/xbees-connect 1.3.6 → 1.3.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.
Files changed (2) hide show
  1. package/README.md +381 -73
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -18,8 +18,8 @@ npm install @wildix/xbees-connect
18
18
  The integration can be launched in different modes via the `v` URL parameter:
19
19
 
20
20
  - `ui` - Standard UI mode (default)
21
- - `no-ui` - Data-only mode, no UI shown
22
- - `d` - Dialog/setup mode
21
+ - `no-ui` / `daemon` - Data-only mode, no UI shown
22
+ - `d` / `dialog` - Dialog/setup mode
23
23
  - `f` - Fullsize mode, integration takes full viewport dimensions
24
24
 
25
25
  You can check the current mode using:
@@ -27,10 +27,10 @@ You can check the current mode using:
27
27
  ```ts
28
28
  const client = Client.getInstance();
29
29
 
30
- client.showsUi(); // Returns true for UI modes (ui, d, f)
31
- client.isDataOnly(); // Returns true for no-ui mode
32
- client.isSetupDialog(); // Returns true for dialog mode (d)
33
- client.isFullsize(); // Returns true for fullsize mode (f)
30
+ client.showsUi(); // Returns true for UI modes (ui, d, f)
31
+ client.isDataOnly(); // Returns true for no-ui / daemon mode
32
+ client.isSetupDialog(); // Returns true for dialog mode (d / dialog)
33
+ client.isFullsize(); // Returns true for fullsize mode (f)
34
34
  ```
35
35
 
36
36
  ## Usage
@@ -41,136 +41,444 @@ import Client from "@wildix/xbees-connect";
41
41
  const xBeesClient = Client.getInstance();
42
42
 
43
43
  console.log(xBeesClient.version());
44
-
45
44
  ```
46
45
 
47
46
  ## API
48
47
 
48
+ ### Class helpers
49
+
50
+ #### `Client.getInstance(): ConnectClient`
51
+
52
+ Returns the singleton `Client` instance. Prefer this over `new Client()` to avoid duplicate message listeners.
53
+
54
+ ```ts
55
+ const client = Client.getInstance();
56
+ ```
57
+
58
+ #### `Client.initialize(renderer: () => Promise<void>): void`
59
+
60
+ Calls `renderer` only when the integration runs in a UI mode (`showsUi() === true`). Use this as the entry point to conditionally boot your React/Vue tree.
61
+
62
+ ```ts
63
+ Client.initialize(async () => {
64
+ ReactDOM.render(<App />, document.getElementById('root'));
65
+ });
66
+ ```
67
+
68
+ ---
69
+
49
70
  ### Initialization
50
71
 
51
- #### `ready()`
72
+ #### `ready(props?: SupportedPlatformVariant | ReadyExtendedProps): Promise<ResponseMessage>`
52
73
 
53
- Sends the signal to x-bees that iFrame is ready to be shown. iFrame should send it when the application starts and is ready.
74
+ Sends the signal to x-bees that the iFrame is ready to be shown. Call this once when the application starts and is fully initialised. Accepts an optional platform variant string or an extended props object (e.g. `templateId`, `analyticTitle`).
54
75
 
55
- #### `isAuthorized: (payload: string) => Promise<ResponseFromChannel>`
76
+ #### `isAuthorized(): Promise<ResponseMessage>`
56
77
 
57
78
  Sends the message to x-bees that the user is authorized and no more actions are required.
58
79
 
59
- #### `isNotAuthorized: (payload: string) => Promise<ResponseFromChannel>`
80
+ #### `isNotAuthorized(): Promise<ResponseMessage>`
81
+
82
+ Sends the message to x-bees that the user is not authorized and interaction is required.
83
+
84
+ ---
85
+
86
+ ### Identity and user data
87
+
88
+ #### `version(): string`
89
+
90
+ Returns the version string of the `xbees-connect` package.
91
+
92
+ #### `getUserEmail(): string`
93
+
94
+ Returns the email of the currently authenticated x-bees user, taken from URL parameters at construction time.
95
+
96
+ #### `getUserPbxToken(): string`
97
+
98
+ Returns the current PBX token. The token is updated automatically whenever the `PBX_TOKEN` event fires. The initial value is an empty string until the first token event is received.
99
+
100
+ #### `getPbxDomain(): string`
101
+
102
+ Returns the current PBX domain. Populated after user data is fetched from x-bees.
103
+
104
+ #### `getUserExtension(): string | null`
105
+
106
+ Returns the PBX extension of the current user, or `null` if not available.
107
+
108
+ #### `getXBeesUser(): XBeesUser | null`
109
+
110
+ Returns a cached `XBeesUser` object (`{ id, email, extension, domain, name }`) or `null` if the data has not been fetched yet. Triggers a background fetch on first call.
111
+
112
+ > **Deprecated behaviour:** this method does not wait for the fetch to complete. If you need the user data before rendering, use `getXBeesUserAsync()` instead.
113
+
114
+ #### `getXBeesUserAsync(): Promise<XBeesUser | null>`
115
+
116
+ Asynchronous version of `getXBeesUser`. Waits for the user data to be fetched from x-bees before returning. Prefer this over the synchronous variant when the user object is required immediately.
117
+
118
+ ```ts
119
+ const user = await client.getXBeesUserAsync();
120
+ if (user) {
121
+ console.log(user.name, user.email);
122
+ }
123
+ ```
124
+
125
+ #### `getReferrer(): string`
126
+
127
+ Returns the URL of the x-bees app that opened this integration, taken from URL parameters at construction time.
128
+
129
+ #### `getBackToAppUrl(): string`
130
+
131
+ Returns the deep-link URL that navigates the user back to this integration inside the x-bees app. The format differs between native and web platforms.
132
+
133
+ #### `getStartPage(): StartPage | null`
134
+
135
+ Returns the `StartPage` enum value parsed from the URL, or `null` if not present.
136
+
137
+ #### `getProduct(): Product | null`
138
+
139
+ Returns the `Product` enum value indicating from which x-bees product the integration was opened (e.g. contacts, conversations), or `null` if not specified.
140
+
141
+ ---
142
+
143
+ ### Environment and platform
144
+
145
+ #### `isPlatformNative(): boolean`
146
+
147
+ Returns `true` when x-bees is running inside a React Native WebView.
148
+
149
+ #### `isPlatformWeb(): boolean`
150
+
151
+ Returns `true` when x-bees is running in a web browser (iFrame).
152
+
153
+ #### `isOpenedFromXBees(): boolean`
154
+
155
+ Returns `true` when the integration is running inside an x-bees iFrame or a React Native WebView. Returns `false` in standalone/dev mode; all `send*` calls will be no-ops in that case.
156
+
157
+ #### `isVisible(): boolean`
158
+
159
+ Returns `true` when the UI iFrame is currently active (visible to the user). Updated automatically via the `VISIBILITY` event.
160
+
161
+ ---
162
+
163
+ ### UI state and launch mode
164
+
165
+ #### `showsUi(): boolean`
166
+
167
+ Returns `true` for all modes that render UI (`ui`, `d`, `f`). Opposite of `isDataOnly()`.
168
+
169
+ #### `isDataOnly(): boolean`
170
+
171
+ Returns `true` when the integration is launched in `no-ui` or `daemon` mode (no UI rendered).
172
+
173
+ #### `isSetupDialog(): boolean`
174
+
175
+ Returns `true` when the integration is launched in dialog/setup mode (`d` or `dialog`).
176
+
177
+ #### `isFullsize(): boolean`
178
+
179
+ Returns `true` when the integration is launched in fullsize mode (`f`).
180
+
181
+ #### `isActivationOnly(): boolean`
182
+
183
+ Returns `true` when the integration is opened for activation/authorization purposes only (URL contains the `authorize` parameter).
184
+
185
+ ---
186
+
187
+ ### Context
188
+
189
+ #### `getContext(): Promise<ResponseMessage>`
190
+
191
+ Retrieves the current x-bees context data. The shape of the payload depends on the active context (e.g. contact view, conversation view).
192
+
193
+ #### `getCurrentContact(): Promise<ResponseMessage>`
194
+
195
+ Retrieves the contact data currently open in x-bees.
196
+
197
+ #### `getCurrentConversation(): Promise<ResponseMessage>`
198
+
199
+ Retrieves the conversation data (`{ id, type }`) currently open in x-bees. Resolves with `undefined` payload if the conversation is temporary.
200
+
201
+ #### `getAvailableContactData(): Promise<ResponseMessage>`
202
+
203
+ Retrieves contact data that x-bees has available for the current context (phone numbers, emails, etc.). Useful to pre-populate integration forms.
204
+
205
+ ---
206
+
207
+ ### Theme
208
+
209
+ #### `getThemeMode(): Promise<ResponseMessage>`
210
+
211
+ Retrieves the current theme mode (`'light'` or `'dark'`).
212
+
213
+ #### `getTheme(): Promise<ResponseMessage>`
214
+
215
+ Retrieves the full theme object including mode and theme options (typography, palette).
60
216
 
61
- Sends the message to x-bees that user actions are required:
217
+ #### `onThemeChange(callback: (theme: IPayloadThemeChange) => void): RemoveEventListener`
62
218
 
63
- ### Contacts search
219
+ Starts listening for theme-change events. Invokes `callback` whenever the user changes the x-bees theme. Returns an unsubscribe function.
64
220
 
65
- #### `onSuggestContacts: ((query: string, resolve: Resolve, reject: Reject) => void) => RemoveEventListener`
221
+ ---
66
222
 
67
- Starts listen for the events of searching contacts and handle autosuggestion with the provided callback */
223
+ ### Token
68
224
 
69
- ```jsx
225
+ #### `getXBeesToken(): Promise<ResponseMessage>`
226
+
227
+ Requests the current x-bees authentication token from x-bees. Use this when you need the token for API calls to x-bees services.
228
+
229
+ #### `onPbxTokenChange(callback: (token: string) => void): RemoveEventListener`
230
+
231
+ Starts listening for PBX token change events. Invokes `callback` with the new token value. Returns an unsubscribe function.
232
+
233
+ ---
234
+
235
+ ### Calls
236
+
237
+ #### `startCall(phoneNumber: string): Promise<ResponseMessage>`
238
+
239
+ Sends a request to x-bees to initiate a call to the given phone number.
240
+
241
+ #### `onCallStarted(callback: (info: IPayloadCallStartedInfo) => void): RemoveEventListener`
242
+
243
+ Starts listening for the event fired when a call starts. Returns an unsubscribe function.
244
+
245
+ #### `onCallEnded(callback: () => void): RemoveEventListener`
246
+
247
+ Starts listening for the event fired when a call ends. Returns an unsubscribe function.
248
+
249
+ ---
250
+
251
+ ### Contacts
252
+
253
+ #### `contactUpdated(query: ContactQuery, contact: Contact): Promise<ResponseMessage>`
254
+
255
+ Notifies x-bees that a contact was created or updated. `query` identifies the contact (`{ id?, email?, phone? }`); `contact` contains the updated data.
256
+
257
+ #### `contactMatchUpdated(query: ContactQuery, contact: Contact): Promise<ResponseMessage>`
258
+
259
+ Notifies x-bees that a contact match was updated. Used when the integration resolves a contact lookup initiated by x-bees.
260
+
261
+ #### `onSuggestContacts(callback: (query: string, resolve: SuggestContactsResolver, reject: Reject) => void): RemoveEventListener`
262
+
263
+ Starts listening for contact auto-suggest requests from x-bees. When the user types in a contact search field, x-bees calls `callback` with the search string. Call `resolve(contacts)` to return results.
264
+
265
+ ```ts
70
266
  Client.getInstance().onSuggestContacts(async (query, resolve) => {
71
- try {
72
- const contacts = await fetchContacts(query);
73
- resolve(contacts);
74
- } catch (error) {
75
- console.log('catch', error);
76
- }
267
+ try {
268
+ const contacts = await fetchContacts(query);
269
+ resolve(contacts);
270
+ } catch (error) {
271
+ console.log('catch', error);
272
+ }
77
273
  });
78
274
  ```
79
275
 
80
- #### `onLookupAndMatchContact: ((query: ContactQuery, resolve: Resolve, reject: Reject) => void) => RemoveEventListener`
276
+ #### `onLookupAndMatchContact(callback: (query: ContactQuery, resolve: LookupAndMatchContactsResolver, reject: Reject) => void): RemoveEventListener`
81
277
 
82
- Starts listen for the events of searching contact info and handle match with the provided callback
278
+ Starts listening for single-contact lookup requests. x-bees supplies a `ContactQuery` and expects a single matched `Contact` via `resolve`.
83
279
 
84
- ```jsx
280
+ ```ts
85
281
  Client.getInstance().onLookupAndMatchContact(async (query, resolve) => {
86
- try {
87
- const contact = await fetchContactAndMatch(query);
88
- resolve(contact);
89
- } catch (error) {
90
- console.log('catch', error);
91
- }
282
+ try {
283
+ const contact = await fetchContactAndMatch(query);
284
+ resolve(contact);
285
+ } catch (error) {
286
+ console.log('catch', error);
287
+ }
92
288
  });
93
289
  ```
94
290
 
95
- ### Context
96
- #### `getContext(): Promise<Response>`
291
+ #### `onLookupAndMatchBatchContacts(callback: (queries: ContactQuery[], returnResults: LookupAndMatchBatchContactsResolver) => void): RemoveEventListener`
97
292
 
98
- Retrieves current x-bees context data. The data may be different depending on context.
293
+ Starts listening for batch contact lookup requests. x-bees sends an array of `ContactQuery` objects. Call `returnResults` with a `Map<ContactQuery, Contact | null | undefined>` mapping each query to its result.
99
294
 
100
- #### `getCurrentContact(): Promise<Response>`
295
+ ```ts
296
+ Client.getInstance().onLookupAndMatchBatchContacts(async (queries, returnResults) => {
297
+ const resultsMap = new Map<ContactQuery, Contact | null>();
298
+ for (const query of queries) {
299
+ resultsMap.set(query, await fetchContact(query));
300
+ }
301
+ returnResults(resultsMap);
302
+ });
303
+ ```
101
304
 
102
- Retrieves contact data currently opened in x-bees.
305
+ #### `createContactIsSupported(): Promise<ResponseMessage>`
103
306
 
104
- #### `getCurrentConversation(): Promise<Response>`
307
+ Sends a signal to x-bees indicating that this integration supports creating contacts. Call once during initialization if your integration handles contact creation.
105
308
 
106
- Retrieves conversation data ({id, type}) currently opened in x-bees.
107
- If the conversation is temporary - retrieves undefined
309
+ #### `createContactHasNoPermission(): Promise<ResponseMessage>`
108
310
 
109
- #### `getThemeMode(): Promise<Response>`
311
+ Sends a signal to x-bees indicating that the current user does not have permission to create contacts.
110
312
 
111
- Retrieves current theme mode (light or dark)
313
+ ---
112
314
 
113
- #### `getTheme(): Promise<Response>`
315
+ ### Navigation
114
316
 
115
- Retrieves current theme mode and theme options
317
+ #### `onRedirectQuery(callback: Callback<EventType.REDIRECT_QUERY>): RemoveEventListener`
116
318
 
117
- #### `onThemeChange: (callback: ThemeChangeListenerCallback) => void;`
319
+ Starts listening for redirect query events. Fires when the user opens the app via a deep-link that targets this integration. Returns an unsubscribe function.
118
320
 
119
- Starts to listen for the events of changing theme and returns the provided callback
321
+ #### `onStartRedirectToEntityPage(callback: Callback<EventType.START_REDIRECT_TO_ENTITY_PAGE>): RemoveEventListener`
120
322
 
121
- #### `onPbxTokenChange: (callback: ListenerCallback) => void;`
323
+ Starts listening for the event that signals x-bees is navigating to an entity page (e.g. conversation). The payload contains `{ conversationId, pageName }`. Returns an unsubscribe function.
122
324
 
123
- Starts to listen for the events of changing PBX token and returns the provided callback
325
+ #### `onCancelRedirectToEntityPage(callback: Callback<EventType.CANCEL_REDIRECT_TO_ENTITY_PAGE>): RemoveEventListener`
124
326
 
125
- #### `onCallStarted: (callback: ListenerCallback) => void;`
327
+ Starts listening for the event that signals a pending redirect to an entity page was cancelled. The payload contains `{ conversationId }`. Returns an unsubscribe function.
126
328
 
127
- Starts to listen for the events of starting the call and returns the provided callback
329
+ ---
128
330
 
129
- #### `onCallEnded: (callback: ListenerCallback) => void;`
331
+ ### Visibility and lifecycle
130
332
 
131
- Starts to listen for the events of ending the call and returns the provided callback
333
+ #### `onVisibilityChange(callback: (isVisible: boolean) => void): RemoveEventListener`
132
334
 
133
- #### `off: (callback: ListenerCallback) => void;`
335
+ Starts listening for iframe visibility changes. `callback` receives `true` when the iFrame becomes active and `false` when it is hidden. Returns an unsubscribe function.
134
336
 
135
- Removes particular callback from handling events
337
+ #### `reboot(): Promise<ResponseMessage>`
136
338
 
339
+ Sends a request to x-bees to restart the iFrame and reload it with the latest parameters and token.
137
340
 
138
- ### Other
139
- #### `version(): string`
341
+ #### `onLogout(callback: Callback<EventType.LOGOUT>): RemoveEventListener`
342
+
343
+ Starts listening for the logout event. Notifies x-bees that the integration supports logout. `callback` is invoked when x-bees requests a logout action.
344
+
345
+ ---
346
+
347
+ ### Contact events
348
+
349
+ #### `onContactWeightUpdate(callback: Callback<EventType.CONTACT_WEIGHT_UPDATE>): RemoveEventListener`
350
+
351
+ Starts listening for contact weight update events. Fires when x-bees recalculates the relevance weight of a contact. The payload contains `{ id, query }`. Returns an unsubscribe function.
352
+
353
+ #### `onContactRefresh(callback: Callback<EventType.CONTACT_REFRESH>): RemoveEventListener`
354
+
355
+ Starts listening for contact refresh events. Fires when a contact was updated in the x-bees daemon and the open integration should re-fetch its data. Returns an unsubscribe function.
356
+
357
+ ---
358
+
359
+ ### UI utilities
360
+
361
+ #### `showToast(message: string, severity?: ToastSeverity): Promise<ResponseMessage>`
362
+
363
+ Displays a toast notification inside the x-bees UI. `severity` defaults to `'INFO'`. Accepted values: `'INFO'`, `'WARNING'`, `'ERROR'`, `'SUCCESS'`, `'NOTICE'`.
364
+
365
+ ```ts
366
+ client.showToast('Contact saved', 'SUCCESS');
367
+ ```
368
+
369
+ #### `setViewport(payload: { height: number | string; width: number | string }): Promise<ResponseMessage>`
140
370
 
141
- Retrieves the version of xBeesConnect
371
+ Sends a request to x-bees to resize the iFrame to the specified dimensions.
142
372
 
143
- #### `startCall(phoneNumber: string)`
373
+ #### `toClipboard(payload: string): Promise<ResponseMessage>`
144
374
 
145
- Sends a request to x-bees to start a call with a number
375
+ Sends a request to x-bees to write the given string to the user's clipboard.
146
376
 
147
- #### `reboot()`
377
+ ---
148
378
 
149
- Sends a request to x-bees to restart the iFrame, reload with actual parameters and token
379
+ ### Event listeners (generic)
150
380
 
151
- #### `setViewport({height: number; width: number})`
381
+ #### `addEventListener<T extends EventType>(eventName: T, callback: Callback<T>): RemoveEventListener`
152
382
 
153
- Sends a request to x-bees about changes of the current frame size
383
+ Starts listening for any x-bees event by name. Returns an unsubscribe function. Prefer the typed convenience methods (`onThemeChange`, `onCallStarted`, etc.) when available.
154
384
 
155
- #### `toClipboard(payload: string)`
385
+ #### `removeEventListener<T extends EventType>(eventName: T, callback: Callback<T>): void`
156
386
 
157
- Sends a request to x-bees to put a string to the user's clipboard
387
+ Stops listening for the specified event with the given callback reference.
388
+
389
+ #### `off(callback: Callback | StorageEventCallback): void`
390
+
391
+ Removes the given callback from all event listeners, including local storage listeners registered via `onStorage`.
392
+
393
+ ---
394
+
395
+ ### Analytics
396
+
397
+ #### `sendAnalytics(eventName: string, params?: Record<string, string>): void`
398
+
399
+ Sends an analytics event to x-bees for tracking. `params` is an optional map of string key-value pairs.
400
+
401
+ ```ts
402
+ client.sendAnalytics('contact_viewed', { contactId: '123' });
403
+ ```
404
+
405
+ ---
406
+
407
+ ### Local storage
408
+
409
+ These methods read and write to the browser's `localStorage`, namespaced per integration.
410
+
411
+ #### `saveToStorage<T>(key: string, value: T): void`
412
+
413
+ Saves a value to `localStorage` under the given key. The value is serialized to JSON automatically.
414
+
415
+ #### `getFromStorage<T>(key: string): T | null`
416
+
417
+ Retrieves and deserializes a value from `localStorage`. Returns `null` if the key does not exist.
418
+
419
+ #### `deleteFromStorage(key: string): void`
420
+
421
+ Removes the entry with the given key from `localStorage`.
422
+
423
+ #### `setIntegrationStorageKey(integrationKey: string): void`
424
+
425
+ Switches the localStorage namespace to the specified parent integration key. Use this when the integration inherits storage from a parent integration.
426
+
427
+ #### `onStorage(listener: StorageEventCallback): () => void`
428
+
429
+ Registers a listener for `localStorage` change events (native `StorageEvent`). Returns an unsubscribe function.
430
+
431
+ ```ts
432
+ const unsubscribe = client.onStorage((event) => {
433
+ console.log('Storage changed:', event.key, event.newValue);
434
+ });
435
+ ```
436
+
437
+ ---
438
+
439
+ ### x-bees storage
440
+
441
+ These methods persist data in x-bees' own server-side storage, not in the browser's `localStorage`. Data stored here survives browser clears and is available across devices.
442
+
443
+ #### `saveInXbeesStorage<T>(key: string, value: T): void`
444
+
445
+ Saves a value to the x-bees storage. The value is serialized to a JSON string before sending.
446
+
447
+ #### `getFromXbeesStorage(key: string): Promise<ResponseMessage>`
448
+
449
+ Requests a stored value from x-bees storage by key. Resolves with a `ResponseMessage` whose payload contains the stored value.
450
+
451
+ #### `removeFromXbeesStorage(key: string): void`
452
+
453
+ Removes the entry with the given key from x-bees storage.
454
+
455
+ ---
456
+
457
+ ### Custom events
458
+
459
+ #### `sendCustomEvent({ type: string, payload?: JSONValue }): void`
460
+
461
+ Sends a custom event to x-bees with an arbitrary `type` string and optional JSON-serializable payload. Use this for integration-specific communication not covered by the built-in event types.
462
+
463
+ ```ts
464
+ client.sendCustomEvent({ type: 'my_action', payload: { foo: 'bar' } });
465
+ ```
158
466
 
159
- #### `addEventListener()`
467
+ #### `sendDropdownVisibilityEvent(dropdownVisibilityStatus: boolean): void`
160
468
 
161
- Starts listening for one of the x-bees events and returns the provided callback
469
+ > **Legacy:** prefer `sendCustomEvent` for new integrations.
162
470
 
163
- #### `removeEventListener()`
471
+ Notifies x-bees when a dropdown inside the integration opens or closes, which allows x-bees to enable nested scrolling on Android WebView.
164
472
 
165
- Stops listening for one of the x-bees events with the particular callback
473
+ ---
166
474
 
167
- #### `onLogout()`
475
+ ### Technical support
168
476
 
169
- Starts listen on logout event and send event to the xbees about logout able
477
+ #### `getTechnicalSupport(): TechnicalSupport`
170
478
 
171
- #### `sendAnalytics()`
479
+ Returns the `TechnicalSupport` singleton, which provides utilities for reporting diagnostic information to x-bees support.
172
480
 
173
- Sends analytics data to xbees for track into analytics data
481
+ ---
174
482
 
175
483
  ## Known issues
176
484
 
@@ -178,6 +486,6 @@ The below function can fix cases when `String.replaceAll()` does not work in the
178
486
 
179
487
  ```ts
180
488
  function replaceAll(str: string, search: string, replace: string) {
181
- return str.split(search).join(replace);
489
+ return str.split(search).join(replace);
182
490
  }
183
491
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wildix/xbees-connect",
3
- "version": "1.3.6",
3
+ "version": "1.3.7",
4
4
  "description": "This library provides easy communication between x-bees and integrated web applications",
5
5
  "author": "dimitri.chernykh <dimitri.chernykh@wildix.com>",
6
6
  "homepage": "",