},
// scripts
async _out => {
- script(src="/js/api_call.js") {}
+ script(src="/js/utils.js") {}
script {
// this function can be overridden in a further script
},
// scripts
async _out => {
- //script(src="/js/api_call.js") {}
+ //script(src="/js/utils.js") {}
script {
let draft_timeout_running = false
+++ /dev/null
-Problem = class {
- constructor(title, detail, status) {
- this.title = title
- this.detail = detail
- this.status = status
- }
-
- static from(error) {
- return (
- error instanceof Problem ?
- error :
- new Problem('Bad request', (error.stack || error.message), 400)
- )
- }
-}
-
-api_call = async (endpoint, ...args) => {
- let response = await fetch(
- endpoint,
- {method: 'POST', body: JSON.stringify(args)}
- )
- let result = await response.json()
- if (!response.ok)
- throw new Problem(result.title, result.detail, result.status)
- return result
-}
--- /dev/null
+Mutex = class {
+ constructor() {
+ this.done = null
+ }
+
+ async acquire() {
+ while (this.done !== null)
+ await this.done.promise
+ let done = {}
+ done.promise = new Promise(
+ (resolve, reject) => {done.resolve = resolve}
+ )
+ this.done = done
+ }
+
+ release() {
+ let done = this.done
+ assert(done !== null)
+ this.done = null
+ done.resolve()
+ }
+}
+
+BinarySemaphore = class {
+ constructor(value) {
+ if (value)
+ this.done = null
+ else {
+ let done = {}
+ done.promise = new Promise(
+ (resolve, reject) => {done.resolve = resolve}
+ )
+ this.done = done
+ }
+ }
+
+ async acquire() {
+ while (this.done !== null)
+ await this.done.promise
+ let done = {}
+ done.promise = new Promise(
+ (resolve, reject) => {done.resolve = resolve}
+ )
+ this.done = done
+ }
+
+ try_acquire() {
+ if (this.done !== null)
+ return false
+ let done = {}
+ done.promise = new Promise(
+ (resolve, reject) => {done.resolve = resolve}
+ )
+ this.done = done
+ return true
+ }
+
+ release() {
+ let done = this.done
+ if (done === null)
+ return false
+ this.done = null
+ done.resolve()
+ return true
+ }
+}
+
+Problem = class {
+ constructor(title, detail, status) {
+ this.title = title
+ this.detail = detail
+ this.status = status
+ }
+
+ static from(error) {
+ return (
+ error instanceof Problem ?
+ error :
+ new Problem('Bad request', (error.stack || error.message), 400)
+ )
+ }
+}
+
+api_call = async (endpoint, ...args) => {
+ let response = await fetch(
+ endpoint,
+ {method: 'POST', body: JSON.stringify(args)}
+ )
+ let result = await response.json()
+ if (!response.ok)
+ throw new Problem(result.title, result.detail, result.status)
+ return result
+}
}
if (signed_in_as !== undefined) {
- //script(src="/js/api_call.js") {}
+ //script(src="/js/utils.js") {}
script {
let step_1_dirty = ${JSON.stringify(draft_details !== null)}
},
// scripts
async _out => {
- //script(src="/js/api_call.js") {}
+ //script(src="/js/utils.js") {}
script {
let step_1 = async () => {
},
// scripts
async _out => {
- //script(src="/js/api_call.js") {}
+ //script(src="/js/utils.js") {}
script {
let step_1 = async () => {
},
// scripts
async _out => {
- //script(src="/js/api_call.js") {}
+ //script(src="/js/utils.js") {}
script {
- let draft_timeout_running = false
- let draft_timeout_handler = async () => {
- draft_timeout_running = false
- await api_call(
- '/api/account/sign_up/set_draft.json',
- {
- email: document.getElementById('email').value.slice(0, 256).toLowerCase(),
- given_names: document.getElementById('given-names').value.slice(0, 256),
- family_name: document.getElementById('family-name').value.slice(0, 256),
- contact_me: document.getElementById('contact-me').checked ? true : false
+ let input_semaphore = new BinarySemaphore(false)
+ ;(
+ async () => {
+ while (true) {
+ await input_semaphore.acquire()
+ await new Promise(resolve => setTimeout(resolve, 3000))
+ input_semaphore.try_acquire()
+ await api_call(
+ '/api/account/sign_up/set_draft.json',
+ {
+ email: document.getElementById('email').value.slice(0, 256).toLowerCase(),
+ given_names: document.getElementById('given-names').value.slice(0, 256),
+ family_name: document.getElementById('family-name').value.slice(0, 256),
+ contact_me: document.getElementById('contact-me').checked ? true : false
+ }
+ )
}
- )
- //console.log('draft', await api_call('/api/account/sign_up/get_draft.json'))
- }
- let draft_change_handler = () => {
- if (!draft_timeout_running) {
- draft_timeout_running = true
- setTimeout(draft_timeout_handler, 5000)
}
- }
+ )() // ignore returned promise (start thread)
let details
let card_1 = async () => {
'DOMContentLoaded',
() => {
document.getElementById('given-names').addEventListener(
- 'change',
- draft_change_handler
+ 'input',
+ () => {input_semaphore.release()}
)
document.getElementById('family-name').addEventListener(
- 'change',
- draft_change_handler
+ 'input',
+ () => {input_semaphore.release()}
)
document.getElementById('email').addEventListener(
- 'change',
- draft_change_handler
- )
- document.getElementById('password').addEventListener(
- 'change',
- draft_change_handler
+ 'input',
+ () => {input_semaphore.release()}
)
+ //document.getElementById('password').addEventListener(
+ // 'input',
+ // () => {input_semaphore.release()}
+ //)
document.getElementById('contact-me').addEventListener(
- 'change',
- draft_change_handler
+ 'input',
+ () => {input_semaphore.release()}
)
+ //document.getElementById('verification-code').addEventListener(
+ // 'input',
+ // () => {input_semaphore.release()}
+ //)
let image_seq = 1
document.getElementById('card-1-new-code').addEventListener(
},
// scripts
async _out => {
- //script(src="/js/api_call.js") {}
+ //script(src="/js/utils.js") {}
script {
let step_1 = async () => {
},
// scripts
async _out => {
- //script(src="/js/api_call.js") {}
+ //script(src="/js/utils.js") {}
script {
let step_1 = async () => {