/**
 * async-lock sample.
 *  use promise.
 */
"use strict";

//const fs = require('fs');
const path = require('path');
//const https = require('https');
const express = require('express');

const app = express();

app.use(express.static(path.join(__dirname, 'public')));

// let webServer = https.createServer({
//     key: fs.readFileSync('server-key.pem'),
//     cert: fs.readFileSync('server-crt.pem'),
//     maxVersion: 'TLSv1.3',
//     minVersion: 'TLSv1',
//   }, app)
//   .listen(8443, function() {
//     console.log('start. (exit: Ctrl + C)');
//   }
// );
let webServer = app.listen(8080, () => {
    console.log('start. (exit: Ctrl + C)');
});

const AsyncLock = require('async-lock');
const lock = new AsyncLock({ timeout: 60000 });
const lockKey = 'key';

let count = 0;

// sleep function.
const sleep = (ms) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve();
        }, ms);
    });
};

// execute function.
async function execute(done) {
    console.log(Date.now() + ' execute');
    await sleep(5000);
    console.log(Date.now() + ' sleep end');
    count++;
    done(undefined, 'execute end. count=' + count);
}

app.get('/start-lock', (request, response) => {
    lock.acquire(lockKey, execute)
    .then(result => {
        // lock released.
        console.log(Date.now() + ' start-lock execute end.');
        console.log(Date.now() + ' response send start.');
        response.send(result);
        console.log(Date.now() + ' response send end.');
    }).catch(err => {
        // lock released.
        console.error(err.message);
        response.send('error.');
    });
});

app.get('/start-lock2', (request, response) => {
    lock.acquire(lockKey, execute)
    .then(result => {
        // lock released.
        console.log(Date.now() + ' start-lock2 execute end.');
        console.log(Date.now() + ' response send start.');
        response.send(result);
        console.log(Date.now() + ' response send end.');
    }).catch(err => {
        // lock released.
        console.error(err.message);
        response.send('error.');
    });
});