77
88namespace workerd ::api {
99
10- static constexpr auto kDefaultBotManagementValue = R"DATA( {
10+ static constexpr kj::StringPtr kDefaultBotManagementValue = R"DATA( {
1111 "corporateProxy": false,
1212 "verifiedBot": false,
1313 "jsDetection": { "passed": false },
1414 "staticResource": false,
1515 "detectionIds": {},
1616 "score": 99
17- })DATA" ;
17+ })DATA" _kjc ;
1818
19- static void handleDefaultBotManagement (jsg::Lock& js, v8::Local<v8::Object> handle) {
19+ static void handleDefaultBotManagement (jsg::Lock& js, jsg::JsObject handle) {
2020 // When the cfBotManagementNoOp compatibility flag is set, we'll check the
2121 // request cf blob to see if it contains a botManagement field. If it does
2222 // *not* we will add it using the following default fields.
2323 // Note that if the botManagement team changes any of the fields they provide,
2424 // this default value may need to be changed also.
25- auto context = js.v8Context ();
26- if (!js.v8Has (handle, " botManagement" _kj)) {
27- auto sym = v8::Private::ForApi (js.v8Isolate ,
28- jsg::v8StrIntern (js.v8Isolate , " botManagement" _kj));
25+ static constexpr auto kName = " botManagement" _kjc;
26+ if (!handle.has (js, kName )) {
2927 // For performance reasons, we only want to construct the default values
3028 // once per isolate so we cache the constructed value using an internal
3129 // private field on the global scope. Whenever we need to use it again we
3230 // pull the exact same value.
33- auto defaultBm = jsg::check (context->Global ()->GetPrivate (context, sym));
34- if (defaultBm->IsUndefined ()) {
35- auto bm = js.parseJson (kj::StringPtr (kDefaultBotManagementValue ));
36- KJ_DASSERT (bm.getHandle (js)->IsObject ());
37- js.recursivelyFreeze (bm);
38- defaultBm = bm.getHandle (js);
39- jsg::check (context->Global ()->SetPrivate (context, sym, defaultBm));
31+ auto bm = js.global ().getPrivate (js, kName );
32+ if (bm.isUndefined ()) {
33+ bm = jsg::JsValue::fromJson (js, kDefaultBotManagementValue );
34+ KJ_DASSERT (bm.isObject ());
35+ js.global ().setPrivate (js, kName , bm);
4036 }
41- js. v8Set (handle, " botManagement " _kj, defaultBm );
37+ handle. set (js, kName , bm );
4238 }
4339}
4440
45- jsg::Optional<v8::Local<v8::Object>> CfProperty::get (jsg::Lock& js) {
46- return getRef (js).map ([&js](jsg::V8Ref<v8::Object>&& ref) mutable {
41+ CfProperty::CfProperty (kj::Maybe<kj::StringPtr> unparsed) {
42+ KJ_IF_MAYBE (str, unparsed) {
43+ value = kj::str (*str);
44+ }
45+ }
46+
47+ CfProperty::CfProperty (jsg::Lock& js, const jsg::JsObject& object)
48+ : CfProperty(kj::Maybe(jsg::JsRef(js, object))) {}
49+
50+ CfProperty::CfProperty (kj::Maybe<jsg::JsRef<jsg::JsObject>>&& parsed) {
51+ KJ_IF_MAYBE (v, parsed) {
52+ value = kj::mv (*v);
53+ }
54+ }
55+
56+ jsg::Optional<jsg::JsObject> CfProperty::get (jsg::Lock& js) {
57+ return getRef (js).map ([&js](jsg::JsRef<jsg::JsObject>&& ref) mutable {
4758 return ref.getHandle (js);
4859 });
4960}
5061
51- jsg::Optional<jsg::V8Ref<v8::Object >> CfProperty::getRef (jsg::Lock& js) {
62+ jsg::Optional<jsg::JsRef<jsg::JsObject >> CfProperty::getRef (jsg::Lock& js) {
5263 KJ_IF_MAYBE (cf, value) {
5364 KJ_SWITCH_ONEOF (*cf) {
54- KJ_CASE_ONEOF (parsed, jsg::V8Ref<v8::Object >) {
65+ KJ_CASE_ONEOF (parsed, jsg::JsRef<jsg::JsObject >) {
5566 return parsed.addRef (js);
5667 }
5768 KJ_CASE_ONEOF (unparsed, kj::String) {
58- auto parsed = js.parseJson (unparsed);
59- auto handle = parsed.getHandle (js);
60- KJ_ASSERT (handle->IsObject ());
69+ auto parsed = jsg::JsValue::fromJson (js, unparsed);
70+ auto object = KJ_ASSERT_NONNULL (parsed.tryCast <jsg::JsObject>());
6171
62- auto objectHandle = handle.As <v8::Object>();
6372 if (!FeatureFlags::get (js).getNoCfBotManagementDefault ()) {
64- handleDefaultBotManagement (js, objectHandle );
73+ handleDefaultBotManagement (js, object );
6574 }
6675
67- // For the inbound request, we make the `cf` blob immutable.
68- js.recursivelyFreeze (parsed);
76+ object.recursivelyFreeze (js);
6977
7078 // replace unparsed string with a parsed v8 object
71- auto parsedObject = parsed.cast <v8::Object>(js);
72- this ->value = parsedObject.addRef (js);
73- return kj::mv (parsedObject);
79+ this ->value = object.addRef (js);
80+ return jsg::JsRef (js, object);
7481 }
7582 }
7683 }
@@ -82,14 +89,15 @@ jsg::Optional<jsg::V8Ref<v8::Object>> CfProperty::getRef(jsg::Lock& js) {
8289kj::Maybe<kj::String> CfProperty::serialize (jsg::Lock& js) {
8390 KJ_IF_MAYBE (cf, value) {
8491 KJ_SWITCH_ONEOF (*cf) {
85- KJ_CASE_ONEOF (parsed, jsg::V8Ref<v8::Object >) {
86- return js. serializeJson (parsed );
92+ KJ_CASE_ONEOF (parsed, jsg::JsRef<jsg::JsObject >) {
93+ return jsg::JsValue (parsed. getHandle (js)). toJson (js );
8794 }
8895 KJ_CASE_ONEOF (unparsed, kj::String) {
8996 if (!FeatureFlags::get (js).getNoCfBotManagementDefault ()) {
9097 // we mess up with the value on this code path,
9198 // need to parse it, fix it and serialize back
92- return js.serializeJson (KJ_ASSERT_NONNULL (getRef (js)));
99+ jsg::JsValue handle = KJ_ASSERT_NONNULL (getRef (js)).getHandle (js);
100+ return handle.toJson (js);
93101 }
94102
95103 return kj::str (unparsed);
@@ -103,9 +111,8 @@ kj::Maybe<kj::String> CfProperty::serialize(jsg::Lock& js) {
103111CfProperty CfProperty::deepClone (jsg::Lock& js) {
104112 KJ_IF_MAYBE (cf, value) {
105113 KJ_SWITCH_ONEOF (*cf) {
106- KJ_CASE_ONEOF (parsed, jsg::V8Ref<v8::Object>) {
107- auto ref = parsed.deepClone (js);
108- return CfProperty (kj::mv (ref));
114+ KJ_CASE_ONEOF (parsed, jsg::JsRef<jsg::JsObject>) {
115+ return CfProperty (jsg::JsRef (js, parsed.getHandle (js).jsonClone (js)));
109116 }
110117 KJ_CASE_ONEOF (unparsed, kj::String) {
111118 return CfProperty (unparsed.asPtr ());
@@ -119,7 +126,7 @@ CfProperty CfProperty::deepClone(jsg::Lock& js) {
119126void CfProperty::visitForGc (jsg::GcVisitor& visitor) {
120127 KJ_IF_MAYBE (cf, value) {
121128 KJ_SWITCH_ONEOF (*cf) {
122- KJ_CASE_ONEOF (parsed, jsg::V8Ref<v8::Object >) {
129+ KJ_CASE_ONEOF (parsed, jsg::JsRef<jsg::JsObject >) {
123130 visitor.visit (parsed);
124131 }
125132 KJ_CASE_ONEOF_DEFAULT {}
0 commit comments