Skip to content

Commit e97c609

Browse files
committed
remove sync promise idea
1 parent b9114f1 commit e97c609

File tree

4 files changed

+76
-43
lines changed

4 files changed

+76
-43
lines changed

ts/asyncify-helpers.ts

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { isSuccess, SuccessOrFail } from './vm-interface'
2+
3+
export class SyncPromise<T> {
4+
constructor(public state: SuccessOrFail<T, unknown>) {}
5+
6+
then<R, R2 = never>(
7+
onSuccess: (value: T) => R,
8+
onFail?: (error: unknown) => R2
9+
): SyncPromise<R | R2> {
10+
try {
11+
if (isSuccess(this.state)) {
12+
return new SyncPromise({ value: onSuccess(this.state.value) })
13+
} else if (onFail) {
14+
return new SyncPromise({ value: onFail(this.state.error) })
15+
} else {
16+
return new SyncPromise(this.state)
17+
}
18+
} catch (error) {
19+
return new SyncPromise({ error })
20+
}
21+
}
22+
23+
catch<R>(fail: (error: unknown) => R): SyncPromise<T | R> {
24+
return this.then(
25+
value => value,
26+
error => fail(error)
27+
)
28+
}
29+
}
30+
31+
export function intoPromise<T>(value: T | Promise<T>): SyncPromise<T> | Promise<T> {
32+
if (value instanceof Promise) {
33+
return value
34+
}
35+
36+
return new SyncPromise({ value })
37+
}
38+
39+
export function unwrapPromise<T>(promise: SyncPromise<T> | Promise<T>): T | Promise<T> {
40+
if (promise instanceof SyncPromise) {
41+
if (isSuccess(promise.state)) {
42+
return promise.state.value
43+
} else {
44+
throw promise.state.error
45+
}
46+
}
47+
48+
return promise
49+
}
50+
51+
function assertSync<T>(value: T | Promise<T>): T {
52+
if (value && typeof value === 'object' && value instanceof Promise) {
53+
throw new Error('Function unexpectedly returned a Promise')
54+
}
55+
return value
56+
}

ts/ffi-asyncify.ts

+12-12
Original file line numberDiff line numberDiff line change
@@ -114,47 +114,47 @@ export class QuickJSAsyncFFI {
114114
QTS_IsJobPending: (rt: JSRuntimePointer) => number =
115115
this.module.cwrap("QTS_IsJobPending", "number", ["number"])
116116

117-
QTS_ExecutePendingJob_AssertSync: (rt: JSRuntimePointer, maxJobsToExecute: number) => JSValuePointer =
117+
QTS_ExecutePendingJob: (rt: JSRuntimePointer, maxJobsToExecute: number) => JSValuePointer =
118118
assertSync(this.module.cwrap("QTS_ExecutePendingJob", "number", ["number","number"]))
119119

120120
QTS_ExecutePendingJob_MaybeAsync: (rt: JSRuntimePointer, maxJobsToExecute: number) => JSValuePointer | Promise<JSValuePointer> =
121-
this.module.cwrap("QTS_ExecutePendingJob", "number", ["number","number"], { async: true })
121+
this.module.cwrap("QTS_ExecutePendingJob", "number", ["number","number"])
122122

123-
QTS_GetProp_AssertSync: (ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer) => JSValuePointer =
123+
QTS_GetProp: (ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer) => JSValuePointer =
124124
assertSync(this.module.cwrap("QTS_GetProp", "number", ["number","number","number"]))
125125

126126
QTS_GetProp_MaybeAsync: (ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer) => JSValuePointer | Promise<JSValuePointer> =
127-
this.module.cwrap("QTS_GetProp", "number", ["number","number","number"], { async: true })
127+
this.module.cwrap("QTS_GetProp", "number", ["number","number","number"])
128128

129-
QTS_SetProp_AssertSync: (ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer) => void =
129+
QTS_SetProp: (ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer) => void =
130130
assertSync(this.module.cwrap("QTS_SetProp", null, ["number","number","number","number"]))
131131

132132
QTS_SetProp_MaybeAsync: (ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer) => void | Promise<void> =
133-
this.module.cwrap("QTS_SetProp", null, ["number","number","number","number"], { async: true })
133+
this.module.cwrap("QTS_SetProp", null, ["number","number","number","number"])
134134

135135
QTS_DefineProp: (ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, get: JSValuePointer | JSValueConstPointer, set: JSValuePointer | JSValueConstPointer, configurable: boolean, enumerable: boolean, has_value: boolean) => void =
136136
this.module.cwrap("QTS_DefineProp", null, ["number","number","number","number","number","number","boolean","boolean","boolean"])
137137

138-
QTS_Call_AssertSync: (ctx: JSContextPointer, func_obj: JSValuePointer | JSValueConstPointer, this_obj: JSValuePointer | JSValueConstPointer, argc: number, argv_ptrs: JSValueConstPointerPointer) => JSValuePointer =
138+
QTS_Call: (ctx: JSContextPointer, func_obj: JSValuePointer | JSValueConstPointer, this_obj: JSValuePointer | JSValueConstPointer, argc: number, argv_ptrs: JSValueConstPointerPointer) => JSValuePointer =
139139
assertSync(this.module.cwrap("QTS_Call", "number", ["number","number","number","number","number"]))
140140

141141
QTS_Call_MaybeAsync: (ctx: JSContextPointer, func_obj: JSValuePointer | JSValueConstPointer, this_obj: JSValuePointer | JSValueConstPointer, argc: number, argv_ptrs: JSValueConstPointerPointer) => JSValuePointer | Promise<JSValuePointer> =
142-
this.module.cwrap("QTS_Call", "number", ["number","number","number","number","number"], { async: true })
142+
this.module.cwrap("QTS_Call", "number", ["number","number","number","number","number"])
143143

144144
QTS_ResolveException: (ctx: JSContextPointer, maybe_exception: JSValuePointer) => JSValuePointer =
145145
this.module.cwrap("QTS_ResolveException", "number", ["number","number"])
146146

147-
QTS_Dump_AssertSync: (ctx: JSContextPointer, obj: JSValuePointer | JSValueConstPointer) => string =
147+
QTS_Dump: (ctx: JSContextPointer, obj: JSValuePointer | JSValueConstPointer) => string =
148148
assertSync(this.module.cwrap("QTS_Dump", "string", ["number","number"]))
149149

150150
QTS_Dump_MaybeAsync: (ctx: JSContextPointer, obj: JSValuePointer | JSValueConstPointer) => string | Promise<string> =
151-
this.module.cwrap("QTS_Dump", "string", ["number","number"], { async: true })
151+
this.module.cwrap("QTS_Dump", "string", ["number","number"])
152152

153-
QTS_Eval_AssertSync: (ctx: JSContextPointer, js_code: HeapCharPointer, filename: string) => JSValuePointer =
153+
QTS_Eval: (ctx: JSContextPointer, js_code: HeapCharPointer, filename: string) => JSValuePointer =
154154
assertSync(this.module.cwrap("QTS_Eval", "number", ["number","number","string"]))
155155

156156
QTS_Eval_MaybeAsync: (ctx: JSContextPointer, js_code: HeapCharPointer, filename: string) => JSValuePointer | Promise<JSValuePointer> =
157-
this.module.cwrap("QTS_Eval", "number", ["number","number","string"], { async: true })
157+
this.module.cwrap("QTS_Eval", "number", ["number","number","string"])
158158

159159
QTS_Typeof: (ctx: JSContextPointer, value: JSValuePointer | JSValueConstPointer) => string =
160160
this.module.cwrap("QTS_Typeof", "string", ["number","number"])

ts/vm-asyncify.ts

-31
Original file line numberDiff line numberDiff line change
@@ -18,37 +18,6 @@ import {
1818
import { PureQuickJSVm, QuickJSHandle, QuickJSPropertyKey, QuickJSVm } from './vm'
1919
import { SuccessOrFail, VmFunctionImplementation } from './vm-interface'
2020

21-
class SyncPromise<T> {
22-
constructor(public value: T) {}
23-
24-
then<R>(fn: (value: T) => R): SyncPromise<R> {
25-
return new SyncPromise(fn(this.value))
26-
}
27-
}
28-
29-
function intoPromise<T>(value: T | Promise<T>): SyncPromise<T> | Promise<T> {
30-
if (value instanceof Promise) {
31-
return value
32-
}
33-
34-
return new SyncPromise(value)
35-
}
36-
37-
function unwrapPromise<T>(promise: SyncPromise<T> | Promise<T>): T | Promise<T> {
38-
if (promise instanceof SyncPromise) {
39-
return promise.value
40-
}
41-
42-
return promise
43-
}
44-
45-
function assertSync<T>(value: T | Promise<T>): T {
46-
if (value && typeof value === 'object' && value instanceof Promise) {
47-
throw new Error('Function unexpectedly returned a Promise')
48-
}
49-
return value
50-
}
51-
5221
export type ModuleExport =
5322
| {
5423
type: 'function'

ts/vm-interface.ts

+8
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ export type SuccessOrFail<S, F> =
1111
error: F
1212
}
1313

14+
export function isSuccess<S, F>(successOrFail: SuccessOrFail<S, F>): successOrFail is { value: S } {
15+
return 'error' in successOrFail === false
16+
}
17+
18+
export function isFail<S, F>(successOrFail: SuccessOrFail<S, F>): successOrFail is { error: F } {
19+
return 'error' in successOrFail === false
20+
}
21+
1422
/**
1523
* Used as an optional for results of a Vm call.
1624
* `{ value: VmHandle } | { error: VmHandle }`.

0 commit comments

Comments
 (0)