service-bridge 1.0.8-dev.19 → 1.0.9-dev.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -13
- package/dist/index.js +6 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -97,7 +97,6 @@ import { servicebridge } from "service-bridge";
|
|
|
97
97
|
const sb = servicebridge(
|
|
98
98
|
process.env.SERVICEBRIDGE_URL ?? "localhost:14445",
|
|
99
99
|
process.env.SERVICEBRIDGE_SERVICE_KEY!,
|
|
100
|
-
"payments",
|
|
101
100
|
);
|
|
102
101
|
|
|
103
102
|
sb.handleRpc("charge", async (payload: { orderId: string; amount: number }) => {
|
|
@@ -115,7 +114,6 @@ import { servicebridge } from "service-bridge";
|
|
|
115
114
|
const sb = servicebridge(
|
|
116
115
|
process.env.SERVICEBRIDGE_URL ?? "localhost:14445",
|
|
117
116
|
process.env.SERVICEBRIDGE_SERVICE_KEY!,
|
|
118
|
-
"orders",
|
|
119
117
|
);
|
|
120
118
|
|
|
121
119
|
const result = await sb.rpc<{ ok: boolean; txId: string }>("payments/charge", {
|
|
@@ -153,7 +151,7 @@ import { servicebridge } from "service-bridge";
|
|
|
153
151
|
|
|
154
152
|
// --- Payments service (worker) ---
|
|
155
153
|
|
|
156
|
-
const payments = servicebridge("localhost:14445", process.env.SERVICEBRIDGE_SERVICE_KEY
|
|
154
|
+
const payments = servicebridge("localhost:14445", process.env.SERVICEBRIDGE_SERVICE_KEY!);
|
|
157
155
|
|
|
158
156
|
payments.handleRpc("charge", async (payload: { orderId: string; amount: number }, ctx) => {
|
|
159
157
|
await ctx?.stream.write({ status: "charging", orderId: payload.orderId }, "progress");
|
|
@@ -170,7 +168,7 @@ await payments.serve({ host: "localhost" });
|
|
|
170
168
|
```ts
|
|
171
169
|
// --- Orders service (caller + event publisher) ---
|
|
172
170
|
|
|
173
|
-
const orders = servicebridge("localhost:14445", process.env.SERVICEBRIDGE_SERVICE_KEY
|
|
171
|
+
const orders = servicebridge("localhost:14445", process.env.SERVICEBRIDGE_SERVICE_KEY!);
|
|
174
172
|
|
|
175
173
|
// Call payments, then publish event
|
|
176
174
|
const charge = await orders.rpc<{ ok: boolean; txId: string }>("payments/charge", {
|
|
@@ -190,7 +188,7 @@ await orders.event("orders.completed", {
|
|
|
190
188
|
```ts
|
|
191
189
|
// --- Notifications service (event consumer) ---
|
|
192
190
|
|
|
193
|
-
const notifications = servicebridge("localhost:14445", process.env.SERVICEBRIDGE_SERVICE_KEY
|
|
191
|
+
const notifications = servicebridge("localhost:14445", process.env.SERVICEBRIDGE_SERVICE_KEY!);
|
|
194
192
|
|
|
195
193
|
notifications.handleEvent("orders.*", async (payload, ctx) => {
|
|
196
194
|
const body = payload as { orderId: string; txId: string };
|
|
@@ -273,18 +271,19 @@ across all three SDKs. Parity differences are naming-only (language idioms):
|
|
|
273
271
|
- Handler hints: timeout/retryable/concurrency/prefetch are advisory in all SDKs
|
|
274
272
|
- Shared `serve()` fields across SDKs: host, max in-flight, instance ID, weight, and per-serve TLS override
|
|
275
273
|
|
|
276
|
-
### `servicebridge(url, serviceKey,
|
|
274
|
+
### `servicebridge(url, serviceKey, opts?)`
|
|
277
275
|
|
|
278
276
|
```ts
|
|
279
277
|
function servicebridge(
|
|
280
278
|
url: string,
|
|
281
279
|
serviceKey: string,
|
|
282
|
-
|
|
283
|
-
|
|
280
|
+
serviceOrOpts?: string | ServiceBridgeOpts,
|
|
281
|
+
maybeGlobalOpts?: ServiceBridgeOpts,
|
|
284
282
|
): ServiceBridgeService
|
|
285
283
|
```
|
|
286
284
|
|
|
287
285
|
Creates an SDK client instance.
|
|
286
|
+
Service identity is resolved by the runtime from `serviceKey`; passing a third `service` argument is legacy-only.
|
|
288
287
|
|
|
289
288
|
`ServiceBridgeOpts`:
|
|
290
289
|
|
|
@@ -540,7 +539,7 @@ Registers an event consumer handler. Chainable.
|
|
|
540
539
|
|
|
541
540
|
| Option | Type | Description |
|
|
542
541
|
|---|---|---|
|
|
543
|
-
| `groupName` | `string` | Consumer group name. Default: `<service>.<pattern>`. |
|
|
542
|
+
| `groupName` | `string` | Consumer group name. Default: `<service-key-id>.<pattern>`. |
|
|
544
543
|
| `concurrency` | `number` | Advisory concurrency hint (currently not hard-enforced). |
|
|
545
544
|
| `prefetch` | `number` | Advisory prefetch hint (currently not hard-enforced). |
|
|
546
545
|
| `retryPolicyJson` | `string` | Retry policy JSON string. |
|
|
@@ -766,7 +765,7 @@ import express from "express";
|
|
|
766
765
|
import { servicebridge } from "service-bridge";
|
|
767
766
|
import { servicebridgeMiddleware, registerExpressRoutes } from "service-bridge/express";
|
|
768
767
|
|
|
769
|
-
const sb = servicebridge(process.env.SERVICEBRIDGE_URL!, process.env.SERVICEBRIDGE_SERVICE_KEY
|
|
768
|
+
const sb = servicebridge(process.env.SERVICEBRIDGE_URL!, process.env.SERVICEBRIDGE_SERVICE_KEY!);
|
|
770
769
|
const app = express();
|
|
771
770
|
|
|
772
771
|
app.use(servicebridgeMiddleware({
|
|
@@ -822,7 +821,7 @@ import Fastify from "fastify";
|
|
|
822
821
|
import { servicebridge } from "service-bridge";
|
|
823
822
|
import { servicebridgePlugin, wrapHandler } from "service-bridge/fastify";
|
|
824
823
|
|
|
825
|
-
const sb = servicebridge(process.env.SERVICEBRIDGE_URL!, process.env.SERVICEBRIDGE_SERVICE_KEY
|
|
824
|
+
const sb = servicebridge(process.env.SERVICEBRIDGE_URL!, process.env.SERVICEBRIDGE_SERVICE_KEY!);
|
|
826
825
|
const app = Fastify();
|
|
827
826
|
|
|
828
827
|
await app.register(servicebridgePlugin, {
|
|
@@ -895,13 +894,11 @@ The SDK requires values you pass into `servicebridge(...)`. Common setup:
|
|
|
895
894
|
|---|---|---|---|
|
|
896
895
|
| `SERVICEBRIDGE_URL` | yes | `localhost:14445` | gRPC control plane URL |
|
|
897
896
|
| `SERVICEBRIDGE_SERVICE_KEY` | yes | `sbv2.<id>.<secret>.<ca>` | Service authentication key (sbv2 only) |
|
|
898
|
-
| `SERVICEBRIDGE_SERVICE` | yes (worker mode) | `orders` | Service name in registry |
|
|
899
897
|
|
|
900
898
|
```ts
|
|
901
899
|
const sb = servicebridge(
|
|
902
900
|
process.env.SERVICEBRIDGE_URL ?? "localhost:14445",
|
|
903
901
|
process.env.SERVICEBRIDGE_SERVICE_KEY!,
|
|
904
|
-
process.env.SERVICEBRIDGE_SERVICE ?? "orders",
|
|
905
902
|
);
|
|
906
903
|
```
|
|
907
904
|
|
package/dist/index.js
CHANGED
|
@@ -458,7 +458,11 @@ function ensureSbResolverRegistered() {
|
|
|
458
458
|
}
|
|
459
459
|
registerResolver("sb", SbResolver);
|
|
460
460
|
}
|
|
461
|
-
function servicebridge(url, serviceKey,
|
|
461
|
+
function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}) {
|
|
462
|
+
const service = typeof serviceOrOpts === "string" ? serviceOrOpts.trim() : "";
|
|
463
|
+
const globalOpts = typeof serviceOrOpts === "string" ? maybeGlobalOpts : serviceOrOpts ?? {};
|
|
464
|
+
const parsedServiceKey = parseServiceKeyV2(serviceKey);
|
|
465
|
+
const defaultConsumerPrefix = service || parsedServiceKey.keyId || "consumer";
|
|
462
466
|
const meta = new grpc.Metadata;
|
|
463
467
|
meta.add("x-service-key", serviceKey);
|
|
464
468
|
const rawUrl = url.trim();
|
|
@@ -1511,7 +1515,7 @@ function servicebridge(url, serviceKey, service = "", globalOpts = {}) {
|
|
|
1511
1515
|
},
|
|
1512
1516
|
handleEvent(pattern, handler, opts) {
|
|
1513
1517
|
const normalizedOpts = opts ?? {};
|
|
1514
|
-
const groupName = normalizedOpts.groupName || `${
|
|
1518
|
+
const groupName = normalizedOpts.groupName || `${defaultConsumerPrefix}.${pattern}`;
|
|
1515
1519
|
if (eventHandlers.has(groupName)) {
|
|
1516
1520
|
throw new Error(`Duplicate event consumer group "${groupName}". ` + "Use a distinct groupName for each handleEvent() registration.");
|
|
1517
1521
|
}
|
|
@@ -1529,9 +1533,6 @@ function servicebridge(url, serviceKey, service = "", globalOpts = {}) {
|
|
|
1529
1533
|
if (fnHandlers.size === 0 && eventHandlers.size === 0) {
|
|
1530
1534
|
throw new Error("No handlers registered. Call handleRpc() or handleEvent() before serve().");
|
|
1531
1535
|
}
|
|
1532
|
-
if (!service.trim()) {
|
|
1533
|
-
throw new Error("serve() requires a non-empty service name");
|
|
1534
|
-
}
|
|
1535
1536
|
if (opts.maxInFlight != null && (!Number.isInteger(opts.maxInFlight) || opts.maxInFlight < 1)) {
|
|
1536
1537
|
throw new Error("serve() maxInFlight must be a positive integer");
|
|
1537
1538
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "service-bridge",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9-dev.21",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "ServiceBridge SDK for Node.js — production-ready RPC, durable events, workflows, jobs, and distributed tracing. One Go runtime + PostgreSQL replaces Istio, RabbitMQ, Temporal, and Jaeger.",
|
|
6
6
|
"keywords": [
|