@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.
- package/adapters/db/ClickHouseDBAdapter.ts +56 -1
- package/adapters/db/DynamoDBAdapter.ts +39 -0
- package/adapters/db/MongoDBAdapter.ts +20 -1
- package/build/adapters/db/ClickHouseDBAdapter.d.ts +2 -1
- package/build/adapters/db/ClickHouseDBAdapter.js +50 -0
- package/build/adapters/db/ClickHouseDBAdapter.js.map +1 -1
- package/build/adapters/db/DynamoDBAdapter.d.ts +2 -1
- package/build/adapters/db/DynamoDBAdapter.js +30 -0
- package/build/adapters/db/DynamoDBAdapter.js.map +1 -1
- package/build/adapters/db/MongoDBAdapter.d.ts +2 -1
- package/build/adapters/db/MongoDBAdapter.js +18 -0
- package/build/adapters/db/MongoDBAdapter.js.map +1 -1
- package/build/types/db.d.ts +5 -0
- package/build/types/db.js.map +1 -1
- package/package.json +1 -1
- package/spec/adapters/DynamoDBAdapter.spec.ts +38 -0
- package/types/db.ts +6 -0
|
@@ -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":";;;;;;;;;;;;AAAA,+CAAkD;AAClD,
|
|
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,
|
|
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":";;;;;;;;;;;;AACA,
|
|
1
|
+
{"version":3,"file":"MongoDBAdapter.js","sourceRoot":"","sources":["../../../adapters/db/MongoDBAdapter.ts"],"names":[],"mappings":"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"}
|
package/build/types/db.d.ts
CHANGED
|
@@ -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[]>;
|
package/build/types/db.js.map
CHANGED
|
@@ -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;
|
|
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
|
@@ -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[]>;
|