1
+ import * as imports from '@nobodyiam/proxy-runtime/assembly/imports' ;
2
+ import { free } from '@nobodyiam/proxy-runtime/assembly/malloc' ;
3
+ import { WasmResultValues , BufferTypeValues , LogLevelValues , log } from "@nobodyiam/proxy-runtime/assembly" ;
4
+
5
+ class ArrayBufferReference {
6
+ private buffer : usize ;
7
+ private size : usize ;
8
+ constructor ( ) {
9
+ }
10
+ sizePtr ( ) : usize {
11
+ return changetype < usize > ( this ) + offsetof < ArrayBufferReference > ( "size" ) ;
12
+ }
13
+ bufferPtr ( ) : usize {
14
+ return changetype < usize > ( this ) + offsetof < ArrayBufferReference > ( "buffer" ) ;
15
+ }
16
+ // Before calling toArrayBuffer below, you must call out to the host to fill in the values.
17
+ // toArrayBuffer below **must** be called once and only once.
18
+ toArrayBuffer ( ) : ArrayBuffer {
19
+ if ( this . size == 0 ) {
20
+ return new ArrayBuffer ( 0 ) ;
21
+ }
22
+ let array = changetype < ArrayBuffer > ( this . buffer ) ;
23
+ // host code used malloc to allocate this buffer.
24
+ // release the allocated ptr. array variable will retain it, so it won't be actually free (as it is ref counted).
25
+ free ( this . buffer ) ;
26
+ // should we return a this sliced up to size?
27
+ return array ;
28
+ }
29
+ }
30
+ var globalArrayBufferReference = new ArrayBufferReference ( ) ;
31
+ type ptr < T > = usize ;
32
+
33
+ export function registerId ( id : string ) : WasmResultValues {
34
+ const idBuffer = String . UTF8 . encode ( id ) ;
35
+ const result = imports . proxy_set_buffer_bytes ( BufferTypeValues . CallData , 0 , id . length ,
36
+ changetype < usize > ( idBuffer ) , idBuffer . byteLength ) ;
37
+ if ( result != WasmResultValues . Ok ) {
38
+ // @ts -ignore
39
+ log ( LogLevelValues . critical , `Unable to set http response body: ${ id } with result: ${ result } ` ) ;
40
+ }
41
+ return result ;
42
+ }
43
+
44
+ // @ts -ignore: decorator
45
+ @external ( "env" , "proxy_invoke_service" )
46
+ declare function proxy_invoke_service (
47
+ idPtr : ptr < u8 > ,
48
+ idSize : usize ,
49
+ methodPtr : ptr < u8 > ,
50
+ messageSize : ptr < usize > ,
51
+ paramPtr : ptr < u8 > ,
52
+ paramSize : usize ,
53
+ resultPtr : ptr < ptr < u8 > > ,
54
+ resultSize : ptr < usize > ,
55
+ ) : u32 ;
56
+
57
+ export function invokeService ( id : string , method : string , param : string ) : ArrayBuffer {
58
+ const idBuffer = String . UTF8 . encode ( id ) ;
59
+ const methodBuffer = String . UTF8 . encode ( method ) ;
60
+ const paramBuffer = String . UTF8 . encode ( param ) ;
61
+ let result = proxy_invoke_service (
62
+ changetype < usize > ( idBuffer ) , idBuffer . byteLength ,
63
+ changetype < usize > ( methodBuffer ) , methodBuffer . byteLength ,
64
+ changetype < usize > ( paramBuffer ) , paramBuffer . byteLength ,
65
+ globalArrayBufferReference . bufferPtr ( ) ,
66
+ globalArrayBufferReference . sizePtr ( ) ,
67
+ ) ;
68
+ if ( result == WasmResultValues . Ok ) {
69
+ return globalArrayBufferReference . toArrayBuffer ( ) ;
70
+ }
71
+ return new ArrayBuffer ( 0 ) ;
72
+ }
73
+
74
+ // @ts -ignore: decorator
75
+ @external ( "env" , "proxy_get_state" )
76
+ declare function proxy_get_state (
77
+ storeNamePtr : ptr < u8 > ,
78
+ storeNameSize : usize ,
79
+ keyPtr : ptr < u8 > ,
80
+ keySize : ptr < usize > ,
81
+ resultPtr : ptr < ptr < u8 > > ,
82
+ resultSize : ptr < usize > ,
83
+ ) : u32 ;
84
+
85
+ export function getState ( storeName : string , key : string ) : ArrayBuffer {
86
+ const storeNameBuffer = String . UTF8 . encode ( storeName ) ;
87
+ const keyBuffer = String . UTF8 . encode ( key ) ;
88
+ let result = proxy_get_state (
89
+ changetype < usize > ( storeNameBuffer ) , storeNameBuffer . byteLength ,
90
+ changetype < usize > ( keyBuffer ) , keyBuffer . byteLength ,
91
+ globalArrayBufferReference . bufferPtr ( ) ,
92
+ globalArrayBufferReference . sizePtr ( ) ,
93
+ ) ;
94
+ if ( result == WasmResultValues . Ok ) {
95
+ return globalArrayBufferReference . toArrayBuffer ( ) ;
96
+ }
97
+ return new ArrayBuffer ( 0 ) ;
98
+ }
0 commit comments