aboutsummaryrefslogtreecommitdiff
path: root/src/server/database.ts
diff options
context:
space:
mode:
authorab <abdullah_ahmed@brown.edu>2019-04-07 10:34:27 -0400
committerab <abdullah_ahmed@brown.edu>2019-04-07 10:34:27 -0400
commit2c248fdf429d70424e398ff2b718c89f802025e9 (patch)
treeae0737b78b75dffc30002e4048abd32fe038eb78 /src/server/database.ts
parent49310acbdfd7ca239c939208b3766c54e980f6f1 (diff)
parentb680f3db2f9fb6dc65f47848234e96453ef60a5c (diff)
ab committed this
Diffstat (limited to 'src/server/database.ts')
-rw-r--r--src/server/database.ts46
1 files changed, 30 insertions, 16 deletions
diff --git a/src/server/database.ts b/src/server/database.ts
index 374cedcbb..415acc09a 100644
--- a/src/server/database.ts
+++ b/src/server/database.ts
@@ -1,8 +1,4 @@
-import { action, configure } from 'mobx';
import * as mongodb from 'mongodb';
-import { ObjectID } from 'mongodb';
-import { Transferable } from './Message';
-import { Utils } from '../Utils';
export class Database {
public static Instance = new Database()
@@ -16,21 +12,39 @@ export class Database {
})
}
+ private currentWrites: { [_id: string]: Promise<void> } = {};
+
public update(id: string, value: any, callback: () => void) {
if (this.db) {
let collection = this.db.collection('documents');
- collection.updateOne({ _id: id }, { $set: value }, {
- upsert: true
- }, (err, res) => {
- if (err) {
- console.log(err.message);
- console.log(err.errmsg);
- }
- // if (res) {
- // console.log(JSON.stringify(res.result));
- // }
- callback()
- });
+ const prom = this.currentWrites[id];
+ const run = (promise: Promise<void>, resolve?: () => void) => {
+ collection.updateOne({ _id: id }, { $set: value }, {
+ upsert: true
+ }, (err, res) => {
+ if (err) {
+ console.log(err.message);
+ console.log(err.errmsg);
+ }
+ // if (res) {
+ // console.log(JSON.stringify(res.result));
+ // }
+ if (this.currentWrites[id] === promise) {
+ delete this.currentWrites[id]
+ }
+ if (resolve) {
+ resolve();
+ }
+ callback();
+ });
+ }
+ if (prom) {
+ const newProm: Promise<void> = prom.then(() => run(newProm));
+ this.currentWrites[id] = newProm;
+ } else {
+ const newProm: Promise<void> = new Promise<void>(res => run(newProm, res))
+ this.currentWrites[id] = newProm;
+ }
}
}