@be-link/pos-cli-nodejs 1.0.236 → 1.0.239

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.
Files changed (33) hide show
  1. package/README.md +43 -0
  2. package/index.d.ts +8 -0
  3. package/index.js +12 -1
  4. package/package.json +1 -1
  5. package/pos/modules/orderCore/seniorConfirmationRecovery.d.ts +2 -0
  6. package/pos/modules/orderCore/seniorConfirmationRecovery.js +6 -0
  7. package/pos/modules/orderCore/service.d.ts +11 -1
  8. package/pos/modules/orderCore/service.js +18 -0
  9. package/pos/modules/orderCore/types.d.ts +127 -0
  10. package/pos/modules/orderQuery/advisor.d.ts +14 -0
  11. package/pos/modules/orderQuery/advisor.js +111 -0
  12. package/pos/modules/orderQuery/advisorBusinessError.d.ts +8 -0
  13. package/pos/modules/orderQuery/advisorBusinessError.js +37 -0
  14. package/pos/modules/orderQuery/advisorHttpSender.d.ts +7 -0
  15. package/pos/modules/orderQuery/advisorHttpSender.js +138 -0
  16. package/pos/modules/orderQuery/advisorProtection.d.ts +63 -0
  17. package/pos/modules/orderQuery/advisorProtection.js +262 -0
  18. package/pos/modules/orderQuery/advisorTypes.d.ts +80 -0
  19. package/pos/modules/orderQuery/advisorTypes.js +2 -0
  20. package/pos/http.test.d.ts +0 -1
  21. package/pos/http.test.js +0 -71
  22. package/pos/modules/orderAbnormalFollow/service.test.d.ts +0 -1
  23. package/pos/modules/orderAbnormalFollow/service.test.js +0 -72
  24. package/pos/modules/orderCore/service.test.d.ts +0 -1
  25. package/pos/modules/orderCore/service.test.js +0 -72
  26. package/pos/modules/orderQuery/service.test.d.ts +0 -1
  27. package/pos/modules/orderQuery/service.test.js +0 -71
  28. package/pos/modules/orderQuery/settlement.test.d.ts +0 -1
  29. package/pos/modules/orderQuery/settlement.test.js +0 -43
  30. package/pos/modules/orderRoomShare/service.test.d.ts +0 -1
  31. package/pos/modules/orderRoomShare/service.test.js +0 -103
  32. package/types.test.d.ts +0 -1
  33. package/types.test.js +0 -55
package/README.md CHANGED
@@ -1,6 +1,49 @@
1
1
  # pos-cli-nodejs
2
2
  正向订单服务Nodejs客户端
3
3
 
4
+ ## 旅顾归属事实查询(开发中)
5
+
6
+ `AdvisorQueryService` 提供四个固定 DTO 查询方法:
7
+ `queryAdvisorShareOrderList`、`getAdvisorShareOrderFacts`、
8
+ `getAdvisorShareOrderFactsBatch`、`getAdvisorShareAdjustmentCreateFacts`。
9
+ 返回值不包装完整订单 Proxy;金额 `remainingFeeCent` 是小管家的“合计”
10
+ (原单 remainFee),quantity 是剩余份数,不是差价数量或实付累计。
11
+
12
+ 这组方法只向 transport 提供四条准确协议路径;`createSignedAdvisorTransport` 使用显式配置的 `origin` 构造目标地址,不沿用旧 BaseService 的 SFC/CLOUD_RUN 内网选择。DS/VS 现有 `new AdvisorQueryService(transport)` 装配方式保持不变;自定义 transport 同样须根据自身固定目标解析该协议路径,不能回退到旧网络模式。
13
+
14
+ 这组方法与旧 `queryByUserService` 隔离。必须由受信应用装配
15
+ `AdvisorProtectedTransport`;没有 transport 时拒绝请求,不回退到共享 inside
16
+ Token。该接口仅定义集成边界,不证明调用方可信,也不实现签名协议。
17
+ transport 必须按后续冻结的 POS 协议绑定调用方、旅顾身份、动作、完整请求、
18
+ 目标地址与有效期,并处理宿主错误和凭据日志脱敏。业务 body 不接受 caller、
19
+ actor、买家身份等额外参数。VS 专用创建事实的服务端授权不能由客户端方法名代替。
20
+
21
+ 已提供签名 transport 与专用 `createAdvisorHttpsSender({origin, timeoutMs, maxResponseBytes})`,但尚未装配真实信任配置或接通服务端路由,因此不可据此直接联调或发布。sender仅接受固定HTTPS origin和四条准确路径,使用Node原生HTTPS、证书验证及独立连接;不使用环境代理、不跟随重定向、不自动重试,不允许自报额外headers。超时为整次调用截止时间,响应容量必须显式配置(技术容量,不是业务金额/数量上限)。HTTP失败统一脱敏;当前不透传HTTP业务错误码,以免未经验证的错误正文泄露。sender仅做Mock离线验证,未进行真实网络/代理/证书环境验收。
22
+
23
+ 专用sender离线检查:
24
+ ```bash
25
+ out=$(mktemp -d /tmp/pos-sdk-sender.XXXXXX)
26
+ tsc src/pos/modules/orderQuery/advisorHttpSender.ts --rootDir src --strict --target ES2020 --module commonjs \
27
+ --typeRoots /opt/homebrew/lib/node_modules/ts-node/node_modules/@types --types node --outDir "$out"
28
+ node src/pos/modules/orderQuery/advisorHttpSender.offline.cjs "$out"
29
+ ```
30
+ transport 返回 POS 原生 `{data,message,success?,requestId?}`,本层只解包一次;
31
+ 不接收 DS 的 code/SUCCESS envelope。方法本身不重试,依赖错误原样传播。
32
+ 集成方 transport 的重试和错误脱敏仍须单独验证。
33
+
34
+ 无项目依赖时可复现离线检查(不等于 Jest 或完整构建):
35
+
36
+ ```bash
37
+ out=$(mktemp -d /tmp/pos-sdk-advisor.XXXXXX)
38
+ tsc src/pos/modules/orderQuery/advisor.ts --strict --target ES2020 --module commonjs \
39
+ --typeRoots /opt/homebrew/lib/node_modules/ts-node/node_modules/@types \
40
+ --types node --outDir "$out"
41
+ node src/pos/modules/orderQuery/advisor.offline.cjs "$out"
42
+ ```
43
+
44
+ 上述 typeRoots 是本机已有 Node 类型声明的位置;其他机器应使用其已安装的声明路径。
45
+
46
+
4
47
  ## 安装
5
48
  ```
6
49
  npm install @be-link/pos-cli-nodejs
package/index.d.ts CHANGED
@@ -1,3 +1,11 @@
1
+ export { AdvisorBusinessError } from './pos/modules/orderQuery/advisorBusinessError';
2
+ export type { AdvisorBusinessCode } from './pos/modules/orderQuery/advisorBusinessError';
3
+ export { AdvisorQueryService } from './pos/modules/orderQuery/advisor';
4
+ export { createAdvisorHttpsSender } from './pos/modules/orderQuery/advisorHttpSender';
5
+ export type { AdvisorHttpSenderOptions } from './pos/modules/orderQuery/advisorHttpSender';
6
+ export { canonicalAdvisorJson, createAdvisorRequestSigner, createAdvisorRequestVerifier, createSignedAdvisorTransport } from './pos/modules/orderQuery/advisorProtection';
7
+ export type { AdvisorActor, AdvisorCaller, AdvisorSignedRequest, AdvisorVerifiedContext, AdvisorVerificationConfig, AdvisorAssertionSender } from './pos/modules/orderQuery/advisorProtection';
8
+ export type { AdvisorOrderFacts, AdvisorOrderListRequest, AdvisorOrderRequest, AdvisorOrderBatchRequest, AdvisorOrderPage, AdvisorAdjustmentCreateFacts, AdvisorQueryController, AdvisorQueryMethod, AdvisorProtectedRequest, AdvisorProtectedTransport, AdvisorResponseEnvelope, } from './pos/modules/orderQuery/advisorTypes';
1
9
  import * as PosConstants from 'vitality-meta/enums/pos';
2
10
  import * as PosDto from './types';
3
11
  import BizError from './errors/BizError';
package/index.js CHANGED
@@ -26,7 +26,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.VenueInfoProxy = exports.ComboInfoProxy = exports.SkuInfoProxy = exports.ItemInfoProxy = exports.PosProxyFactory = exports.BizError = exports.PosDto = exports.PosConstants = exports.tongchengService = exports.orderRoomShareService = exports.orderAbnormalFollowService = exports.orderTouristMaterialService = exports.dataMigrateService = exports.orderJobService = exports.orderNoteService = exports.queryByPandoraService = exports.queryBySupplierService = exports.queryByWebService = exports.queryByUserService = exports.queryByStoreService = exports.queryByCommodityService = exports.orderFulfillService = exports.orderCoreService = void 0;
29
+ exports.VenueInfoProxy = exports.ComboInfoProxy = exports.SkuInfoProxy = exports.ItemInfoProxy = exports.PosProxyFactory = exports.BizError = exports.PosDto = exports.PosConstants = exports.tongchengService = exports.orderRoomShareService = exports.orderAbnormalFollowService = exports.orderTouristMaterialService = exports.dataMigrateService = exports.orderJobService = exports.orderNoteService = exports.queryByPandoraService = exports.queryBySupplierService = exports.queryByWebService = exports.queryByUserService = exports.queryByStoreService = exports.queryByCommodityService = exports.orderFulfillService = exports.orderCoreService = exports.createSignedAdvisorTransport = exports.createAdvisorRequestVerifier = exports.createAdvisorRequestSigner = exports.canonicalAdvisorJson = exports.createAdvisorHttpsSender = exports.AdvisorQueryService = exports.AdvisorBusinessError = void 0;
30
+ var advisorBusinessError_1 = require("./pos/modules/orderQuery/advisorBusinessError");
31
+ Object.defineProperty(exports, "AdvisorBusinessError", { enumerable: true, get: function () { return advisorBusinessError_1.AdvisorBusinessError; } });
32
+ var advisor_1 = require("./pos/modules/orderQuery/advisor");
33
+ Object.defineProperty(exports, "AdvisorQueryService", { enumerable: true, get: function () { return advisor_1.AdvisorQueryService; } });
34
+ var advisorHttpSender_1 = require("./pos/modules/orderQuery/advisorHttpSender");
35
+ Object.defineProperty(exports, "createAdvisorHttpsSender", { enumerable: true, get: function () { return advisorHttpSender_1.createAdvisorHttpsSender; } });
36
+ var advisorProtection_1 = require("./pos/modules/orderQuery/advisorProtection");
37
+ Object.defineProperty(exports, "canonicalAdvisorJson", { enumerable: true, get: function () { return advisorProtection_1.canonicalAdvisorJson; } });
38
+ Object.defineProperty(exports, "createAdvisorRequestSigner", { enumerable: true, get: function () { return advisorProtection_1.createAdvisorRequestSigner; } });
39
+ Object.defineProperty(exports, "createAdvisorRequestVerifier", { enumerable: true, get: function () { return advisorProtection_1.createAdvisorRequestVerifier; } });
40
+ Object.defineProperty(exports, "createSignedAdvisorTransport", { enumerable: true, get: function () { return advisorProtection_1.createSignedAdvisorTransport; } });
30
41
  const PosConstants = __importStar(require("vitality-meta/enums/pos"));
31
42
  exports.PosConstants = PosConstants;
32
43
  const PosDto = __importStar(require("./types"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@be-link/pos-cli-nodejs",
3
- "version": "1.0.236",
3
+ "version": "1.0.239",
4
4
  "description": "正向订单服务Nodejs客户端",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -0,0 +1,2 @@
1
+ export declare const SENIOR_CONFIRMATION_REQUIRED = "SENIOR_CONFIRMATION_REQUIRED";
2
+ export declare const SENIOR_CONFIRMATION_RECOVERY_MESSAGE = "\u8BA2\u5355\u5DF2\u4ED8\u6B3E\uFF0C\u9700\u5B8C\u6210\u9AD8\u9F84\u51FA\u884C\u4EBA\u5065\u5EB7\u53CA\u514D\u8D23\u786E\u8BA4\u540E\u65B9\u53EF\u63A5\u5355\u3002\u8BF7\u5728\u8BA2\u5355\u8BE6\u60C5\u7EE7\u7EED\u786E\u8BA4\uFF1B\u5982\u65E0\u786E\u8BA4\u5165\u53E3\uFF0C\u8BF7\u66F4\u65B0\u6216\u91CD\u65B0\u6253\u5F00\u5C0F\u7A0B\u5E8F\uFF0C\u518D\u5230\u201C\u6211\u7684\u8BA2\u5355\u201D\u627E\u5230\u672C\u5355\u3002\u6682\u65F6\u65E0\u6CD5\u66F4\u65B0\u8BF7\u8054\u7CFB\u5BA2\u670D\uFF0C\u8BA2\u5355\u4FDD\u7559\u5F85\u786E\u8BA4\uFF0C\u8BF7\u52FF\u91CD\u590D\u4ED8\u6B3E\u3002";
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SENIOR_CONFIRMATION_RECOVERY_MESSAGE = exports.SENIOR_CONFIRMATION_REQUIRED = void 0;
4
+ // Stable code; keep the message readable for clients that only display msg/message.
5
+ exports.SENIOR_CONFIRMATION_REQUIRED = 'SENIOR_CONFIRMATION_REQUIRED';
6
+ exports.SENIOR_CONFIRMATION_RECOVERY_MESSAGE = '订单已付款,需完成高龄出行人健康及免责确认后方可接单。请在订单详情继续确认;如无确认入口,请更新或重新打开小程序,再到“我的订单”找到本单。暂时无法更新请联系客服,订单保留待确认,请勿重复付款。';
@@ -1,8 +1,18 @@
1
- import { Service } from './types';
1
+ import { Service, SeniorDisclaimerPreparation, SeniorConfirmationState } from './types';
2
2
  import BaseService from '../service';
3
3
  import { IPositiveOrderInvoice } from '../../../types';
4
4
  declare class OrderCoreService extends BaseService implements Service.OrderCoreController {
5
5
  protected prefixUrl: string;
6
+ getSeniorConfirmation(request: Service.Request.getSeniorConfirmation): Promise<SeniorConfirmationState>;
7
+ saveSeniorHealthDraft(request: Service.Request.saveSeniorHealthDraft): Promise<void>;
8
+ markSeniorConfirmationRead(request: Service.Request.markSeniorConfirmationRead): Promise<{
9
+ readToken: string;
10
+ }>;
11
+ acceptSeniorConfirmation(request: Service.Request.acceptSeniorConfirmation): Promise<void>;
12
+ prepareSeniorDisclaimer(request: Service.Request.prepareSeniorDisclaimer): Promise<SeniorDisclaimerPreparation>;
13
+ acceptSeniorDisclaimer(request: Service.Request.acceptSeniorDisclaimer): Promise<{
14
+ recordId: string;
15
+ }>;
6
16
  orderFulfill(request: Service.Request.orderFulfill): Promise<void>;
7
17
  updateOrderInvoice(request: IPositiveOrderInvoice): Promise<string>;
8
18
  orderCreateInvoice(request: IPositiveOrderInvoice): Promise<IPositiveOrderInvoice>;
@@ -10,6 +10,24 @@ class OrderCoreService extends service_1.default {
10
10
  super(...arguments);
11
11
  this.prefixUrl = '/core';
12
12
  }
13
+ getSeniorConfirmation(request) {
14
+ return (0, http_1.callApi)(this.getApiUrl(this.getSeniorConfirmation), request);
15
+ }
16
+ saveSeniorHealthDraft(request) {
17
+ return (0, http_1.callApi)(this.getApiUrl(this.saveSeniorHealthDraft), request);
18
+ }
19
+ markSeniorConfirmationRead(request) {
20
+ return (0, http_1.callApi)(this.getApiUrl(this.markSeniorConfirmationRead), request);
21
+ }
22
+ acceptSeniorConfirmation(request) {
23
+ return (0, http_1.callApi)(this.getApiUrl(this.acceptSeniorConfirmation), request);
24
+ }
25
+ prepareSeniorDisclaimer(request) {
26
+ return (0, http_1.callApi)(this.getApiUrl(this.prepareSeniorDisclaimer), request);
27
+ }
28
+ acceptSeniorDisclaimer(request) {
29
+ return (0, http_1.callApi)(this.getApiUrl(this.acceptSeniorDisclaimer), request);
30
+ }
13
31
  orderFulfill(request) {
14
32
  return (0, http_1.callApi)(this.getApiUrl(this.orderFulfill), request);
15
33
  }
@@ -1,8 +1,121 @@
1
1
  import * as PosConstants from 'vitality-meta/enums/pos';
2
2
  import * as DTO from '../../../types';
3
3
  export type RescheduleSource = 'WEB' | 'BIZ_FLOW' | 'ORDER_CHANGE';
4
+ export interface SeniorDisclaimerTourist {
5
+ id: string;
6
+ name: string;
7
+ age: number;
8
+ maskedIdCard: string;
9
+ }
10
+ export interface SeniorDisclaimerPreparation {
11
+ required: boolean;
12
+ accepted?: boolean;
13
+ recordId?: string;
14
+ title?: string;
15
+ content?: string;
16
+ contentHash?: string;
17
+ agreementVersion?: string;
18
+ minimumReadSeconds?: number;
19
+ tourists?: SeniorDisclaimerTourist[];
20
+ departureDate?: string;
21
+ itemName?: string;
22
+ }
23
+ export interface SeniorHealthAnswers {
24
+ emergencyContact: {
25
+ name: string;
26
+ relationship: string;
27
+ phone: string;
28
+ nonTraveler: boolean;
29
+ };
30
+ diseaseGroup1: string[];
31
+ diseaseGroup2: string[];
32
+ allergyDetails: string;
33
+ otherDetails: string;
34
+ recentDiscomfort: string;
35
+ regularMedication: string;
36
+ mobility: string;
37
+ canAdapt: string;
38
+ }
39
+ export interface SeniorConfirmationPerson extends SeniorDisclaimerTourist {
40
+ gender: string;
41
+ mobile: string;
42
+ birthday: string;
43
+ }
44
+ export interface SeniorHealthProgress {
45
+ touristId: string;
46
+ answers: SeniorHealthAnswers | null;
47
+ confirmedAt: number | null;
48
+ disclaimerConfirmedAt: number | null;
49
+ disclaimerText?: string;
50
+ }
51
+ export interface SeniorConfirmationState {
52
+ required: boolean;
53
+ paid: boolean;
54
+ completed: boolean;
55
+ orderId: string;
56
+ sessionId?: string;
57
+ stateLabel?: string;
58
+ itemName?: string;
59
+ departureDate?: string;
60
+ returnDate?: string;
61
+ tourists?: SeniorConfirmationPerson[];
62
+ healthRecords?: SeniorHealthProgress[];
63
+ relationships?: Record<string, string>;
64
+ documents?: {
65
+ version: string;
66
+ notice: string;
67
+ confirmationText: string;
68
+ healthConfirmationText: string;
69
+ healthText: string;
70
+ disclaimerText: string;
71
+ diseaseGroups: Array<Array<{
72
+ id: string;
73
+ label: string;
74
+ }>>;
75
+ questions: Array<{
76
+ key: string;
77
+ label: string;
78
+ options: Array<{
79
+ value: string;
80
+ label: string;
81
+ }>;
82
+ }>;
83
+ };
84
+ }
4
85
  export declare namespace Service {
5
86
  namespace Request {
87
+ interface getSeniorConfirmation {
88
+ orderId: string;
89
+ unionId: string;
90
+ }
91
+ interface saveSeniorHealthDraft extends getSeniorConfirmation {
92
+ sessionId: string;
93
+ touristId: string;
94
+ answers: SeniorHealthAnswers;
95
+ }
96
+ interface markSeniorConfirmationRead extends getSeniorConfirmation {
97
+ sessionId: string;
98
+ kind: 'HEALTH' | 'DISCLAIMER';
99
+ touristId: string;
100
+ phase: 'START' | 'BOTTOM';
101
+ readToken?: string;
102
+ answers?: SeniorHealthAnswers;
103
+ relationships?: Record<string, string>;
104
+ }
105
+ interface acceptSeniorConfirmation extends getSeniorConfirmation {
106
+ sessionId: string;
107
+ kind: 'HEALTH' | 'DISCLAIMER';
108
+ touristId: string;
109
+ readToken: string;
110
+ }
111
+ interface prepareSeniorDisclaimer {
112
+ version: 'V1' | 'V2';
113
+ orderRequest: orderCreate | orderCreateV2;
114
+ }
115
+ interface acceptSeniorDisclaimer {
116
+ recordId: string;
117
+ unionId: string;
118
+ }
6
119
  interface createOrderInvoice {
7
120
  /** 快照:订单ID */
8
121
  tradeOrderId?: string;
@@ -33,6 +146,7 @@ export declare namespace Service {
33
146
  };
34
147
  }
35
148
  interface orderCreate {
149
+ seniorDisclaimerRecordId?: string;
36
150
  /** 基础信息 */
37
151
  basicInfo: {
38
152
  /** 用户id */
@@ -126,6 +240,7 @@ export declare namespace Service {
126
240
  storeAdjustmentReason?: string;
127
241
  }
128
242
  interface orderCreateV2 {
243
+ seniorDisclaimerRecordId?: string;
129
244
  /** 基础信息 */
130
245
  basicInfo: {
131
246
  /** 用户id */
@@ -534,6 +649,18 @@ export declare namespace Service {
534
649
  }[];
535
650
  }
536
651
  interface OrderCoreController {
652
+ getSeniorConfirmation(request: Request.getSeniorConfirmation): Promise<SeniorConfirmationState>;
653
+ saveSeniorHealthDraft(request: Request.saveSeniorHealthDraft): Promise<void>;
654
+ markSeniorConfirmationRead(request: Request.markSeniorConfirmationRead): Promise<{
655
+ readToken: string;
656
+ readText?: string;
657
+ documentVersion?: string;
658
+ }>;
659
+ acceptSeniorConfirmation(request: Request.acceptSeniorConfirmation): Promise<void>;
660
+ prepareSeniorDisclaimer(request: Request.prepareSeniorDisclaimer): Promise<SeniorDisclaimerPreparation>;
661
+ acceptSeniorDisclaimer(request: Request.acceptSeniorDisclaimer): Promise<{
662
+ recordId: string;
663
+ }>;
537
664
  /**
538
665
  * 订单发票修改
539
666
  * @path /core/update-order-invoice
@@ -0,0 +1,14 @@
1
+ import BaseService from '../service';
2
+ import { AdvisorAdjustmentCreateFacts, AdvisorOrderBatchRequest, AdvisorOrderFacts, AdvisorOrderListRequest, AdvisorOrderPage, AdvisorOrderRequest, AdvisorProtectedTransport, AdvisorQueryController } from './advisorTypes';
3
+ export declare class AdvisorQueryService extends BaseService implements AdvisorQueryController {
4
+ private readonly transport?;
5
+ protected prefixUrl: string;
6
+ constructor(transport?: AdvisorProtectedTransport | undefined);
7
+ private invoke;
8
+ queryAdvisorShareOrderList(request: AdvisorOrderListRequest): Promise<AdvisorOrderPage>;
9
+ getAdvisorShareOrderFacts(request: AdvisorOrderRequest): Promise<AdvisorOrderFacts>;
10
+ getAdvisorShareOrderFactsBatch(request: AdvisorOrderBatchRequest): Promise<{
11
+ list: AdvisorOrderFacts[];
12
+ }>;
13
+ getAdvisorShareAdjustmentCreateFacts(request: AdvisorOrderRequest): Promise<AdvisorAdjustmentCreateFacts>;
14
+ }
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AdvisorQueryService = void 0;
16
+ const service_1 = __importDefault(require("../service"));
17
+ const advisorProtection_1 = require("./advisorProtection");
18
+ function invalid() {
19
+ throw new Error('INVALID_ARGUMENT');
20
+ }
21
+ function id(value) {
22
+ if (typeof value !== 'string' || !value || value.trim() !== value)
23
+ invalid();
24
+ }
25
+ function body(request, allowed) {
26
+ if (!request || typeof request !== 'object' || Array.isArray(request))
27
+ invalid();
28
+ const result = Object.assign({}, request);
29
+ if (Object.keys(result).some((key) => !allowed.includes(key)))
30
+ invalid();
31
+ id(result.advisorId);
32
+ return result;
33
+ }
34
+ // Separate from queryByUserService: there is deliberately no inside-token fallback.
35
+ class AdvisorQueryService extends service_1.default {
36
+ constructor(transport) {
37
+ super();
38
+ this.transport = transport;
39
+ this.prefixUrl = '/query/user';
40
+ }
41
+ invoke(action, request) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ if (typeof this.transport !== 'function')
44
+ throw new Error('ADVISOR_PROTECTED_TRANSPORT_REQUIRED');
45
+ const response = yield this.transport(Object.freeze({
46
+ method: 'POST',
47
+ // The protected transport owns the configured origin, independently of legacy network mode.
48
+ url: advisorProtection_1.advisorActionPaths[action],
49
+ action,
50
+ body: Object.freeze(request),
51
+ }));
52
+ if (!response || typeof response !== 'object' || Array.isArray(response) ||
53
+ !Object.prototype.hasOwnProperty.call(response, 'data') || response.data == null || 'code' in response ||
54
+ typeof response.message !== 'string' ||
55
+ (response.success !== undefined && response.success !== true)) {
56
+ throw new Error('ADVISOR_RESPONSE_INVALID');
57
+ }
58
+ return response.data;
59
+ });
60
+ }
61
+ queryAdvisorShareOrderList(request) {
62
+ return __awaiter(this, void 0, void 0, function* () {
63
+ const result = body(request, ['advisorId', 'statusList', 'categoryTwo', 'keyword', 'cursor', 'pageSize']);
64
+ if (result.statusList !== undefined) {
65
+ if (!Array.isArray(result.statusList) || !result.statusList.length)
66
+ invalid();
67
+ const statuses = Array.from(result.statusList);
68
+ statuses.forEach(id);
69
+ result.statusList = Object.freeze(statuses);
70
+ }
71
+ if (result.categoryTwo !== undefined)
72
+ id(result.categoryTwo);
73
+ if (result.keyword !== undefined && typeof result.keyword !== 'string')
74
+ invalid();
75
+ if (result.cursor !== undefined)
76
+ id(result.cursor);
77
+ if (result.pageSize !== undefined &&
78
+ (typeof result.pageSize !== 'number' || !Number.isInteger(result.pageSize) || result.pageSize < 1 || result.pageSize > 50))
79
+ invalid();
80
+ return this.invoke('queryAdvisorShareOrderList', result);
81
+ });
82
+ }
83
+ getAdvisorShareOrderFacts(request) {
84
+ return __awaiter(this, void 0, void 0, function* () {
85
+ const result = body(request, ['advisorId', 'orderId']);
86
+ id(result.orderId);
87
+ return this.invoke('getAdvisorShareOrderFacts', result);
88
+ });
89
+ }
90
+ getAdvisorShareOrderFactsBatch(request) {
91
+ return __awaiter(this, void 0, void 0, function* () {
92
+ const result = body(request, ['advisorId', 'orderIds']);
93
+ if (!Array.isArray(result.orderIds) || !result.orderIds.length || result.orderIds.length > 50)
94
+ invalid();
95
+ const ids = Array.from(result.orderIds);
96
+ ids.forEach(id);
97
+ if (new Set(ids).size !== ids.length)
98
+ invalid();
99
+ result.orderIds = Object.freeze(ids);
100
+ return this.invoke('getAdvisorShareOrderFactsBatch', result);
101
+ });
102
+ }
103
+ getAdvisorShareAdjustmentCreateFacts(request) {
104
+ return __awaiter(this, void 0, void 0, function* () {
105
+ const result = body(request, ['advisorId', 'orderId']);
106
+ id(result.orderId);
107
+ return this.invoke('getAdvisorShareAdjustmentCreateFacts', result);
108
+ });
109
+ }
110
+ }
111
+ exports.AdvisorQueryService = AdvisorQueryService;
@@ -0,0 +1,8 @@
1
+ export declare const advisorBusinessCodes: readonly ["INVALID_ARGUMENT", "INVALID_CURSOR", "ORDER_NOT_ACCESSIBLE", "ADVISOR_FORBIDDEN"];
2
+ export type AdvisorBusinessCode = typeof advisorBusinessCodes[number];
3
+ export declare class AdvisorBusinessError extends Error {
4
+ readonly code: AdvisorBusinessCode;
5
+ constructor(code: AdvisorBusinessCode);
6
+ }
7
+ export declare function copyAdvisorBusinessError(error: unknown): AdvisorBusinessError | null;
8
+ export declare function advisorBusinessErrorFromResponse(status: number, value: unknown): AdvisorBusinessError | null;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.advisorBusinessErrorFromResponse = exports.copyAdvisorBusinessError = exports.AdvisorBusinessError = exports.advisorBusinessCodes = void 0;
4
+ // Preserve only the POS advisor routes' known rejection codes, never server messages.
5
+ exports.advisorBusinessCodes = [
6
+ 'INVALID_ARGUMENT', 'INVALID_CURSOR', 'ORDER_NOT_ACCESSIBLE', 'ADVISOR_FORBIDDEN',
7
+ ];
8
+ const issued = new WeakMap();
9
+ class AdvisorBusinessError extends Error {
10
+ constructor(code) {
11
+ if (!exports.advisorBusinessCodes.includes(code))
12
+ throw new Error('ADVISOR_BUSINESS_CODE_INVALID');
13
+ super(code);
14
+ this.code = code;
15
+ issued.set(this, code);
16
+ Object.freeze(this);
17
+ }
18
+ }
19
+ exports.AdvisorBusinessError = AdvisorBusinessError;
20
+ // The WeakMap rejects prototype/shape impersonation and ignores caller-added fields.
21
+ function copyAdvisorBusinessError(error) {
22
+ const code = error && typeof error === 'object' ? issued.get(error) : undefined;
23
+ return code ? new AdvisorBusinessError(code) : null;
24
+ }
25
+ exports.copyAdvisorBusinessError = copyAdvisorBusinessError;
26
+ function advisorBusinessErrorFromResponse(status, value) {
27
+ if (!Number.isInteger(status) || status < 400 || status >= 500 || !value ||
28
+ typeof value !== 'object' || Array.isArray(value))
29
+ return null;
30
+ const body = value;
31
+ if (!Object.prototype.hasOwnProperty.call(body, 'data') || body.data !== null ||
32
+ typeof body.message !== 'string' || (body.success !== undefined && body.success !== false) ||
33
+ typeof body.code !== 'string' || !exports.advisorBusinessCodes.includes(body.code))
34
+ return null;
35
+ return new AdvisorBusinessError(body.code);
36
+ }
37
+ exports.advisorBusinessErrorFromResponse = advisorBusinessErrorFromResponse;
@@ -0,0 +1,7 @@
1
+ import { AdvisorAssertionSender } from './advisorProtection';
2
+ export type AdvisorHttpSenderOptions = {
3
+ origin: string;
4
+ timeoutMs: number;
5
+ maxResponseBytes: number;
6
+ };
7
+ export declare function createAdvisorHttpsSender(options: AdvisorHttpSenderOptions): AdvisorAssertionSender;
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createAdvisorHttpsSender = void 0;
13
+ const https_1 = require("https");
14
+ const advisorProtection_1 = require("./advisorProtection");
15
+ const advisorBusinessError_1 = require("./advisorBusinessError");
16
+ function failed() { return new Error('ADVISOR_HTTP_REQUEST_FAILED'); }
17
+ // Native HTTPS ignores HTTP(S)_PROXY environment variables and does not follow redirects.
18
+ // A dedicated connection avoids process-global agents/interceptors and implicit retry plugins.
19
+ function createAdvisorHttpsSender(options) {
20
+ if (!options || typeof options.origin !== 'string' ||
21
+ !Number.isSafeInteger(options.timeoutMs) || options.timeoutMs < 1 || options.timeoutMs > 2147483647 ||
22
+ !Number.isSafeInteger(options.maxResponseBytes) || options.maxResponseBytes < 1) {
23
+ throw new Error('ADVISOR_HTTP_CONFIG_REQUIRED');
24
+ }
25
+ let endpoint;
26
+ try {
27
+ endpoint = new URL(options.origin);
28
+ }
29
+ catch (_a) {
30
+ throw new Error('ADVISOR_HTTP_CONFIG_REQUIRED');
31
+ }
32
+ if (endpoint.protocol !== 'https:' || endpoint.username || endpoint.password ||
33
+ endpoint.search || endpoint.hash || endpoint.pathname !== '/')
34
+ throw new Error('ADVISOR_HTTP_CONFIG_REQUIRED');
35
+ const origin = endpoint.origin;
36
+ const { timeoutMs, maxResponseBytes } = options;
37
+ const paths = Object.values(advisorProtection_1.advisorActionPaths);
38
+ return (input) => __awaiter(this, void 0, void 0, function* () {
39
+ let url;
40
+ let body;
41
+ let assertion;
42
+ try {
43
+ url = new URL(input.url);
44
+ if (input.method !== 'POST' || url.protocol !== 'https:' || url.origin !== origin ||
45
+ url.username || url.password || url.search || url.hash || !paths.includes(url.pathname) ||
46
+ !input.headers || Object.keys(input.headers).length !== 1 ||
47
+ typeof input.headers['x-advisor-assertion'] !== 'string' ||
48
+ !input.headers['x-advisor-assertion'] || /[\r\n]/.test(input.headers['x-advisor-assertion']))
49
+ throw failed();
50
+ assertion = input.headers['x-advisor-assertion'];
51
+ body = (0, advisorProtection_1.canonicalAdvisorJson)(input.body);
52
+ }
53
+ catch (_b) {
54
+ throw failed();
55
+ }
56
+ return new Promise((resolve, reject) => {
57
+ let settled = false;
58
+ let timer;
59
+ const finish = (error, value) => {
60
+ var _a;
61
+ if (settled)
62
+ return;
63
+ settled = true;
64
+ if (timer)
65
+ clearTimeout(timer);
66
+ if (error)
67
+ reject((_a = (0, advisorBusinessError_1.copyAdvisorBusinessError)(error)) !== null && _a !== void 0 ? _a : failed());
68
+ else
69
+ resolve(value);
70
+ };
71
+ try {
72
+ const req = (0, https_1.request)(url, {
73
+ method: 'POST', agent: false, rejectUnauthorized: true,
74
+ headers: { 'Content-Type': 'application/json', 'Accept': 'application/json',
75
+ 'Accept-Encoding': 'identity', 'Content-Length': Buffer.byteLength(body),
76
+ 'x-advisor-assertion': assertion },
77
+ }, (res) => {
78
+ if (settled) {
79
+ res.destroy();
80
+ return;
81
+ }
82
+ const status = res.statusCode;
83
+ const type = res.headers['content-type'];
84
+ if (typeof status !== 'number' || !((status >= 200 && status < 300) || (status >= 400 && status < 500)) ||
85
+ typeof type !== 'string' || !/^application\/json(?:\s*;|$)/i.test(type) ||
86
+ (res.headers['content-encoding'] && res.headers['content-encoding'] !== 'identity')) {
87
+ finish(failed());
88
+ res.destroy();
89
+ return;
90
+ }
91
+ const chunks = [];
92
+ let size = 0;
93
+ res.on('error', () => finish(failed()));
94
+ res.on('aborted', () => finish(failed()));
95
+ res.on('data', (chunk) => {
96
+ if (settled)
97
+ return;
98
+ const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
99
+ size += bytes.length;
100
+ if (size > maxResponseBytes) {
101
+ finish(failed());
102
+ res.destroy();
103
+ return;
104
+ }
105
+ chunks.push(bytes);
106
+ });
107
+ res.on('end', () => {
108
+ var _a;
109
+ if (settled)
110
+ return;
111
+ try {
112
+ const value = JSON.parse(Buffer.concat(chunks).toString('utf8'));
113
+ if (status >= 400) {
114
+ finish((_a = (0, advisorBusinessError_1.advisorBusinessErrorFromResponse)(status, value)) !== null && _a !== void 0 ? _a : failed());
115
+ return;
116
+ }
117
+ if (!value || typeof value !== 'object' || Array.isArray(value) ||
118
+ typeof value.message !== 'string' || value.data == null || 'code' in value ||
119
+ (value.success !== undefined && value.success !== true))
120
+ throw failed();
121
+ finish(undefined, value);
122
+ }
123
+ catch (_b) {
124
+ finish(failed());
125
+ }
126
+ });
127
+ });
128
+ req.on('error', () => finish(failed()));
129
+ timer = setTimeout(() => { finish(failed()); req.destroy(); }, timeoutMs);
130
+ req.end(body);
131
+ }
132
+ catch (_a) {
133
+ finish(failed());
134
+ }
135
+ });
136
+ });
137
+ }
138
+ exports.createAdvisorHttpsSender = createAdvisorHttpsSender;