```typescript
import {getElasticClient} from "./get.elastic.client";
import * as console from "console";
import {SearchHit} from "@elastic/elasticsearch/lib/api/types";
const TIME_WINDOW = 10;
const WIGGLE_ROOM = 0.1;
const TIME_WINDOWS_MS = (TIME_WINDOW - WIGGLE_ROOM) * 60 * 1000;
type DocumentType = {
"type": "WHITEBOARD_RT_CONTRIBUTION",
"id": string,
"name": string,
"author": string,
"space": string,
"@timestamp": Date,
"alkemio": boolean,
"environment": "production"
}
const main = async () => {
const elastic = getElasticClient();
if (!elastic) {
throw new Error('elastic not initialized');
}
const result = await elastic.search<DocumentType>({
size: 10000,
index: 'contribution-events',
query: {
"bool": {
"filter": [
{
"match_phrase": {
"type": "WHITEBOARD_RT_CONTRIBUTION"
}
},
],
}
}
});
const docs = result.hits.hits
// convert @timestamp field to Date object
.map(x => {
if (x._source) {
x._source['@timestamp'] = new Date(x._source['@timestamp']);
}
return x;
});
// group docs by the id field
const map = new Map<string, SearchHit<DocumentType>[]>();
docs.forEach(doc => {
if (doc._source) {
const id = doc._source.id;
const arr = map.get(id) ?? [];
arr.push(doc);
map.set(id, arr);
}
});
// for every entry in the map track if the time between two of the same values of author is less than 9 minutes
// if it's less than 9 minutes - add the _id field to an array and print it at the end
const duplicates: SearchHit<DocumentType>[] = [];
map.forEach((hits, id) => {
const sorted = hits.sort((a, b) => {
if (a._source && b._source) {
return a._source['@timestamp'].getTime() - b._source['@timestamp'].getTime();
}
return 0;
});
let lastTimestamp = 0;
// for every unique value of author check if the time between it and the last occurrence is less than 9 minutes
// if it is - add it to the duplicates array
const map = new Map<string, number>();
sorted.forEach(hit => {
if (hit._source) {
const author = hit._source.author;
const lastTimeStamp = map.get(author);
if (lastTimeStamp && hit._source['@timestamp'].getTime() - lastTimeStamp < TIME_WINDOWS_MS) {
duplicates.push(hit);
} else {
map.set(author, hit._source['@timestamp'].getTime());
}
}
});
});
const deleteResult = await elastic.deleteByQuery({
index: 'contribution-events',
human: true,
wait_for_completion: true,
query: {
ids: {
values: duplicates.map(x => x._id),
},
},
});
console.log(deleteResult);
};
main();
```