@aws-amplify/analytics 7.0.1-console-preview.11cf989.0 → 7.0.1-console-preview.4ae78ed.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 (234) hide show
  1. package/lib/errors/assertValidationError.d.ts +1 -1
  2. package/lib/errors/assertValidationError.js +7 -3
  3. package/lib/errors/validation.d.ts +3 -1
  4. package/lib/errors/validation.js +8 -0
  5. package/lib/index.d.ts +1 -1
  6. package/lib/index.js +2 -1
  7. package/lib/providers/kinesis/apis/flushEvents.d.ts +8 -0
  8. package/lib/providers/kinesis/apis/flushEvents.js +37 -0
  9. package/lib/providers/kinesis/apis/index.d.ts +1 -0
  10. package/lib/providers/kinesis/apis/index.js +3 -1
  11. package/lib/providers/kinesis/apis/record.d.ts +1 -1
  12. package/lib/providers/kinesis/apis/record.js +40 -2
  13. package/lib/providers/kinesis/index.d.ts +1 -1
  14. package/lib/providers/kinesis/index.js +2 -1
  15. package/lib/providers/kinesis/types/buffer.d.ts +15 -0
  16. package/lib/providers/kinesis/types/buffer.js +4 -0
  17. package/lib/providers/kinesis/types/index.d.ts +1 -0
  18. package/lib/providers/kinesis/types/inputs.d.ts +6 -1
  19. package/lib/providers/kinesis/utils/constants.d.ts +6 -0
  20. package/lib/providers/kinesis/utils/constants.js +11 -0
  21. package/lib/providers/kinesis/utils/getEventBuffer.d.ts +3 -0
  22. package/lib/providers/kinesis/utils/getEventBuffer.js +103 -0
  23. package/lib/providers/kinesis/utils/resolveConfig.d.ts +7 -0
  24. package/lib/providers/kinesis/utils/resolveConfig.js +24 -0
  25. package/lib/providers/kinesis-firehose/apis/flushEvents.d.ts +8 -0
  26. package/lib/providers/kinesis-firehose/apis/flushEvents.js +36 -0
  27. package/lib/providers/kinesis-firehose/apis/index.d.ts +1 -0
  28. package/lib/providers/kinesis-firehose/apis/index.js +3 -1
  29. package/lib/providers/kinesis-firehose/apis/record.d.ts +1 -1
  30. package/lib/providers/kinesis-firehose/apis/record.js +37 -2
  31. package/lib/providers/kinesis-firehose/index.d.ts +1 -1
  32. package/lib/providers/kinesis-firehose/index.js +2 -1
  33. package/lib/providers/kinesis-firehose/types/buffer.d.ts +15 -0
  34. package/lib/providers/kinesis-firehose/types/buffer.js +4 -0
  35. package/lib/providers/kinesis-firehose/types/index.d.ts +1 -0
  36. package/lib/providers/kinesis-firehose/types/inputs.d.ts +5 -1
  37. package/lib/providers/kinesis-firehose/utils/constants.d.ts +6 -0
  38. package/lib/providers/kinesis-firehose/utils/constants.js +11 -0
  39. package/lib/providers/kinesis-firehose/utils/getEventBuffer.d.ts +3 -0
  40. package/lib/providers/kinesis-firehose/utils/getEventBuffer.js +100 -0
  41. package/lib/providers/kinesis-firehose/utils/index.d.ts +2 -0
  42. package/lib/providers/kinesis-firehose/utils/index.js +9 -0
  43. package/lib/providers/kinesis-firehose/utils/resolveConfig.d.ts +7 -0
  44. package/lib/providers/kinesis-firehose/utils/resolveConfig.js +24 -0
  45. package/lib/providers/personalize/apis/flushEvents.d.ts +8 -0
  46. package/lib/providers/personalize/apis/flushEvents.js +35 -0
  47. package/lib/providers/personalize/apis/index.d.ts +1 -0
  48. package/lib/providers/personalize/apis/index.js +3 -1
  49. package/lib/providers/personalize/apis/record.d.ts +1 -1
  50. package/lib/providers/personalize/apis/record.js +65 -2
  51. package/lib/providers/personalize/index.d.ts +1 -1
  52. package/lib/providers/personalize/index.js +2 -1
  53. package/lib/providers/personalize/types/buffer.d.ts +16 -0
  54. package/lib/providers/personalize/types/buffer.js +4 -0
  55. package/lib/providers/personalize/types/index.d.ts +2 -1
  56. package/lib/providers/personalize/types/inputs.d.ts +7 -1
  57. package/lib/providers/personalize/utils/autoTrackMedia.d.ts +10 -0
  58. package/lib/providers/personalize/utils/autoTrackMedia.js +182 -0
  59. package/lib/providers/personalize/utils/cachedSession.d.ts +5 -0
  60. package/lib/providers/personalize/utils/cachedSession.js +52 -0
  61. package/lib/providers/personalize/utils/constants.d.ts +7 -0
  62. package/lib/providers/personalize/utils/constants.js +12 -0
  63. package/lib/providers/personalize/utils/getEventBuffer.d.ts +3 -0
  64. package/lib/providers/personalize/utils/getEventBuffer.js +100 -0
  65. package/lib/providers/personalize/utils/index.d.ts +5 -0
  66. package/lib/providers/personalize/utils/index.js +17 -0
  67. package/lib/providers/personalize/utils/resolveConfig.d.ts +7 -0
  68. package/lib/providers/personalize/utils/resolveConfig.js +25 -0
  69. package/lib/providers/pinpoint/apis/flushEvents.d.ts +8 -0
  70. package/lib/providers/pinpoint/apis/flushEvents.js +27 -0
  71. package/lib/providers/pinpoint/apis/identifyUser.d.ts +2 -2
  72. package/lib/providers/pinpoint/apis/identifyUser.js +3 -3
  73. package/lib/providers/pinpoint/apis/index.d.ts +1 -0
  74. package/lib/providers/pinpoint/apis/index.js +3 -1
  75. package/lib/providers/pinpoint/index.d.ts +1 -1
  76. package/lib/providers/pinpoint/index.js +2 -1
  77. package/lib/tsconfig.tsbuildinfo +1 -1
  78. package/lib/types/index.d.ts +1 -0
  79. package/lib/types/kinesis.d.ts +8 -0
  80. package/lib/types/kinesis.js +4 -0
  81. package/lib/utils/eventBuffer/EventBuffer.d.ts +16 -0
  82. package/lib/utils/eventBuffer/EventBuffer.js +91 -0
  83. package/lib/utils/eventBuffer/index.d.ts +2 -0
  84. package/lib/utils/eventBuffer/index.js +7 -0
  85. package/lib/utils/eventBuffer/types.d.ts +8 -0
  86. package/lib/utils/eventBuffer/types.js +4 -0
  87. package/lib/utils/groupBy.d.ts +1 -0
  88. package/lib/utils/groupBy.js +15 -0
  89. package/lib/utils/index.d.ts +3 -0
  90. package/lib/utils/index.js +7 -1
  91. package/lib/utils/resolveCredentials.d.ts +9 -0
  92. package/lib/utils/resolveCredentials.js +21 -0
  93. package/lib-esm/errors/assertValidationError.d.ts +1 -1
  94. package/lib-esm/errors/assertValidationError.js +7 -3
  95. package/lib-esm/errors/validation.d.ts +3 -1
  96. package/lib-esm/errors/validation.js +8 -0
  97. package/lib-esm/index.d.ts +1 -1
  98. package/lib-esm/index.js +1 -1
  99. package/lib-esm/providers/kinesis/apis/flushEvents.d.ts +8 -0
  100. package/lib-esm/providers/kinesis/apis/flushEvents.js +33 -0
  101. package/lib-esm/providers/kinesis/apis/index.d.ts +1 -0
  102. package/lib-esm/providers/kinesis/apis/index.js +1 -0
  103. package/lib-esm/providers/kinesis/apis/record.d.ts +1 -1
  104. package/lib-esm/providers/kinesis/apis/record.js +40 -2
  105. package/lib-esm/providers/kinesis/index.d.ts +1 -1
  106. package/lib-esm/providers/kinesis/index.js +1 -1
  107. package/lib-esm/providers/kinesis/types/buffer.d.ts +15 -0
  108. package/lib-esm/providers/kinesis/types/buffer.js +3 -0
  109. package/lib-esm/providers/kinesis/types/index.d.ts +1 -0
  110. package/lib-esm/providers/kinesis/types/inputs.d.ts +6 -1
  111. package/lib-esm/providers/kinesis/utils/constants.d.ts +6 -0
  112. package/lib-esm/providers/kinesis/utils/constants.js +8 -0
  113. package/lib-esm/providers/kinesis/utils/getEventBuffer.d.ts +3 -0
  114. package/lib-esm/providers/kinesis/utils/getEventBuffer.js +99 -0
  115. package/lib-esm/providers/kinesis/utils/resolveConfig.d.ts +7 -0
  116. package/lib-esm/providers/kinesis/utils/resolveConfig.js +20 -0
  117. package/lib-esm/providers/kinesis-firehose/apis/flushEvents.d.ts +8 -0
  118. package/lib-esm/providers/kinesis-firehose/apis/flushEvents.js +32 -0
  119. package/lib-esm/providers/kinesis-firehose/apis/index.d.ts +1 -0
  120. package/lib-esm/providers/kinesis-firehose/apis/index.js +1 -0
  121. package/lib-esm/providers/kinesis-firehose/apis/record.d.ts +1 -1
  122. package/lib-esm/providers/kinesis-firehose/apis/record.js +37 -2
  123. package/lib-esm/providers/kinesis-firehose/index.d.ts +1 -1
  124. package/lib-esm/providers/kinesis-firehose/index.js +1 -1
  125. package/lib-esm/providers/kinesis-firehose/types/buffer.d.ts +15 -0
  126. package/lib-esm/providers/kinesis-firehose/types/buffer.js +3 -0
  127. package/lib-esm/providers/kinesis-firehose/types/index.d.ts +1 -0
  128. package/lib-esm/providers/kinesis-firehose/types/inputs.d.ts +5 -1
  129. package/lib-esm/providers/kinesis-firehose/utils/constants.d.ts +6 -0
  130. package/lib-esm/providers/kinesis-firehose/utils/constants.js +8 -0
  131. package/lib-esm/providers/kinesis-firehose/utils/getEventBuffer.d.ts +3 -0
  132. package/lib-esm/providers/kinesis-firehose/utils/getEventBuffer.js +96 -0
  133. package/lib-esm/providers/kinesis-firehose/utils/index.d.ts +2 -0
  134. package/lib-esm/providers/kinesis-firehose/utils/index.js +4 -0
  135. package/lib-esm/providers/kinesis-firehose/utils/resolveConfig.d.ts +7 -0
  136. package/lib-esm/providers/kinesis-firehose/utils/resolveConfig.js +20 -0
  137. package/lib-esm/providers/personalize/apis/flushEvents.d.ts +8 -0
  138. package/lib-esm/providers/personalize/apis/flushEvents.js +31 -0
  139. package/lib-esm/providers/personalize/apis/index.d.ts +1 -0
  140. package/lib-esm/providers/personalize/apis/index.js +1 -0
  141. package/lib-esm/providers/personalize/apis/record.d.ts +1 -1
  142. package/lib-esm/providers/personalize/apis/record.js +65 -2
  143. package/lib-esm/providers/personalize/index.d.ts +1 -1
  144. package/lib-esm/providers/personalize/index.js +1 -1
  145. package/lib-esm/providers/personalize/types/buffer.d.ts +16 -0
  146. package/lib-esm/providers/personalize/types/buffer.js +3 -0
  147. package/lib-esm/providers/personalize/types/index.d.ts +2 -1
  148. package/lib-esm/providers/personalize/types/inputs.d.ts +7 -1
  149. package/lib-esm/providers/personalize/utils/autoTrackMedia.d.ts +10 -0
  150. package/lib-esm/providers/personalize/utils/autoTrackMedia.js +178 -0
  151. package/lib-esm/providers/personalize/utils/cachedSession.d.ts +5 -0
  152. package/lib-esm/providers/personalize/utils/cachedSession.js +47 -0
  153. package/lib-esm/providers/personalize/utils/constants.d.ts +7 -0
  154. package/lib-esm/providers/personalize/utils/constants.js +9 -0
  155. package/lib-esm/providers/personalize/utils/getEventBuffer.d.ts +3 -0
  156. package/lib-esm/providers/personalize/utils/getEventBuffer.js +96 -0
  157. package/lib-esm/providers/personalize/utils/index.d.ts +5 -0
  158. package/lib-esm/providers/personalize/utils/index.js +7 -0
  159. package/lib-esm/providers/personalize/utils/resolveConfig.d.ts +7 -0
  160. package/lib-esm/providers/personalize/utils/resolveConfig.js +21 -0
  161. package/lib-esm/providers/pinpoint/apis/flushEvents.d.ts +8 -0
  162. package/lib-esm/providers/pinpoint/apis/flushEvents.js +23 -0
  163. package/lib-esm/providers/pinpoint/apis/identifyUser.d.ts +2 -2
  164. package/lib-esm/providers/pinpoint/apis/identifyUser.js +3 -3
  165. package/lib-esm/providers/pinpoint/apis/index.d.ts +1 -0
  166. package/lib-esm/providers/pinpoint/apis/index.js +1 -0
  167. package/lib-esm/providers/pinpoint/index.d.ts +1 -1
  168. package/lib-esm/providers/pinpoint/index.js +1 -1
  169. package/lib-esm/tsconfig.tsbuildinfo +1 -1
  170. package/lib-esm/types/index.d.ts +1 -0
  171. package/lib-esm/types/kinesis.d.ts +8 -0
  172. package/lib-esm/types/kinesis.js +3 -0
  173. package/lib-esm/utils/eventBuffer/EventBuffer.d.ts +16 -0
  174. package/lib-esm/utils/eventBuffer/EventBuffer.js +88 -0
  175. package/lib-esm/utils/eventBuffer/index.d.ts +2 -0
  176. package/lib-esm/utils/eventBuffer/index.js +3 -0
  177. package/lib-esm/utils/eventBuffer/types.d.ts +8 -0
  178. package/lib-esm/utils/eventBuffer/types.js +3 -0
  179. package/lib-esm/utils/groupBy.d.ts +1 -0
  180. package/lib-esm/utils/groupBy.js +11 -0
  181. package/lib-esm/utils/index.d.ts +3 -0
  182. package/lib-esm/utils/index.js +3 -0
  183. package/lib-esm/utils/resolveCredentials.d.ts +9 -0
  184. package/lib-esm/utils/resolveCredentials.js +17 -0
  185. package/package.json +5 -4
  186. package/src/errors/assertValidationError.ts +9 -3
  187. package/src/errors/validation.ts +8 -0
  188. package/src/index.ts +1 -0
  189. package/src/providers/kinesis/apis/flushEvents.ts +42 -0
  190. package/src/providers/kinesis/apis/index.ts +1 -0
  191. package/src/providers/kinesis/apis/record.ts +54 -2
  192. package/src/providers/kinesis/index.ts +1 -1
  193. package/src/providers/kinesis/types/buffer.ts +20 -0
  194. package/src/providers/kinesis/types/index.ts +1 -0
  195. package/src/providers/kinesis/types/inputs.ts +7 -1
  196. package/src/providers/kinesis/utils/constants.ts +9 -0
  197. package/src/providers/kinesis/utils/getEventBuffer.ts +110 -0
  198. package/src/providers/kinesis/utils/resolveConfig.ts +36 -0
  199. package/src/providers/kinesis-firehose/apis/flushEvents.ts +41 -0
  200. package/src/providers/kinesis-firehose/apis/index.ts +1 -0
  201. package/src/providers/kinesis-firehose/apis/record.ts +47 -2
  202. package/src/providers/kinesis-firehose/index.ts +1 -1
  203. package/src/providers/kinesis-firehose/types/buffer.ts +20 -0
  204. package/src/providers/kinesis-firehose/types/index.ts +5 -0
  205. package/src/providers/kinesis-firehose/types/inputs.ts +6 -1
  206. package/src/providers/kinesis-firehose/utils/constants.ts +9 -0
  207. package/src/providers/kinesis-firehose/utils/getEventBuffer.ts +118 -0
  208. package/src/providers/kinesis-firehose/utils/index.ts +5 -0
  209. package/src/providers/kinesis-firehose/utils/resolveConfig.ts +36 -0
  210. package/src/providers/personalize/apis/flushEvents.ts +39 -0
  211. package/src/providers/personalize/apis/index.ts +1 -0
  212. package/src/providers/personalize/apis/record.ts +98 -2
  213. package/src/providers/personalize/index.ts +1 -1
  214. package/src/providers/personalize/types/buffer.ts +21 -0
  215. package/src/providers/personalize/types/index.ts +2 -1
  216. package/src/providers/personalize/types/inputs.ts +8 -1
  217. package/src/providers/personalize/utils/autoTrackMedia.ts +231 -0
  218. package/src/providers/personalize/utils/cachedSession.ts +67 -0
  219. package/src/providers/personalize/utils/constants.ts +12 -0
  220. package/src/providers/personalize/utils/getEventBuffer.ts +111 -0
  221. package/src/providers/personalize/utils/index.ts +11 -0
  222. package/src/providers/personalize/utils/resolveConfig.ts +41 -0
  223. package/src/providers/pinpoint/apis/flushEvents.ts +34 -0
  224. package/src/providers/pinpoint/apis/identifyUser.ts +3 -3
  225. package/src/providers/pinpoint/apis/index.ts +1 -0
  226. package/src/providers/pinpoint/index.ts +1 -1
  227. package/src/types/index.ts +2 -0
  228. package/src/types/kinesis.ts +13 -0
  229. package/src/utils/eventBuffer/EventBuffer.ts +84 -0
  230. package/src/utils/eventBuffer/index.ts +5 -0
  231. package/src/utils/eventBuffer/types.ts +12 -0
  232. package/src/utils/groupBy.ts +12 -0
  233. package/src/utils/index.ts +7 -0
  234. package/src/utils/resolveCredentials.ts +14 -0
@@ -2,7 +2,52 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { RecordInput } from '../types';
5
+ import { getEventBuffer, resolveConfig } from '../utils';
6
+ import {
7
+ getAnalyticsUserAgentString,
8
+ isAnalyticsEnabled,
9
+ resolveCredentials,
10
+ } from '../../../utils';
11
+ import { fromUtf8 } from '@smithy/util-utf8';
12
+ import {
13
+ AnalyticsAction,
14
+ ConsoleLogger as Logger,
15
+ } from '@aws-amplify/core/internals/utils';
5
16
 
6
- export const record = (input: RecordInput): void => {
7
- throw new Error('Not Yet Implemented');
17
+ const logger = new Logger('KinesisFirehose');
18
+
19
+ export const record = ({ streamName, data }: RecordInput): void => {
20
+ if (!isAnalyticsEnabled()) {
21
+ logger.debug('Analytics is disabled, event will not be recorded.');
22
+ return;
23
+ }
24
+
25
+ const timestamp = Date.now();
26
+ const { region, bufferSize, flushSize, flushInterval, resendLimit } =
27
+ resolveConfig();
28
+
29
+ resolveCredentials()
30
+ .then(({ credentials, identityId }) => {
31
+ const buffer = getEventBuffer({
32
+ region,
33
+ credentials,
34
+ identityId,
35
+ bufferSize,
36
+ flushSize,
37
+ flushInterval,
38
+ resendLimit,
39
+ userAgentValue: getAnalyticsUserAgentString(AnalyticsAction.Record),
40
+ });
41
+
42
+ buffer.append({
43
+ region,
44
+ streamName,
45
+ event: ArrayBuffer.isView(data) ? data : fromUtf8(JSON.stringify(data)),
46
+ timestamp,
47
+ retryCount: 0,
48
+ });
49
+ })
50
+ .catch(e => {
51
+ logger.warn('Failed to record event.', e);
52
+ });
8
53
  };
@@ -1,4 +1,4 @@
1
1
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- export { record } from './apis';
4
+ export { record, flushEvents } from './apis';
@@ -0,0 +1,20 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { EventBufferConfig } from '../../../utils';
5
+ import { KinesisStream } from '../../../types';
6
+ import { Credentials } from '@aws-sdk/types';
7
+
8
+ export type KinesisFirehoseBufferEvent = KinesisStream & {
9
+ event: Uint8Array;
10
+ retryCount: number;
11
+ timestamp: number;
12
+ };
13
+
14
+ export type KinesisFirehoseEventBufferConfig = EventBufferConfig & {
15
+ region: string;
16
+ credentials: Credentials;
17
+ identityId?: string;
18
+ resendLimit?: number;
19
+ userAgentValue?: string;
20
+ };
@@ -2,3 +2,8 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  export { RecordInput } from './inputs';
5
+
6
+ export {
7
+ KinesisFirehoseBufferEvent,
8
+ KinesisFirehoseEventBufferConfig,
9
+ } from './buffer';
@@ -1,4 +1,9 @@
1
1
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- export type RecordInput = {};
4
+ import { KinesisEventData } from '../../../types';
5
+
6
+ export type RecordInput = {
7
+ streamName: string;
8
+ data: KinesisEventData;
9
+ };
@@ -0,0 +1,9 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export const DEFAULT_KINESIS_FIREHOSE_CONFIG = {
5
+ bufferSize: 1_000,
6
+ flushSize: 100,
7
+ flushInterval: 5_000,
8
+ resendLimit: 5,
9
+ };
@@ -0,0 +1,118 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { EventBuffer, groupBy, IAnalyticsClient } from '../../../utils';
5
+ import {
6
+ FirehoseClient,
7
+ PutRecordBatchCommand,
8
+ } from '@aws-sdk/client-firehose';
9
+ import {
10
+ KinesisFirehoseBufferEvent,
11
+ KinesisFirehoseEventBufferConfig,
12
+ } from '../types';
13
+
14
+ /**
15
+ * These Records hold cached event buffers and AWS clients.
16
+ * The hash key is determined by the region and session,
17
+ * consisting of a combined value comprising [region, sessionToken, identityId].
18
+ *
19
+ * Only one active session should exist at any given moment.
20
+ * When a new session is initiated, the previous ones should be released.
21
+ * */
22
+ const eventBufferMap: Record<
23
+ string,
24
+ EventBuffer<KinesisFirehoseBufferEvent>
25
+ > = {};
26
+ const cachedClients: Record<string, FirehoseClient> = {};
27
+
28
+ const createPutRecordsBatchCommand = (
29
+ streamName: string,
30
+ events: KinesisFirehoseBufferEvent[]
31
+ ): PutRecordBatchCommand =>
32
+ new PutRecordBatchCommand({
33
+ DeliveryStreamName: streamName,
34
+ Records: events.map(event => ({
35
+ Data: event.event,
36
+ })),
37
+ });
38
+
39
+ const submitEvents = async (
40
+ events: KinesisFirehoseBufferEvent[],
41
+ client: FirehoseClient,
42
+ resendLimit?: number
43
+ ): Promise<KinesisFirehoseBufferEvent[]> => {
44
+ const groupedByStreamName = Object.entries(
45
+ groupBy(event => event.streamName, events)
46
+ );
47
+
48
+ const requests = groupedByStreamName
49
+ .map(([streamName, events]) =>
50
+ createPutRecordsBatchCommand(streamName, events)
51
+ )
52
+ .map(command => client.send(command));
53
+
54
+ const responses = await Promise.allSettled(requests);
55
+ const failedEvents = responses
56
+ .map((response, i) =>
57
+ response.status === 'rejected' ? groupedByStreamName[i][1] : []
58
+ )
59
+ .flat();
60
+ return resendLimit
61
+ ? failedEvents
62
+ .filter(event => event.retryCount < resendLimit)
63
+ .map(event => ({ ...event, retryCount: event.retryCount + 1 }))
64
+ .sort((a, b) => a.timestamp - b.timestamp)
65
+ : [];
66
+ };
67
+
68
+ export const getEventBuffer = ({
69
+ region,
70
+ credentials,
71
+ identityId,
72
+ bufferSize,
73
+ flushSize,
74
+ flushInterval,
75
+ resendLimit,
76
+ userAgentValue,
77
+ }: KinesisFirehoseEventBufferConfig): EventBuffer<KinesisFirehoseBufferEvent> => {
78
+ const { sessionToken } = credentials;
79
+ const sessionIdentityKey = [region, sessionToken, identityId]
80
+ .filter(id => !!id)
81
+ .join('-');
82
+
83
+ if (!eventBufferMap[sessionIdentityKey]) {
84
+ const getClient = (): IAnalyticsClient<KinesisFirehoseBufferEvent> => {
85
+ if (!cachedClients[sessionIdentityKey]) {
86
+ cachedClients[sessionIdentityKey] = new FirehoseClient({
87
+ region,
88
+ credentials,
89
+ customUserAgent: userAgentValue,
90
+ });
91
+ }
92
+
93
+ const firehoseClient = cachedClients[sessionIdentityKey];
94
+ return events => submitEvents(events, firehoseClient, resendLimit);
95
+ };
96
+
97
+ eventBufferMap[sessionIdentityKey] =
98
+ new EventBuffer<KinesisFirehoseBufferEvent>(
99
+ {
100
+ bufferSize,
101
+ flushSize,
102
+ flushInterval,
103
+ },
104
+ getClient
105
+ );
106
+
107
+ const releaseSessionKeys = Object.keys(eventBufferMap).filter(
108
+ key => key !== sessionIdentityKey
109
+ );
110
+ for (const releaseSessionKey of releaseSessionKeys) {
111
+ eventBufferMap[releaseSessionKey].release();
112
+ delete eventBufferMap[releaseSessionKey];
113
+ delete cachedClients[releaseSessionKey];
114
+ }
115
+ }
116
+
117
+ return eventBufferMap[sessionIdentityKey];
118
+ };
@@ -0,0 +1,5 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export { getEventBuffer } from './getEventBuffer';
5
+ export { resolveConfig } from './resolveConfig';
@@ -0,0 +1,36 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { Amplify } from '@aws-amplify/core';
5
+ import {
6
+ AnalyticsValidationErrorCode,
7
+ assertValidationError,
8
+ } from '../../../errors';
9
+ import { DEFAULT_KINESIS_FIREHOSE_CONFIG } from './constants';
10
+
11
+ export const resolveConfig = () => {
12
+ const config = Amplify.getConfig().Analytics?.KinesisFirehose;
13
+ const {
14
+ region,
15
+ bufferSize = DEFAULT_KINESIS_FIREHOSE_CONFIG.bufferSize,
16
+ flushSize = DEFAULT_KINESIS_FIREHOSE_CONFIG.flushSize,
17
+ flushInterval = DEFAULT_KINESIS_FIREHOSE_CONFIG.flushInterval,
18
+ resendLimit,
19
+ } = {
20
+ ...DEFAULT_KINESIS_FIREHOSE_CONFIG,
21
+ ...config,
22
+ };
23
+
24
+ assertValidationError(!!region, AnalyticsValidationErrorCode.NoRegion);
25
+ assertValidationError(
26
+ flushSize < bufferSize,
27
+ AnalyticsValidationErrorCode.InvalidFlushSize
28
+ );
29
+ return {
30
+ region,
31
+ bufferSize,
32
+ flushSize,
33
+ flushInterval,
34
+ resendLimit,
35
+ };
36
+ };
@@ -0,0 +1,39 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { getEventBuffer, resolveConfig } from '../utils';
5
+ import {
6
+ getAnalyticsUserAgentString,
7
+ resolveCredentials,
8
+ } from '../../../utils';
9
+ import {
10
+ AnalyticsAction,
11
+ ConsoleLogger,
12
+ } from '@aws-amplify/core/internals/utils';
13
+
14
+ const logger = new ConsoleLogger('Personalize');
15
+
16
+ /**
17
+ * Flushes all buffered Personalize events to the service.
18
+ *
19
+ * @note
20
+ * This API will make a best-effort attempt to flush events from the buffer. Events recorded immediately after invoking
21
+ * this API may not be included in the flush.
22
+ */
23
+ export const flushEvents = () => {
24
+ const { region, flushSize, bufferSize, flushInterval } = resolveConfig();
25
+ resolveCredentials()
26
+ .then(({ credentials, identityId }) =>
27
+ getEventBuffer({
28
+ region,
29
+ flushSize,
30
+ flushInterval,
31
+ bufferSize,
32
+ credentials,
33
+ identityId,
34
+ userAgentValue: getAnalyticsUserAgentString(AnalyticsAction.Record),
35
+ })
36
+ )
37
+ .then(eventBuffer => eventBuffer.flushAll())
38
+ .catch(e => logger.warn('Failed to flush events', e));
39
+ };
@@ -2,3 +2,4 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  export { record } from './record';
5
+ export { flushEvents } from './flushEvents';
@@ -2,7 +2,103 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { RecordInput } from '../types';
5
+ import {
6
+ autoTrackMedia,
7
+ getEventBuffer,
8
+ resolveCachedSession,
9
+ resolveConfig,
10
+ updateCachedSession,
11
+ } from '../utils';
12
+ import {
13
+ getAnalyticsUserAgentString,
14
+ isAnalyticsEnabled,
15
+ resolveCredentials,
16
+ } from '../../../utils';
17
+ import {
18
+ AnalyticsAction,
19
+ ConsoleLogger,
20
+ } from '@aws-amplify/core/internals/utils';
21
+ import {
22
+ IDENTIFY_EVENT_TYPE,
23
+ MEDIA_AUTO_TRACK_EVENT_TYPE,
24
+ } from '../utils/constants';
5
25
 
6
- export const record = (input: RecordInput): void => {
7
- throw new Error('Not Yet Implemented');
26
+ const logger = new ConsoleLogger('Personalize');
27
+
28
+ export const record = ({
29
+ userId,
30
+ eventId,
31
+ eventType,
32
+ properties,
33
+ }: RecordInput): void => {
34
+ if (!isAnalyticsEnabled()) {
35
+ logger.debug('Analytics is disabled, event will not be recorded.');
36
+ return;
37
+ }
38
+
39
+ const { region, trackingId, bufferSize, flushSize, flushInterval } =
40
+ resolveConfig();
41
+ resolveCredentials()
42
+ .then(({ credentials, identityId }) => {
43
+ const timestamp = Date.now();
44
+ const { sessionId: cachedSessionId, userId: cachedUserId } =
45
+ resolveCachedSession(trackingId);
46
+ if (eventType === IDENTIFY_EVENT_TYPE) {
47
+ updateCachedSession(
48
+ typeof properties.userId === 'string' ? properties.userId : '',
49
+ cachedSessionId,
50
+ cachedUserId
51
+ );
52
+ } else if (!!userId) {
53
+ updateCachedSession(userId, cachedSessionId, cachedUserId);
54
+ }
55
+
56
+ const { sessionId: updatedSessionId, userId: updatedUserId } =
57
+ resolveCachedSession(trackingId);
58
+
59
+ const eventBuffer = getEventBuffer({
60
+ region,
61
+ flushSize,
62
+ flushInterval,
63
+ bufferSize,
64
+ credentials,
65
+ identityId,
66
+ userAgentValue: getAnalyticsUserAgentString(AnalyticsAction.Record),
67
+ });
68
+
69
+ if (eventType === MEDIA_AUTO_TRACK_EVENT_TYPE) {
70
+ autoTrackMedia(
71
+ {
72
+ trackingId,
73
+ sessionId: updatedSessionId,
74
+ userId: updatedUserId,
75
+ event: {
76
+ eventId,
77
+ eventType,
78
+ properties,
79
+ },
80
+ },
81
+ eventBuffer
82
+ );
83
+ } else {
84
+ eventBuffer.append({
85
+ trackingId,
86
+ sessionId: updatedSessionId,
87
+ userId: updatedUserId,
88
+ event: {
89
+ eventId,
90
+ eventType,
91
+ properties,
92
+ },
93
+ timestamp,
94
+ });
95
+ }
96
+
97
+ if (eventBuffer.length >= bufferSize) {
98
+ eventBuffer.flushAll();
99
+ }
100
+ })
101
+ .catch(e => {
102
+ logger.warn('Failed to record event.', e);
103
+ });
8
104
  };
@@ -1,4 +1,4 @@
1
1
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- export { record } from './apis';
4
+ export { record, flushEvents } from './apis';
@@ -0,0 +1,21 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { PersonalizeEvent } from './';
5
+ import { EventBufferConfig } from '../../../utils';
6
+ import { Credentials } from '@aws-sdk/types';
7
+
8
+ export type PersonalizeBufferEvent = {
9
+ trackingId: string;
10
+ sessionId?: string;
11
+ userId?: string;
12
+ event: PersonalizeEvent;
13
+ timestamp: number;
14
+ };
15
+
16
+ export type PersonalizeBufferConfig = EventBufferConfig & {
17
+ region: string;
18
+ credentials: Credentials;
19
+ identityId?: string;
20
+ userAgentValue?: string;
21
+ };
@@ -1,4 +1,5 @@
1
1
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- export { RecordInput } from './inputs';
4
+ export { RecordInput, PersonalizeEvent } from './inputs';
5
+ export { PersonalizeBufferEvent, PersonalizeBufferConfig } from './buffer';
@@ -1,4 +1,11 @@
1
1
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- export type RecordInput = {};
4
+ export type PersonalizeEvent = {
5
+ userId?: string;
6
+ eventId?: string;
7
+ eventType: string;
8
+ properties: Record<string, unknown>;
9
+ };
10
+
11
+ export type RecordInput = PersonalizeEvent;