1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
/// @file WASM shim for kj/async-io.h
#pragma once
#include "async.h"
namespace kj {
// ---- Timer ----
struct Timer
{
Promise<void> afterDelay(Duration)
{
return {};
}
template<typename T>
Promise<T> timeoutAfter(Duration, Promise<T> p)
{
return p;
}
};
// ---- AsyncIoProvider ----
struct AsyncIoProvider
{
Timer & getTimer()
{
static Timer t;
return t;
}
};
// ---- UnixEventPort ----
struct UnixEventPort
{
struct FdObserver
{
enum Flags { OBSERVE_READ = 1, OBSERVE_WRITE = 2, OBSERVE_READ_WRITE = 3 };
FdObserver(UnixEventPort &, int, Flags) {}
Promise<void> whenBecomesReadable()
{
return {};
}
Promise<void> whenBecomesWritable()
{
return {};
}
};
};
// ---- LowLevelAsyncIoProvider ----
struct LowLevelAsyncIoProvider
{
UnixEventPort & getUnixEventPort()
{
static UnixEventPort p;
return p;
}
};
// ---- AsyncIoContext ----
// provider and lowLevelProvider are Own<> (pointer-like) in real KJ —
// the code accesses them as *aio.provider, *aio.lowLevelProvider.
// unixEventPort is kj::UnixEventPort& — the code accesses it directly.
struct AsyncIoContext
{
// Use Own<> (unique_ptr) so *aio.provider dereferences correctly.
Own<AsyncIoProvider> provider;
Own<LowLevelAsyncIoProvider> lowLevelProvider;
WaitScope waitScope;
UnixEventPort unixEventPort;
};
inline AsyncIoContext setupAsyncIo()
{
AsyncIoContext ctx;
ctx.provider = std::make_unique<AsyncIoProvider>();
ctx.lowLevelProvider = std::make_unique<LowLevelAsyncIoProvider>();
return ctx;
}
struct AsyncObject
{};
} // namespace kj
|