This is an automated email from the ASF dual-hosted git repository.

xuanwo pushed a commit to branch nodejs-layer
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git


The following commit(s) were added to refs/heads/nodejs-layer by this push:
     new 505e07ac4 Try
505e07ac4 is described below

commit 505e07ac478ba1649ad2d3425bec762b2152746b
Author: Xuanwo <[email protected]>
AuthorDate: Mon Nov 13 18:44:26 2023 +0800

    Try
    
    Signed-off-by: Xuanwo <[email protected]>
---
 bindings/nodejs/generated.js           |   4 +-
 bindings/nodejs/index.d.ts             |  27 ++++----
 bindings/nodejs/index.js               |   6 +-
 bindings/nodejs/src/lib.rs             | 109 ++++++++++-----------------------
 bindings/nodejs/tests/suites/index.mjs |   5 +-
 5 files changed, 52 insertions(+), 99 deletions(-)

diff --git a/bindings/nodejs/generated.js b/bindings/nodejs/generated.js
index 8607c1838..81487de7e 100644
--- a/bindings/nodejs/generated.js
+++ b/bindings/nodejs/generated.js
@@ -271,11 +271,11 @@ if (!nativeBinding) {
   throw new Error(`Failed to load native binding`)
 }
 
-const { Operator, Entry, Metadata, Lister, BlockingLister, RetryLayer } = 
nativeBinding
+const { Operator, Entry, Metadata, Lister, BlockingLister, RetryLayerBuilder } 
= nativeBinding
 
 module.exports.Operator = Operator
 module.exports.Entry = Entry
 module.exports.Metadata = Metadata
 module.exports.Lister = Lister
 module.exports.BlockingLister = BlockingLister
-module.exports.RetryLayer = RetryLayer
+module.exports.RetryLayerBuilder = RetryLayerBuilder
diff --git a/bindings/nodejs/index.d.ts b/bindings/nodejs/index.d.ts
index ce4c5b960..2173869aa 100644
--- a/bindings/nodejs/index.d.ts
+++ b/bindings/nodejs/index.d.ts
@@ -22,6 +22,12 @@
 
 /* auto-generated by NAPI-RS */
 
+export class ExternalObject<T> {
+  readonly '': {
+    readonly '': unique symbol
+    [K: symbol]: T
+  }
+}
 export interface PresignedRequest {
   /** HTTP method of this request. */
   method: string
@@ -395,7 +401,7 @@ export class Operator {
    */
   presignStat(path: string, expires: number): Promise<PresignedRequest>
   /** Add a layer to this operator. */
-  layer(layer: object): this
+  layer(layer: ExternalObject<Layer>): this
 }
 export class Entry {
   /** Return the path of this entry. */
@@ -437,16 +443,9 @@ export class Lister {
 export class BlockingLister {
   next(): Entry | null
 }
-/**
- * A layer that will retry the request if it fails.
- * It will retry with exponential backoff.
- *
- * ## Parameters
- *
- * - `jitter`<bool>: Whether to add jitter to the backoff.
- * - `max_times`<number>: The maximum number of times to retry.
- * - `factor`<number>: The exponential factor to use.
- * - `max_delay`<number>: The maximum delay between retries. The unit is 
microsecond.
- * - `min_delay`<number>: The minimum delay between retries. The unit is 
microsecond.
- */
-export class RetryLayer { }
+/** TODO: fill me */
+export class RetryLayerBuilder {
+  constructor()
+  set jitter(v: boolean)
+  build(): ExternalObject<Layer>
+}
diff --git a/bindings/nodejs/index.js b/bindings/nodejs/index.js
index 197d20950..9cabf7303 100644
--- a/bindings/nodejs/index.js
+++ b/bindings/nodejs/index.js
@@ -20,9 +20,11 @@
 /// <reference types="node" />
 
 require('dotenv').config()
-const { Operator, RetryLayer } = require('./generated.js')
+const { Operator, RetryLayerBuilder } = require('./generated.js')
+
 
 module.exports.Operator = Operator
 module.exports.layers = {
-  RetryLayer,
+  RetryLayerBuilder,
 }
+
diff --git a/bindings/nodejs/src/lib.rs b/bindings/nodejs/src/lib.rs
index 896c91279..d29a1bb31 100644
--- a/bindings/nodejs/src/lib.rs
+++ b/bindings/nodejs/src/lib.rs
@@ -28,11 +28,6 @@ use std::time::Duration;
 use futures::TryStreamExt;
 use napi::bindgen_prelude::*;
 
-use napi::CallContext;
-use napi::JsBoolean;
-use napi::JsNumber;
-use napi::JsObject;
-
 #[napi]
 pub struct Operator(opendal::Operator);
 
@@ -696,7 +691,7 @@ pub trait NodeLayer: Send + Sync {
     fn layer(&self, op: opendal::Operator) -> opendal::Operator;
 }
 
-struct NodeLayerWrapper {
+pub struct Layer {
     inner: Box<dyn NodeLayer>,
 }
 
@@ -704,11 +699,8 @@ struct NodeLayerWrapper {
 impl Operator {
     /// Add a layer to this operator.
     #[napi]
-    pub fn layer(&self, env: Env, layer: JsObject) -> Result<Self> {
-        let ctx: &mut NodeLayerWrapper = env
-            .unwrap(&layer)
-            .map_err(|e| Error::from_reason(format!("failed to unwrap layer: 
{}", e)))?;
-        Ok(Self(ctx.inner.layer(self.0.clone())))
+    pub fn layer(&self, layer: External<Layer>) -> Result<Self> {
+        Ok(Self(layer.inner.layer(self.0.clone())))
     }
 }
 
@@ -722,8 +714,7 @@ impl Operator {
 /// - `factor`<number>: The exponential factor to use.
 /// - `max_delay`<number>: The maximum delay between retries. The unit is 
microsecond.
 /// - `min_delay`<number>: The minimum delay between retries. The unit is 
microsecond.
-#[napi]
-pub struct RetryLayer(opendal::layers::RetryLayer);
+struct RetryLayer(opendal::layers::RetryLayer);
 
 impl NodeLayer for RetryLayer {
     fn layer(&self, op: opendal::Operator) -> opendal::Operator {
@@ -731,76 +722,40 @@ impl NodeLayer for RetryLayer {
     }
 }
 
-/// RetryLayer constructor.
-#[js_function(1)]
-pub fn create_retry_layer(ctx: CallContext) -> Result<JsObject> {
-    let mut retry = opendal::layers::RetryLayer::default();
-
-    let config: Option<JsObject> = ctx.get::<JsObject>(0).ok();
-
-    if let Some(config) = config {
-        let jitter = config.get_named_property::<JsBoolean>("jitter").ok();
-        if let Some(jitter) = jitter {
-            let jitter = jitter.get_value().ok();
-            if let Some(jitter) = jitter {
-                if jitter {
-                    retry = retry.with_jitter();
-                }
-            }
-        }
-
-        let max_times = config.get_named_property::<JsNumber>("maxTimes").ok();
-        if let Some(max_times) = max_times {
-            let max_times = max_times.get_uint32().ok();
-            if let Some(max_times) = max_times {
-                retry = retry.with_max_times(max_times as usize);
-            }
-        }
-
-        let factor = config.get_named_property::<JsNumber>("factor").ok();
-        if let Some(factor) = factor {
-            let factor = factor.get_double().ok();
-            if let Some(factor) = factor {
-                retry = retry.with_factor(factor as f32);
-            }
-        }
-
-        let max_delay = config.get_named_property::<JsNumber>("maxDelay").ok();
-        if let Some(max_delay) = max_delay {
-            let max_delay = max_delay.get_uint32().ok();
-            if let Some(max_delay) = max_delay {
-                retry = retry.with_max_delay(Duration::from_millis(max_delay 
as u64));
-            }
-        }
+/// TODO: fill me
+#[napi]
+pub struct RetryLayerBuilder {
+    jitter: bool,
+}
 
-        let min_delay = config.get_named_property::<JsNumber>("minDelay").ok();
-        if let Some(min_delay) = min_delay {
-            let min_delay = min_delay.get_uint32().ok();
-            if let Some(min_delay) = min_delay {
-                retry = retry.with_min_delay(Duration::from_millis(min_delay 
as u64));
-            }
-        }
+#[napi]
+impl RetryLayerBuilder {
+    #[napi(constructor)]
+    pub fn new() -> Self {
+        RetryLayerBuilder { jitter: false }
     }
 
-    let mut layer = ctx.this_unchecked();
+    // #[napi(factory)]
+    // pub fn new() -> Self {
+    //     RetryLayerBuilder { jitter: false }
+    // }
 
-    ctx.env.wrap(
-        &mut layer,
-        NodeLayerWrapper {
-            inner: Box::new(RetryLayer(retry)),
-        },
-    )?;
-
-    Ok(layer)
-}
+    #[napi(setter)]
+    pub fn jitter(&mut self, v: bool) {
+        self.jitter = v;
+    }
 
-/// Export all layers types and constructors to nodejs.
-#[module_exports]
-pub fn layer_init(mut exports: JsObject, env: Env) -> Result<()> {
-    let retry_layer = env.define_class("RetryLayer", create_retry_layer, &[])?;
-    exports.set_named_property("RetryLayer", retry_layer)?;
+    #[napi]
+    pub fn build(&self) -> External<Layer> {
+        let mut l = opendal::layers::RetryLayer::default();
+        if self.jitter {
+            l = l.with_jitter();
+        }
 
-    Ok(())
+        External::new(Layer {
+            inner: Box::new(RetryLayer(l)),
+        })
+    }
 }
 
 fn format_napi_error(err: opendal::Error) -> Error {
diff --git a/bindings/nodejs/tests/suites/index.mjs 
b/bindings/nodejs/tests/suites/index.mjs
index a10bc1baf..05282e4c2 100644
--- a/bindings/nodejs/tests/suites/index.mjs
+++ b/bindings/nodejs/tests/suites/index.mjs
@@ -38,10 +38,7 @@ export function runner(testName, scheme) {
 
   let operator = scheme ? new Operator(scheme, config) : null
 
-  let retryLayer = new layers.RetryLayer({
-    jitter: true,
-    maxTimes: 4,
-  })
+  let retryLayer = new layers.RetryLayerBuilder().build()
 
   operator = operator.layer(retryLayer)
 

Reply via email to