3
3
#[ macro_use]
4
4
extern crate napi_derive;
5
5
6
- use napi:: { CallContext , Env , Error , JsBuffer , JsBufferValue , JsObject , Ref , Result , Status , Task } ;
6
+ use std:: ffi:: CString ;
7
+
8
+ use napi:: {
9
+ CallContext , Env , Error , JsBoolean , JsBuffer , JsBufferValue , JsObject , JsUnknown , Ref , Result ,
10
+ Status , Task ,
11
+ } ;
7
12
use snap:: raw:: { Decoder , Encoder } ;
8
13
9
14
#[ cfg( all(
@@ -48,11 +53,12 @@ impl Task for Enc {
48
53
struct Dec {
49
54
inner : Decoder ,
50
55
data : Ref < JsBufferValue > ,
56
+ as_buffer : bool ,
51
57
}
52
58
53
59
impl Task for Dec {
54
60
type Output = Vec < u8 > ;
55
- type JsValue = JsBuffer ;
61
+ type JsValue = JsUnknown ;
56
62
57
63
fn compute ( & mut self ) -> Result < Self :: Output > {
58
64
let data_ref: & [ u8 ] = & self . data ;
@@ -63,7 +69,15 @@ impl Task for Dec {
63
69
}
64
70
65
71
fn resolve ( self , env : Env , output : Self :: Output ) -> Result < Self :: JsValue > {
66
- env. create_buffer_with_data ( output) . map ( |b| b. into_raw ( ) )
72
+ if self . as_buffer {
73
+ env
74
+ . create_buffer_with_data ( output)
75
+ . map ( |b| b. into_raw ( ) . into_unknown ( ) )
76
+ } else {
77
+ let len = output. len ( ) ;
78
+ let c_string = CString :: new ( output) ?;
79
+ unsafe { env. create_string_from_c_char ( c_string. as_ptr ( ) , len) } . map ( |v| v. into_unknown ( ) )
80
+ }
67
81
}
68
82
}
69
83
@@ -89,24 +103,38 @@ fn compress(ctx: CallContext) -> Result<JsObject> {
89
103
ctx. env . spawn ( encoder) . map ( |v| v. promise_object ( ) )
90
104
}
91
105
92
- #[ js_function( 1 ) ]
93
- fn uncompress_sync ( ctx : CallContext ) -> Result < JsBuffer > {
106
+ #[ js_function( 2 ) ]
107
+ fn uncompress_sync ( ctx : CallContext ) -> Result < JsUnknown > {
94
108
let data = ctx. get :: < JsBuffer > ( 0 ) ?;
109
+ let as_buffer = ctx. get :: < JsBoolean > ( 1 ) ?. get_value ( ) ?;
95
110
let mut dec = Decoder :: new ( ) ;
96
111
dec
97
112
. decompress_vec ( & data. into_value ( ) ?)
98
113
. map_err ( |e| Error :: new ( napi:: Status :: GenericFailure , format ! ( "{}" , e) ) )
99
- . and_then ( |d| ctx. env . create_buffer_with_data ( d) )
100
- . map ( |b| b. into_raw ( ) )
114
+ . and_then ( |d| {
115
+ if as_buffer {
116
+ ctx
117
+ . env
118
+ . create_buffer_with_data ( d)
119
+ . map ( |b| b. into_raw ( ) . into_unknown ( ) )
120
+ } else {
121
+ let len = d. len ( ) ;
122
+ let c_string = CString :: new ( d) ?;
123
+ unsafe { ctx. env . create_string_from_c_char ( c_string. as_ptr ( ) , len) }
124
+ . map ( |v| v. into_unknown ( ) )
125
+ }
126
+ } )
101
127
}
102
128
103
- #[ js_function( 1 ) ]
129
+ #[ js_function( 2 ) ]
104
130
fn uncompress ( ctx : CallContext ) -> Result < JsObject > {
105
131
let data = ctx. get :: < JsBuffer > ( 0 ) ?;
132
+ let as_buffer = ctx. get :: < JsBoolean > ( 1 ) ?. get_value ( ) ?;
106
133
let dec = Decoder :: new ( ) ;
107
134
let decoder = Dec {
108
135
inner : dec,
109
136
data : data. into_ref ( ) ?,
137
+ as_buffer,
110
138
} ;
111
139
ctx. env . spawn ( decoder) . map ( |v| v. promise_object ( ) )
112
140
}
0 commit comments