env.now = XDate.now()
let transaction = await this.database.Transaction()
try {
- let sessions = await (
- await transaction.get({})
- ).get('sessions', {})
+ let root = await transaction.get({})
+ let sessions = await root.get('sessions', {})
let cookies = cookie.parse(env.request.headers.cookie || '')
let session, expires = new XDate(env.now)
-return async (env, transaction, session) => {
- let accounts = await (
- await transaction.get({})
- ).get('accounts', {})
-
+return async (root, session) => {
let signed_in_as = await session.get('signed_in_as', null)
- return (
- signed_in_as !== null ?
- await accounts.get(signed_in_as, {}) :
- undefined
- )
+ if (signed_in_as === null)
+ return undefined
+ let accounts = await root.get('accounts', {})
+ return await accounts.get(signed_in_as, {})
}
+++ /dev/null
-return async (env, transaction) => {
- return /*await*/ (
- await transaction.get({})
- ).get('globals', {})
-}
let nodemailer = require('nodemailer')
-return async (env, transaction, name) => {
- return nodemailer.createTransport(
- await (
- await (
- await transaction.get({})
- ).get('nodemailer')
- ).get_json(name)
- )
+return async (root, name) => {
+ let _nodemailer = await root.get('nodemailer')
+ return nodemailer.createTransport(await _nodemailer.get_json(name))
}
let XDate = require('xdate')
-return async (env, transaction) => {
- let sessions = await (
- await transaction.get({})
- ).get('sessions', {})
-
+return async (env, root) => {
+ let sessions = await root.get('sessions', {})
let session = await sessions.get(env.session_key)
if (session === undefined) {
// this should never happen, but could happen if we take more than a day
return async (env, head, body, scripts) => {
//let cart = await _require('/online_store/cart.jst')
- let get_globals = await _require('/_lib/get_globals.jst')
let get_session = await _require('/_lib/get_session.jst')
//let icon_cart_small = await env.site.get_min_svg('/_svg/icon_cart_small.svg')
let icon_search_mono = await env.site.get_min_svg('/_svg/icon_search_mono.svg')
// initialize env.cart
//await cart(env)
- let transaction = await env.site.Transaction()
- let signed_in_as, site_title, copyright
+ let transaction = await env.site.database.Transaction()
+ let signed_in_as
+ let site_title, copyright
try {
- let session = await get_session(env, transaction)
- signed_in_as = session.get_json('signed_in_as', null)
+ let root = await transaction.get({})
- let globals = await get_globals(env, transaction)
- site_title = globals.get_json('site_title')
- copyright = globals.get_json('copyright')
+ let session = await get_session(env, root)
+ signed_in_as = await session.get_json('signed_in_as', null)
+
+ let globals = await root.get('globals', {})
+ site_title = await globals.get_json('site_title')
+ copyright = await globals.get_json('copyright')
}
finally {
transaction.rollback()
else
a#sign-out(href="#" style="display: none;") {'Sign out'}
}
-
+
form(action="/search/index.html") {
div.input-group {
input.form-control(name="query" type="text" placeholder="Search" aria-describedby="search-button") {}
}
}
}
-
+
//div.'col-sm-1'.vbottom {
// // a nested div is used to avoid hover colour on the padding
// div.nav-li-a(style="text-align: center;") {
// initialize env.session_key, set cookie in env.response
let transaction = await env.site.database.Transaction()
- let session = await get_session(env, transaction)
+ try {
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
- let pageview = await (
- await (
- await transaction.get({})
- ).get('pageviews', {})
- ).get(env.parsed_url.pathname, {})
- pageview.set('visits', (await pageview.get('visits') || 0) + 1)
+ let pageviews = await root.get('pageviews', {})
+ let pageview = await pageviews.get(env.parsed_url.pathname, {})
+ pageview.set('visits', (await pageview.get('visits') || 0) + 1)
- let session_pageviews = await session.get('pageviews', {})
- let i = await session_pageviews.get(env.parsed_url.pathname)
- if (i === undefined) {
- pageview.set(
- 'unique_visits',
- (await pageview.get('unique_visits') || 0) + 1
- )
- i = 0
- }
- session_pageviews.set(env.parsed_url.pathname, i + 1)
+ let session_pageviews = await session.get('pageviews', {})
+ let i = await session_pageviews.get(env.parsed_url.pathname)
+ if (i === undefined) {
+ pageview.set(
+ 'unique_visits',
+ (await pageview.get('unique_visits') || 0) + 1
+ )
+ i = 0
+ }
+ session_pageviews.set(env.parsed_url.pathname, i + 1)
- await transaction.commit()
+ await transaction.commit()
+ }
+ catch (error) {
+ transaction.rollback()
+ throw error
+ }
let _out = []
_out.push('<!doctype html>')
)
return
}
-
+
env.site.serve(
env,
200,
async () => {
let transaction = await env.site.database.Transaction()
try {
- let account = await get_account(
- env,
- transaction,
- await get_session(env, transaction)
- )
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
+
+ let account = await get_account(root, session)
if (account === undefined)
throw new Problem('Unauthorized', 'Please sign in first.', 401)
- let details = {
+ return {
given_names: await account.get_json('given_names'),
family_name: await account.get_json('family_name'),
contact_me: await account.get_json('contact_me')
}
-
- await transaction.commit()
- return details
}
- catch (error) {
+ finally {
transaction.rollback()
- throw error
}
}
)
async () => {
let transaction = await env.site.database.Transaction()
try {
- // initialize env.session_key, set cookie in env.response
- let session = await get_session(env, transaction)
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
let change_details_draft = await session.get('change_details_draft')
- let details =
+ return (
change_details_draft !== undefined &&
XDate.now() < await change_details_draft.get_json('expires') ?
{
contact_me: await change_details_draft.get_json('contact_me')
} :
null
-
- await transaction.commit()
- return details
+ )
}
- catch (error) {
+ finally {
transaction.rollback()
- throw error
}
}
)
let transaction = await env.site.database.Transaction()
try {
- let account = await get_account(
- env,
- transaction,
- await get_session(env, transaction)
- )
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
+
+ let account = await get_account(root, session)
if (account === undefined)
throw new Problem('Unauthorized', 'Please sign in first.', 401)
let transaction = await env.site.database.Transaction()
try {
- // initialize env.session_key, set cookie in env.response
- let session = await get_session(env, transaction)
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
if (details) {
let expires = new XDate()
let transaction = await env.site.database.Transaction()
try {
- let account = await get_account(
- env,
- transaction,
- await get_session(env, transaction)
- )
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
+
+ let account = await get_account(root, session)
if (account === undefined)
throw new Problem('Unauthorized', 'Please sign in first.', 401)
let XDate = require('xdate')
return async env => {
- let get_globals = await _require('/_lib/get_globals.jst')
let get_nodemailer = await _require('/_lib/get_nodemailer.jst')
- let get_session = await _require('/_lib/get_session.jst')
let post_request = await _require('/_lib/post_request.jst')
let Problem = await _require('/_lib/Problem.jst')
let transaction = await env.site.database.Transaction()
let link_code
- let nodemailer, noreply_from, noreply_signature
+ let nodemailer
+ let noreply_from, noreply_signature
let given_names, family_name
try {
- // initialize env.session_key, set cookie in env.response
- await get_session(env, transaction)
-
- let account = await (
- await (
- await transaction.get({})
- ).get('accounts', {})
- ).get(email)
+ let root = await transaction.get({})
+ let accounts = await root.get('accounts', {})
+ let account = await accounts.get(email)
if (account === undefined)
throw new Problem(
'Account does not exist',
{password, link_code, expires: expires.getTime()}
)
- nodemailer = await get_nodemailer(env, transaction, 'noreply')
- let globals = await get_globals(env, transaction)
+ nodemailer = await get_nodemailer(root, 'noreply')
+
+ let globals = await root.get('globals', {})
site_url = await globals.get_json('site_url')
noreply_from = await globals.get_json('noreply_from')
noreply_signature = await globals.get_json('noreply_signature')
let transaction = await env.site.database.Transaction()
try {
- // initialize env.session_key, set cookie in env.response
- let session = await get_session(env, transaction)
+ let root = await transaction.get({})
- let account = await (
- await (
- await transaction.get({})
- ).get('accounts', {})
- ).get(email)
+ let accounts = await root.get('accounts', {})
+ let account = await accounts.get(email)
if (
account === undefined ||
password !== await account.get_json('password')
425
)
+ let session = await get_session(env, root)
session.set_json('signed_in_as', email)
await transaction.commit()
}
async () => {
let transaction = await env.site.database.Transaction()
try {
- // initialize env.session_key, set cookie in env.response
- let session = await get_session(env, transaction)
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
session.set('signed_in_as', null)
await transaction.commit()
let transaction = await env.site.database.Transaction()
try {
- // initialize env.session_key, set cookie in env.response
- let session = await get_session(env, transaction)
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
let captcha = await session.get('captcha')
if (
`Please call the "/api/verification_image.png" endpoint to create a verification image, in same session as the "/api/account/sign_up/create_account.json" call and less than one hour prior.`,
418
)
-
+
let captcha_text = await captcha.get_json('text')
if (verification_code !== captcha_text) {
console.log(`verification code mismatch, \"${verification_code}\" should be \"${captcha_text}\"`)
)
}
- let accounts = await (
- await transaction.get({})
- ).get('accounts', {})
-
+ let accounts = await root.get('accounts', {})
if (accounts.has(details.email))
throw new Problem(
'Account already exists',
async () => {
let transaction = await env.site.database.Transaction()
try {
- // initialize env.session_key, set cookie in env.response
- let session = await get_session(env, transaction)
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
let sign_up_draft = await session.get('sign_up_draft')
- let details =
+ return (
sign_up_draft !== undefined &&
XDate.now() < await sign_up_draft.get_json('expires') ?
{
contact_me: await sign_up_draft.get_json('contact_me')
} :
null
-
- await transaction.commit()
- return details
+ )
}
- catch (error) {
+ finally {
transaction.rollback()
- throw error
}
}
)
let XDate = require('xdate')
return async env => {
- let get_globals = await _require('/_lib/get_globals.jst')
let get_nodemailer = await _require('/_lib/get_nodemailer.jst')
- let get_session = await _require('/_lib/get_session.jst')
let post_request = await _require('/_lib/post_request.jst')
let Problem = await _require('/_lib/Problem.jst')
let transaction = await env.site.database.Transaction()
let link_code
- let nodemailer, site_url, noreply_from, noreply_signature
+ let nodemailer
+ let site_url, noreply_from, noreply_signature
let given_names, family_name
try {
- // initialize env.session_key, set cookie in env.response
- await get_session(env, transaction)
-
- let account = await (
- await (
- await transaction.get({})
- ).get('accounts', {})
- ).get(email)
+ let root = await transaction.get({})
+ let accounts = await root.get('accounts', {})
+ let account = await accounts.get(email)
if (account === undefined)
throw new Problem(
'Account does not exist',
{link_code, expires: expires.getTime()}
)
- nodemailer = await get_nodemailer(env, transaction, 'noreply')
- let globals = await get_globals(env, transaction)
+ nodemailer = await get_nodemailer(root, 'noreply')
+
+ let globals = await root.get('globals', {})
site_url = await globals.get_json('site_url')
noreply_from = await globals.get_json('noreply_from')
noreply_signature = await globals.get_json('noreply_signature')
let transaction = await env.site.database.Transaction()
try {
- // initialize env.session_key, set cookie in env.response
- let session = await get_session(env, transaction)
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
if (details) {
let expires = new XDate()
return async env => {
let post_request = await _require('/_lib/post_request.jst')
- let get_session = await _require('/_lib/get_session.jst')
let Problem = await _require('/_lib/Problem.jst')
await post_request(
let transaction = await env.site.database.Transaction()
try {
- // initialize env.session_key, set cookie in env.response
- await get_session(env, transaction)
-
- let account = await (
- await (
- await transaction.get({})
- ).get('accounts', {})
- ).get(email)
+ let root = await transaction.get({})
+ let accounts = await root.get('accounts', {})
+ let account = await accounts.get(email)
if (account === undefined)
throw new Problem(
'Account does not exist',
await account.delete('verify_email')
await account.set('email_verified', true)
-
await transaction.commit()
}
catch (error) {
return async env => {
let post_request = await _require('/_lib/post_request.jst')
- let get_session = await _require('/_lib/get_session.jst')
let Problem = await _require('/_lib/Problem.jst')
await post_request(
let transaction = await env.site.database.Transaction()
try {
- // initialize env.session_key, set cookie in env.response
- await get_session(env, transaction)
-
- let account = await (
- await (
- await transaction.get({})
- ).get('accounts', {})
- ).get(email)
+ let root = await transaction.get({})
+ let accounts = await root.get('accounts', {})
+ let account = await accounts.get(email)
if (account === undefined)
throw new Problem(
'Account does not exist',
async () => {
let transaction = await env.site.database.Transaction()
try {
- // initialize env.session_key, set cookie in env.response
- let session = await get_session(env, transaction)
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
let contact_draft = await session.get('contact_draft')
- let details =
+ return (
contact_draft !== undefined &&
XDate.now() < await contact_draft.get_json('expires') ?
{
message: await contact_draft.get_json('message')
} :
null
-
- await transaction.commit()
- return details
+ )
}
- catch (error) {
+ finally {
transaction.rollback()
- throw error
}
}
)
let XDate = require('xdate')
return async env => {
- let get_globals = await _require('/_lib/get_globals.jst')
let get_nodemailer = await _require('/_lib/get_nodemailer.jst')
- let get_session = await _require('/_lib/get_session.jst')
let post_request = await _require('/_lib/post_request.jst')
let Problem = await _require('/_lib/Problem.jst')
)
let transaction = await env.site.database.Transaction()
- let nodemailer, contact_from, contact_to
+ let nodemailer
+ let contact_from, contact_to
try {
- // initialize env.session_key, set cookie in env.response
- get_session(env, transaction)
+ let root = await transaction.get({})
- nodemailer = await get_nodemailer(env, transaction, 'contact')
- let globals = await get_globals(env, transaction)
+ nodemailer = await get_nodemailer(root, 'contact')
+
+ let globals = await root.get('globals', {})
contact_from = await globals.get_json('contact_from')
contact_to = await globals.get_json('contact_to')
-
- await transaction.commit()
}
- catch (error) {
+ finally {
transaction.rollback()
- throw error
}
let name =
let transaction = await env.site.database.Transaction()
try {
- // initialize env.session_key, set cookie in env.response
- let session = await get_session(env, transaction)
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
if (details) {
let expires = new XDate()
return async env => {
let get_nodemailer = await _require('/_lib/get_nodemailer.jst')
- let get_session = await _require('/_lib/get_session.jst')
let post_request = await _require('/_lib/post_request.jst')
await post_request(
)
let transaction = await env.site.database.Transaction()
- let nodemailer, feedback_from, feedback_to
+ let nodemailer
+ let feedback_from, feedback_to
try {
- // initialize env.session_key, set cookie in env.response
- await get_session(env, transaction)
+ let root = await transaction.get({})
- nodemailer = await get_nodemailer(env, transaction, 'feedback')
- let globals = await get_globals(env, transaction)
+ nodemailer = await get_nodemailer(root, 'feedback')
+
+ let globals = await root.get('globals', {})
feedback_from = await globals.get_json('feedback_from')
feedback_to = await globals.get_json('feedback_to')
-
- await transaction.commit()
}
- catch (error) {
+ finally {
transaction.rollback()
- throw error
}
await nodemailer.sendMail(
async () => {
let transaction = await env.site.database.Transaction()
try {
- let account = await get_account(
- env,
- transaction,
- await get_session(env, transaction)
- )
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
+
+ let account = await get_account(root, session)
if (account === undefined)
throw new Problem('Unauthorized', 'Please sign in first.', 401)
if (!await account.get_json('administrator'))
throw new Problem('Unauthorized', 'Not administrator.', 401)
- globals = await (await transaction.get({})).get_json('globals', {})
-
- await transaction.commit()
- return globals
+ return /*await*/ root.get_json('globals', {})
}
- catch (error) {
+ finally {
transaction.rollback()
- throw error
}
}
)
let transaction = await env.site.database.Transaction()
try {
- let account = await get_account(
- env,
- transaction,
- await get_session(env, transaction)
- )
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
+
+ let account = await get_account(root, session)
if (account === undefined)
throw new Problem('Unauthorized', 'Please sign in first.', 401)
if (!await account.get_json('administrator'))
throw new Problem('Unauthorized', 'Not administrator.', 401)
- ;(await transaction.get({})).set_json('globals', globals)
+ root.set_json('globals', globals)
await transaction.commit()
}
catch (error) {
async () => {
let transaction = await env.site.database.Transaction()
try {
- let account = await get_account(
- env,
- transaction,
- await get_session(env, transaction)
- )
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
+
+ let account = await get_account(root, session)
if (account === undefined)
throw new Problem('Unauthorized', 'Please sign in first.', 401)
-
if (!await account.get_json('administrator'))
throw new Problem('Unauthorized', 'Not administrator.', 401)
- nodemailer = await (
- await transaction.get({})
- ).get_json('nodemailer', {})
-
- await transaction.commit()
- return nodemailer
+ return /*await*/ root.get_json('nodemailer', {})
}
- catch (error) {
+ finally {
transaction.rollback()
- throw error
}
}
)
let transaction = await env.site.database.Transaction()
try {
- let account = await get_account(
- env,
- transaction,
- await get_session(env, transaction)
- )
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
+
+ let account = await get_account(root, session)
if (account === undefined)
throw new Problem('Unauthorized', 'Please sign in first.', 401)
-
if (!await account.get_json('administrator'))
throw new Problem('Unauthorized', 'Not administrator.', 401)
- ;(await transaction.get({})).set_json('nodemailer', nodemailer)
+ root.set_json('nodemailer', nodemailer)
await transaction.commit()
}
catch (error) {
let captcha = captchagen.create()
captcha.generate()
- // initialize env.session_key, set cookie in env.response
let transaction = await env.site.database.Transaction()
- let session = await get_session(env, transaction)
+ try {
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
- // store captcha text in the session for validation when form submitted
- let expires = new XDate()
- expires.addHours(1)
- session.set_json(
- 'captcha',
- {text: captcha.text(), expires: expires.getTime()}
- )
+ // store captcha text in the session for validation when form submitted
+ let expires = new XDate(env.now)
+ expires.addHours(1)
+ session.set_json(
+ 'captcha',
+ {text: captcha.text(), expires: expires.getTime()}
+ )
- await transaction.commit()
+ await transaction.commit()
+ }
+ catch (error) {
+ transaction.rollback()
+ throw error
+ }
// serve the png file
env.caching = false
return async env => {
- let post = await _require('/_lib/post.jst')
+ let post = await _require('/_lib/post.jst')
await post(
env,
i {'reference'}
' to the just-written element, rather than the full text of the element itself:'
}
-
+
pre {
`[
"Hello",
' or '
tt {'Object'}
' as not conflicting.'
- }
+ }
p {'Currently there is a bit of a risk that if I do not implement good try/catch handling in my code, then a webserver request will crash, leaving the webserver running but the mutex in ‘held’ state. This would hang the webserver, requiring a manual restart. I could implement some sort of disaster recovery, but there is probably no point at this time, I will simply use try/catch and make sure transactions are rolled back if not completed.'}
-
+
h4 {'Conclusion'}
p {'The log-structured format provides a useful way of maintaining huge JSON files. It remains to complete the documentation and release the source code and NPM package. It also remains to implement a stress test of my website, once up and running, to simulate thousands of user accounts and multiple logins to the same account all performing transactions simultaneously. Therefore, things are still experimental at this stage. I enjoy writing this blog to update on those experiments.'}
let breadcrumbs = await _require('/_lib/breadcrumbs.jst')
let menu = await env.site.get_menu('/blog/_menu.json')
let navbar = await _require('/_lib/navbar.jst')
-
+
await navbar(
env,
async _out => {},
return async env => {
let breadcrumbs = await _require('/_lib/breadcrumbs.jst')
+ let get_session = await _require('/_lib/get_session.jst')
let icon_cross = await env.site.get_min_svg('/_svg/icon_cross.svg')
let icon_tick = await env.site.get_min_svg('/_svg/icon_tick.svg')
let navbar = await _require('/_lib/navbar.jst')
- let get_session = await _require('/_lib/get_session.jst')
// preload draft details if any
- let transaction = await env.site.database.Transaction(), draft_details
+ let transaction = await env.site.database.Transaction()
+ let draft_details
try {
- // initialize env.session_key, set cookie in env.response
- let session = await get_session(env, transaction)
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
let contact_draft = await session.get('contact_draft')
draft_details =
message: await contact_draft.get_json('message')
} :
null
-
- await transaction.commit()
}
- catch (error) {
+ finally {
transaction.rollback()
- throw error
}
console.log('draft_details', JSON.stringify(draft_details))
return async env => {
let breadcrumbs = await _require('/_lib/breadcrumbs.jst')
let navbar = await _require('/_lib/navbar.jst')
-
+
await navbar(
env,
// head
let serve_html = async (env, pathname) => {
// read HTML file
- let data
+ let data
try {
data = await env.site.min_html_cache.get(pathname)
}
)
return
return /*await*/ env.site.serve_path(env, pathname, components)
-}
+}
let transaction = await env.site.database.Transaction()
let signed_in_as, details, draft_details
try {
- let session = await get_session(env, transaction)
+ let root = await transaction.get({})
+
+ let session = await get_session(env, root)
signed_in_as = await session.get_json('signed_in_as', null)
- let account = await get_account(env, transaction, session)
+ let account = await get_account(root, session)
if (account !== undefined) {
details = {
given_names: await account.get_json('given_names'),
} :
null
}
- await transaction.commit()
}
- catch (error) {
+ finally {
transaction.rollback()
- throw error
}
console.log(
'details',
step_1_dirty = true
document.getElementById('step-1-revert').disabled = false
document.getElementById('step-1-save').disabled = false
-
+
if (!draft_timeout_running) {
draft_timeout_running = true
setTimeout(draft_timeout_handler, 5000)
$('#step-1-cross').hide()
$('#step-1-spinner').show()
- let details
+ let details
try {
details = await api_account_change_details_get()
}
400
)
console.log(problem.detail)
-
+
$('#step-1-tick').hide()
$('#step-1-cross').show()
$('#step-1-spinner').hide()
$('#step-1-tick').hide()
$('#step-1-cross').hide()
$('#step-1-spinner').show()
-
+
try {
await api_account_change_details_set(
{
400
)
console.log(problem.detail)
-
+
$('#step-1-tick').hide()
$('#step-1-cross').show()
$('#step-1-spinner').hide()
$('#step-2-tick').hide()
$('#step-2-cross').hide()
$('#step-2-spinner').show()
-
+
try {
await api_account_change_password(
// old_password
400
)
console.log(problem.detail)
-
+
$('#step-2-tick').hide()
$('#step-2-cross').show()
$('#step-2-spinner').hide()
let icon_cross = await env.site.get_min_svg('/_svg/icon_cross.svg')
let icon_tick = await env.site.get_min_svg('/_svg/icon_tick.svg')
let navbar = await _require('/_lib/navbar.jst')
- let get_session = await _require('/_lib/get_session.jst')
// preload draft details if any
let details = {}
let step_1 = async () => {
if (
- !document.getElementById('email').reportValidity() ||
+ !document.getElementById('email').reportValidity() ||
!document.getElementById('password').reportValidity()
) {
$('#step-1-tick').hide()
let icon_cross = await env.site.get_min_svg('/_svg/icon_cross.svg')
let icon_tick = await env.site.get_min_svg('/_svg/icon_tick.svg')
let navbar = await _require('/_lib/navbar.jst')
- let get_session = await _require('/_lib/get_session.jst')
// preload draft details if any
let details = {}
return async env => {
let breadcrumbs = await _require('/_lib/breadcrumbs.jst')
+ let get_session = await _require('/_lib/get_session.jst')
let icon_cross = await env.site.get_min_svg('/_svg/icon_cross.svg')
let icon_tick = await env.site.get_min_svg('/_svg/icon_tick.svg')
let navbar = await _require('/_lib/navbar.jst')
- let get_session = await _require('/_lib/get_session.jst')
// preload draft details if any
- let transaction = await env.site.database.Transaction(), draft_details
+ let transaction = await env.site.database.Transaction()
+ let draft_details
try {
- // initialize env.session_key, set cookie in env.response
- let session = await get_session(env, transaction)
+ let root = await transaction.get({})
+ let session = await get_session(env, root)
let sign_up_draft = await session.get('sign_up_draft')
draft_details =
contact_me: await sign_up_draft.get_json('contact_me')
} :
null
-
- await transaction.commit()
}
- catch (error) {
+ finally {
transaction.rollback()
- throw error
}
console.log('draft_details', JSON.stringify(draft_details))
let icon_cross = await env.site.get_min_svg('/_svg/icon_cross.svg')
let icon_tick = await env.site.get_min_svg('/_svg/icon_tick.svg')
let navbar = await _require('/_lib/navbar.jst')
- let get_session = await _require('/_lib/get_session.jst')
// preload draft details if any
let details = {}
let icon_cross = await env.site.get_min_svg('/_svg/icon_cross.svg')
let icon_tick = await env.site.get_min_svg('/_svg/icon_tick.svg')
let navbar = await _require('/_lib/navbar.jst')
- let get_session = await _require('/_lib/get_session.jst')
// preload draft details if any
let details = {}
let icon_jst = await env.site.get_min_svg('/_svg/icon_jst.svg')
let navbar = await _require('/_lib/navbar.jst')
let icon_pitree = await env.site.get_min_svg('/_svg/icon_pitree.svg')
-
+
await navbar(
env,
// head
async _out => {
async function breadcrumbs_str(pathname) {
assert(pathname.slice(0, 1) === '/')
-
+
// find names of path components
console.log('pathname', pathname)
let components = ['Home']
components.push(menu.entries[menu.index[dir]].name)
}
- return components.join(' > ')
+ return components.join(' > ')
}
await breadcrumbs(env, _out)
'Query: '
strong {`${query}`}
}
-
+
if (search.results.length) {
p {`Showing results ${first + 1}–${first + search.results.length} of ${search.total_results}`}
let serve_html = async (env, pathname) => {
// read HTML file
- let data
+ let data
try {
data = await env.site.min_html_cache.get(pathname)
}
)
return
return /*await*/ env.site.serve_path(env, pathname, components)
-}
+}