@eyevinn/player-analytics-shared 0.7.4 → 0.8.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.
@@ -1,5 +1,5 @@
1
1
  import { createClient } from '@clickhouse/client';
2
- import { AbstractDBAdapter, ErrorType, IGetItemInput, IGetItems, IHandleErrorOutput, IPutItemInput } from '../../types/interfaces';
2
+ import { AbstractDBAdapter, ErrorType, IGetItemInput, IGetItems, IHandleErrorOutput, IPutItemInput, IPutItemsInput } from '../../types/interfaces';
3
3
  import winston from 'winston';
4
4
 
5
5
  interface EventItem {
@@ -120,6 +120,61 @@ export class ClickHouseDBAdapter implements AbstractDBAdapter {
120
120
  return true;
121
121
  }
122
122
 
123
+ async putItems(params: IPutItemsInput): Promise<boolean> {
124
+ const tableName = params.tableName;
125
+ const items = params.data as EventItem[];
126
+
127
+ if (!items || items.length === 0) {
128
+ this.logger.warn('No items provided for batch insert');
129
+ return true;
130
+ }
131
+
132
+ this.logger.debug(`Batch inserting ${items.length} items into ${tableName}`);
133
+
134
+ // Prepare all items for insertion
135
+ const data = items.map(item => {
136
+ // Convert payload to JSON string if it's an object
137
+ const payload = typeof item.payload === 'object'
138
+ ? JSON.stringify(item.payload)
139
+ : item.payload || '';
140
+
141
+ // Prepare the data for insertion
142
+ let parsedPayload = {};
143
+ if (payload) {
144
+ try {
145
+ parsedPayload = JSON.parse(payload);
146
+ } catch (error) {
147
+ this.logger.warn('Payload not json, skipping parsing');
148
+ }
149
+ }
150
+
151
+ return {
152
+ event: item.event,
153
+ sessionId: item.sessionId,
154
+ timestamp: item.timestamp,
155
+ playhead: item.playhead || -1,
156
+ duration: item.duration || -1,
157
+ live: parsedPayload['live'] || false,
158
+ contentId: parsedPayload['contentId'] || '',
159
+ userId: parsedPayload['userId'] || '',
160
+ deviceId: parsedPayload['deviceId'] || '',
161
+ deviceModel: parsedPayload['deviceModel'] || '',
162
+ deviceType: parsedPayload['deviceType'] || '',
163
+ payload
164
+ };
165
+ });
166
+
167
+ // Insert all data in a single batch operation
168
+ await this.dbClient.insert({
169
+ table: tableName,
170
+ values: data,
171
+ format: 'JSONEachRow'
172
+ });
173
+
174
+ this.logger.debug(`Successfully batch inserted ${items.length} items into ${tableName}`);
175
+ return true;
176
+ }
177
+
123
178
  async getItem(params: IGetItemInput): Promise<any> {
124
179
  throw new Error('Method not implemented.');
125
180
  }
@@ -18,6 +18,7 @@ import {
18
18
  IGetItemInput,
19
19
  IGetItems,
20
20
  IPutItemInput,
21
+ IPutItemsInput,
21
22
  IHandleErrorOutput,
22
23
  ErrorType,
23
24
  } from '../../types/interfaces';
@@ -64,6 +65,44 @@ export class DynamoDBAdapter implements AbstractDBAdapter {
64
65
  }
65
66
  }
66
67
 
68
+ async putItems(params: IPutItemsInput): Promise<boolean> {
69
+ try {
70
+ if (!params.data || params.data.length === 0) {
71
+ this.logger.warn('No items provided for batch insert');
72
+ return true;
73
+ }
74
+
75
+ this.logger.debug(`Batch inserting ${params.data.length} items into ${params.tableName}`);
76
+
77
+ // DynamoDB batch write has a limit of 25 items per request
78
+ const batchSize = 25;
79
+ const batches: Object[][] = [];
80
+
81
+ for (let i = 0; i < params.data.length; i += batchSize) {
82
+ batches.push(params.data.slice(i, i + batchSize));
83
+ }
84
+
85
+ // Process all batches
86
+ for (const batch of batches) {
87
+ const promises = batch.map(item =>
88
+ this.dbClient.send(
89
+ new PutItemCommand({
90
+ TableName: params.tableName,
91
+ Item: marshall(item),
92
+ })
93
+ )
94
+ );
95
+
96
+ await Promise.all(promises);
97
+ }
98
+
99
+ this.logger.debug(`Successfully batch inserted ${params.data.length} items into ${params.tableName}`);
100
+ return true;
101
+ } catch (err) {
102
+ throw this.handleError(err);
103
+ }
104
+ }
105
+
67
106
  async getItem(params: IGetItemInput): Promise<any> {
68
107
  try {
69
108
  const data = await this.dbClient.send(
@@ -1,5 +1,5 @@
1
1
  import { Logger } from "winston";
2
- import { AbstractDBAdapter, IHandleErrorOutput, ErrorType, IPutItemInput, IGetItemInput, IGetItems } from "../../types/interfaces";
2
+ import { AbstractDBAdapter, IHandleErrorOutput, ErrorType, IPutItemInput, IPutItemsInput, IGetItemInput, IGetItems } from "../../types/interfaces";
3
3
  import { MongoClient } from "mongodb";
4
4
 
5
5
  const DB_NAME = "EPAS";
@@ -40,6 +40,25 @@ export class MongoDBAdapter implements AbstractDBAdapter {
40
40
  }
41
41
  }
42
42
 
43
+ public async putItems({ tableName, data }: IPutItemsInput): Promise<boolean> {
44
+ try {
45
+ if (!data || data.length === 0) {
46
+ this.logger.warn('No items provided for batch insert');
47
+ return true;
48
+ }
49
+
50
+ this.logger.debug(`Batch inserting ${data.length} items into ${tableName}`);
51
+
52
+ const collection = await this.dbClient.db().collection(tableName);
53
+ const result = await collection.insertMany(data);
54
+
55
+ this.logger.debug(`Successfully batch inserted ${data.length} items into ${tableName}`);
56
+ return result.acknowledged;
57
+ } catch (error) {
58
+ throw this.handleError(error);
59
+ }
60
+ }
61
+
43
62
  public async getItem({ sessionId, tableName, timestamp }: IGetItemInput): Promise<any> {
44
63
  try {
45
64
  const collection = await this.dbClient.db().collection(tableName);
@@ -1,4 +1,4 @@
1
- import { AbstractDBAdapter, IGetItemInput, IGetItems, IHandleErrorOutput, IPutItemInput } from '../../types/interfaces';
1
+ import { AbstractDBAdapter, IGetItemInput, IGetItems, IHandleErrorOutput, IPutItemInput, IPutItemsInput } from '../../types/interfaces';
2
2
  import winston from 'winston';
3
3
  export declare class ClickHouseDBAdapter implements AbstractDBAdapter {
4
4
  logger: winston.Logger;
@@ -6,6 +6,7 @@ export declare class ClickHouseDBAdapter implements AbstractDBAdapter {
6
6
  constructor(logger: winston.Logger);
7
7
  tableExists(name: string): Promise<boolean>;
8
8
  putItem(params: IPutItemInput): Promise<boolean>;
9
+ putItems(params: IPutItemsInput): Promise<boolean>;
9
10
  getItem(params: IGetItemInput): Promise<any>;
10
11
  deleteItem(params: IGetItemInput): Promise<boolean>;
11
12
  getItemsBySession(params: IGetItems): Promise<any[]>;
@@ -114,6 +114,56 @@ class ClickHouseDBAdapter {
114
114
  return true;
115
115
  });
116
116
  }
117
+ putItems(params) {
118
+ return __awaiter(this, void 0, void 0, function* () {
119
+ const tableName = params.tableName;
120
+ const items = params.data;
121
+ if (!items || items.length === 0) {
122
+ this.logger.warn('No items provided for batch insert');
123
+ return true;
124
+ }
125
+ this.logger.debug(`Batch inserting ${items.length} items into ${tableName}`);
126
+ // Prepare all items for insertion
127
+ const data = items.map(item => {
128
+ // Convert payload to JSON string if it's an object
129
+ const payload = typeof item.payload === 'object'
130
+ ? JSON.stringify(item.payload)
131
+ : item.payload || '';
132
+ // Prepare the data for insertion
133
+ let parsedPayload = {};
134
+ if (payload) {
135
+ try {
136
+ parsedPayload = JSON.parse(payload);
137
+ }
138
+ catch (error) {
139
+ this.logger.warn('Payload not json, skipping parsing');
140
+ }
141
+ }
142
+ return {
143
+ event: item.event,
144
+ sessionId: item.sessionId,
145
+ timestamp: item.timestamp,
146
+ playhead: item.playhead || -1,
147
+ duration: item.duration || -1,
148
+ live: parsedPayload['live'] || false,
149
+ contentId: parsedPayload['contentId'] || '',
150
+ userId: parsedPayload['userId'] || '',
151
+ deviceId: parsedPayload['deviceId'] || '',
152
+ deviceModel: parsedPayload['deviceModel'] || '',
153
+ deviceType: parsedPayload['deviceType'] || '',
154
+ payload
155
+ };
156
+ });
157
+ // Insert all data in a single batch operation
158
+ yield this.dbClient.insert({
159
+ table: tableName,
160
+ values: data,
161
+ format: 'JSONEachRow'
162
+ });
163
+ this.logger.debug(`Successfully batch inserted ${items.length} items into ${tableName}`);
164
+ return true;
165
+ });
166
+ }
117
167
  getItem(params) {
118
168
  return __awaiter(this, void 0, void 0, function* () {
119
169
  throw new Error('Method not implemented.');
@@ -1 +1 @@
1
- {"version":3,"file":"ClickHouseDBAdapter.js","sourceRoot":"","sources":["../../../adapters/db/ClickHouseDBAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ClickHouseDBAdapter.js","sourceRoot":"","sources":["../../../adapters/db/ClickHouseDBAdapter.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
2
2
  import winston from 'winston';
3
- import { AbstractDBAdapter, IGetItemInput, IGetItems, IPutItemInput, IHandleErrorOutput } from '../../types/interfaces';
3
+ import { AbstractDBAdapter, IGetItemInput, IGetItems, IPutItemInput, IPutItemsInput, IHandleErrorOutput } from '../../types/interfaces';
4
4
  export declare class DynamoDBAdapter implements AbstractDBAdapter {
5
5
  logger: winston.Logger;
6
6
  dbClient: DynamoDBClient;
7
7
  constructor(logger: winston.Logger);
8
8
  tableExists(name: string): Promise<boolean>;
9
9
  putItem(params: IPutItemInput): Promise<boolean>;
10
+ putItems(params: IPutItemsInput): Promise<boolean>;
10
11
  getItem(params: IGetItemInput): Promise<any>;
11
12
  deleteItem(params: IGetItemInput): Promise<boolean>;
12
13
  getItemsBySession(params: IGetItems): Promise<any[]>;
@@ -55,6 +55,36 @@ class DynamoDBAdapter {
55
55
  }
56
56
  });
57
57
  }
58
+ putItems(params) {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ try {
61
+ if (!params.data || params.data.length === 0) {
62
+ this.logger.warn('No items provided for batch insert');
63
+ return true;
64
+ }
65
+ this.logger.debug(`Batch inserting ${params.data.length} items into ${params.tableName}`);
66
+ // DynamoDB batch write has a limit of 25 items per request
67
+ const batchSize = 25;
68
+ const batches = [];
69
+ for (let i = 0; i < params.data.length; i += batchSize) {
70
+ batches.push(params.data.slice(i, i + batchSize));
71
+ }
72
+ // Process all batches
73
+ for (const batch of batches) {
74
+ const promises = batch.map(item => this.dbClient.send(new client_dynamodb_1.PutItemCommand({
75
+ TableName: params.tableName,
76
+ Item: (0, util_dynamodb_1.marshall)(item),
77
+ })));
78
+ yield Promise.all(promises);
79
+ }
80
+ this.logger.debug(`Successfully batch inserted ${params.data.length} items into ${params.tableName}`);
81
+ return true;
82
+ }
83
+ catch (err) {
84
+ throw this.handleError(err);
85
+ }
86
+ });
87
+ }
58
88
  getItem(params) {
59
89
  return __awaiter(this, void 0, void 0, function* () {
60
90
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"DynamoDBAdapter.js","sourceRoot":"","sources":["../../../adapters/db/DynamoDBAdapter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8DAYkC;AAClC,0DAA8D;AAE9D,uDAOgC;AAEhC,MAAa,eAAe;IAI1B,YAAY,MAAsB;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,gCAAc,CAAC;YACjC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;YAC9B,WAAW,EAAE,CAAC;SACf,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEK,WAAW,CAAC,IAAY;;YAC5B,IAAI;gBACF,MAAM,MAAM,GAA8B,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBAC9D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,sCAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC9E,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ;oBAAE,OAAO,IAAI,CAAC;gBACrF,OAAO,KAAK,CAAC;aACd;YAAC,OAAO,QAAQ,EAAE;gBACjB,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,2BAA2B,EAAE;oBAClE,OAAO,KAAK,CAAC;iBACd;qBAAM;oBACL,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC5B,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;iBAC3B;aACF;QACH,CAAC;KAAA;IAEK,OAAO,CAAC,MAAqB;;YACjC,IAAI;gBACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CACnC,IAAI,gCAAc,CAAC;oBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,IAAI,EAAE,IAAA,wBAAQ,EAAC,MAAM,CAAC,IAAI,CAAC;iBAC5B,CAAC,CACH,CAAC;gBACF,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,KAAK,GAAG,CAAC;aAC9C;YAAC,OAAO,GAAG,EAAE;gBACZ,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;aAC7B;QACH,CAAC;KAAA;IAEK,OAAO,CAAC,MAAqB;;YACjC,IAAI;gBACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CACnC,IAAI,gCAAc,CAAC;oBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,GAAG,EAAE,IAAA,wBAAQ,EAAC;wBACZ,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;qBAC5B,CAAC;iBACH,CAAC,CACH,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAC1C,OAAO,IAAI,CAAC;aACb;YAAC,OAAO,GAAG,EAAE;gBACZ,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;aAC7B;QACH,CAAC;KAAA;IAEK,UAAU,CAAC,MAAqB;;YACpC,IAAI;gBACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CACnC,IAAI,mCAAiB,CAAC;oBACpB,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,GAAG,EAAE,IAAA,wBAAQ,EAAC;wBACZ,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;qBAC5B,CAAC;iBACH,CAAC,CACH,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC;gBACnD,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,KAAK,GAAG,CAAC;aAC9C;YAAC,OAAO,GAAG,EAAE;gBACZ,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;aAC7B;QACH,CAAC;KAAA;IAEK,iBAAiB,CAAC,MAAiB;;YACvC,IAAI;gBACF,MAAM,SAAS,GAAsB;oBACnC,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,sBAAsB,EAAE,aAAa;oBACrC,wBAAwB,EAAE;wBACxB,MAAM,EAAE,WAAW;qBACpB;oBACD,yBAAyB,EAAE,IAAA,wBAAQ,EAAC;wBAClC,MAAM,EAAE,MAAM,CAAC,SAAS;qBACzB,CAAC;iBACH,CAAC;gBACF,MAAM,SAAS,GAAuB,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAC5D,IAAI,8BAAY,CAAC,SAAS,CAAC,CAC5B,CAAC;gBACF,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjD,IAAI,KAAK,GAAU,EAAE,CAAC;oBACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;wBAC/C,KAAK,CAAC,CAAC,CAAC,GAAG,IAAA,0BAAU,EAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;qBAC3C;oBACD,OAAO,KAAK,CAAC;iBACd;gBACD,OAAO,EAAE,CAAC;aACX;YAAC,OAAO,GAAG,EAAE;gBACZ,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;aAC7B;QACH,CAAC;KAAA;IAED,WAAW,CAAC,WAAgB;QAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAuB;YACtC,SAAS,EAAE,sBAAS,CAAC,KAAK;YAC1B,KAAK,EAAE,WAAW;SACnB,CAAC;QACF,IAAI,WAAW,CAAC,IAAI,EAAE;YACpB,IACE,WAAW,CAAC,IAAI,KAAK,2BAA2B;gBAChD,WAAW,CAAC,IAAI,KAAK,wBAAwB,EAC7C;gBACA,WAAW,CAAC,WAAW,CAAC,GAAG,sBAAS,CAAC,QAAQ,CAAC;aAC/C;SACF;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AA1HD,0CA0HC"}
1
+ {"version":3,"file":"DynamoDBAdapter.js","sourceRoot":"","sources":["../../../adapters/db/DynamoDBAdapter.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Logger } from "winston";
2
- import { AbstractDBAdapter, IHandleErrorOutput, IPutItemInput, IGetItemInput, IGetItems } from "../../types/interfaces";
2
+ import { AbstractDBAdapter, IHandleErrorOutput, IPutItemInput, IPutItemsInput, IGetItemInput, IGetItems } from "../../types/interfaces";
3
3
  import { MongoClient } from "mongodb";
4
4
  export declare class MongoDBAdapter implements AbstractDBAdapter {
5
5
  logger: Logger;
@@ -9,6 +9,7 @@ export declare class MongoDBAdapter implements AbstractDBAdapter {
9
9
  private connect;
10
10
  tableExists(tableName: string): Promise<boolean>;
11
11
  putItem({ tableName, data }: IPutItemInput): Promise<boolean>;
12
+ putItems({ tableName, data }: IPutItemsInput): Promise<boolean>;
12
13
  getItem({ sessionId, tableName, timestamp }: IGetItemInput): Promise<any>;
13
14
  deleteItem({ sessionId, tableName, timestamp }: IGetItemInput): Promise<boolean>;
14
15
  getItemsBySession({ tableName, sessionId }: IGetItems): Promise<any[]>;
@@ -51,6 +51,24 @@ class MongoDBAdapter {
51
51
  }
52
52
  });
53
53
  }
54
+ putItems({ tableName, data }) {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ try {
57
+ if (!data || data.length === 0) {
58
+ this.logger.warn('No items provided for batch insert');
59
+ return true;
60
+ }
61
+ this.logger.debug(`Batch inserting ${data.length} items into ${tableName}`);
62
+ const collection = yield this.dbClient.db().collection(tableName);
63
+ const result = yield collection.insertMany(data);
64
+ this.logger.debug(`Successfully batch inserted ${data.length} items into ${tableName}`);
65
+ return result.acknowledged;
66
+ }
67
+ catch (error) {
68
+ throw this.handleError(error);
69
+ }
70
+ });
71
+ }
54
72
  getItem({ sessionId, tableName, timestamp }) {
55
73
  return __awaiter(this, void 0, void 0, function* () {
56
74
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"MongoDBAdapter.js","sourceRoot":"","sources":["../../../adapters/db/MongoDBAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MongoDBAdapter.js","sourceRoot":"","sources":["../../../adapters/db/MongoDBAdapter.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,10 @@ export interface IPutItemInput {
11
11
  tableName: string;
12
12
  data: Object;
13
13
  }
14
+ export interface IPutItemsInput {
15
+ tableName: string;
16
+ data: Object[];
17
+ }
14
18
  export interface IGetItems {
15
19
  sessionId: string;
16
20
  tableName: string;
@@ -25,6 +29,7 @@ export declare abstract class AbstractDBAdapter {
25
29
  dbClient: any;
26
30
  abstract tableExists(name: string): Promise<boolean>;
27
31
  abstract putItem(params: IPutItemInput): Promise<boolean>;
32
+ abstract putItems(params: IPutItemsInput): Promise<boolean>;
28
33
  abstract getItem(params: IGetItemInput): Promise<any>;
29
34
  abstract deleteItem(params: IGetItemInput): Promise<boolean>;
30
35
  abstract getItemsBySession(params: IGetItems): Promise<any[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../types/db.ts"],"names":[],"mappings":";;;AAEA,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,2CAAW,CAAA;IACX,iDAAc,CAAA;AAChB,CAAC,EAHW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAGpB;AAuBD,MAAsB,iBAAiB;CAUtC;AAVD,8CAUC"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../types/db.ts"],"names":[],"mappings":";;;AAEA,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,2CAAW,CAAA;IACX,iDAAc,CAAA;AAChB,CAAC,EAHW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAGpB;AA4BD,MAAsB,iBAAiB;CAWtC;AAXD,8CAWC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eyevinn/player-analytics-shared",
3
- "version": "0.7.4",
3
+ "version": "0.8.0",
4
4
  "description": "Shared modules &amp; adapters for EPAS components",
5
5
  "source": "index.ts",
6
6
  "main": "./build/index.js",
@@ -113,6 +113,44 @@ describe('Dynamo DB Adapter', () => {
113
113
  expect(result).toBeTrue();
114
114
  });
115
115
 
116
+ it('should put multiple items to database in batch', async () => {
117
+ const DDBReply: PutItemCommandOutput = {
118
+ $metadata: {
119
+ httpStatusCode: 200,
120
+ },
121
+ };
122
+ const adapter = new DynamoDBAdapter(Logger);
123
+ const mockEvents = [
124
+ {
125
+ event: 'loading',
126
+ timestamp: 0,
127
+ playhead: 0,
128
+ duration: 0,
129
+ host: 'mock.tenant.mock',
130
+ },
131
+ {
132
+ event: 'playing',
133
+ timestamp: 1000,
134
+ playhead: 1,
135
+ duration: 60,
136
+ host: 'mock.tenant.mock',
137
+ },
138
+ {
139
+ event: 'paused',
140
+ timestamp: 2000,
141
+ playhead: 2,
142
+ duration: 60,
143
+ host: 'mock.tenant.mock',
144
+ }
145
+ ];
146
+ ddbMock.on(PutItemCommand).resolves(DDBReply);
147
+ const result = await adapter.putItems({
148
+ tableName: 'table_1',
149
+ data: mockEvents,
150
+ });
151
+ expect(result).toBeTrue();
152
+ });
153
+
116
154
  it('should label errorType with "continue" when allowed error occurs', async () => {
117
155
  const DDBReply: AwsError = {
118
156
  Type: 'Sender',
package/types/db.ts CHANGED
@@ -15,6 +15,11 @@ export interface IPutItemInput {
15
15
  data: Object;
16
16
  }
17
17
 
18
+ export interface IPutItemsInput {
19
+ tableName: string;
20
+ data: Object[];
21
+ }
22
+
18
23
  export interface IGetItems {
19
24
  sessionId: string;
20
25
  tableName: string;
@@ -32,6 +37,7 @@ export abstract class AbstractDBAdapter {
32
37
 
33
38
  abstract tableExists(name: string): Promise<boolean>;
34
39
  abstract putItem(params: IPutItemInput): Promise<boolean>;
40
+ abstract putItems(params: IPutItemsInput): Promise<boolean>;
35
41
  abstract getItem(params: IGetItemInput): Promise<any>;
36
42
  abstract deleteItem(params: IGetItemInput): Promise<boolean>;
37
43
  abstract getItemsBySession(params: IGetItems): Promise<any[]>;