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)