@whitewall/blip-sdk 0.0.197 → 0.0.200
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/dist/cjs/client.js.map +1 -1
- package/dist/cjs/namespaces/account.js.map +1 -1
- package/dist/cjs/namespaces/activecampaign.js.map +1 -1
- package/dist/cjs/namespaces/analytics.js.map +1 -1
- package/dist/cjs/namespaces/billing.js.map +1 -1
- package/dist/cjs/namespaces/builder.js.map +1 -1
- package/dist/cjs/namespaces/configurations.js.map +1 -1
- package/dist/cjs/namespaces/context.js.map +1 -1
- package/dist/cjs/namespaces/desk.js.map +1 -1
- package/dist/cjs/namespaces/media.js.map +1 -1
- package/dist/cjs/namespaces/namespace.js +23 -9
- package/dist/cjs/namespaces/namespace.js.map +1 -1
- package/dist/cjs/namespaces/portal.js.map +1 -1
- package/dist/cjs/namespaces/scheduler.js.map +1 -1
- package/dist/cjs/namespaces/tunnel.js.map +1 -1
- package/dist/cjs/namespaces/whatsapp.js.map +1 -1
- package/dist/cjs/schemas/webhook.js.map +1 -1
- package/dist/cjs/sender/bliperror.js.map +1 -1
- package/dist/cjs/sender/closable.js.map +1 -1
- package/dist/cjs/sender/enveloperesolver.js +1 -1
- package/dist/cjs/sender/enveloperesolver.js.map +1 -1
- package/dist/cjs/sender/gateway/customgatewaysender.js +1 -1
- package/dist/cjs/sender/gateway/customgatewaysender.js.map +1 -1
- package/dist/cjs/sender/http/httpsender.js +1 -1
- package/dist/cjs/sender/http/httpsender.js.map +1 -1
- package/dist/cjs/sender/multi/multisender.js.map +1 -1
- package/dist/cjs/sender/plugin/communication.js.map +1 -1
- package/dist/cjs/sender/plugin/pluginsender.js.map +1 -1
- package/dist/cjs/sender/retryableerror.js.map +1 -1
- package/dist/cjs/sender/security.js.map +1 -1
- package/dist/cjs/sender/sender.js +11 -0
- package/dist/cjs/sender/sender.js.map +1 -1
- package/dist/cjs/sender/sessionnegotiator.js +2 -2
- package/dist/cjs/sender/sessionnegotiator.js.map +1 -1
- package/dist/cjs/sender/tcp/json-parser.js.map +1 -1
- package/dist/cjs/sender/tcp/tcpsender.js +7 -13
- package/dist/cjs/sender/tcp/tcpsender.js.map +1 -1
- package/dist/cjs/sender/throttler.js.map +1 -1
- package/dist/cjs/sender/transporttls.js.map +1 -1
- package/dist/cjs/sender/websocket/websocketsender.js +7 -13
- package/dist/cjs/sender/websocket/websocketsender.js.map +1 -1
- package/dist/cjs/types/command.js.map +1 -1
- package/dist/cjs/types/desk.js +9 -10
- package/dist/cjs/types/desk.js.map +1 -1
- package/dist/cjs/types/flow.js.map +1 -1
- package/dist/cjs/types/message.js.map +1 -1
- package/dist/cjs/types/node.js.map +1 -1
- package/dist/cjs/types/notification.js.map +1 -1
- package/dist/cjs/types/reason.js +8 -9
- package/dist/cjs/types/reason.js.map +1 -1
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/cjs/utils/builder.js.map +1 -1
- package/dist/cjs/utils/desk.js.map +1 -1
- package/dist/cjs/utils/flow-rules.js.map +1 -1
- package/dist/cjs/utils/minifier.js.map +1 -1
- package/dist/cjs/utils/odata.js.map +1 -1
- package/dist/cjs/utils/promise.js +9 -0
- package/dist/cjs/utils/promise.js.map +1 -0
- package/dist/cjs/utils/random.js.map +1 -1
- package/dist/cjs/utils/thread.js.map +1 -1
- package/dist/cjs/utils/uri.js.map +1 -1
- package/dist/cjs/utils/whatsapp.js.map +1 -1
- package/dist/esm/client.js +16 -16
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/index.js +13 -13
- package/dist/esm/namespaces/account.js +5 -5
- package/dist/esm/namespaces/account.js.map +1 -1
- package/dist/esm/namespaces/activecampaign.js +3 -3
- package/dist/esm/namespaces/analytics.js +4 -4
- package/dist/esm/namespaces/analytics.js.map +1 -1
- package/dist/esm/namespaces/billing.js +3 -3
- package/dist/esm/namespaces/builder.js +3 -3
- package/dist/esm/namespaces/configurations.js +2 -2
- package/dist/esm/namespaces/context.js +2 -2
- package/dist/esm/namespaces/desk.js +5 -5
- package/dist/esm/namespaces/media.js +4 -4
- package/dist/esm/namespaces/namespace.js +27 -13
- package/dist/esm/namespaces/namespace.js.map +1 -1
- package/dist/esm/namespaces/portal.js +5 -5
- package/dist/esm/namespaces/scheduler.js +3 -3
- package/dist/esm/namespaces/tunnel.js +3 -3
- package/dist/esm/namespaces/whatsapp.js +3 -3
- package/dist/esm/schemas/index.js +1 -1
- package/dist/esm/schemas/utils/validate.js +1 -1
- package/dist/esm/schemas/webhook.js +1 -1
- package/dist/esm/sender/bliperror.js +1 -1
- package/dist/esm/sender/bliperror.js.map +1 -1
- package/dist/esm/sender/enveloperesolver.js +4 -4
- package/dist/esm/sender/enveloperesolver.js.map +1 -1
- package/dist/esm/sender/gateway/customgatewaysender.js +2 -2
- package/dist/esm/sender/gateway/customgatewaysender.js.map +1 -1
- package/dist/esm/sender/http/httpsender.js +7 -7
- package/dist/esm/sender/http/httpsender.js.map +1 -1
- package/dist/esm/sender/index.js +8 -8
- package/dist/esm/sender/multi/multisender.js +1 -1
- package/dist/esm/sender/plugin/communication.js +1 -1
- package/dist/esm/sender/plugin/pluginsender.js +3 -3
- package/dist/esm/sender/retryableerror.js +1 -1
- package/dist/esm/sender/sender.js +14 -3
- package/dist/esm/sender/sender.js.map +1 -1
- package/dist/esm/sender/sessionnegotiator.js +4 -4
- package/dist/esm/sender/sessionnegotiator.js.map +1 -1
- package/dist/esm/sender/tcp/tcpsender.js +14 -20
- package/dist/esm/sender/tcp/tcpsender.js.map +1 -1
- package/dist/esm/sender/websocket/websocketsender.js +14 -20
- package/dist/esm/sender/websocket/websocketsender.js.map +1 -1
- package/dist/esm/types/desk.js +9 -10
- package/dist/esm/types/desk.js.map +1 -1
- package/dist/esm/types/index.js +12 -12
- package/dist/esm/types/node.js.map +1 -1
- package/dist/esm/types/reason.js +8 -9
- package/dist/esm/types/reason.js.map +1 -1
- package/dist/esm/utils/builder.js +1 -1
- package/dist/esm/utils/desk.js +1 -1
- package/dist/esm/utils/flow-rules.js +1 -1
- package/dist/esm/utils/minifier.js +2 -2
- package/dist/esm/utils/minifier.js.map +1 -1
- package/dist/esm/utils/promise.js +6 -0
- package/dist/esm/utils/promise.js.map +1 -0
- package/dist/esm/utils/thread.js +1 -1
- package/dist/esm/utils/whatsapp.js +1 -1
- package/dist/types/client.d.ts +2 -2
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/namespaces/account.d.ts +347 -347
- package/dist/types/namespaces/account.d.ts.map +1 -1
- package/dist/types/namespaces/activecampaign.d.ts +1 -1
- package/dist/types/namespaces/activecampaign.d.ts.map +1 -1
- package/dist/types/namespaces/analytics.d.ts +10 -10
- package/dist/types/namespaces/analytics.d.ts.map +1 -1
- package/dist/types/namespaces/billing.d.ts.map +1 -1
- package/dist/types/namespaces/builder.d.ts.map +1 -1
- package/dist/types/namespaces/configurations.d.ts.map +1 -1
- package/dist/types/namespaces/context.d.ts.map +1 -1
- package/dist/types/namespaces/desk.d.ts +3 -3
- package/dist/types/namespaces/desk.d.ts.map +1 -1
- package/dist/types/namespaces/media.d.ts.map +1 -1
- package/dist/types/namespaces/namespace.d.ts +2 -1
- package/dist/types/namespaces/namespace.d.ts.map +1 -1
- package/dist/types/namespaces/portal.d.ts.map +1 -1
- package/dist/types/namespaces/scheduler.d.ts.map +1 -1
- package/dist/types/namespaces/tunnel.d.ts.map +1 -1
- package/dist/types/namespaces/whatsapp.d.ts.map +1 -1
- package/dist/types/schemas/utils/validate.d.ts +2 -2
- package/dist/types/schemas/utils/validate.d.ts.map +1 -1
- package/dist/types/schemas/webhook.d.ts +6 -6
- package/dist/types/schemas/webhook.d.ts.map +1 -1
- package/dist/types/sender/bliperror.d.ts +3 -4
- package/dist/types/sender/bliperror.d.ts.map +1 -1
- package/dist/types/sender/closable.d.ts.map +1 -1
- package/dist/types/sender/enveloperesolver.d.ts +1 -1
- package/dist/types/sender/enveloperesolver.d.ts.map +1 -1
- package/dist/types/sender/gateway/customgatewaysender.d.ts.map +1 -1
- package/dist/types/sender/http/httpsender.d.ts.map +1 -1
- package/dist/types/sender/multi/multisender.d.ts.map +1 -1
- package/dist/types/sender/plugin/communication.d.ts.map +1 -1
- package/dist/types/sender/plugin/pluginsender.d.ts.map +1 -1
- package/dist/types/sender/retryableerror.d.ts.map +1 -1
- package/dist/types/sender/sender.d.ts +1 -0
- package/dist/types/sender/sender.d.ts.map +1 -1
- package/dist/types/sender/sessionnegotiator.d.ts +2 -2
- package/dist/types/sender/sessionnegotiator.d.ts.map +1 -1
- package/dist/types/sender/tcp/tcpsender.d.ts.map +1 -1
- package/dist/types/sender/throttler.d.ts.map +1 -1
- package/dist/types/sender/transporttls.d.ts +1 -1
- package/dist/types/sender/transporttls.d.ts.map +1 -1
- package/dist/types/sender/websocket/websocketsender.d.ts.map +1 -1
- package/dist/types/types/command.d.ts.map +1 -1
- package/dist/types/types/desk.d.ts +10 -9
- package/dist/types/types/desk.d.ts.map +1 -1
- package/dist/types/types/flow.d.ts +320 -320
- package/dist/types/types/flow.d.ts.map +1 -1
- package/dist/types/types/message.d.ts +1 -1
- package/dist/types/types/message.d.ts.map +1 -1
- package/dist/types/types/node.d.ts +3 -3
- package/dist/types/types/node.d.ts.map +1 -1
- package/dist/types/types/notification.d.ts.map +1 -1
- package/dist/types/types/reason.d.ts +9 -8
- package/dist/types/types/reason.d.ts.map +1 -1
- package/dist/types/types/session.d.ts.map +1 -1
- package/dist/types/types/whatsapp.d.ts +1 -1
- package/dist/types/types/whatsapp.d.ts.map +1 -1
- package/dist/types/utils/flow-rules.d.ts.map +1 -1
- package/dist/types/utils/logger.d.ts +2 -2
- package/dist/types/utils/logger.d.ts.map +1 -1
- package/dist/types/utils/minifier.d.ts +253 -253
- package/dist/types/utils/odata.d.ts.map +1 -1
- package/dist/types/utils/promise.d.ts +2 -0
- package/dist/types/utils/promise.d.ts.map +1 -0
- package/dist/types/utils/uri.d.ts.map +1 -1
- package/package.json +9 -6
- package/src/client.ts +6 -4
- package/src/namespaces/namespace.ts +42 -15
- package/src/sender/bliperror.ts +9 -6
- package/src/sender/enveloperesolver.ts +4 -1
- package/src/sender/sender.ts +11 -0
- package/src/sender/sessionnegotiator.ts +7 -4
- package/src/sender/tcp/tcpsender.ts +6 -12
- package/src/sender/websocket/websocketsender.ts +6 -13
- package/src/types/desk.ts +11 -9
- package/src/types/node.ts +8 -5
- package/src/types/reason.ts +10 -8
- package/src/utils/promise.ts +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odata.d.ts","sourceRoot":"","sources":["../../../src/utils/odata.ts"],"names":[],"mappings":"AAEA,qBAAa,WAAW,CAAC,CAAC;IACtB,OAAO,CAAC,WAAW,CAAoB;IAEvC,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,YAAY;IAIpB,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"odata.d.ts","sourceRoot":"","sources":["../../../src/utils/odata.ts"],"names":[],"mappings":"AAEA,qBAAa,WAAW,CAAC,CAAC;IACtB,OAAO,CAAC,WAAW,CAAoB;IAEvC,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,YAAY;IAIpB,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAG3D;IAED,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAG3D;IAED,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAGlE;IAED,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAGlE;IAED,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAGlE;IAED,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAGlE;IAED,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAInE;IAED,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAGrE;IAED,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAGnE;IAED,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAGnE;IAED,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAGnE;IAED,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAGtE;IAED,GAAG,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAW7E;IAED,EAAE,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAW5E;IAED,QAAQ,IAAI,MAAM,CAEjB;CACJ;AAED,eAAO,MAAM,MAAM,GAAI,CAAC,OAAK,WAAW,CAAC,CAAC,CAAyB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../../../src/utils/promise.ts"],"names":[],"mappings":"AACA,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAGvE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../../../src/utils/uri.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG;IAChB,IAAI,EAAE,MAAM,CAAA;IAKZ,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7B;AAED,eAAO,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../../../src/utils/uri.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG;IAChB,IAAI,EAAE,MAAM,CAAA;IAKZ,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7B;AAED,eAAO,MAAM,GAAG,UAAW,oBAAoB,WAAW,KAAK,CAAC,OAAO,CAAC,KAAG,GAyB1E,CAAA;AAED,eAAO,MAAM,WAAW,QAAS,GAAG,KAAG,MAStC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@whitewall/blip-sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.200",
|
|
4
4
|
"description": "Blip API wrapper",
|
|
5
5
|
"exports": {
|
|
6
6
|
"types": "./dist/types/index.d.ts",
|
|
@@ -13,17 +13,20 @@
|
|
|
13
13
|
"build": "concurrently -g \"pnpm run build:esm\" \"pnpm run build:cjs\"",
|
|
14
14
|
"lint": "tsc --noEmit",
|
|
15
15
|
"start": "concurrently -k \"pnpm run build:esm -- -w\" \"pnpm run build:cjs -- -w\"",
|
|
16
|
-
"test": "node --
|
|
16
|
+
"test": "node --test ./test/*.spec.ts"
|
|
17
17
|
},
|
|
18
18
|
"files": [
|
|
19
19
|
"dist/*",
|
|
20
20
|
"src/*"
|
|
21
21
|
],
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": "26"
|
|
24
|
+
},
|
|
22
25
|
"devDependencies": {
|
|
23
|
-
"@types/node": "
|
|
24
|
-
"concurrently": "10.0.
|
|
25
|
-
"typescript": "
|
|
26
|
-
"zod": "4.
|
|
26
|
+
"@types/node": "26.6.2",
|
|
27
|
+
"concurrently": "10.0.5",
|
|
28
|
+
"typescript": "7.0.2",
|
|
29
|
+
"zod": "4.6.5"
|
|
27
30
|
},
|
|
28
31
|
"peerDependencies": {
|
|
29
32
|
"zod": ">=4.2"
|
package/src/client.ts
CHANGED
|
@@ -20,10 +20,12 @@ import { type BlipDomain, type Domain, type Identity, Node } from './types/node.
|
|
|
20
20
|
import { randomId } from './utils/random.ts'
|
|
21
21
|
|
|
22
22
|
export class BlipClient<TSender extends Sender = Sender> {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
) {
|
|
23
|
+
public readonly sender: TSender
|
|
24
|
+
protected readonly defaultOptions?: SendCommandOptions
|
|
25
|
+
|
|
26
|
+
constructor(sender: TSender, defaultOptions?: SendCommandOptions) {
|
|
27
|
+
this.sender = sender
|
|
28
|
+
this.defaultOptions = defaultOptions
|
|
27
29
|
this.account = new AccountNamespace(this, defaultOptions)
|
|
28
30
|
this.builder = new BuilderNamespace(this, defaultOptions)
|
|
29
31
|
this.desk = new DeskNamespace(this, defaultOptions)
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import type { BlipClient } from '../client.ts'
|
|
2
|
+
import { BlipError } from '../sender/bliperror.ts'
|
|
2
3
|
import { ConnectionSender } from '../sender/sender.ts'
|
|
3
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
type Command,
|
|
6
|
+
type CommandMethods,
|
|
7
|
+
type Domain,
|
|
8
|
+
type Identity,
|
|
9
|
+
Node,
|
|
10
|
+
type NodeLike,
|
|
11
|
+
type UnknownCommand,
|
|
12
|
+
} from '../types/index.ts'
|
|
4
13
|
import { randomId } from '../utils/random.ts'
|
|
5
14
|
import { type URI, uriToString } from '../utils/uri.ts'
|
|
6
15
|
|
|
@@ -31,11 +40,15 @@ export type ConsumeOptions = SendCommandOptions & {
|
|
|
31
40
|
}
|
|
32
41
|
|
|
33
42
|
export class Namespace {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
) {
|
|
43
|
+
protected readonly blipClient: BlipClient
|
|
44
|
+
private readonly ownerSubdomain: string
|
|
45
|
+
private readonly defaultOptions?: ConsumeOptions
|
|
46
|
+
|
|
47
|
+
constructor(blipClient: BlipClient, ownerSubdomain: string, defaultOptions?: ConsumeOptions) {
|
|
48
|
+
this.blipClient = blipClient
|
|
49
|
+
this.ownerSubdomain = ownerSubdomain
|
|
50
|
+
this.defaultOptions = defaultOptions
|
|
51
|
+
}
|
|
39
52
|
|
|
40
53
|
get identity() {
|
|
41
54
|
return `postmaster@${this.ownerSubdomain ? `${this.ownerSubdomain}.` : ''}${this.defaultOptions?.domain ?? 'msging.net'}` as Identity
|
|
@@ -106,6 +119,19 @@ export class Namespace {
|
|
|
106
119
|
return []
|
|
107
120
|
}
|
|
108
121
|
|
|
122
|
+
private async fetchPage<TItem>(cmd: UnknownCommand, tolerateNotFound: boolean): Promise<Array<TItem>> {
|
|
123
|
+
try {
|
|
124
|
+
return this.extractCollection<TItem>(await this.blipClient.sender.sendCommand(cmd))
|
|
125
|
+
} catch (err) {
|
|
126
|
+
// Past the first page the resource is known to exist, so a not-found is the end of the collection.
|
|
127
|
+
if (tolerateNotFound && err instanceof BlipError && err.code === 67) {
|
|
128
|
+
return []
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
throw err
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
109
135
|
private async *sendIterableCommand<TMethod extends CommandMethods, TResponse = void>(
|
|
110
136
|
command: Omit<Command<TMethod>, 'uri' | 'id' | 'to'> & {
|
|
111
137
|
uri: URI
|
|
@@ -113,15 +139,15 @@ export class Namespace {
|
|
|
113
139
|
options: ConsumeOptions,
|
|
114
140
|
): AsyncIterable<Unpacked<TResponse>> {
|
|
115
141
|
const { path, query, owner, take } = this.prepareCommandContext(command, options)
|
|
116
|
-
|
|
142
|
+
const startSkip = options.skip ?? 0
|
|
143
|
+
let skip = startSkip
|
|
117
144
|
let yielded = 0
|
|
118
145
|
|
|
119
146
|
while (true) {
|
|
120
147
|
const q = new Map(query).set('$take', take.toString()).set('$skip', skip.toString())
|
|
121
148
|
|
|
122
|
-
const
|
|
123
|
-
const
|
|
124
|
-
const items = this.extractCollection<Unpacked<TResponse>>(response)
|
|
149
|
+
const cmd = this.buildCommand(command, path, q, owner, options)
|
|
150
|
+
const items = await this.fetchPage<Unpacked<TResponse>>(cmd, skip > startSkip)
|
|
125
151
|
|
|
126
152
|
if (!items.length) {
|
|
127
153
|
break
|
|
@@ -167,7 +193,8 @@ export class Namespace {
|
|
|
167
193
|
throw new Error('Optimistic consume requires max or fetchall to be set')
|
|
168
194
|
}
|
|
169
195
|
|
|
170
|
-
|
|
196
|
+
const startSkip = options.skip ?? 0
|
|
197
|
+
let skip = startSkip
|
|
171
198
|
let results: Array<Unpacked<TResponse>> = []
|
|
172
199
|
|
|
173
200
|
query.set('$take', take.toString())
|
|
@@ -176,11 +203,11 @@ export class Namespace {
|
|
|
176
203
|
const pageCapacity = options.optimistic ? Math.min(Math.ceil(remaining / take), 20) : 1
|
|
177
204
|
|
|
178
205
|
const items = await Promise.all(
|
|
179
|
-
Array.from({ length: pageCapacity },
|
|
180
|
-
const
|
|
206
|
+
Array.from({ length: pageCapacity }, (_, i: number) => {
|
|
207
|
+
const pageSkip = skip + i * take
|
|
208
|
+
const q = new Map(query).set('$skip', pageSkip.toString())
|
|
181
209
|
const cmd = this.buildCommand(command, path, q, owner, options)
|
|
182
|
-
|
|
183
|
-
return this.extractCollection<Unpacked<TResponse>>(response)
|
|
210
|
+
return this.fetchPage<Unpacked<TResponse>>(cmd, pageSkip > startSkip)
|
|
184
211
|
}),
|
|
185
212
|
)
|
|
186
213
|
|
package/src/sender/bliperror.ts
CHANGED
|
@@ -3,12 +3,15 @@ import type { Reason } from '../types/reason.ts'
|
|
|
3
3
|
import { ReasonCodes } from '../types/reason.ts'
|
|
4
4
|
|
|
5
5
|
export class BlipError extends Error {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
) {
|
|
6
|
+
public readonly uri: string
|
|
7
|
+
public readonly cause: Reason
|
|
8
|
+
public commandResponse?: CommandResponse<unknown, CommandMethods, 'failure'>
|
|
9
|
+
|
|
10
|
+
constructor(uri: string, cause: Reason, commandResponse?: CommandResponse<unknown, CommandMethods, 'failure'>) {
|
|
11
11
|
super(`Blip command for ${uri} failed (${cause.code}): ${cause.description}`)
|
|
12
|
+
this.uri = uri
|
|
13
|
+
this.cause = cause
|
|
14
|
+
this.commandResponse = commandResponse
|
|
12
15
|
}
|
|
13
16
|
|
|
14
17
|
public get code(): number {
|
|
@@ -33,7 +36,7 @@ export class BlipError extends Error {
|
|
|
33
36
|
return new BlipError(uri, commandResponse.reason, commandResponse)
|
|
34
37
|
}
|
|
35
38
|
|
|
36
|
-
static retryableBlipErrors = [
|
|
39
|
+
static retryableBlipErrors: Array<number> = [
|
|
37
40
|
ReasonCodes.PipelineTimeout,
|
|
38
41
|
ReasonCodes.MaxThroughputExceeded,
|
|
39
42
|
ReasonCodes.GeneralError,
|
|
@@ -49,10 +49,13 @@ export class EnvelopeResolver {
|
|
|
49
49
|
}
|
|
50
50
|
> = {}
|
|
51
51
|
|
|
52
|
+
private readonly sender: OpenConnectionSender
|
|
53
|
+
|
|
52
54
|
constructor(
|
|
53
|
-
|
|
55
|
+
sender: OpenConnectionSender,
|
|
54
56
|
timeoutSeconds = 60 * 15, // Default timeout of 15 minutes
|
|
55
57
|
) {
|
|
58
|
+
this.sender = sender
|
|
56
59
|
this.timeoutListener = setInterval(() => {
|
|
57
60
|
const now = Date.now()
|
|
58
61
|
for (const id in this.waitingEnvelopeResponseResolvers) {
|
package/src/sender/sender.ts
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
type Notification,
|
|
12
12
|
type UnknownCommandResponse,
|
|
13
13
|
} from '../types/index.ts'
|
|
14
|
+
import { logger } from '../utils/logger.ts'
|
|
14
15
|
import type { Closable } from './closable.ts'
|
|
15
16
|
import { EnvelopeResolver, type EventMap, type Listener } from './enveloperesolver.ts'
|
|
16
17
|
import { RetryableError } from './retryableerror.ts'
|
|
@@ -166,6 +167,16 @@ export abstract class OpenConnectionSender extends ConnectionSender implements S
|
|
|
166
167
|
return this.sessionNegotiator?.session ?? null
|
|
167
168
|
}
|
|
168
169
|
|
|
170
|
+
protected handleEnvelope(envelope: Envelope): void {
|
|
171
|
+
if (this.sessionNegotiator?.negotiating) {
|
|
172
|
+
this.sessionNegotiator.handleEnvelope(envelope)
|
|
173
|
+
} else {
|
|
174
|
+
this.envelopeResolver
|
|
175
|
+
.resolve(envelope)
|
|
176
|
+
.catch((err) => logger.error(this.constructor.name, 'Failed to handle envelope', err))
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
169
180
|
public override get node() {
|
|
170
181
|
// the negotiated local node is authoritative: it carries the server-assigned instance
|
|
171
182
|
return this.sessionNegotiator?.session?.localNode ?? super.node
|
|
@@ -19,10 +19,13 @@ export class SessionNegotiator {
|
|
|
19
19
|
private currentSessionResolver: Pick<PromiseWithResolvers<Session>, 'reject' | 'resolve'> | null = null
|
|
20
20
|
private failure: Error | null = null
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
) {
|
|
22
|
+
private readonly sender: OpenConnectionSender
|
|
23
|
+
private readonly sendSession: (session: Session) => void
|
|
24
|
+
|
|
25
|
+
constructor(sender: OpenConnectionSender, sendSession: (session: Session) => void) {
|
|
26
|
+
this.sender = sender
|
|
27
|
+
this.sendSession = sendSession
|
|
28
|
+
}
|
|
26
29
|
|
|
27
30
|
public async negotiate(options: {
|
|
28
31
|
node: NodeLike
|
|
@@ -10,6 +10,7 @@ import type {
|
|
|
10
10
|
Notification,
|
|
11
11
|
UnknownCommandResponse,
|
|
12
12
|
} from '../../types/index.ts'
|
|
13
|
+
import { markRejectionHandled } from '../../utils/promise.ts'
|
|
13
14
|
import { BlipError } from '../bliperror.ts'
|
|
14
15
|
import { RetryableError } from '../retryableerror.ts'
|
|
15
16
|
import { ConnectionSender, type ConnectionSenderConstructor, OpenConnectionSender } from '../sender.ts'
|
|
@@ -54,12 +55,7 @@ export class TCPSender extends OpenConnectionSender {
|
|
|
54
55
|
})
|
|
55
56
|
},
|
|
56
57
|
() => this.rejectPending('Connection was closed'),
|
|
57
|
-
(envelope: Envelope) =>
|
|
58
|
-
if (this.sessionNegotiator?.negotiating) {
|
|
59
|
-
return this.sessionNegotiator.handleEnvelope(envelope)
|
|
60
|
-
}
|
|
61
|
-
this.envelopeResolver.resolve(envelope)
|
|
62
|
-
},
|
|
58
|
+
(envelope: Envelope) => this.handleEnvelope(envelope),
|
|
63
59
|
)
|
|
64
60
|
}
|
|
65
61
|
|
|
@@ -146,7 +142,7 @@ class TCPHandle<T> {
|
|
|
146
142
|
onMessage: (message: T) => void,
|
|
147
143
|
) {
|
|
148
144
|
this.onMessage = onMessage
|
|
149
|
-
this.currentSocketPromise = this.connect(host, port, onConnected, onClose)
|
|
145
|
+
this.currentSocketPromise = markRejectionHandled(this.connect(host, port, onConnected, onClose))
|
|
150
146
|
}
|
|
151
147
|
|
|
152
148
|
public get() {
|
|
@@ -247,12 +243,10 @@ class TCPHandle<T> {
|
|
|
247
243
|
if (connected) onClose()
|
|
248
244
|
|
|
249
245
|
this.connectionAttempts++
|
|
250
|
-
// Swallow the rejection of the now-orphaned previous promise; any
|
|
251
|
-
// in-flight get() awaiter still sees it via their captured reference.
|
|
252
|
-
const previous = this.currentSocketPromise
|
|
253
246
|
this.currentSocketPromise =
|
|
254
|
-
this.connectionAttempts < 3
|
|
255
|
-
|
|
247
|
+
this.connectionAttempts < 3
|
|
248
|
+
? markRejectionHandled(this.connect(host, port, onConnected, onClose))
|
|
249
|
+
: null
|
|
256
250
|
}
|
|
257
251
|
|
|
258
252
|
if (!connected) reject(new Error('Socket closed before connect'))
|
|
@@ -9,6 +9,7 @@ import type {
|
|
|
9
9
|
UnknownCommandResponse,
|
|
10
10
|
} from '../../types/index.ts'
|
|
11
11
|
import { logger } from '../../utils/logger.ts'
|
|
12
|
+
import { markRejectionHandled } from '../../utils/promise.ts'
|
|
12
13
|
import { BlipError } from '../bliperror.ts'
|
|
13
14
|
import { RetryableError } from '../retryableerror.ts'
|
|
14
15
|
import { assertNonTransportAuth, type NonTransportAuthentication } from '../security.ts'
|
|
@@ -40,13 +41,7 @@ export class WebSocketSender extends OpenConnectionSender {
|
|
|
40
41
|
})
|
|
41
42
|
},
|
|
42
43
|
() => this.rejectPending('Connection was closed'),
|
|
43
|
-
(envelope: Envelope) =>
|
|
44
|
-
if (this.sessionNegotiator?.negotiating) {
|
|
45
|
-
return this.sessionNegotiator.handleEnvelope(envelope)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
this.envelopeResolver.resolve(envelope)
|
|
49
|
-
},
|
|
44
|
+
(envelope: Envelope) => this.handleEnvelope(envelope),
|
|
50
45
|
)
|
|
51
46
|
}
|
|
52
47
|
|
|
@@ -135,7 +130,7 @@ class WebSocketHandle<T> {
|
|
|
135
130
|
onClose: () => void,
|
|
136
131
|
onMessage: (message: T) => void,
|
|
137
132
|
) {
|
|
138
|
-
this.currentWebSocketPromise = this.connect(url, onConnected, onClose, onMessage)
|
|
133
|
+
this.currentWebSocketPromise = markRejectionHandled(this.connect(url, onConnected, onClose, onMessage))
|
|
139
134
|
}
|
|
140
135
|
|
|
141
136
|
public get() {
|
|
@@ -179,12 +174,10 @@ class WebSocketHandle<T> {
|
|
|
179
174
|
if (connected) onClose()
|
|
180
175
|
|
|
181
176
|
this.connectionAttempts++
|
|
182
|
-
// Swallow the rejection of the now-orphaned previous promise; any
|
|
183
|
-
// in-flight get() awaiter still sees it via their captured reference.
|
|
184
|
-
const previous = this.currentWebSocketPromise
|
|
185
177
|
this.currentWebSocketPromise =
|
|
186
|
-
this.connectionAttempts < 3
|
|
187
|
-
|
|
178
|
+
this.connectionAttempts < 3
|
|
179
|
+
? markRejectionHandled(this.connect(url, onConnected, onClose, onMessage))
|
|
180
|
+
: null
|
|
188
181
|
}
|
|
189
182
|
|
|
190
183
|
if (!connected) reject(new Error('WebSocket closed before open'))
|
package/src/types/desk.ts
CHANGED
|
@@ -18,15 +18,17 @@ export type AttendanceHour = {
|
|
|
18
18
|
timeZoneId?: string
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export
|
|
22
|
-
Sunday
|
|
23
|
-
Monday
|
|
24
|
-
Tuesday
|
|
25
|
-
Wednesday
|
|
26
|
-
Thursday
|
|
27
|
-
Friday
|
|
28
|
-
Saturday
|
|
29
|
-
}
|
|
21
|
+
export const DayOfWeek = {
|
|
22
|
+
Sunday: 'Sunday',
|
|
23
|
+
Monday: 'Monday',
|
|
24
|
+
Tuesday: 'Tuesday',
|
|
25
|
+
Wednesday: 'Wednesday',
|
|
26
|
+
Thursday: 'Thursday',
|
|
27
|
+
Friday: 'Friday',
|
|
28
|
+
Saturday: 'Saturday',
|
|
29
|
+
} as const
|
|
30
|
+
|
|
31
|
+
export type DayOfWeek = (typeof DayOfWeek)[keyof typeof DayOfWeek]
|
|
30
32
|
|
|
31
33
|
export type AttendanceHourScheduleItem = {
|
|
32
34
|
id: string
|
package/src/types/node.ts
CHANGED
|
@@ -6,12 +6,15 @@ export type NodeLike = Node | NodeShape
|
|
|
6
6
|
export type PossiblyNode = NodeLike | string
|
|
7
7
|
|
|
8
8
|
export class Node extends String {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
) {
|
|
9
|
+
public readonly name: string
|
|
10
|
+
public readonly domain: Domain
|
|
11
|
+
public readonly instance?: string
|
|
12
|
+
|
|
13
|
+
constructor(name: string, domain: Domain, instance?: string) {
|
|
14
14
|
super(`${encodeURIComponent(name)}@${domain}${instance ? `/${instance}` : ''}`)
|
|
15
|
+
this.name = name
|
|
16
|
+
this.domain = domain
|
|
17
|
+
this.instance = instance
|
|
15
18
|
}
|
|
16
19
|
|
|
17
20
|
public toIdentity(): Identity {
|
package/src/types/reason.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
export
|
|
2
|
-
PipelineTimeout
|
|
3
|
-
MaxThroughputExceeded
|
|
4
|
-
GeneralError
|
|
5
|
-
FailedToSendEnvelopeViaHTTP
|
|
1
|
+
export const ReasonCodes = {
|
|
2
|
+
PipelineTimeout: 2,
|
|
3
|
+
MaxThroughputExceeded: 38,
|
|
4
|
+
GeneralError: 101,
|
|
5
|
+
FailedToSendEnvelopeViaHTTP: 2105,
|
|
6
6
|
// Returned on analytics requests when data is not ready but will be soon
|
|
7
|
-
PendingRequest
|
|
8
|
-
CommandProcessingError
|
|
9
|
-
}
|
|
7
|
+
PendingRequest: 7390,
|
|
8
|
+
CommandProcessingError: 61,
|
|
9
|
+
} as const
|
|
10
|
+
|
|
11
|
+
export type ReasonCodes = (typeof ReasonCodes)[keyof typeof ReasonCodes]
|
|
10
12
|
|
|
11
13
|
export interface Reason {
|
|
12
14
|
code: ReasonCodes | number
|