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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
/*
* Copyright (C) Dmitry Volyntsev
* Copyright (C) F5, Inc.
*/
#ifndef _QJS_H_INCLUDED_
#define _QJS_H_INCLUDED_
#include <njs_auto_config.h>
#include <njs_types.h>
#include <njs_clang.h>
#include <inttypes.h>
#include <string.h>
#include <njs_str.h>
#include <njs_unicode.h>
#include <njs_utf8.h>
#include <njs_chb.h>
#include <njs_utils.h>
#include <njs_assert.h>
#if defined(__GNUC__) && (__GNUC__ >= 8)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcast-function-type"
#endif
#include <quickjs.h>
#ifndef JS_BOOL
#define JS_BOOL bool
#endif
#if defined(__GNUC__) && (__GNUC__ >= 8)
#pragma GCC diagnostic pop
#endif
#include <pthread.h>
#define QJS_CORE_CLASS_ID_OFFSET 64
#define QJS_CORE_CLASS_ID_BUFFER (QJS_CORE_CLASS_ID_OFFSET)
#define QJS_CORE_CLASS_ID_UINT8_ARRAY_CTOR (QJS_CORE_CLASS_ID_OFFSET + 1)
#define QJS_CORE_CLASS_ID_TEXT_DECODER (QJS_CORE_CLASS_ID_OFFSET + 2)
#define QJS_CORE_CLASS_ID_TEXT_ENCODER (QJS_CORE_CLASS_ID_OFFSET + 3)
#define QJS_CORE_CLASS_ID_FS_STATS (QJS_CORE_CLASS_ID_OFFSET + 4)
#define QJS_CORE_CLASS_ID_FS_DIRENT (QJS_CORE_CLASS_ID_OFFSET + 5)
#define QJS_CORE_CLASS_ID_FS_FILEHANDLE (QJS_CORE_CLASS_ID_OFFSET + 6)
#define QJS_CORE_CLASS_ID_WEBCRYPTO_KEY (QJS_CORE_CLASS_ID_OFFSET + 7)
#define QJS_CORE_CLASS_CRYPTO_HASH (QJS_CORE_CLASS_ID_OFFSET + 8)
#define QJS_CORE_CLASS_CRYPTO_HMAC (QJS_CORE_CLASS_ID_OFFSET + 9)
#define QJS_CORE_CLASS_ID_XML_DOC (QJS_CORE_CLASS_ID_OFFSET + 10)
#define QJS_CORE_CLASS_ID_XML_NODE (QJS_CORE_CLASS_ID_OFFSET + 11)
#define QJS_CORE_CLASS_ID_XML_ATTR (QJS_CORE_CLASS_ID_OFFSET + 12)
#define QJS_CORE_CLASS_ID_LAST (QJS_CORE_CLASS_ID_OFFSET + 13)
typedef JSModuleDef *(*qjs_addon_init_pt)(JSContext *ctx, const char *name);
typedef struct {
const char *name;
qjs_addon_init_pt init;
} qjs_module_t;
JSContext *qjs_new_context(JSRuntime *rt, qjs_module_t **addons);
JSValue qjs_new_uint8_array(JSContext *ctx, int argc, JSValueConst *argv);
JSValue qjs_new_array_buffer(JSContext *cx, uint8_t *src, size_t len);
JSValue qjs_buffer_alloc(JSContext *ctx, size_t size);
JSValue qjs_buffer_create(JSContext *ctx, u_char *start, size_t size);
JSValue qjs_buffer_chb_alloc(JSContext *ctx, njs_chb_t *chain);
typedef int (*qjs_buffer_encode_t)(JSContext *ctx, const njs_str_t *src,
njs_str_t *dst);
typedef size_t (*qjs_buffer_encode_length_t)(JSContext *ctx,
const njs_str_t *src);
typedef struct {
njs_str_t name;
qjs_buffer_encode_t encode;
qjs_buffer_encode_length_t encode_length;
qjs_buffer_encode_t decode;
qjs_buffer_encode_length_t decode_length;
} qjs_buffer_encoding_t;
const qjs_buffer_encoding_t *qjs_buffer_encoding(JSContext *ctx,
JSValueConst value, JS_BOOL thrw);
int qjs_base64_encode(JSContext *ctx, const njs_str_t *src,
njs_str_t *dst);
size_t qjs_base64_encode_length(JSContext *ctx, const njs_str_t *src);
int qjs_base64_decode(JSContext *ctx, const njs_str_t *src,
njs_str_t *dst);
size_t qjs_base64_decode_length(JSContext *ctx, const njs_str_t *src);
int qjs_base64url_encode(JSContext *ctx, const njs_str_t *src,
njs_str_t *dst);
int qjs_base64url_decode(JSContext *ctx, const njs_str_t *src,
njs_str_t *dst);
size_t qjs_base64url_decode_length(JSContext *ctx, const njs_str_t *src);
int qjs_hex_encode(JSContext *ctx, const njs_str_t *src, njs_str_t *dst);
size_t qjs_hex_encode_length(JSContext *ctx, const njs_str_t *src);
int qjs_hex_decode(JSContext *ctx, const njs_str_t *src, njs_str_t *dst);
size_t qjs_hex_decode_length(JSContext *ctx, const njs_str_t *src);
JSValue qjs_process_object(JSContext *ctx, int argc, const char **argv);
typedef struct {
int tag;
size_t length;
u_char *start;
} qjs_bytes_t;
njs_inline int
qjs_is_typed_array(JSContext *cx, JSValue val)
{
JS_BOOL exception;
val = JS_GetTypedArrayBuffer(cx, val, NULL, NULL, NULL);
exception = JS_IsException(val);
JS_FreeValue(cx, val);
return !exception;
}
int qjs_to_bytes(JSContext *ctx, qjs_bytes_t *data, JSValueConst value);
void qjs_bytes_free(JSContext *ctx, qjs_bytes_t *data);
JSValue qjs_typed_array_data(JSContext *ctx, JSValueConst value,
njs_str_t *data);
#define qjs_string_create(ctx, data, len) \
JS_NewStringLen(ctx, (const char *) (data), len)
JSValue qjs_string_create_chb(JSContext *cx, njs_chb_t *chain);
void qjs_free_prop_enum(JSContext *ctx, JSPropertyEnum *tab, uint32_t len);
JSValue qjs_promise_result(JSContext *cx, JSValue result);
JSValue qjs_string_hex(JSContext *cx, const njs_str_t *src);
JSValue qjs_string_base64(JSContext *cx, const njs_str_t *src);
JSValue qjs_string_base64url(JSContext *cx, const njs_str_t *src);
static inline JS_BOOL JS_IsNullOrUndefined(JSValueConst v)
{
return JS_VALUE_GET_TAG(v) == JS_TAG_NULL
|| JS_VALUE_GET_TAG(v) == JS_TAG_UNDEFINED;
}
#ifdef NJS_HAVE_QUICKJS_IS_SAME_VALUE
#define qjs_is_same_value(cx, a, b) JS_IsSameValue(cx, a, b)
#else
#define qjs_is_same_value(cx, a, b) JS_SameValue(cx, a, b)
#endif
#ifdef NJS_HAVE_QUICKJS_IS_ARRAY_SINGLE_ARG
#define qjs_is_array(cx, a) JS_IsArray(a)
#else
#define qjs_is_array(cx, a) JS_IsArray(cx, a)
#endif
extern qjs_module_t *qjs_modules[];
#endif /* _QJS_H_INCLUDED_ */
|