@aws-amplify/api-graphql 4.0.1-api-v6-models.9351bcf.0 → 4.0.1-api-v6-models.58f2536.0

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 (95) hide show
  1. package/internals/server/package.json +8 -0
  2. package/lib/GraphQLAPI.d.ts +1 -1
  3. package/lib/GraphQLAPI.js +23 -28
  4. package/lib/Providers/AWSAppSyncRealTimeProvider/index.js +467 -582
  5. package/lib/index.js +1 -1
  6. package/lib/internals/APIClient.d.ts +16 -1
  7. package/lib/internals/APIClient.js +232 -206
  8. package/lib/internals/InternalGraphQLAPI.d.ts +1 -1
  9. package/lib/internals/InternalGraphQLAPI.js +205 -247
  10. package/lib/internals/generateClient.js +14 -13
  11. package/lib/internals/generateModelsProperty.js +19 -312
  12. package/lib/internals/operations/get.d.ts +2 -0
  13. package/lib/internals/operations/get.js +59 -0
  14. package/lib/internals/operations/list.d.ts +2 -0
  15. package/lib/internals/operations/list.js +71 -0
  16. package/lib/internals/operations/observeQuery.d.ts +2 -0
  17. package/lib/internals/operations/observeQuery.js +119 -0
  18. package/lib/internals/operations/subscription.d.ts +1 -0
  19. package/lib/internals/operations/subscription.js +27 -0
  20. package/lib/internals/server/generateClient.d.ts +11 -0
  21. package/lib/internals/server/generateClient.js +30 -0
  22. package/lib/internals/server/generateModelsProperty.d.ts +3 -0
  23. package/lib/internals/server/generateModelsProperty.js +45 -0
  24. package/lib/internals/server/index.d.ts +1 -0
  25. package/lib/internals/server/index.js +7 -0
  26. package/lib/internals/v6.js +3 -3
  27. package/lib/tsconfig.tsbuildinfo +1 -1
  28. package/lib/types/index.d.ts +36 -4
  29. package/lib/utils/ConnectionStateMonitor.js +51 -64
  30. package/lib/utils/ReachabilityMonitor/index.js +2 -2
  31. package/lib/utils/ReachabilityMonitor/index.native.js +4 -6
  32. package/lib/utils/ReconnectionMonitor.js +20 -24
  33. package/lib/utils/errors/APIError.js +7 -11
  34. package/lib/utils/errors/assertValidationError.js +4 -4
  35. package/lib/utils/errors/validation.js +5 -6
  36. package/lib/utils/findIndexByFields.js +4 -9
  37. package/lib/utils/resolveConfig.js +9 -10
  38. package/lib/utils/resolveLibraryOptions.js +4 -5
  39. package/lib/utils/resolveOwnerFields.js +10 -33
  40. package/lib/utils/resolvePKFields.js +2 -3
  41. package/lib-esm/GraphQLAPI.d.ts +1 -1
  42. package/lib-esm/GraphQLAPI.js +23 -29
  43. package/lib-esm/Providers/AWSAppSyncRealTimeProvider/index.js +459 -575
  44. package/lib-esm/Providers/constants.js +10 -10
  45. package/lib-esm/internals/APIClient.d.ts +16 -1
  46. package/lib-esm/internals/APIClient.js +230 -205
  47. package/lib-esm/internals/InternalGraphQLAPI.d.ts +1 -1
  48. package/lib-esm/internals/InternalGraphQLAPI.js +201 -244
  49. package/lib-esm/internals/generateClient.js +11 -10
  50. package/lib-esm/internals/generateModelsProperty.js +19 -312
  51. package/lib-esm/internals/operations/get.d.ts +2 -0
  52. package/lib-esm/internals/operations/get.js +55 -0
  53. package/lib-esm/internals/operations/list.d.ts +2 -0
  54. package/lib-esm/internals/operations/list.js +67 -0
  55. package/lib-esm/internals/operations/observeQuery.d.ts +2 -0
  56. package/lib-esm/internals/operations/observeQuery.js +115 -0
  57. package/lib-esm/internals/operations/subscription.d.ts +1 -0
  58. package/lib-esm/internals/operations/subscription.js +23 -0
  59. package/lib-esm/internals/server/generateClient.d.ts +11 -0
  60. package/lib-esm/internals/server/generateClient.js +26 -0
  61. package/lib-esm/internals/server/generateModelsProperty.d.ts +3 -0
  62. package/lib-esm/internals/server/generateModelsProperty.js +41 -0
  63. package/lib-esm/internals/server/index.d.ts +1 -0
  64. package/lib-esm/internals/server/index.js +3 -0
  65. package/lib-esm/internals/v6.js +1 -1
  66. package/lib-esm/tsconfig.tsbuildinfo +1 -1
  67. package/lib-esm/types/index.d.ts +36 -4
  68. package/lib-esm/types/index.js +3 -3
  69. package/lib-esm/utils/ConnectionStateMonitor.js +49 -63
  70. package/lib-esm/utils/ReachabilityMonitor/index.js +1 -1
  71. package/lib-esm/utils/ReachabilityMonitor/index.native.js +1 -3
  72. package/lib-esm/utils/ReconnectionMonitor.js +19 -24
  73. package/lib-esm/utils/errors/APIError.js +6 -11
  74. package/lib-esm/utils/errors/assertValidationError.js +2 -2
  75. package/lib-esm/utils/errors/validation.js +5 -6
  76. package/lib-esm/utils/findIndexByFields.js +4 -9
  77. package/lib-esm/utils/resolveConfig.js +8 -9
  78. package/lib-esm/utils/resolveLibraryOptions.js +4 -5
  79. package/lib-esm/utils/resolveOwnerFields.js +10 -33
  80. package/lib-esm/utils/resolvePKFields.js +2 -3
  81. package/package.json +8 -7
  82. package/src/GraphQLAPI.ts +6 -2
  83. package/src/Providers/AWSAppSyncRealTimeProvider/index.ts +6 -5
  84. package/src/internals/APIClient.ts +122 -35
  85. package/src/internals/InternalGraphQLAPI.ts +35 -10
  86. package/src/internals/generateClient.ts +0 -1
  87. package/src/internals/generateModelsProperty.ts +27 -340
  88. package/src/internals/operations/get.ts +121 -0
  89. package/src/internals/operations/list.ts +111 -0
  90. package/src/internals/operations/observeQuery.ts +140 -0
  91. package/src/internals/operations/subscription.ts +59 -0
  92. package/src/internals/server/generateClient.ts +45 -0
  93. package/src/internals/server/generateModelsProperty.ts +70 -0
  94. package/src/internals/server/index.ts +4 -0
  95. package/src/types/index.ts +65 -9
@@ -1,330 +1,37 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateModelsProperty = void 0;
4
- var tslib_1 = require("tslib");
5
- var APIClient_1 = require("./APIClient");
6
- var types_1 = require("../types");
7
- var utils_1 = require("../utils");
8
- var rxjs_1 = require("rxjs");
9
- /**
10
- * Produces a parameter object that can contains auth mode/token overrides
11
- * only if present in either `options` (first) or configured on the `client`
12
- * as a fallback.
13
- *
14
- * @param client Configured client from `generateClient`
15
- * @param options Args/Options obect from call site.
16
- * @returns
17
- */
18
- function authModeParams(client, options) {
19
- if (options === void 0) { options = {}; }
20
- return {
21
- authMode: options.authMode || client[types_1.__authMode],
22
- authToken: options.authToken || client[types_1.__authToken],
23
- };
24
- }
4
+ const APIClient_1 = require("./APIClient");
5
+ const list_1 = require("./operations/list");
6
+ const get_1 = require("./operations/get");
7
+ const subscription_1 = require("./operations/subscription");
8
+ const observeQuery_1 = require("./operations/observeQuery");
25
9
  function generateModelsProperty(client, params) {
26
- var e_1, _a;
27
- var _this = this;
28
- var _b, _c;
29
- var models = {};
30
- var config = params.amplify.getConfig();
31
- var modelIntrospection = (_c = (_b = config.API) === null || _b === void 0 ? void 0 : _b.GraphQL) === null || _c === void 0 ? void 0 : _c.modelIntrospection;
10
+ const models = {};
11
+ const config = params.amplify.getConfig();
12
+ const modelIntrospection = config.API?.GraphQL?.modelIntrospection;
32
13
  if (!modelIntrospection) {
33
14
  return {};
34
15
  }
35
- var _loop_1 = function (model) {
36
- var name_1 = model.name;
37
- models[name_1] = {};
38
- Object.entries(APIClient_1.graphQLOperationsInfo).forEach(function (_a) {
39
- var _b = tslib_1.__read(_a, 2), key = _b[0], operationPrefix = _b[1].operationPrefix;
40
- var operation = key;
16
+ const SUBSCRIPTION_OPS = ['ONCREATE', 'ONUPDATE', 'ONDELETE'];
17
+ for (const model of Object.values(modelIntrospection.models)) {
18
+ const { name } = model;
19
+ models[name] = {};
20
+ Object.entries(APIClient_1.graphQLOperationsInfo).forEach(([key, { operationPrefix }]) => {
21
+ const operation = key;
41
22
  if (operation === 'LIST') {
42
- models[name_1][operationPrefix] = function (args) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
43
- var query, variables, auth, _a, data, extensions, _b, key_1, flattenedResult, initialized, error_1;
44
- return tslib_1.__generator(this, function (_c) {
45
- switch (_c.label) {
46
- case 0:
47
- query = (0, APIClient_1.generateGraphQLDocument)(modelIntrospection.models, name_1, 'LIST', args);
48
- variables = (0, APIClient_1.buildGraphQLVariables)(model, 'LIST', args, modelIntrospection);
49
- _c.label = 1;
50
- case 1:
51
- _c.trys.push([1, 3, , 4]);
52
- auth = authModeParams(client, args);
53
- return [4 /*yield*/, client.graphql(tslib_1.__assign(tslib_1.__assign({}, auth), { query: query, variables: variables }))];
54
- case 2:
55
- _a = (_c.sent()), data = _a.data, extensions = _a.extensions;
56
- // flatten response
57
- if (data !== undefined) {
58
- _b = tslib_1.__read(Object.keys(data), 1), key_1 = _b[0];
59
- if (data[key_1].items) {
60
- flattenedResult = (0, APIClient_1.flattenItems)(data)[key_1];
61
- // don't init if custom selection set
62
- if (args === null || args === void 0 ? void 0 : args.selectionSet) {
63
- return [2 /*return*/, {
64
- data: flattenedResult,
65
- nextToken: data[key_1].nextToken,
66
- extensions: extensions,
67
- }];
68
- }
69
- else {
70
- initialized = (0, APIClient_1.initializeModel)(client, name_1, flattenedResult, modelIntrospection, auth.authMode, auth.authToken);
71
- return [2 /*return*/, {
72
- data: initialized,
73
- nextToken: data[key_1].nextToken,
74
- extensions: extensions,
75
- }];
76
- }
77
- }
78
- return [2 /*return*/, {
79
- data: data[key_1],
80
- nextToken: data[key_1].nextToken,
81
- extensions: extensions,
82
- }];
83
- }
84
- return [3 /*break*/, 4];
85
- case 3:
86
- error_1 = _c.sent();
87
- if (error_1.errors) {
88
- // graphql errors pass through
89
- return [2 /*return*/, error_1];
90
- }
91
- else {
92
- // non-graphql errors re re-thrown
93
- throw error_1;
94
- }
95
- return [3 /*break*/, 4];
96
- case 4: return [2 /*return*/];
97
- }
98
- });
99
- }); };
23
+ models[name][operationPrefix] = (0, list_1.listFactory)(client, modelIntrospection, model);
100
24
  }
101
- else if (['ONCREATE', 'ONUPDATE', 'ONDELETE'].includes(operation)) {
102
- models[name_1][operationPrefix] = function (args) {
103
- var query = (0, APIClient_1.generateGraphQLDocument)(modelIntrospection.models, name_1, operation);
104
- var variables = (0, APIClient_1.buildGraphQLVariables)(model, operation, args, modelIntrospection);
105
- var auth = authModeParams(client, args);
106
- var observable = client.graphql(tslib_1.__assign(tslib_1.__assign({}, auth), { query: query, variables: variables }));
107
- return observable.pipe((0, rxjs_1.map)(function (value) {
108
- var _a = tslib_1.__read(Object.keys(value.data), 1), key = _a[0];
109
- var _b = tslib_1.__read((0, APIClient_1.initializeModel)(client, name_1, [value.data[key]], modelIntrospection, auth.authMode, auth.authToken), 1), initialized = _b[0];
110
- return initialized;
111
- }));
112
- };
25
+ else if (SUBSCRIPTION_OPS.includes(operation)) {
26
+ models[name][operationPrefix] = (0, subscription_1.subscriptionFactory)(client, modelIntrospection, model, operation);
113
27
  }
114
28
  else if (operation === 'OBSERVE_QUERY') {
115
- models[name_1][operationPrefix] = function (arg) {
116
- return new rxjs_1.Observable(function (subscriber) {
117
- // what we'll be sending to our subscribers
118
- var items = [];
119
- // To enqueue subscription messages while we collect our initial
120
- // result set.
121
- var messageQueue = [];
122
- // operation to take when message(s) arrive.
123
- // this operation will be swapped out once initial "sync" is complete
124
- // to immediately ingest messsages.
125
- var receiveMessages = function () {
126
- var messages = [];
127
- for (var _i = 0; _i < arguments.length; _i++) {
128
- messages[_i] = arguments[_i];
129
- }
130
- return messageQueue.push.apply(messageQueue, tslib_1.__spreadArray([], tslib_1.__read(messages), false));
131
- };
132
- // start subscriptions
133
- var onCreateSub = models[name_1].onCreate(arg).subscribe({
134
- next: function (item) {
135
- receiveMessages({ item: item, type: 'create' });
136
- },
137
- error: function (error) {
138
- subscriber.error({ type: 'onCreate', error: error });
139
- },
140
- });
141
- var onUpdateSub = models[name_1].onUpdate(arg).subscribe({
142
- next: function (item) {
143
- receiveMessages({ item: item, type: 'update' });
144
- },
145
- error: function (error) {
146
- subscriber.error({ type: 'onUpdate', error: error });
147
- },
148
- });
149
- var onDeleteSub = models[name_1].onDelete(arg).subscribe({
150
- next: function (item) {
151
- receiveMessages({ item: item, type: 'delete' });
152
- },
153
- error: function (error) {
154
- subscriber.error({ type: 'onDelete', error: error });
155
- },
156
- });
157
- // consumes a list of messages and sends a snapshot
158
- function ingestMessages(messages) {
159
- var e_2, _a;
160
- try {
161
- for (var messages_1 = tslib_1.__values(messages), messages_1_1 = messages_1.next(); !messages_1_1.done; messages_1_1 = messages_1.next()) {
162
- var message = messages_1_1.value;
163
- var idx = (0, utils_1.findIndexByFields)(message.item, items, pkFields);
164
- switch (message.type) {
165
- case 'create':
166
- if (idx < 0)
167
- items.push(message.item);
168
- break;
169
- case 'update':
170
- if (idx >= 0)
171
- items[idx] = message.item;
172
- break;
173
- case 'delete':
174
- if (idx >= 0)
175
- items.splice(idx, 1);
176
- break;
177
- default:
178
- console.error('Unrecognized message in observeQuery.', message);
179
- }
180
- }
181
- }
182
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
183
- finally {
184
- try {
185
- if (messages_1_1 && !messages_1_1.done && (_a = messages_1.return)) _a.call(messages_1);
186
- }
187
- finally { if (e_2) throw e_2.error; }
188
- }
189
- subscriber.next({
190
- items: items,
191
- isSynced: true,
192
- });
193
- }
194
- var pkFields = (0, utils_1.resolvePKFields)(model);
195
- // initial results
196
- (function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
197
- var firstPage, nextToken, _a, page, errors, _nextToken, isSynced, errors_1, errors_1_1, error;
198
- var e_3, _b;
199
- return tslib_1.__generator(this, function (_c) {
200
- switch (_c.label) {
201
- case 0:
202
- firstPage = true;
203
- nextToken = null;
204
- _c.label = 1;
205
- case 1:
206
- if (!(!subscriber.closed && (firstPage || nextToken))) return [3 /*break*/, 3];
207
- firstPage = false;
208
- return [4 /*yield*/, models[name_1].list(tslib_1.__assign(tslib_1.__assign({}, arg), { nextToken: nextToken }))];
209
- case 2:
210
- _a = _c.sent(), page = _a.data, errors = _a.errors, _nextToken = _a.nextToken;
211
- nextToken = _nextToken;
212
- items.push.apply(items, tslib_1.__spreadArray([], tslib_1.__read(page), false));
213
- isSynced = messageQueue.length === 0 &&
214
- (nextToken === null || nextToken === undefined);
215
- subscriber.next({
216
- items: items,
217
- isSynced: isSynced,
218
- });
219
- if (Array.isArray(errors)) {
220
- try {
221
- for (errors_1 = (e_3 = void 0, tslib_1.__values(errors)), errors_1_1 = errors_1.next(); !errors_1_1.done; errors_1_1 = errors_1.next()) {
222
- error = errors_1_1.value;
223
- subscriber.error(error);
224
- }
225
- }
226
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
227
- finally {
228
- try {
229
- if (errors_1_1 && !errors_1_1.done && (_b = errors_1.return)) _b.call(errors_1);
230
- }
231
- finally { if (e_3) throw e_3.error; }
232
- }
233
- }
234
- return [3 /*break*/, 1];
235
- case 3:
236
- // play through the queue
237
- if (messageQueue.length > 0) {
238
- ingestMessages(messageQueue);
239
- }
240
- // switch the queue to write directly to the items collection
241
- receiveMessages = function () {
242
- var messages = [];
243
- for (var _i = 0; _i < arguments.length; _i++) {
244
- messages[_i] = arguments[_i];
245
- }
246
- ingestMessages(messages);
247
- return items.length;
248
- };
249
- return [2 /*return*/];
250
- }
251
- });
252
- }); })();
253
- // when subscriber unsubscribes, tear down internal subs
254
- return function () {
255
- // 1. tear down internal subs
256
- onCreateSub.unsubscribe();
257
- onUpdateSub.unsubscribe();
258
- onDeleteSub.unsubscribe();
259
- // 2. there is no need to explicitly stop paging. instead, we
260
- // just check `subscriber.closed` above before fetching each page.
261
- };
262
- });
263
- };
29
+ models[name][operationPrefix] = (0, observeQuery_1.observeQueryFactory)(models, model);
264
30
  }
265
31
  else {
266
- models[name_1][operationPrefix] = function (arg, options) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
267
- var query, variables, auth, _a, data, extensions, _b, key_2, flattenedResult, _c, initialized, error_2;
268
- return tslib_1.__generator(this, function (_d) {
269
- switch (_d.label) {
270
- case 0:
271
- query = (0, APIClient_1.generateGraphQLDocument)(modelIntrospection.models, name_1, operation, options);
272
- variables = (0, APIClient_1.buildGraphQLVariables)(model, operation, arg, modelIntrospection);
273
- _d.label = 1;
274
- case 1:
275
- _d.trys.push([1, 3, , 4]);
276
- auth = authModeParams(client, options);
277
- return [4 /*yield*/, client.graphql(tslib_1.__assign(tslib_1.__assign({}, auth), { query: query, variables: variables }))];
278
- case 2:
279
- _a = (_d.sent()), data = _a.data, extensions = _a.extensions;
280
- // flatten response
281
- if (data !== undefined) {
282
- _b = tslib_1.__read(Object.keys(data), 1), key_2 = _b[0];
283
- flattenedResult = (0, APIClient_1.flattenItems)(data)[key_2];
284
- if (options === null || options === void 0 ? void 0 : options.selectionSet) {
285
- return [2 /*return*/, { data: flattenedResult, extensions: extensions }];
286
- }
287
- else {
288
- _c = tslib_1.__read((0, APIClient_1.initializeModel)(client, name_1, [flattenedResult], modelIntrospection, auth.authMode, auth.authToken), 1), initialized = _c[0];
289
- return [2 /*return*/, { data: initialized, extensions: extensions }];
290
- }
291
- }
292
- else {
293
- return [2 /*return*/, { data: null, extensions: extensions }];
294
- }
295
- return [3 /*break*/, 4];
296
- case 3:
297
- error_2 = _d.sent();
298
- if (error_2.errors) {
299
- // graphql errors pass through
300
- return [2 /*return*/, error_2];
301
- }
302
- else {
303
- // non-graphql errors re re-thrown
304
- throw error_2;
305
- }
306
- return [3 /*break*/, 4];
307
- case 4: return [2 /*return*/];
308
- }
309
- });
310
- }); };
32
+ models[name][operationPrefix] = (0, get_1.getFactory)(client, modelIntrospection, model, operation);
311
33
  }
312
34
  });
313
- };
314
- try {
315
- // TODO: refactor this to use separate methods for each CRUDL.
316
- // Doesn't make sense to gen the methods dynamically given the different args and return values
317
- for (var _d = tslib_1.__values(Object.values(modelIntrospection.models)), _e = _d.next(); !_e.done; _e = _d.next()) {
318
- var model = _e.value;
319
- _loop_1(model);
320
- }
321
- }
322
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
323
- finally {
324
- try {
325
- if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
326
- }
327
- finally { if (e_1) throw e_1.error; }
328
35
  }
329
36
  return models;
330
37
  }
@@ -0,0 +1,2 @@
1
+ import { AmplifyServer } from '@aws-amplify/core/internals/adapter-core';
2
+ export declare function getFactory(client: any, modelIntrospection: any, model: any, operation: any, context?: boolean): (contextSpec: AmplifyServer.ContextSpec, arg?: any, options?: any) => Promise<any>;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFactory = void 0;
4
+ const APIClient_1 = require("../APIClient");
5
+ function getFactory(client, modelIntrospection, model, operation, context = false) {
6
+ const getWithContext = async (contextSpec, arg, options) => {
7
+ return _get(client, modelIntrospection, model, arg, options, operation, contextSpec);
8
+ };
9
+ const get = async (arg, options) => {
10
+ return _get(client, modelIntrospection, model, arg, options, operation, context);
11
+ };
12
+ return context ? getWithContext : get;
13
+ }
14
+ exports.getFactory = getFactory;
15
+ async function _get(client, modelIntrospection, model, arg, options, operation, context) {
16
+ const { name } = model;
17
+ const query = (0, APIClient_1.generateGraphQLDocument)(modelIntrospection.models, name, operation, options);
18
+ const variables = (0, APIClient_1.buildGraphQLVariables)(model, operation, arg, modelIntrospection);
19
+ try {
20
+ const auth = (0, APIClient_1.authModeParams)(client, options);
21
+ const { data, extensions } = context
22
+ ? (await client.graphql(context, {
23
+ ...auth,
24
+ query,
25
+ variables,
26
+ }))
27
+ : (await client.graphql({
28
+ ...auth,
29
+ query,
30
+ variables,
31
+ }));
32
+ // flatten response
33
+ if (data !== undefined) {
34
+ const [key] = Object.keys(data);
35
+ const flattenedResult = (0, APIClient_1.flattenItems)(data)[key];
36
+ if (options?.selectionSet) {
37
+ return { data: flattenedResult, extensions };
38
+ }
39
+ else {
40
+ // TODO: refactor to avoid destructuring here
41
+ const [initialized] = (0, APIClient_1.initializeModel)(client, name, [flattenedResult], modelIntrospection, auth.authMode, auth.authToken, context);
42
+ return { data: initialized, extensions };
43
+ }
44
+ }
45
+ else {
46
+ return { data: null, extensions };
47
+ }
48
+ }
49
+ catch (error) {
50
+ if (error.errors) {
51
+ // graphql errors pass through
52
+ return error;
53
+ }
54
+ else {
55
+ // non-graphql errors re re-thrown
56
+ throw error;
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,2 @@
1
+ import { AmplifyServer } from '@aws-amplify/core/internals/adapter-core';
2
+ export declare function listFactory(client: any, modelIntrospection: any, model: any, context?: boolean): (contextSpec: AmplifyServer.ContextSpec, args?: any) => Promise<any>;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listFactory = void 0;
4
+ const APIClient_1 = require("../APIClient");
5
+ function listFactory(client, modelIntrospection, model, context = false) {
6
+ const listWithContext = async (contextSpec, args) => {
7
+ return _list(client, modelIntrospection, model, args, contextSpec);
8
+ };
9
+ const list = async (args) => {
10
+ return _list(client, modelIntrospection, model, args, context);
11
+ };
12
+ return context ? listWithContext : list;
13
+ }
14
+ exports.listFactory = listFactory;
15
+ async function _list(client, modelIntrospection, model, args, context) {
16
+ const { name } = model;
17
+ const query = (0, APIClient_1.generateGraphQLDocument)(modelIntrospection.models, name, 'LIST', args);
18
+ const variables = (0, APIClient_1.buildGraphQLVariables)(model, 'LIST', args, modelIntrospection);
19
+ try {
20
+ const auth = (0, APIClient_1.authModeParams)(client, args);
21
+ const { data, extensions } = context
22
+ ? (await client.graphql(context, {
23
+ ...auth,
24
+ query,
25
+ variables,
26
+ }))
27
+ : (await client.graphql({
28
+ ...auth,
29
+ query,
30
+ variables,
31
+ }));
32
+ // flatten response
33
+ if (data !== undefined) {
34
+ const [key] = Object.keys(data);
35
+ if (data[key].items) {
36
+ const flattenedResult = (0, APIClient_1.flattenItems)(data)[key];
37
+ // don't init if custom selection set
38
+ if (args?.selectionSet) {
39
+ return {
40
+ data: flattenedResult,
41
+ nextToken: data[key].nextToken,
42
+ extensions,
43
+ };
44
+ }
45
+ else {
46
+ const initialized = (0, APIClient_1.initializeModel)(client, name, flattenedResult, modelIntrospection, auth.authMode, auth.authToken, context);
47
+ return {
48
+ data: initialized,
49
+ nextToken: data[key].nextToken,
50
+ extensions,
51
+ };
52
+ }
53
+ }
54
+ return {
55
+ data: data[key],
56
+ nextToken: data[key].nextToken,
57
+ extensions,
58
+ };
59
+ }
60
+ }
61
+ catch (error) {
62
+ if (error.errors) {
63
+ // graphql errors pass through
64
+ return error;
65
+ }
66
+ else {
67
+ // non-graphql errors re re-thrown
68
+ throw error;
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,2 @@
1
+ import { Observable } from 'rxjs';
2
+ export declare function observeQueryFactory(models: any, model: any): (arg?: any) => Observable<unknown>;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.observeQueryFactory = void 0;
6
+ const rxjs_1 = require("rxjs");
7
+ const utils_1 = require("../../utils");
8
+ function observeQueryFactory(models, model) {
9
+ const { name } = model;
10
+ const observeQuery = (arg) => new rxjs_1.Observable(subscriber => {
11
+ // what we'll be sending to our subscribers
12
+ const items = [];
13
+ // To enqueue subscription messages while we collect our initial
14
+ // result set.
15
+ const messageQueue = [];
16
+ // operation to take when message(s) arrive.
17
+ // this operation will be swapped out once initial "sync" is complete
18
+ // to immediately ingest messsages.
19
+ let receiveMessages = (...messages) => {
20
+ return messageQueue.push(...messages);
21
+ };
22
+ // start subscriptions
23
+ const onCreateSub = models[name].onCreate(arg).subscribe({
24
+ next(item) {
25
+ receiveMessages({ item, type: 'create' });
26
+ },
27
+ error(error) {
28
+ subscriber.error({ type: 'onCreate', error });
29
+ },
30
+ });
31
+ const onUpdateSub = models[name].onUpdate(arg).subscribe({
32
+ next(item) {
33
+ receiveMessages({ item, type: 'update' });
34
+ },
35
+ error(error) {
36
+ subscriber.error({ type: 'onUpdate', error });
37
+ },
38
+ });
39
+ const onDeleteSub = models[name].onDelete(arg).subscribe({
40
+ next(item) {
41
+ receiveMessages({ item, type: 'delete' });
42
+ },
43
+ error(error) {
44
+ subscriber.error({ type: 'onDelete', error });
45
+ },
46
+ });
47
+ // consumes a list of messages and sends a snapshot
48
+ function ingestMessages(messages) {
49
+ for (const message of messages) {
50
+ const idx = (0, utils_1.findIndexByFields)(message.item, items, pkFields);
51
+ switch (message.type) {
52
+ case 'create':
53
+ if (idx < 0)
54
+ items.push(message.item);
55
+ break;
56
+ case 'update':
57
+ if (idx >= 0)
58
+ items[idx] = message.item;
59
+ break;
60
+ case 'delete':
61
+ if (idx >= 0)
62
+ items.splice(idx, 1);
63
+ break;
64
+ default:
65
+ console.error('Unrecognized message in observeQuery.', message);
66
+ }
67
+ }
68
+ subscriber.next({
69
+ items,
70
+ isSynced: true,
71
+ });
72
+ }
73
+ const pkFields = (0, utils_1.resolvePKFields)(model);
74
+ // initial results
75
+ (async () => {
76
+ let firstPage = true;
77
+ let nextToken = null;
78
+ while (!subscriber.closed && (firstPage || nextToken)) {
79
+ firstPage = false;
80
+ const { data: page, errors, nextToken: _nextToken, } = await models[name].list({ ...arg, nextToken });
81
+ nextToken = _nextToken;
82
+ items.push(...page);
83
+ // if there are no more pages and no items we already know about
84
+ // that need to be merged in from sub, we're "synced"
85
+ const isSynced = messageQueue.length === 0 &&
86
+ (nextToken === null || nextToken === undefined);
87
+ subscriber.next({
88
+ items,
89
+ isSynced,
90
+ });
91
+ if (Array.isArray(errors)) {
92
+ for (const error of errors) {
93
+ subscriber.error(error);
94
+ }
95
+ }
96
+ }
97
+ // play through the queue
98
+ if (messageQueue.length > 0) {
99
+ ingestMessages(messageQueue);
100
+ }
101
+ // switch the queue to write directly to the items collection
102
+ receiveMessages = (...messages) => {
103
+ ingestMessages(messages);
104
+ return items.length;
105
+ };
106
+ })();
107
+ // when subscriber unsubscribes, tear down internal subs
108
+ return () => {
109
+ // 1. tear down internal subs
110
+ onCreateSub.unsubscribe();
111
+ onUpdateSub.unsubscribe();
112
+ onDeleteSub.unsubscribe();
113
+ // 2. there is no need to explicitly stop paging. instead, we
114
+ // just check `subscriber.closed` above before fetching each page.
115
+ };
116
+ });
117
+ return observeQuery;
118
+ }
119
+ exports.observeQueryFactory = observeQueryFactory;
@@ -0,0 +1 @@
1
+ export declare function subscriptionFactory(client: any, modelIntrospection: any, model: any, operation: any): (args?: any) => import("rxjs").Observable<any>;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.subscriptionFactory = void 0;
6
+ const rxjs_1 = require("rxjs");
7
+ const APIClient_1 = require("../APIClient");
8
+ function subscriptionFactory(client, modelIntrospection, model, operation) {
9
+ const { name } = model;
10
+ const subscription = (args) => {
11
+ const query = (0, APIClient_1.generateGraphQLDocument)(modelIntrospection.models, name, operation);
12
+ const variables = (0, APIClient_1.buildGraphQLVariables)(model, operation, args, modelIntrospection);
13
+ const auth = (0, APIClient_1.authModeParams)(client, args);
14
+ const observable = client.graphql({
15
+ ...auth,
16
+ query,
17
+ variables,
18
+ });
19
+ return observable.pipe((0, rxjs_1.map)(value => {
20
+ const [key] = Object.keys(value.data);
21
+ const [initialized] = (0, APIClient_1.initializeModel)(client, name, [value.data[key]], modelIntrospection, auth.authMode, auth.authToken);
22
+ return initialized;
23
+ }));
24
+ };
25
+ return subscription;
26
+ }
27
+ exports.subscriptionFactory = subscriptionFactory;
@@ -0,0 +1,11 @@
1
+ import { V6ClientSSRRequest, V6ClientSSRCookies, ServerClientGenerationParams, CommonPublicClientOptions } from '../../types';
2
+ /**
3
+ * @private
4
+ *
5
+ * Creates a client that can be used to make GraphQL requests, using a provided `AmplifyClassV6`
6
+ * compatible context object for config and auth fetching.
7
+ *
8
+ * @param params
9
+ * @returns
10
+ */
11
+ export declare function generateClient<T extends Record<any, any> = never, ClientType extends V6ClientSSRRequest<T> | V6ClientSSRCookies<T> = V6ClientSSRCookies<T>>(params: ServerClientGenerationParams & CommonPublicClientOptions): ClientType;