Consistency changes for the Problem object
[ndcode_site.git] / js / utils.js.min
1 Mutex = class {
2   constructor() {
3     this.done = null
4   }
5
6   async acquire() {
7     while (this.done !== null)
8       await this.done.promise
9     let done = {}
10     done.promise = new Promise(
11       (resolve, reject) => {done.resolve = resolve}
12     )
13     this.done = done
14   }
15
16   release() {
17     let done = this.done
18     assert(done !== null)
19     this.done = null
20     done.resolve()
21   }
22 }
23
24 BinarySemaphore = class {
25   constructor(value) {
26     if (value)
27       this.done = null
28     else {
29       let done = {}
30       done.promise = new Promise(
31         (resolve, reject) => {done.resolve = resolve}
32       )
33       this.done = done
34     }
35   }
36
37   async acquire() {
38     while (this.done !== null)
39       await this.done.promise
40     let done = {}
41     done.promise = new Promise(
42       (resolve, reject) => {done.resolve = resolve}
43     )
44     this.done = done
45   }
46
47   try_acquire() {
48     if (this.done !== null)
49       return false
50     let done = {}
51     done.promise = new Promise(
52       (resolve, reject) => {done.resolve = resolve}
53     )
54     this.done = done
55     return true
56   }
57
58   release() {
59     let done = this.done
60     if (done === null)
61       return false
62     this.done = null
63     done.resolve()
64     return true
65   }
66 }
67
68 Problem = class {
69   constructor(title, detail, status) {
70     this.title = title
71     this.detail = detail
72     this.status = status
73   }
74
75   // note: Javascript errors return status 400 (Bad request) in the client
76   // version of Problem, 500 (Internal server error) in the server version
77   static from(error) {
78     return (
79       error instanceof Problem ?
80         error :
81         new Problem(
82           'Bad request',
83           (error.stack || error.message),
84           400
85         )
86     )
87   }
88 }
89
90 api_call = async (endpoint, ...args) => {
91   let response = await fetch(
92     endpoint,
93     {method: 'POST', body: JSON.stringify(args)}
94   )
95   let result = await response.json()
96   if (!response.ok)
97     throw new Problem(result.title, result.detail, result.status)
98   return result
99 }