EdgeAIG's picture
download
raw
4.63 kB
import * as Context from "../../Context.js";
import * as Effect from "../../Effect.js";
import { identity } from "../../Function.js";
import * as Layer from "../../Layer.js";
import * as Stream from "../../Stream.js";
import * as Rpc from "./Rpc.js";
const TypeId = "~effect/rpc/RpcGroup";
const RpcGroupProto = {
add(...rpcs) {
const requests = new Map(this.requests);
for (const rpc of rpcs) {
requests.set(rpc._tag, rpc);
}
return makeProto({
requests,
annotations: this.annotations
});
},
merge(...groups) {
const requests = new Map(this.requests);
const annotations = new Map(this.annotations.mapUnsafe);
for (const group of groups) {
for (const [tag, rpc] of group.requests) {
requests.set(tag, rpc);
}
for (const [key, value] of group.annotations.mapUnsafe) {
annotations.set(key, value);
}
}
return makeProto({
requests,
annotations: Context.makeUnsafe(annotations)
});
},
omit(...tags) {
const requests = new Map(this.requests);
for (const tag of tags) {
requests.delete(tag);
}
return makeProto({
requests,
annotations: this.annotations
});
},
middleware(middleware) {
const requests = new Map();
for (const [tag, rpc] of this.requests) {
requests.set(tag, rpc.middleware(middleware));
}
return makeProto({
requests,
annotations: this.annotations
});
},
toHandlers(build) {
// oxlint-disable-next-line no-this-alias
const self = this;
return Effect.gen(function* () {
const services = yield* Effect.context();
const handlers = Effect.isEffect(build) ? yield* build : build;
const contextMap = new Map();
for (const [tag, handler] of Object.entries(handlers)) {
const rpc = self.requests.get(tag);
contextMap.set(rpc.key, {
tag: rpc._tag,
handler,
context: services
});
}
return Context.makeUnsafe(contextMap);
});
},
prefix(prefix) {
const requests = new Map();
for (const rpc of this.requests.values()) {
const newRpc = rpc.prefix(prefix);
requests.set(newRpc._tag, newRpc);
}
return makeProto({
requests,
annotations: this.annotations
});
},
toLayer(build) {
return Layer.effectContext(this.toHandlers(build));
},
of: identity,
toLayerHandler(service, build) {
// oxlint-disable-next-line no-this-alias
const self = this;
return Layer.effectContext(Effect.gen(function* () {
const services = yield* Effect.context();
const handler = Effect.isEffect(build) ? yield* build : build;
const contextMap = new Map();
const rpc = self.requests.get(service);
contextMap.set(rpc.key, {
handler,
context: services
});
return Context.makeUnsafe(contextMap);
}));
},
accessHandler(service) {
return Effect.contextWith(parentContext => {
const rpc = this.requests.get(service);
const {
handler,
context
} = parentContext.mapUnsafe.get(rpc.key);
return Effect.succeed((payload, options) => {
options.rpc = rpc;
const result = handler(payload, options);
const effectOrStream = Rpc.isWrapper(result) ? result.value : result;
return Effect.isEffect(effectOrStream) ? Effect.provide(effectOrStream, context) : Stream.provideContext(effectOrStream, context);
});
});
},
annotate(service, value) {
return makeProto({
requests: this.requests,
annotations: Context.add(this.annotations, service, value)
});
},
annotateRpcs(service, value) {
return this.annotateRpcsMerge(Context.make(service, value));
},
annotateMerge(context) {
return makeProto({
requests: this.requests,
annotations: Context.merge(this.annotations, context)
});
},
annotateRpcsMerge(context) {
const requests = new Map();
for (const [tag, rpc] of this.requests) {
requests.set(tag, rpc.annotateMerge(Context.merge(context, rpc.annotations)));
}
return makeProto({
requests,
annotations: this.annotations
});
}
};
const makeProto = options => Object.assign(function () {}, RpcGroupProto, {
requests: options.requests,
annotations: options.annotations
});
/**
* Creates an `RpcGroup` from one or more RPC definitions.
*
* @category groups
* @since 4.0.0
*/
export const make = (...rpcs) => makeProto({
requests: new Map(rpcs.map(rpc => [rpc._tag, rpc])),
annotations: Context.empty()
});
//# sourceMappingURL=RpcGroup.js.map

Xet Storage Details

Size:
4.63 kB
·
Xet hash:
0b59de0e9d435f9edc5d8516e2c295c24ca97d5a670466c01f4bb14778f0e142

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.