skapi-js 1.0.19 → 1.0.21

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.
@@ -40,18 +40,25 @@ export default class Skapi {
40
40
  connectRealtime(cb: (rt: {
41
41
  status: 'message' | 'error' | 'success' | 'close' | 'notice';
42
42
  message: any;
43
- }) => Promise<void>): any;
43
+ sender?: string;
44
+ }) => Promise<WebSocket>): any;
44
45
  closeRealtime(): Promise<void>;
45
46
  getRealtimeUsers(params: {
46
47
  group: string;
47
48
  user_id?: string;
48
49
  }, fetchOptions?: FetchOptions): Promise<DatabaseResponse<string[]>>;
50
+ getRealtimeGroups(params?: {
51
+ searchFor: 'group' | 'number_of_users';
52
+ value: string | number;
53
+ condition?: '>' | '>=' | '=' | '<' | '<=' | '!=' | 'gt' | 'gte' | 'eq' | 'lt' | 'lte' | 'ne';
54
+ range?: string | number;
55
+ } | null, fetchOptions?: FetchOptions): Promise<DatabaseResponse<{
56
+ group: string;
57
+ number_of_users: number;
58
+ }>>;
49
59
  postRealtime(message: any, recipient: string): Promise<{
50
60
  status: 'success';
51
61
  message: 'Message sent.';
52
- } | {
53
- status: 'error';
54
- message: 'Realtime connection is not open.';
55
62
  }>;
56
63
  joinRealtime(params: {
57
64
  group: string | null;
package/js/main/skapi.js CHANGED
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import SkapiError from './error';
8
8
  import validator from '../utils/validator';
9
9
  import { getRecords, postRecord, deleteRecords, getTables, getIndexes, getTags, uploadFiles, getFile, grantPrivateRecordAccess, removePrivateRecordAccess, listPrivateRecordAccess, requestPrivateRecordAccessKey, deleteFiles, normalizeRecord } from '../methods/database';
10
- import { connectRealtime, joinRealtime, postRealtime, closeRealtime, getRealtimeUsers } from '../methods/realtime';
10
+ import { connectRealtime, joinRealtime, postRealtime, closeRealtime, getRealtimeUsers, getRealtimeGroups } from '../methods/realtime';
11
11
  import { request, secureRequest, mock, getFormResponse, formHandler, getConnection } from '../methods/request';
12
12
  import { subscribe, unsubscribe, blockSubscriber, unblockSubscriber, getSubscriptions, subscribeNewsletter, getNewsletters, unsubscribeNewsletter, getNewsletterSubscription } from '../methods/subscription';
13
13
  import { checkAdmin, getProfile, logout, recoverAccount, resendSignupConfirmation, authentication, login, signup, disableAccount, resetPassword, verifyEmail, verifyPhoneNumber, forgotPassword, changePassword, updateProfile, getUsers, setUserPool, userPool, lastVerifiedEmail, requestUsernameChange } from '../methods/user';
@@ -23,7 +23,7 @@ export default class Skapi {
23
23
  set user(value) {
24
24
  }
25
25
  constructor(service, owner, options) {
26
- this.version = '1.0.19';
26
+ this.version = '1.0.21';
27
27
  this.session = null;
28
28
  this.connection = null;
29
29
  this.host = 'skapi';
@@ -200,6 +200,9 @@ export default class Skapi {
200
200
  getRealtimeUsers(params, fetchOptions) {
201
201
  return getRealtimeUsers.bind(this)(params, fetchOptions);
202
202
  }
203
+ getRealtimeGroups(params, fetchOptions) {
204
+ return getRealtimeGroups.bind(this)(params, fetchOptions);
205
+ }
203
206
  postRealtime(message, recipient) {
204
207
  return postRealtime.bind(this)(message, recipient);
205
208
  }
@@ -308,6 +311,9 @@ export default class Skapi {
308
311
  __decorate([
309
312
  formHandler()
310
313
  ], Skapi.prototype, "getRealtimeUsers", null);
314
+ __decorate([
315
+ formHandler()
316
+ ], Skapi.prototype, "getRealtimeGroups", null);
311
317
  __decorate([
312
318
  formHandler()
313
319
  ], Skapi.prototype, "postRealtime", null);
@@ -1,18 +1,14 @@
1
1
  import { DatabaseResponse, FetchOptions } from '../Types';
2
- type RealTimeCallback = (rt: {
2
+ type RealtimeCallback = (rt: {
3
3
  status: 'message' | 'error' | 'success' | 'close' | 'notice';
4
- message: string | {
5
- [key: string]: any;
6
- };
4
+ message: any;
5
+ sender?: string;
7
6
  }) => void;
8
7
  export declare function closeRealtime(): Promise<void>;
9
- export declare function connectRealtime(cb: RealTimeCallback, delay?: number): Promise<void>;
8
+ export declare function connectRealtime(cb: RealtimeCallback, delay?: number): Promise<WebSocket>;
10
9
  export declare function postRealtime(message: any, recipient: string): Promise<{
11
10
  status: 'success';
12
11
  message: 'Message sent.';
13
- } | {
14
- status: 'error';
15
- message: 'Realtime connection is not open.';
16
12
  }>;
17
13
  export declare function joinRealtime(params: {
18
14
  group?: string | null;
@@ -24,4 +20,13 @@ export declare function getRealtimeUsers(params: {
24
20
  group: string;
25
21
  user_id?: string;
26
22
  }, fetchOptions?: FetchOptions): Promise<DatabaseResponse<string[]>>;
23
+ export declare function getRealtimeGroups(params?: {
24
+ searchFor: 'group' | 'number_of_users';
25
+ value?: string | number;
26
+ condition?: '>' | '>=' | '=' | '<' | '<=' | '!=' | 'gt' | 'gte' | 'eq' | 'lt' | 'lte' | 'ne';
27
+ range?: string | number;
28
+ } | null, fetchOptions?: FetchOptions): Promise<DatabaseResponse<{
29
+ group: string;
30
+ number_of_users: number;
31
+ }>>;
27
32
  export {};
@@ -43,12 +43,14 @@ export function connectRealtime(cb, delay = 0) {
43
43
  };
44
44
  socket.onmessage = event => {
45
45
  let data = JSON.parse(decodeURI(event.data));
46
- if (data?.['#notice']) {
47
- cb({ status: 'notice', message: data['#notice'] });
46
+ let ret = { status: 'message', message: data?.['#message'] || null };
47
+ if (data?.['#user_id']) {
48
+ ret.sender = data['#user_id'];
48
49
  }
49
- else {
50
- cb({ status: 'message', message: data });
50
+ if (data?.['#notice']) {
51
+ Object.assign(ret, { status: 'notice', message: data['#notice'] });
51
52
  }
53
+ cb(ret);
52
54
  };
53
55
  socket.onclose = event => {
54
56
  if (event.wasClean) {
@@ -113,7 +115,7 @@ export async function postRealtime(message, recipient) {
113
115
  }
114
116
  return { status: 'success', message: 'Message sent.' };
115
117
  }
116
- return { status: 'error', message: 'Realtime connection is not open.' };
118
+ throw new SkapiError('Realtime connection is not open. Try reconnecting with connectRealtime().', { code: 'INVALID_REQUEST' });
117
119
  }
118
120
  export async function joinRealtime(params) {
119
121
  let socket = this.__socket ? await this.__socket : this.__socket;
@@ -157,3 +159,52 @@ export async function getRealtimeUsers(params, fetchOptions) {
157
159
  }
158
160
  return res;
159
161
  }
162
+ export async function getRealtimeGroups(params, fetchOptions) {
163
+ await this.__connection;
164
+ if (!params) {
165
+ params = { searchFor: 'group' };
166
+ }
167
+ params = validator.Params(params, {
168
+ searchFor: ['group', 'number_of_users', () => 'group'],
169
+ value: ['string', 'number', () => {
170
+ if (params?.searchFor && params?.searchFor === 'number_of_users') {
171
+ return 0;
172
+ }
173
+ return ' ';
174
+ }],
175
+ condition: ['>', '>=', '=', '<', '<=', '!=', 'gt', 'gte', 'eq', 'lt', 'lte', 'ne'],
176
+ range: ['string', 'number']
177
+ });
178
+ if (!params.condition) {
179
+ if (params.value === ' ' || !params.value) {
180
+ params.condition = '>';
181
+ }
182
+ else {
183
+ params.condition = '=';
184
+ }
185
+ }
186
+ if (params.range && params.condition) {
187
+ delete params.condition;
188
+ }
189
+ if (params.searchFor === 'number_of_users' && typeof params.value !== 'number') {
190
+ throw new SkapiError(`"value" must be a number.`, { code: 'INVALID_PARAMETER' });
191
+ }
192
+ if (params.searchFor === 'group' && typeof params.value !== 'string') {
193
+ throw new SkapiError(`"value" must be a string.`, { code: 'INVALID_PARAMETER' });
194
+ }
195
+ if (params.hasOwnProperty('range') && typeof params.range !== typeof params.value) {
196
+ throw new SkapiError(`"range" must be a ${typeof params.value}.`, { code: 'INVALID_PARAMETER' });
197
+ }
198
+ let res = await request.bind(this)('get-ws-group', params, {
199
+ fetchOptions,
200
+ auth: true,
201
+ method: 'post'
202
+ });
203
+ res.list = res.list.map((v) => {
204
+ return {
205
+ group: v.rid.split('#')[1],
206
+ number_of_users: v.cnt
207
+ };
208
+ });
209
+ return res;
210
+ }
@@ -50,9 +50,6 @@ export async function request(url, data = null, options) {
50
50
  switch (dest) {
51
51
  case 'get-newsletters':
52
52
  case 'get-public-newsletters':
53
- case 'delete-newsletter':
54
- case 'block-account':
55
- case 'register-service':
56
53
  case 'get-users':
57
54
  case 'post-userdata':
58
55
  case 'remove-account':
@@ -63,18 +60,11 @@ export async function request(url, data = null, options) {
63
60
  case 'confirm-signup':
64
61
  case 'recover-account':
65
62
  case 'mock':
66
- case 'get-services':
67
63
  case 'service':
68
64
  case 'grant-access':
69
65
  case 'last-verified-email':
70
66
  case 'get-newsletter-subscription':
71
67
  case 'request-username-change':
72
- case 'register-subdomain':
73
- case 'list-host-directory':
74
- case 'refresh-cdn':
75
- case 'request-newsletter-sender':
76
- case 'set-404':
77
- case 'subdomain-info':
78
68
  return {
79
69
  public: admin.admin_public,
80
70
  private: admin.admin_private
@@ -87,7 +77,6 @@ export async function request(url, data = null, options) {
87
77
  case 'get-table':
88
78
  case 'get-tag':
89
79
  case 'get-index':
90
- case 'storage-info':
91
80
  case 'get-signed-url':
92
81
  case 'grant-private-access':
93
82
  case 'request-private-access-key':
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skapi-js",
3
- "version": "1.0.19",
3
+ "version": "1.0.21",
4
4
  "description": "Javascript library for Skapi: Complete JAM Stack, front-end driven serverless backend API service.",
5
5
  "main": "./dist/skapi.module.js",
6
6
  "types": "./js/Main.d.ts",