@xihe-lab/tapd-core 2.0.0-rc.2 → 2.0.0-rc.4

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 (119) hide show
  1. package/README.md +1 -0
  2. package/dist/advisor/index.d.ts.map +1 -1
  3. package/dist/advisor/index.js +2 -0
  4. package/dist/advisor/index.js.map +1 -1
  5. package/dist/cache/read-cache.d.ts +136 -0
  6. package/dist/cache/read-cache.d.ts.map +1 -0
  7. package/dist/cache/read-cache.js +322 -0
  8. package/dist/cache/read-cache.js.map +1 -0
  9. package/dist/cache/read-cache.test.d.ts +2 -0
  10. package/dist/cache/read-cache.test.d.ts.map +1 -0
  11. package/dist/cache/read-cache.test.js +429 -0
  12. package/dist/cache/read-cache.test.js.map +1 -0
  13. package/dist/errors/index.d.ts +120 -0
  14. package/dist/errors/index.d.ts.map +1 -0
  15. package/dist/errors/index.js +429 -0
  16. package/dist/errors/index.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +2 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/registry/registry.d.ts +7 -0
  22. package/dist/registry/registry.d.ts.map +1 -1
  23. package/dist/registry/registry.js +9 -3
  24. package/dist/registry/registry.js.map +1 -1
  25. package/dist/registry/registry.test.js +293 -2
  26. package/dist/registry/registry.test.js.map +1 -1
  27. package/dist/richtext/index.d.ts +1 -14
  28. package/dist/richtext/index.d.ts.map +1 -1
  29. package/dist/richtext/index.js +3 -34
  30. package/dist/richtext/index.js.map +1 -1
  31. package/dist/richtext/pipeline.d.ts +1 -4
  32. package/dist/richtext/pipeline.d.ts.map +1 -1
  33. package/dist/richtext/pipeline.js +2 -198
  34. package/dist/richtext/pipeline.js.map +1 -1
  35. package/dist/tapd-client.d.ts +34 -2
  36. package/dist/tapd-client.d.ts.map +1 -1
  37. package/dist/tapd-client.js +121 -42
  38. package/dist/tapd-client.js.map +1 -1
  39. package/dist/tools/attachment.js +40 -40
  40. package/dist/tools/attachment.js.map +1 -1
  41. package/dist/tools/board.js +22 -22
  42. package/dist/tools/board.js.map +1 -1
  43. package/dist/tools/bug.js +259 -259
  44. package/dist/tools/bug.js.map +1 -1
  45. package/dist/tools/changes.js +20 -20
  46. package/dist/tools/changes.js.map +1 -1
  47. package/dist/tools/comment.js +23 -23
  48. package/dist/tools/comment.js.map +1 -1
  49. package/dist/tools/custom-fields.js +16 -16
  50. package/dist/tools/custom-fields.js.map +1 -1
  51. package/dist/tools/image.js +2 -2
  52. package/dist/tools/image.js.map +1 -1
  53. package/dist/tools/iteration.js +50 -50
  54. package/dist/tools/iteration.js.map +1 -1
  55. package/dist/tools/media.js +2 -2
  56. package/dist/tools/media.js.map +1 -1
  57. package/dist/tools/mini-comment.js +27 -27
  58. package/dist/tools/mini-comment.js.map +1 -1
  59. package/dist/tools/mini-item.js +83 -83
  60. package/dist/tools/mini-item.js.map +1 -1
  61. package/dist/tools/mini-workspace.js +5 -5
  62. package/dist/tools/mini-workspace.js.map +1 -1
  63. package/dist/tools/program.js +7 -7
  64. package/dist/tools/program.js.map +1 -1
  65. package/dist/tools/relations.js +14 -14
  66. package/dist/tools/relations.js.map +1 -1
  67. package/dist/tools/release.js +53 -53
  68. package/dist/tools/release.js.map +1 -1
  69. package/dist/tools/report.js +8 -8
  70. package/dist/tools/report.js.map +1 -1
  71. package/dist/tools/settings.js +77 -77
  72. package/dist/tools/settings.js.map +1 -1
  73. package/dist/tools/source.js +14 -14
  74. package/dist/tools/source.js.map +1 -1
  75. package/dist/tools/story.js +120 -120
  76. package/dist/tools/story.js.map +1 -1
  77. package/dist/tools/task.js +123 -123
  78. package/dist/tools/task.js.map +1 -1
  79. package/dist/tools/test.js +117 -117
  80. package/dist/tools/test.js.map +1 -1
  81. package/dist/tools/timesheet.js +23 -23
  82. package/dist/tools/timesheet.js.map +1 -1
  83. package/dist/tools/user.js +8 -8
  84. package/dist/tools/user.js.map +1 -1
  85. package/dist/tools/utility.d.ts +17 -0
  86. package/dist/tools/utility.d.ts.map +1 -1
  87. package/dist/tools/utility.js +73 -78
  88. package/dist/tools/utility.js.map +1 -1
  89. package/dist/tools/wiki.js +51 -51
  90. package/dist/tools/wiki.js.map +1 -1
  91. package/dist/tools/workflow.js +26 -26
  92. package/dist/tools/workflow.js.map +1 -1
  93. package/dist/tools/workspace.js +16 -16
  94. package/dist/tools/workspace.js.map +1 -1
  95. package/package.json +10 -14
  96. package/dist/richtext/attachment-anchor.d.ts +0 -58
  97. package/dist/richtext/attachment-anchor.d.ts.map +0 -1
  98. package/dist/richtext/attachment-anchor.js +0 -221
  99. package/dist/richtext/attachment-anchor.js.map +0 -1
  100. package/dist/richtext/attachment-anchor.test.d.ts +0 -2
  101. package/dist/richtext/attachment-anchor.test.d.ts.map +0 -1
  102. package/dist/richtext/attachment-anchor.test.js +0 -149
  103. package/dist/richtext/attachment-anchor.test.js.map +0 -1
  104. package/dist/richtext/escape.d.ts +0 -7
  105. package/dist/richtext/escape.d.ts.map +0 -1
  106. package/dist/richtext/escape.js +0 -60
  107. package/dist/richtext/escape.js.map +0 -1
  108. package/dist/richtext/mention.d.ts +0 -49
  109. package/dist/richtext/mention.d.ts.map +0 -1
  110. package/dist/richtext/mention.js +0 -179
  111. package/dist/richtext/mention.js.map +0 -1
  112. package/dist/richtext/mention.test.d.ts +0 -2
  113. package/dist/richtext/mention.test.d.ts.map +0 -1
  114. package/dist/richtext/mention.test.js +0 -123
  115. package/dist/richtext/mention.test.js.map +0 -1
  116. package/dist/richtext/round-trip.test.d.ts +0 -2
  117. package/dist/richtext/round-trip.test.d.ts.map +0 -1
  118. package/dist/richtext/round-trip.test.js +0 -105
  119. package/dist/richtext/round-trip.test.js.map +0 -1
@@ -1,199 +1,3 @@
1
- // TAPD 2.0 rc.2 P3 接线(需求 1139814312001001548)—— 富文本保真转换主管道。
2
- //
3
- // B 侧语义库(core/richtext,纯函数)在转换器「token / 规则级」接入(B 的接线警告):
4
- // - md→html(markdown-it core 规则,token 级):
5
- // * `attach:` 链接(link_open..link_close 纯文本运行)→ 整段替换为 R6 data 五件套锚点
6
- // (html_inline token;html:false 只影响解析不影响程序化 token 的渲染);
7
- // * `@昵称` / `@@` 语义只在 inline children 的 **text token** 内替换(mention/escape 各自成 token);
8
- // * code_inline / fence / html_* / image(含 alt)/ 链接内部(含 URL)一律跳过;
9
- // 裸 URL(https://.../@name)内的 @ 由「连续非空白段含 ://」护栏跳过。
10
- // * 禁止对整段输入直接调 fragment 级函数上线(会误伤代码段与 URL)——本模块即正确接线层。
11
- // - html→md(turndown 规则级):
12
- // * at-who <b> → `@昵称`(永不降级 **粗体**,R7);附件锚点 <a> → `[📎 name](attach:ws/id)`;
13
- // 识别失败(href 缺失等)保留原节点 HTML,绝不猜测改写。
14
- // * 保真规则先于 GFM 注册(FSD §8):turndown addRule 为 unshift 语义(后注册者先匹配),
15
- // 故在 use(gfm) 之后再 addRule 即获得最高匹配优先级,并有规则优先级测试固化。
16
- // * 文本节点字面 @ 保护走 turndown 实例 escape 钩子(escapeAtLiteralsForMd;
17
- // CODE 内文本 isCode 天然绕过 escape,代码段 @ 不被加倍)。
18
- //
19
- // 单一实例共享给 md_to_html/html_to_md 工具(tools/utility.ts)与写管道
20
- // (registry/richtext.ts 的 transformWriteArgs/transformReadData)——FSD §3.7:
21
- // 所有富文本写工具与 pm 层场景共用同一条管道,免费获得 @/附件/图片能力。
22
- import MarkdownIt from 'markdown-it';
23
- import TurndownService from 'turndown';
24
- import { gfm } from 'turndown-plugin-gfm';
25
- import { attachmentAnchorHtml, attachmentAnchorNodeToMd, atWhoNodeToMd, escapeAtLiteralsForMd, findMentions, isAttachmentAnchorNode, isAtWhoNode, renderMentionHtml, } from './index.js';
26
- // ---------------------------------------------------------------------------
27
- // md → html(markdown-it,token 级)
28
- // ---------------------------------------------------------------------------
29
- /** `attach:<ws>/<id>`(与 richtext md 扩展语法的 ws/id 文法一致:排除空白、()、/)。 */
30
- const ATTACH_HREF_RE = /^attach:([^()\s/]+)\/([^()\s/]+)$/i;
31
- /**
32
- * 裸 URL 防误伤:mention 候选往前回溯同一连续非空白段,段内含 `://` 视为 URL 的一部分
33
- * (如 `https://e.com/@zhang`)。md 链接语法 `[t](url)` 的 URL 在 token attrs 里天然不进本层。
34
- */
35
- function insideBareUrl(content, atIndex) {
36
- let start = atIndex;
37
- while (start > 0 && !/\s/.test(content[start - 1]))
38
- start -= 1;
39
- return content.slice(start, atIndex).includes('://');
40
- }
41
- /**
42
- * 把一个 text token 的内容按 @ 语义拆分为 [text | html_inline] 串
43
- * (镜像 richtext scanAtTokens 规则:@@ 优先、findMentions 已内建左边界判定)。
44
- * 无任何语义变化时返回 null(调用方保留原 token,避免无谓重排)。
45
- */
46
- function splitTextTokenAtSemantics(TokenCtor, token) {
47
- const content = token.content;
48
- const mentions = findMentions(content);
49
- if (mentions.length === 0 && !content.includes('@@'))
50
- return null;
51
- const mentionByStart = new Map(mentions.map(m => [m.start, m]));
52
- const out = [];
53
- let plain = '';
54
- const flush = () => {
55
- if (plain === '')
56
- return;
57
- const text = new TokenCtor('text', '', 0);
58
- text.content = plain;
59
- out.push(text);
60
- plain = '';
61
- };
62
- let i = 0;
63
- let changed = false;
64
- while (i < content.length) {
65
- if (content[i] === '@') {
66
- if (content[i + 1] === '@') {
67
- plain += '@'; // md 转义 @@ → 字面 @
68
- changed = true;
69
- i += 2;
70
- continue;
71
- }
72
- const mention = mentionByStart.get(i);
73
- if (mention && !insideBareUrl(content, i)) {
74
- flush();
75
- const html = new TokenCtor('html_inline', '', 0);
76
- html.content = renderMentionHtml(mention.name);
77
- out.push(html);
78
- changed = true;
79
- i = mention.end;
80
- continue;
81
- }
82
- }
83
- plain += content[i];
84
- i += 1;
85
- }
86
- flush();
87
- if (!changed || (out.length === 1 && out[0].type === 'text' && out[0].content === content))
88
- return null;
89
- return out;
90
- }
91
- /** inline children 内的 `attach:` 链接 → R6 锚点(整段替换为单个 html_inline token)。 */
92
- function convertAttachmentLinks(TokenCtor, tokens) {
93
- for (let i = 0; i < tokens.length; i++) {
94
- const open = tokens[i];
95
- if (open.type !== 'link_open')
96
- continue;
97
- const href = String(open.attrGet('href') ?? '');
98
- const refMatch = ATTACH_HREF_RE.exec(href.trim());
99
- if (!refMatch)
100
- continue;
101
- // link_open..link_close 之间必须是纯文本运行(含嵌套/换行则保守跳过,保留原链接)
102
- let text = '';
103
- let closeIdx = -1;
104
- for (let j = i + 1; j < tokens.length; j++) {
105
- const t = tokens[j];
106
- if (t.type === 'link_close') {
107
- closeIdx = j;
108
- break;
109
- }
110
- if (t.type !== 'text')
111
- break;
112
- text += t.content;
113
- }
114
- if (closeIdx < 0)
115
- continue;
116
- const name = text.replace(/^\s*📎\s*/, '');
117
- if (name === '')
118
- continue;
119
- let anchor;
120
- try {
121
- anchor = attachmentAnchorHtml({ workspaceId: refMatch[1], id: refMatch[2], name });
122
- }
123
- catch {
124
- continue; // ws/id 含空白或非法字符 → 原样保留(绝不猜测改写)
125
- }
126
- const htmlToken = new TokenCtor('html_inline', '', 0);
127
- htmlToken.content = anchor;
128
- tokens.splice(i, closeIdx - i + 1, htmlToken);
129
- }
130
- }
131
- /** inline children 内 text token 的 @ 语义替换(链接内部跳过;code/html/image token 天然跳过)。 */
132
- function convertMentions(TokenCtor, tokens) {
133
- let linkDepth = 0;
134
- for (let i = 0; i < tokens.length; i++) {
135
- const token = tokens[i];
136
- if (token.type === 'link_open') {
137
- linkDepth += 1;
138
- continue;
139
- }
140
- if (token.type === 'link_close') {
141
- linkDepth = Math.max(0, linkDepth - 1);
142
- continue;
143
- }
144
- if (linkDepth > 0)
145
- continue; // 链接文本内 @ 不转换(URL 已天然不在 text token)
146
- if (token.type !== 'text')
147
- continue;
148
- const replacement = splitTextTokenAtSemantics(TokenCtor, token);
149
- if (replacement) {
150
- tokens.splice(i, 1, ...replacement);
151
- i += replacement.length - 1;
152
- }
153
- }
154
- }
155
- function tapdRichtextCoreRule(state) {
156
- const TokenCtor = state.Token;
157
- for (const token of state.tokens) {
158
- // fence/code_block/html_block 等 block token 内容不经过 inline 层,天然跳过
159
- if (token.type !== 'inline' || !token.children)
160
- continue;
161
- convertAttachmentLinks(TokenCtor, token.children);
162
- convertMentions(TokenCtor, token.children);
163
- }
164
- }
165
- const markdownIt = new MarkdownIt({ html: false, breaks: true });
166
- // push 到 core 链尾(text_join 之后):不再有规则会合并/重排我们的 token 切分
167
- markdownIt.core.ruler.push('tapd_richtext_semantics', tapdRichtextCoreRule);
168
- /** md → TAPD 富文本 html(@昵称/@@转义/attach: 附件引用/图片与普通 md 全兼容)。 */
169
- export function mdToHtml(md) {
170
- return markdownIt.render(md);
171
- }
172
- // ---------------------------------------------------------------------------
173
- // html → md(turndown,规则级)
174
- // ---------------------------------------------------------------------------
175
- const turndown = new TurndownService({ headingStyle: 'atx', codeBlockStyle: 'fenced' });
176
- turndown.use(gfm);
177
- // 保真规则先于 GFM/内建规则匹配:addRule 是 unshift 语义(后注册者先匹配),
178
- // 在 use(gfm) 之后注册即拿到最高优先级(FSD §8,规则优先级由测试固化)。
179
- turndown.addRule('tapdAtWho', {
180
- filter: node => isAtWhoNode(node),
181
- replacement: (_content, node) => atWhoNodeToMd(node),
182
- });
183
- turndown.addRule('tapdAttachmentAnchor', {
184
- filter: node => isAttachmentAnchorNode(node),
185
- replacement: (_content, node) => {
186
- const md = attachmentAnchorNodeToMd(node);
187
- // 识别条件不满足(缺 href 等)→ 保留原节点 HTML,绝不猜测改写
188
- return md ?? node.outerHTML ?? '';
189
- },
190
- });
191
- // 文本节点字面 @ 保护(round-trip 稳定:命中 mention 规则的 @名字 加倍为 @@名字)。
192
- // CODE 内文本 isCode 天然绕过 escape 钩子(turndown process 分支),代码段 @ 不被加倍。
193
- const baseEscape = TurndownService.prototype.escape.bind(TurndownService.prototype);
194
- turndown.escape = (text) => baseEscape(escapeAtLiteralsForMd(text));
195
- /** TAPD 富文本 html → md(at-who → @昵称、附件锚点 → attach: 引用、/tfl/ 图片走 GFM 内建规则)。 */
196
- export function htmlToMd(html) {
197
- return turndown.turndown(html);
198
- }
1
+ // 兼容垫片:转换引擎(mdToHtml/htmlToMd)已迁出为 @xihe-lab/tapd-markdown。
2
+ export { mdToHtml, htmlToMd } from '@xihe-lab/tapd-markdown';
199
3
  //# sourceMappingURL=pipeline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/richtext/pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/richtext/pipeline.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC"}
@@ -10,6 +10,11 @@
10
10
  * - GET SDK failures fall back to fetch (read-only, idempotent)
11
11
  * - POST SDK failures throw directly (never fallback, avoid duplicate writes)
12
12
  * - Set TAPD_SDK_DISABLED=1 to bypass the SDK entirely (rollback switch)
13
+ *
14
+ * GET 通道前置只读数据 TTL 缓存(cache/read-cache.ts):仅 allowlist 内低频端点
15
+ * (workitem_types / workflow / 成员 / 自定义字段配置 / settings 系 / 分类 / 角色)
16
+ * 参与缓存(TTL + LRU + in-flight 去重 + 深拷贝返回),其余请求一律直连。
17
+ * TAPD_CACHE=off 关闭;TAPD_CACHE_DEBUG=1 打命中日志;失效用 invalidateCache()。
13
18
  */
14
19
  import { ReadStream } from 'node:fs';
15
20
  /**
@@ -30,6 +35,15 @@ export declare class TapdClient {
30
35
  private sdk?;
31
36
  private readonly sdkEnabled;
32
37
  private readonly verbose;
38
+ /**
39
+ * GET 重试指数退避基数(毫秒):延迟 = base * 2^attempt(1s, 2s, 4s)。
40
+ * 公开静态以便测试注入小值加速、运维按需调参;429 携带 Retry-After 时优先采用其值(上限 30s)。
41
+ */
42
+ static retryBackoffBaseMs: number;
43
+ private static readonly MAX_RETRIES;
44
+ private static readonly RETRYABLE_STATUS;
45
+ /** Retry-After 退避上限:避免服务端给出超长等待时占死工具超时预算(原始值仍透出在错误详情)。 */
46
+ private static readonly RETRY_AFTER_CAP_MS;
33
47
  private constructor();
34
48
  /**
35
49
  * Create client from OAuth access token
@@ -96,11 +110,29 @@ export declare class TapdClient {
96
110
  */
97
111
  private getSdk;
98
112
  /**
99
- * Route a request through the SDK when the method+path is mapped,
100
- * otherwise (and on read-only SDK failure) through the fetch client.
113
+ * 请求入口:GET 先过只读缓存门面(allowlist 内端点命中即返,未命中并发去重),
114
+ * 再走 SDK/fetch 网络通道;POST 与 multipart 不参与缓存,直连网络通道。
115
+ * 返回值形态与直连完全一致(命中为深拷贝,防消费方 mutate 污染缓存)。
101
116
  */
102
117
  private route;
118
+ /**
119
+ * Network channel: route a request through the SDK when the method+path is
120
+ * mapped, otherwise (and on read-only SDK failure) through the fetch client.
121
+ */
122
+ private routeNetwork;
123
+ /**
124
+ * Make HTTP request to TAPD API with retry support
125
+ *
126
+ * Retry policy:
127
+ * - Retry on 429/500/502/503 status codes and network-level failures
128
+ * - Max 3 retries with exponential backoff (1s, 2s, 4s); 429 的 Retry-After 优先(上限 30s)
129
+ * - POST requests do NOT retry (avoid duplicate creation)
130
+ * - 非 2xx 的确定性错误(400/401/403/404...)立即抛出,不做无谓重试
131
+ * - 所有错误统一抛 TapdError(结构化详情见 errors/index.ts)
132
+ */
103
133
  request<T>(method: 'GET' | 'POST', path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T>;
134
+ /** 单次重试等待:429 的 Retry-After 优先(封顶 30s),否则指数退避 base * 2^attempt。 */
135
+ private retryDelayMs;
104
136
  /**
105
137
  * GET request to TAPD API
106
138
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tapd-client.d.ts","sourceRoot":"","sources":["../src/tapd-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAMrC;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjF,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,GAAG,CAAC,CAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyC;IACpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAEhE,OAAO;IAgBP;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU;IAIzE;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU;IAWxF;;;OAGG;IACH,MAAM,CAAC,OAAO,IAAI,UAAU;IAmB5B;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,MAAM,GAAG,SAAS;IAIxC;;OAEG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM,GAAG,SAAS;IAKlD;;OAEG;IACH,MAAM,CAAC,6BAA6B,IAAI,MAAM,GAAG,SAAS;IAI1D;;OAEG;IACH,MAAM,CAAC,4BAA4B,IAAI,MAAM,GAAG,SAAS;IAIzD;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,UAAO,GAAG,MAAM;IAc1F;;;;;;;KAOC;IACD;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAe3B,OAAO,CAAC,MAAM;IAQd;;;;OAIG;IACH,OAAO,CAAC,MAAM;IAOd;;;OAGG;YACW,KAAK;IAyBb,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,KAAK,GAAG,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAC7D,OAAO,CAAC,CAAC,CAAC;IAwEb;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1F;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIvG;;;;;;;;;;;;;;;;OAgBG;IACG,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAiBpF;;;OAGG;YACW,qBAAqB;CAgCpC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE,MAAM,CAAC;CACd"}
1
+ {"version":3,"file":"tapd-client.d.ts","sourceRoot":"","sources":["../src/tapd-client.ts"],"names":[],"mappings":"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"}
@@ -10,12 +10,19 @@
10
10
  * - GET SDK failures fall back to fetch (read-only, idempotent)
11
11
  * - POST SDK failures throw directly (never fallback, avoid duplicate writes)
12
12
  * - Set TAPD_SDK_DISABLED=1 to bypass the SDK entirely (rollback switch)
13
+ *
14
+ * GET 通道前置只读数据 TTL 缓存(cache/read-cache.ts):仅 allowlist 内低频端点
15
+ * (workitem_types / workflow / 成员 / 自定义字段配置 / settings 系 / 分类 / 角色)
16
+ * 参与缓存(TTL + LRU + in-flight 去重 + 深拷贝返回),其余请求一律直连。
17
+ * TAPD_CACHE=off 关闭;TAPD_CACHE_DEBUG=1 打命中日志;失效用 invalidateCache()。
13
18
  */
14
19
  import { ReadStream } from 'node:fs';
15
20
  import { readFile } from 'node:fs/promises';
16
21
  import { basename } from 'node:path';
17
22
  import TapdSdk from '@opentapd/tapd-node-sdk';
18
23
  import { SDK_ROUTES } from './sdk-routes.js';
24
+ import { cachedGet } from './cache/read-cache.js';
25
+ import { parseRetryAfterMs, sanitizeParamsForError, TapdError } from './errors/index.js';
19
26
  export class TapdClient {
20
27
  authHeader;
21
28
  baseUrl;
@@ -26,6 +33,15 @@ export class TapdClient {
26
33
  sdk;
27
34
  sdkEnabled = process.env.TAPD_SDK_DISABLED !== '1';
28
35
  verbose = process.env.TAPD_LOG_VERBOSE === '1';
36
+ /**
37
+ * GET 重试指数退避基数(毫秒):延迟 = base * 2^attempt(1s, 2s, 4s)。
38
+ * 公开静态以便测试注入小值加速、运维按需调参;429 携带 Retry-After 时优先采用其值(上限 30s)。
39
+ */
40
+ static retryBackoffBaseMs = 1000;
41
+ static MAX_RETRIES = 3;
42
+ static RETRYABLE_STATUS = new Set([429, 500, 502, 503]);
43
+ /** Retry-After 退避上限:避免服务端给出超长等待时占死工具超时预算(原始值仍透出在错误详情)。 */
44
+ static RETRY_AFTER_CAP_MS = 30_000;
29
45
  constructor(authHeader, baseUrl, authType, apiUser, apiPassword, accessToken) {
30
46
  this.authHeader = authHeader;
31
47
  this.baseUrl = baseUrl ?? process.env.TAPD_API_BASE_URL ?? 'https://api.tapd.cn';
@@ -135,10 +151,10 @@ export class TapdClient {
135
151
  restoreNewline ? String(value).replace(/\\n/g, '\n') : String(value),
136
152
  ]));
137
153
  }
138
- unwrap(response) {
154
+ unwrap(response, ctx, attempts) {
139
155
  const result = response;
140
156
  if (result.status !== 1) {
141
- throw new Error(`TAPD API error: ${result.info ?? 'Unknown error'}`);
157
+ throw TapdError.apiStatus(ctx, result.status, result.info ?? '', attempts);
142
158
  }
143
159
  return result.data;
144
160
  }
@@ -154,22 +170,36 @@ export class TapdClient {
154
170
  return this.sdk;
155
171
  }
156
172
  /**
157
- * Route a request through the SDK when the method+path is mapped,
158
- * otherwise (and on read-only SDK failure) through the fetch client.
173
+ * 请求入口:GET 先过只读缓存门面(allowlist 内端点命中即返,未命中并发去重),
174
+ * 再走 SDK/fetch 网络通道;POST 与 multipart 不参与缓存,直连网络通道。
175
+ * 返回值形态与直连完全一致(命中为深拷贝,防消费方 mutate 污染缓存)。
176
+ */
177
+ route(method, path, params) {
178
+ if (method === 'GET') {
179
+ return cachedGet(this.baseUrl, path, params, () => this.routeNetwork(method, path, params));
180
+ }
181
+ return this.routeNetwork(method, path, params);
182
+ }
183
+ /**
184
+ * Network channel: route a request through the SDK when the method+path is
185
+ * mapped, otherwise (and on read-only SDK failure) through the fetch client.
159
186
  */
160
- async route(method, path, params) {
187
+ async routeNetwork(method, path, params) {
161
188
  const sdkMethod = this.sdkEnabled ? SDK_ROUTES[`${method} ${path}`] : undefined;
162
189
  if (sdkMethod) {
190
+ const ctx = { method, path, params: sanitizeParamsForError(params) };
163
191
  try {
164
192
  const encoded = TapdClient.encodeParams(method, params);
165
193
  const sdk = this.getSdk();
166
194
  const response = await sdk[sdkMethod](encoded);
167
- return this.unwrap(response);
195
+ return this.unwrap(response, ctx);
168
196
  }
169
197
  catch (error) {
170
198
  if (method === 'POST') {
171
- throw error;
199
+ // POST 失败直接抛(不回退 fetch,防重复写入);TapdError 原样保留结构,其余包成 TAPD_SDK_ERROR
200
+ throw error instanceof TapdError ? error : TapdError.sdk(ctx, error);
172
201
  }
202
+ // GET:SDK 通道任何失败(含 TAPD 业务错误)都回退 fetch 重读——只读幂等,保持既有回退契约
173
203
  if (this.verbose) {
174
204
  const message = error instanceof Error ? error.message : String(error);
175
205
  console.error(`[tapd-client] SDK ${sdkMethod} failed for ${method} ${path}, falling back to fetch: ${message}`);
@@ -178,6 +208,16 @@ export class TapdClient {
178
208
  }
179
209
  return this.request(method, path, params);
180
210
  }
211
+ /**
212
+ * Make HTTP request to TAPD API with retry support
213
+ *
214
+ * Retry policy:
215
+ * - Retry on 429/500/502/503 status codes and network-level failures
216
+ * - Max 3 retries with exponential backoff (1s, 2s, 4s); 429 的 Retry-After 优先(上限 30s)
217
+ * - POST requests do NOT retry (avoid duplicate creation)
218
+ * - 非 2xx 的确定性错误(400/401/403/404...)立即抛出,不做无谓重试
219
+ * - 所有错误统一抛 TapdError(结构化详情见 errors/index.ts)
220
+ */
181
221
  async request(method, path, params) {
182
222
  const url = new URL(path, this.baseUrl);
183
223
  const headers = {
@@ -194,9 +234,8 @@ export class TapdClient {
194
234
  headers['Content-Type'] = 'application/x-www-form-urlencoded';
195
235
  body = encoded.toString();
196
236
  }
197
- // Retry configuration
198
- const maxRetries = 3;
199
- const retryableStatusCodes = [429, 500, 502, 503];
237
+ const ctx = { method, path, params: sanitizeParamsForError(params) };
238
+ const maxRetries = TapdClient.MAX_RETRIES;
200
239
  const shouldRetry = method === 'GET'; // Only retry GET requests
201
240
  let lastError;
202
241
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
@@ -208,12 +247,14 @@ export class TapdClient {
208
247
  });
209
248
  if (!response.ok) {
210
249
  const errorText = await response.text();
211
- const error = new Error(`TAPD API error: ${response.status} ${response.statusText} - ${errorText.slice(0, 200)}`);
212
- // Check if we should retry
213
- if (shouldRetry && retryableStatusCodes.includes(response.status) && attempt < maxRetries) {
250
+ const error = TapdError.http(ctx, response.status, response.statusText, errorText, {
251
+ retryAfterMs: parseRetryAfterMs(response.headers.get('retry-after')),
252
+ attempts: attempt + 1,
253
+ });
254
+ const retryable = shouldRetry && TapdClient.RETRYABLE_STATUS.has(response.status);
255
+ if (retryable && attempt < maxRetries) {
214
256
  lastError = error;
215
- const delayMs = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s
216
- await new Promise(resolve => setTimeout(resolve, delayMs));
257
+ await new Promise(resolve => setTimeout(resolve, this.retryDelayMs(error.detail.retryAfterMs, attempt)));
217
258
  continue;
218
259
  }
219
260
  throw error;
@@ -221,23 +262,34 @@ export class TapdClient {
221
262
  const contentType = response.headers.get('content-type');
222
263
  if (!contentType?.includes('application/json')) {
223
264
  const text = await response.text();
224
- throw new Error(`TAPD API returned non-JSON response: ${text.slice(0, 100)}`);
265
+ throw TapdError.nonJson(ctx, text, attempt + 1);
225
266
  }
226
- return this.unwrap(await response.json());
267
+ return this.unwrap(await response.json(), ctx, attempt + 1);
227
268
  }
228
269
  catch (error) {
229
- // For non-retryable errors or final attempt, throw immediately
230
- if (!shouldRetry || attempt >= maxRetries) {
270
+ // 已归一的结构化错误(HTTP 状态/解析/业务错误)不属于网络故障,直接上抛
271
+ if (error instanceof TapdError) {
231
272
  throw error;
232
273
  }
233
- // For network errors, retry
234
- lastError = error instanceof Error ? error : new Error(String(error));
235
- const delayMs = Math.pow(2, attempt) * 1000;
236
- await new Promise(resolve => setTimeout(resolve, delayMs));
274
+ // 网络层异常(ECONNREFUSED / DNS / 中断等):GET 按指数退避重试
275
+ const networkError = TapdError.network(ctx, error, attempt + 1);
276
+ if (shouldRetry && attempt < maxRetries) {
277
+ lastError = networkError;
278
+ await new Promise(resolve => setTimeout(resolve, this.retryDelayMs(undefined, attempt)));
279
+ continue;
280
+ }
281
+ throw networkError;
237
282
  }
238
283
  }
239
284
  // All retries exhausted
240
- throw lastError ?? new Error('Request failed after all retries');
285
+ throw lastError ?? TapdError.network(ctx, new Error('Request failed after all retries'), maxRetries + 1);
286
+ }
287
+ /** 单次重试等待:429 的 Retry-After 优先(封顶 30s),否则指数退避 base * 2^attempt。 */
288
+ retryDelayMs(retryAfterMs, attempt) {
289
+ if (retryAfterMs !== undefined) {
290
+ return Math.min(retryAfterMs, TapdClient.RETRY_AFTER_CAP_MS);
291
+ }
292
+ return TapdClient.retryBackoffBaseMs * Math.pow(2, attempt);
241
293
  }
242
294
  /**
243
295
  * GET request to TAPD API
@@ -271,17 +323,32 @@ export class TapdClient {
271
323
  async postFile(path, params) {
272
324
  const sdkMethod = this.sdkEnabled ? SDK_ROUTES[`POST ${path}`] : undefined;
273
325
  if (sdkMethod) {
274
- // Scalars are stringified up-front: the SDK appends values to a
275
- // form-data payload as-is, so numbers/booleans must arrive as strings.
276
- const sdkParams = {};
277
- for (const [key, value] of Object.entries(params)) {
278
- if (value === undefined)
279
- continue;
280
- sdkParams[key] = value instanceof ReadStream ? value : String(value);
326
+ // 文件流参数不进错误详情(不可序列化且无脱敏价值),仅保留标量字段
327
+ const ctx = {
328
+ method: 'POST',
329
+ path,
330
+ params: sanitizeParamsForError(Object.fromEntries(Object.entries(params).filter(([, value]) => !(value instanceof ReadStream)))),
331
+ };
332
+ try {
333
+ // Scalars are stringified up-front: the SDK appends values to a
334
+ // form-data payload as-is, so numbers/booleans must arrive as strings.
335
+ const sdkParams = {};
336
+ for (const [key, value] of Object.entries(params)) {
337
+ if (value === undefined)
338
+ continue;
339
+ sdkParams[key] = value instanceof ReadStream ? value : String(value);
340
+ }
341
+ const sdk = this.getSdk();
342
+ const response = await sdk[sdkMethod](sdkParams);
343
+ return this.unwrap(response, ctx);
344
+ }
345
+ catch (error) {
346
+ if (error instanceof TapdError) {
347
+ throw error;
348
+ }
349
+ // POST 失败直接抛(不回退 fetch,防重复上传)
350
+ throw TapdError.sdk(ctx, error);
281
351
  }
282
- const sdk = this.getSdk();
283
- const response = await sdk[sdkMethod](sdkParams);
284
- return this.unwrap(response);
285
352
  }
286
353
  return this.postMultipartViaFetch(path, params);
287
354
  }
@@ -290,6 +357,11 @@ export class TapdClient {
290
357
  * global fetch serializes FormData bodies (boundary included) automatically.
291
358
  */
292
359
  async postMultipartViaFetch(path, params) {
360
+ const ctx = {
361
+ method: 'POST',
362
+ path,
363
+ params: sanitizeParamsForError(Object.fromEntries(Object.entries(params).filter(([, value]) => !(value instanceof ReadStream)))),
364
+ };
293
365
  const form = new FormData();
294
366
  for (const [key, value] of Object.entries(params)) {
295
367
  if (value === undefined)
@@ -306,21 +378,28 @@ export class TapdClient {
306
378
  }
307
379
  }
308
380
  const url = new URL(path, this.baseUrl);
309
- const response = await fetch(url.toString(), {
310
- method: 'POST',
311
- headers: { 'Authorization': this.authHeader },
312
- body: form,
313
- });
381
+ let response;
382
+ try {
383
+ response = await fetch(url.toString(), {
384
+ method: 'POST',
385
+ headers: { 'Authorization': this.authHeader },
386
+ body: form,
387
+ });
388
+ }
389
+ catch (error) {
390
+ // POST 不重试(防重复上传),统一包成 TapdError 保留 cause
391
+ throw TapdError.network(ctx, error);
392
+ }
314
393
  if (!response.ok) {
315
394
  const errorText = await response.text();
316
- throw new Error(`TAPD API error: ${response.status} ${response.statusText} - ${errorText.slice(0, 200)}`);
395
+ throw TapdError.http(ctx, response.status, response.statusText, errorText);
317
396
  }
318
397
  const contentType = response.headers.get('content-type');
319
398
  if (!contentType?.includes('application/json')) {
320
399
  const text = await response.text();
321
- throw new Error(`TAPD API returned non-JSON response: ${text.slice(0, 100)}`);
400
+ throw TapdError.nonJson(ctx, text);
322
401
  }
323
- return this.unwrap(await response.json());
402
+ return this.unwrap(await response.json(), ctx);
324
403
  }
325
404
  }
326
405
  //# sourceMappingURL=tapd-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tapd-client.js","sourceRoot":"","sources":["../src/tapd-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,OAAO,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAW7C,MAAM,OAAO,UAAU;IACb,UAAU,CAAS;IACnB,OAAO,CAAS;IAChB,QAAQ,CAAoB;IAC5B,OAAO,CAAU;IACjB,WAAW,CAAU;IACrB,WAAW,CAAU;IACrB,GAAG,CAAW;IACL,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG,CAAC;IACnD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,GAAG,CAAC;IAEhE,YACE,UAAkB,EAClB,OAAgB,EAChB,QAA4B,EAC5B,OAAgB,EAChB,WAAoB,EACpB,WAAoB;QAEpB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,qBAAqB,CAAC;QACjF,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,OAAO,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,WAAmB,EAAE,OAAgB;QAC1D,OAAO,IAAI,UAAU,CAAC,UAAU,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACtG,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAe,EAAE,WAAmB,EAAE,OAAgB;QACzE,MAAM,WAAW,GAAG,GAAG,OAAO,IAAI,WAAW,EAAE,CAAC;QAChD,OAAO,IAAI,UAAU,CACnB,SAAS,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EACtD,OAAO,EACP,OAAO,EACP,OAAO,EACP,WAAW,CACZ,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,OAAO;QACZ,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAClD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAClD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAE9C,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,UAAU,CAAC,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;YAC3B,OAAO,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,IAAI,KAAK,CACb,8GAA8G,CAC/G,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW;QAChB,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,qBAAqB;QAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;QACjD,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,6BAA6B;QAClC,OAAO,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,4BAA4B;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC;IACxD,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAmB,EAAE,WAA4B,EAAE,OAAO,GAAG,IAAI;QAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QAE3C,oDAAoD;QACpD,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACxC,OAAO,GAAG,MAAM,GAAG,cAAc,GAAG,QAAQ,EAAE,CAAC;QACjD,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;KAOC;IACD;;;;OAIG;IACK,MAAM,CAAC,YAAY,CACzB,MAAsB,EACtB,MAA8D;QAE9D,MAAM,cAAc,GAAG,MAAM,KAAK,MAAM,CAAC;QACzC,OAAO,IAAI,eAAe,CACxB,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;aACzB,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;aAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAoB,EAAE,CAAC;YACvC,GAAG;YACH,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SACrE,CAAC,CACL,CAAC;IACJ,CAAC;IAEO,MAAM,CAAI,QAAiB;QACjC,MAAM,MAAM,GAAG,QAA2B,CAAC;QAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACK,MAAM;QACZ,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,KAAK,OAAO;YACpC,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YACvE,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,WAAY,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7F,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,KAAK,CACjB,MAAsB,EACtB,IAAY,EACZ,MAA8D;QAE9D,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACxD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAiE,CAAC;gBACzF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC/C,OAAO,IAAI,CAAC,MAAM,CAAI,QAAQ,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtB,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvE,OAAO,CAAC,KAAK,CAAC,qBAAqB,SAAS,eAAe,MAAM,IAAI,IAAI,4BAA4B,OAAO,EAAE,CAAC,CAAC;gBAClH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO,CACX,MAAsB,EACtB,IAAY,EACZ,MAA8D;QAE9D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAExC,MAAM,OAAO,GAAgB;YAC3B,eAAe,EAAE,IAAI,CAAC,UAAU;SACjC,CAAC;QAEF,IAAI,IAAwB,CAAC;QAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAExD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;gBACnC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,cAAc,CAAC,GAAG,mCAAmC,CAAC;YAC9D,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC;QAED,sBAAsB;QACtB,MAAM,UAAU,GAAG,CAAC,CAAC;QACrB,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,0BAA0B;QAEhE,IAAI,SAA4B,CAAC;QAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;oBAC3C,MAAM;oBACN,OAAO;oBACP,IAAI;iBACL,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACxC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;oBAElH,2BAA2B;oBAC3B,IAAI,WAAW,IAAI,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;wBAC1F,SAAS,GAAG,KAAK,CAAC;wBAClB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,aAAa;wBAC1D,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;wBAC3D,SAAS;oBACX,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACzD,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC/C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACnC,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChF,CAAC;gBAED,OAAO,IAAI,CAAC,MAAM,CAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,+DAA+D;gBAC/D,IAAI,CAAC,WAAW,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;oBAC1C,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,4BAA4B;gBAC5B,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;gBAC5C,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAI,IAAY,EAAE,MAAkD;QAC3E,OAAO,IAAI,CAAC,KAAK,CAAI,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,MAA8D;QACxF,OAAO,IAAI,CAAC,KAAK,CAAI,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,QAAQ,CAAI,IAAY,EAAE,MAAuC;QACrE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3E,IAAI,SAAS,EAAE,CAAC;YACd,gEAAgE;YAChE,uEAAuE;YACvE,MAAM,SAAS,GAAwC,EAAE,CAAC;YAC1D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClD,IAAI,KAAK,KAAK,SAAS;oBAAE,SAAS;gBAClC,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAiE,CAAC;YACzF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,MAAM,CAAI,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC,qBAAqB,CAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,qBAAqB,CAAI,IAAY,EAAE,MAAuC;QAC1F,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAS;YAClC,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC3F,qEAAqE;gBACrE,kEAAkE;gBAClE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACvC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,UAAU,EAAE;YAC7C,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5G,CAAC;QACD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;CACF"}
1
+ {"version":3,"file":"tapd-client.js","sourceRoot":"","sources":["../src/tapd-client.ts"],"names":[],"mappings":"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"}