@zlooks.cn/baidu-submit-server 1.0.1

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 (97) hide show
  1. package/dist/command/index.d.ts +3 -0
  2. package/dist/command/index.d.ts.map +1 -0
  3. package/dist/command/index.js +14 -0
  4. package/dist/command/index.js.map +1 -0
  5. package/dist/config/config-command.d.ts +20 -0
  6. package/dist/config/config-command.d.ts.map +1 -0
  7. package/dist/config/config-command.js +57 -0
  8. package/dist/config/config-command.js.map +1 -0
  9. package/dist/contracts.d.ts +502 -0
  10. package/dist/contracts.d.ts.map +1 -0
  11. package/dist/contracts.js +142 -0
  12. package/dist/contracts.js.map +1 -0
  13. package/dist/events/blog-subscriptions.d.ts +7 -0
  14. package/dist/events/blog-subscriptions.d.ts.map +1 -0
  15. package/dist/events/blog-subscriptions.js +49 -0
  16. package/dist/events/blog-subscriptions.js.map +1 -0
  17. package/dist/mcp/provider.d.ts +5 -0
  18. package/dist/mcp/provider.d.ts.map +1 -0
  19. package/dist/mcp/provider.js +162 -0
  20. package/dist/mcp/provider.js.map +1 -0
  21. package/dist/messages/status/read.msg.d.ts +47 -0
  22. package/dist/messages/status/read.msg.d.ts.map +1 -0
  23. package/dist/messages/status/read.msg.js +6 -0
  24. package/dist/messages/status/read.msg.js.map +1 -0
  25. package/dist/messages/submissions/read.msg.d.ts +42 -0
  26. package/dist/messages/submissions/read.msg.d.ts.map +1 -0
  27. package/dist/messages/submissions/read.msg.js +6 -0
  28. package/dist/messages/submissions/read.msg.js.map +1 -0
  29. package/dist/messages/submissions/retry.msg.d.ts +74 -0
  30. package/dist/messages/submissions/retry.msg.d.ts.map +1 -0
  31. package/dist/messages/submissions/retry.msg.js +6 -0
  32. package/dist/messages/submissions/retry.msg.js.map +1 -0
  33. package/dist/messages/submissions/search.msg.d.ts +52 -0
  34. package/dist/messages/submissions/search.msg.d.ts.map +1 -0
  35. package/dist/messages/submissions/search.msg.js +6 -0
  36. package/dist/messages/submissions/search.msg.js.map +1 -0
  37. package/dist/models/read-status.model.d.ts +33 -0
  38. package/dist/models/read-status.model.d.ts.map +1 -0
  39. package/dist/models/read-status.model.js +11 -0
  40. package/dist/models/read-status.model.js.map +1 -0
  41. package/dist/models/read-submission.model.d.ts +6 -0
  42. package/dist/models/read-submission.model.d.ts.map +1 -0
  43. package/dist/models/read-submission.model.js +13 -0
  44. package/dist/models/read-submission.model.js.map +1 -0
  45. package/dist/models/retry-submission.model.d.ts +7 -0
  46. package/dist/models/retry-submission.model.d.ts.map +1 -0
  47. package/dist/models/retry-submission.model.js +17 -0
  48. package/dist/models/retry-submission.model.js.map +1 -0
  49. package/dist/models/search-submissions.model.d.ts +31 -0
  50. package/dist/models/search-submissions.model.d.ts.map +1 -0
  51. package/dist/models/search-submissions.model.js +13 -0
  52. package/dist/models/search-submissions.model.js.map +1 -0
  53. package/dist/persistence/entities.d.ts +32 -0
  54. package/dist/persistence/entities.d.ts.map +1 -0
  55. package/dist/persistence/entities.js +49 -0
  56. package/dist/persistence/entities.js.map +1 -0
  57. package/dist/persistence/submission-store.d.ts +41 -0
  58. package/dist/persistence/submission-store.d.ts.map +1 -0
  59. package/dist/persistence/submission-store.js +266 -0
  60. package/dist/persistence/submission-store.js.map +1 -0
  61. package/dist/services/application.service.d.ts +8 -0
  62. package/dist/services/application.service.d.ts.map +1 -0
  63. package/dist/services/application.service.js +28 -0
  64. package/dist/services/application.service.js.map +1 -0
  65. package/dist/services/baidu-submit.boot.d.ts +3 -0
  66. package/dist/services/baidu-submit.boot.d.ts.map +1 -0
  67. package/dist/services/baidu-submit.boot.js +11 -0
  68. package/dist/services/baidu-submit.boot.js.map +1 -0
  69. package/dist/services/config.service.d.ts +20 -0
  70. package/dist/services/config.service.d.ts.map +1 -0
  71. package/dist/services/config.service.js +44 -0
  72. package/dist/services/config.service.js.map +1 -0
  73. package/dist/services/database.service.d.ts +3 -0
  74. package/dist/services/database.service.d.ts.map +1 -0
  75. package/dist/services/database.service.js +23 -0
  76. package/dist/services/database.service.js.map +1 -0
  77. package/dist/services/logger.service.d.ts +4 -0
  78. package/dist/services/logger.service.d.ts.map +1 -0
  79. package/dist/services/logger.service.js +8 -0
  80. package/dist/services/logger.service.js.map +1 -0
  81. package/dist/services/mcp-provider.service.d.ts +3 -0
  82. package/dist/services/mcp-provider.service.d.ts.map +1 -0
  83. package/dist/services/mcp-provider.service.js +23 -0
  84. package/dist/services/mcp-provider.service.js.map +1 -0
  85. package/dist/services/submission-runtime.service.d.ts +8 -0
  86. package/dist/services/submission-runtime.service.d.ts.map +1 -0
  87. package/dist/services/submission-runtime.service.js +33 -0
  88. package/dist/services/submission-runtime.service.js.map +1 -0
  89. package/dist/submission/baidu-submit-client.d.ts +29 -0
  90. package/dist/submission/baidu-submit-client.d.ts.map +1 -0
  91. package/dist/submission/baidu-submit-client.js +132 -0
  92. package/dist/submission/baidu-submit-client.js.map +1 -0
  93. package/dist/submission/submission-worker.d.ts +17 -0
  94. package/dist/submission/submission-worker.d.ts.map +1 -0
  95. package/dist/submission/submission-worker.js +75 -0
  96. package/dist/submission/submission-worker.js.map +1 -0
  97. package/package.json +61 -0
@@ -0,0 +1,266 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { searchSubmissionsSchema, submissionRecordSchema, submissionServiceStatusSchema, } from '../contracts.js';
3
+ import { And, Equal, In, LessThan, LessThanOrEqual, MoreThanOrEqual, } from 'typeorm';
4
+ import { BaiduSubmitActivationEntity, BaiduSubmissionEntity, } from './entities.js';
5
+ const ACTIVATION_ID = 'service';
6
+ export class SubmissionStore {
7
+ database;
8
+ #rows;
9
+ #clock;
10
+ #listeners = new Set();
11
+ constructor(database, options = {}) {
12
+ this.database = database;
13
+ this.#rows = database.getRepository(BaiduSubmissionEntity);
14
+ this.#clock = options.clock ?? (() => new Date());
15
+ }
16
+ async activate(at = this.#clock()) {
17
+ await this.database.getRepository(BaiduSubmitActivationEntity)
18
+ .createQueryBuilder()
19
+ .insert()
20
+ .values({ id: ACTIVATION_ID, activatedAt: at })
21
+ .orIgnore()
22
+ .execute();
23
+ const row = await this.database.getRepository(BaiduSubmitActivationEntity)
24
+ .findOneByOrFail({ id: ACTIVATION_ID });
25
+ return row.activatedAt;
26
+ }
27
+ subscribe(listener) {
28
+ this.#listeners.add(listener);
29
+ return () => this.#listeners.delete(listener);
30
+ }
31
+ async recordIntent(input) {
32
+ const activation = await this.database.getRepository(BaiduSubmitActivationEntity)
33
+ .findOneByOrFail({ id: ACTIVATION_ID });
34
+ const occurredAt = new Date(input.occurredAt);
35
+ const status = occurredAt < activation.activatedAt ? 'skipped' : 'queued';
36
+ await this.#rows.createQueryBuilder()
37
+ .insert()
38
+ .values({
39
+ id: randomUUID(),
40
+ eventId: input.eventId,
41
+ postId: input.postId,
42
+ postVersion: input.postVersion,
43
+ trigger: input.trigger,
44
+ url: input.url,
45
+ status,
46
+ occurredAt,
47
+ attempts: 0,
48
+ })
49
+ .orIgnore()
50
+ .execute();
51
+ const record = project(await this.#rows.findOneByOrFail({ eventId: input.eventId }));
52
+ this.notifyChanged(record.id);
53
+ return record;
54
+ }
55
+ async read(id) {
56
+ const row = await this.#rows.findOneBy({ id });
57
+ return row ? project(row) : null;
58
+ }
59
+ async search(input) {
60
+ const query = searchSubmissionsSchema.parse(input);
61
+ const filter = {};
62
+ if (query.statuses)
63
+ filter.status = In(query.statuses);
64
+ if (query.postId)
65
+ filter.postId = Equal(query.postId);
66
+ const createdBounds = [];
67
+ if (query.createdFrom)
68
+ createdBounds.push(MoreThanOrEqual(new Date(query.createdFrom)));
69
+ if (query.createdTo)
70
+ createdBounds.push(LessThan(new Date(query.createdTo)));
71
+ if (createdBounds.length > 0)
72
+ filter.createdAt = And(...createdBounds);
73
+ const cursor = query.cursor
74
+ ? await this.#rows.findOne({ where: { ...filter, id: query.cursor } })
75
+ : null;
76
+ if (query.cursor && !cursor)
77
+ throw new Error('Submission cursor not found in current filter');
78
+ const where = cursor
79
+ ? [
80
+ { ...filter, createdAt: And(...createdBounds, LessThan(cursor.createdAt)) },
81
+ {
82
+ ...filter,
83
+ createdAt: And(...createdBounds, Equal(cursor.createdAt)),
84
+ id: LessThan(cursor.id),
85
+ },
86
+ ]
87
+ : filter;
88
+ const rows = await this.#rows.find({
89
+ where,
90
+ order: { createdAt: 'DESC', id: 'DESC' },
91
+ take: query.limit + 1,
92
+ });
93
+ const hasMore = rows.length > query.limit;
94
+ const bounded = hasMore ? rows.slice(0, query.limit) : rows;
95
+ return {
96
+ items: bounded.map(project),
97
+ nextCursor: hasMore ? (bounded.at(-1)?.id ?? null) : null,
98
+ };
99
+ }
100
+ async claimNext(worker, leaseMs) {
101
+ const now = this.#clock();
102
+ for (let attempt = 0; attempt < 4; attempt += 1) {
103
+ const candidate = await this.#rows.findOne({
104
+ where: { status: 'queued' },
105
+ order: { createdAt: 'ASC', id: 'ASC' },
106
+ });
107
+ if (!candidate)
108
+ return null;
109
+ const leaseToken = randomUUID();
110
+ const result = await this.#rows.update({ id: candidate.id, status: 'queued', attempts: candidate.attempts }, {
111
+ status: 'submitting',
112
+ leasedBy: worker,
113
+ leaseToken,
114
+ leaseUntil: new Date(now.getTime() + leaseMs),
115
+ attempts: candidate.attempts + 1,
116
+ });
117
+ if (result.affected !== 1)
118
+ continue;
119
+ const row = await this.#rows.findOneByOrFail({ id: candidate.id });
120
+ const claimed = { ...project(row), leaseToken };
121
+ this.notifyChanged(claimed.id);
122
+ return claimed;
123
+ }
124
+ return null;
125
+ }
126
+ completeAccepted(id, leaseToken, acceptedCount, remaining, message) {
127
+ return this.complete(id, leaseToken, {
128
+ status: 'accepted',
129
+ providerAcceptedCount: acceptedCount,
130
+ providerRemaining: remaining,
131
+ providerMessage: message,
132
+ lastErrorCode: null,
133
+ submittedAt: this.#clock(),
134
+ });
135
+ }
136
+ completeRejected(id, leaseToken, code, message, acceptedCount, remaining) {
137
+ return this.complete(id, leaseToken, {
138
+ status: 'rejected',
139
+ providerAcceptedCount: acceptedCount,
140
+ providerRemaining: remaining,
141
+ providerMessage: message,
142
+ lastErrorCode: code,
143
+ submittedAt: this.#clock(),
144
+ });
145
+ }
146
+ completeUnknown(id, leaseToken, code, message) {
147
+ return this.complete(id, leaseToken, {
148
+ status: 'unknown',
149
+ providerAcceptedCount: null,
150
+ providerRemaining: null,
151
+ providerMessage: message,
152
+ lastErrorCode: code,
153
+ submittedAt: this.#clock(),
154
+ });
155
+ }
156
+ async recoverExpired(now = this.#clock()) {
157
+ const expired = await this.#rows.find({
158
+ select: { id: true },
159
+ where: { status: 'submitting', leaseUntil: LessThanOrEqual(now) },
160
+ });
161
+ if (expired.length === 0)
162
+ return 0;
163
+ const result = await this.#rows.update({
164
+ id: In(expired.map(({ id }) => id)),
165
+ status: 'submitting',
166
+ leaseUntil: LessThanOrEqual(now),
167
+ }, {
168
+ status: 'unknown',
169
+ providerAcceptedCount: null,
170
+ providerRemaining: null,
171
+ lastErrorCode: 'LEASE_EXPIRED',
172
+ providerMessage: 'Submission worker stopped before the provider result was recorded',
173
+ leasedBy: null,
174
+ leaseToken: null,
175
+ leaseUntil: null,
176
+ });
177
+ for (const { id } of expired)
178
+ this.notifyChanged(id);
179
+ return result.affected ?? 0;
180
+ }
181
+ async retry(id, actor) {
182
+ const row = await this.#rows.findOneBy({ id });
183
+ if (!row)
184
+ return null;
185
+ if (!['rejected', 'unknown'].includes(row.status)) {
186
+ return { retryRequested: false, record: project(row) };
187
+ }
188
+ const result = await this.#rows.update({ id, status: row.status, attempts: row.attempts }, {
189
+ status: 'queued',
190
+ retryRequestedBy: actor,
191
+ providerAcceptedCount: null,
192
+ providerRemaining: null,
193
+ providerMessage: null,
194
+ lastErrorCode: null,
195
+ submittedAt: null,
196
+ leasedBy: null,
197
+ leaseToken: null,
198
+ leaseUntil: null,
199
+ });
200
+ if (result.affected !== 1) {
201
+ return {
202
+ retryRequested: false,
203
+ record: project(await this.#rows.findOneByOrFail({ id })),
204
+ };
205
+ }
206
+ const record = project(await this.#rows.findOneByOrFail({ id }));
207
+ this.notifyChanged(record.id);
208
+ return { retryRequested: true, record };
209
+ }
210
+ async status() {
211
+ const activation = await this.database.getRepository(BaiduSubmitActivationEntity)
212
+ .findOneByOrFail({ id: ACTIVATION_ID });
213
+ const statuses = [
214
+ 'queued', 'submitting', 'accepted', 'rejected', 'unknown', 'skipped',
215
+ ];
216
+ const counts = Object.fromEntries(await Promise.all(statuses.map(async (status) => [
217
+ status,
218
+ await this.#rows.countBy({ status }),
219
+ ])));
220
+ const last = await this.#rows.findOne({ order: { createdAt: 'DESC', id: 'DESC' } });
221
+ return submissionServiceStatusSchema.parse({
222
+ activatedAt: activation.activatedAt.toISOString(),
223
+ counts,
224
+ lastSubmission: last ? project(last) : null,
225
+ indexingStatusAvailable: false,
226
+ });
227
+ }
228
+ async complete(id, leaseToken, changes) {
229
+ const result = await this.#rows.update({ id, status: 'submitting', leaseToken }, { ...changes, leasedBy: null, leaseToken: null, leaseUntil: null });
230
+ if (result.affected === 1)
231
+ this.notifyChanged(id);
232
+ return result.affected === 1;
233
+ }
234
+ notifyChanged(id) {
235
+ for (const listener of this.#listeners) {
236
+ try {
237
+ void Promise.resolve(listener(id)).catch(() => undefined);
238
+ }
239
+ catch {
240
+ // Observation failure must not reverse a durable state transition.
241
+ }
242
+ }
243
+ }
244
+ }
245
+ function project(row) {
246
+ return submissionRecordSchema.parse({
247
+ id: row.id,
248
+ eventId: row.eventId,
249
+ postId: row.postId,
250
+ postVersion: row.postVersion,
251
+ trigger: row.trigger,
252
+ url: row.url,
253
+ status: row.status,
254
+ attempts: row.attempts,
255
+ providerAcceptedCount: row.providerAcceptedCount,
256
+ providerRemaining: row.providerRemaining,
257
+ providerMessage: row.providerMessage,
258
+ lastErrorCode: row.lastErrorCode,
259
+ retryRequestedBy: row.retryRequestedBy,
260
+ submittedAt: row.submittedAt?.toISOString() ?? null,
261
+ occurredAt: row.occurredAt.toISOString(),
262
+ createdAt: row.createdAt.toISOString(),
263
+ updatedAt: row.updatedAt.toISOString(),
264
+ });
265
+ }
266
+ //# sourceMappingURL=submission-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submission-store.js","sourceRoot":"","sources":["../../src/persistence/submission-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Application, type MicroBinding } from '@hile/micro';
2
+ import { baiduSubmitMicroContract } from '../contracts.js';
3
+ declare const _default: import("@hile/core").ServiceRegisterProps<Readonly<{
4
+ application: Application;
5
+ contractBinding: MicroBinding<typeof baiduSubmitMicroContract>;
6
+ }>>;
7
+ export default _default;
8
+ //# sourceMappingURL=application.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application.service.d.ts","sourceRoot":"","sources":["../../src/services/application.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAqB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAEL,wBAAwB,EACzB,MAAM,iBAAiB,CAAC;;iBAQV,WAAW;qBACP,YAAY,CAAC,OAAO,wBAAwB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { fileURLToPath } from 'node:url';
2
+ import { defineService } from '@hile/core';
3
+ import { Application, loadMicroContract } from '@hile/micro';
4
+ import { BAIDU_SUBMIT_SERVICE_NAMESPACE, baiduSubmitMicroContract, } from '../contracts.js';
5
+ import { parseAdvertiseHost, parseRegistryBootstrap, } from '@zlooks.cn/registry-config';
6
+ import { detect } from 'detect-port';
7
+ export default defineService('zlooks.baidu-submit.application', async (shutdown) => {
8
+ const registry = parseRegistryBootstrap({
9
+ REGISTRY_HOST: process.env.REGISTRY_HOST,
10
+ REGISTRY_PORT: process.env.REGISTRY_PORT,
11
+ });
12
+ const advertiseHost = parseAdvertiseHost(process.env.HILE_ADVERTISE_HOST);
13
+ const application = new Application({
14
+ namespace: BAIDU_SUBMIT_SERVICE_NAMESPACE,
15
+ registry,
16
+ ...(advertiseHost ? { advertiseHost } : {}),
17
+ });
18
+ const contractBinding = await loadMicroContract(application, baiduSubmitMicroContract, fileURLToPath(new URL('../messages', import.meta.url)));
19
+ try {
20
+ shutdown(await application.listen(await detect()));
21
+ return { application, contractBinding };
22
+ }
23
+ catch (error) {
24
+ await contractBinding.close();
25
+ throw error;
26
+ }
27
+ });
28
+ //# sourceMappingURL=application.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application.service.js","sourceRoot":"","sources":["../../src/services/application.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AAChF,OAAO,EACL,8BAA8B,EAC9B,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,eAAe,aAAa,CAC1B,iCAAiC,EACjC,KAAK,EAAE,QAAQ,EAAE,EAAE;IACjB,MAAM,QAAQ,GAAG,sBAAsB,CAAC;QACtC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;QACxC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;KACzC,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,SAAS,EAAE,8BAA8B;QACzC,QAAQ;QACR,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAC7C,WAAW,EACX,wBAAwB,EACxB,aAAa,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CACvD,CAAC;IACF,IAAI,CAAC;QACH,QAAQ,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC;QACnD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@hile/core").ServiceRegisterProps<import("@hile/mcp/micro").McpProviderAttachment>;
2
+ export default _default;
3
+ //# sourceMappingURL=baidu-submit.boot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baidu-submit.boot.d.ts","sourceRoot":"","sources":["../../src/services/baidu-submit.boot.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import { defineService, loadService } from '@hile/core';
2
+ import applicationService from './application.service.js';
3
+ import mcpProviderService from './mcp-provider.service.js';
4
+ import submissionRuntimeService from './submission-runtime.service.js';
5
+ export default defineService('zlooks.baidu-submit.boot', async () => {
6
+ await loadService(submissionRuntimeService);
7
+ const { contractBinding } = await loadService(applicationService);
8
+ contractBinding.activate();
9
+ return loadService(mcpProviderService);
10
+ });
11
+ //# sourceMappingURL=baidu-submit.boot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baidu-submit.boot.js","sourceRoot":"","sources":["../../src/services/baidu-submit.boot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAC1D,OAAO,kBAAkB,MAAM,2BAA2B,CAAC;AAC3D,OAAO,wBAAwB,MAAM,iCAAiC,CAAC;AAEvE,eAAe,aAAa,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;IAClE,MAAM,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAC5C,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAClE,eAAe,CAAC,QAAQ,EAAE,CAAC;IAC3B,OAAO,WAAW,CAAC,kBAAkB,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ declare const _default: import("@hile/core").ServiceRegisterProps<import("@zlooks.cn/registry-config").RegistryConfigSubscription<Readonly<{
2
+ postgres: Readonly<{
3
+ host: string;
4
+ port: number;
5
+ username: string;
6
+ password: string;
7
+ database: string;
8
+ ssl: boolean;
9
+ poolSize: number;
10
+ }>;
11
+ publicHost: Readonly<{
12
+ origin: string;
13
+ }>;
14
+ baiduSubmit: Readonly<Readonly<{
15
+ site: string;
16
+ token: string;
17
+ }>>;
18
+ }>>>;
19
+ export default _default;
20
+ //# sourceMappingURL=config.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.d.ts","sourceRoot":"","sources":["../../src/services/config.service.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { defineService, loadService } from '@hile/core';
2
+ import { BAIDU_SUBMIT_CONFIG_TOPIC_KEY, parseBaiduSubmitConfig, } from '../contracts.js';
3
+ import { parsePostgresConfig } from '@zlooks.cn/infrastructure';
4
+ import { parsePublicHostConfig, PUBLIC_HOST_CONFIG_TOPIC_KEY, } from '@zlooks.cn/public-host-contract';
5
+ import { registryConfigTopic, subscribeRegistryConfig, } from '@zlooks.cn/registry-config';
6
+ import applicationService from './application.service.js';
7
+ import loggerService from './logger.service.js';
8
+ export default defineService('zlooks.baidu-submit.config', async (shutdown) => {
9
+ const [{ application }, logger] = await Promise.all([
10
+ loadService(applicationService),
11
+ loadService(loggerService),
12
+ ]);
13
+ const subscriber = await subscribeRegistryConfig(application, {
14
+ sources: {
15
+ postgres: {
16
+ topic: registryConfigTopic('postgres'),
17
+ parse: parsePostgresConfig,
18
+ },
19
+ publicHost: {
20
+ topic: registryConfigTopic(PUBLIC_HOST_CONFIG_TOPIC_KEY),
21
+ parse: parsePublicHostConfig,
22
+ },
23
+ baiduSubmit: {
24
+ topic: registryConfigTopic(BAIDU_SUBMIT_CONFIG_TOPIC_KEY),
25
+ parse: parseBaiduSubmitConfig,
26
+ },
27
+ },
28
+ compose(sources) {
29
+ const publicOrigin = new URL(sources.publicHost.origin).origin;
30
+ if (sources.baiduSubmit.site !== publicOrigin) {
31
+ throw new Error('Baidu site must equal the configured public Host origin');
32
+ }
33
+ return Object.freeze({
34
+ postgres: sources.postgres,
35
+ publicHost: sources.publicHost,
36
+ baiduSubmit: sources.baiduSubmit,
37
+ });
38
+ },
39
+ onError: (error) => logger.error({ err: error, event: 'baidu-submit.config.invalid' }, 'Baidu submission configuration is invalid'),
40
+ });
41
+ shutdown(() => subscriber.close());
42
+ return subscriber;
43
+ });
44
+ //# sourceMappingURL=config.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../src/services/config.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EACL,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAC1D,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAEhD,eAAe,aAAa,CAAC,4BAA4B,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAC5E,MAAM,CAAC,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClD,WAAW,CAAC,kBAAkB,CAAC;QAC/B,WAAW,CAAC,aAAa,CAAC;KAC3B,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,WAAW,EAAE;QAC5D,OAAO,EAAE;YACP,QAAQ,EAAE;gBACR,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC;gBACtC,KAAK,EAAE,mBAAmB;aAC3B;YACD,UAAU,EAAE;gBACV,KAAK,EAAE,mBAAmB,CAAC,4BAA4B,CAAC;gBACxD,KAAK,EAAE,qBAAqB;aAC7B;YACD,WAAW,EAAE;gBACX,KAAK,EAAE,mBAAmB,CAAC,6BAA6B,CAAC;gBACzD,KAAK,EAAE,sBAAsB;aAC9B;SACF;QACD,OAAO,CAAC,OAAO;YACb,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;YAC/D,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,EACnF,2CAA2C,CAAC;KAC/C,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IACnC,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@hile/core").ServiceRegisterProps<import("typeorm").DataSource>;
2
+ export default _default;
3
+ //# sourceMappingURL=database.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.service.d.ts","sourceRoot":"","sources":["../../src/services/database.service.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { defineService, loadService } from '@hile/core';
2
+ import { createDataSource } from '@hile/typeorm';
3
+ import { baiduSubmitEntities } from '../persistence/entities.js';
4
+ import configService from './config.service.js';
5
+ export default defineService('zlooks.baidu-submit.database', async (shutdown) => {
6
+ const config = (await loadService(configService)).snapshot().postgres;
7
+ const database = await createDataSource({
8
+ type: 'postgres',
9
+ host: config.host,
10
+ port: config.port,
11
+ username: config.username,
12
+ password: config.password,
13
+ database: config.database,
14
+ ssl: config.ssl,
15
+ poolSize: config.poolSize,
16
+ synchronize: true,
17
+ migrationsRun: false,
18
+ entities: [...baiduSubmitEntities],
19
+ });
20
+ shutdown(() => database.destroy());
21
+ return database;
22
+ });
23
+ //# sourceMappingURL=database.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.service.js","sourceRoot":"","sources":["../../src/services/database.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAEhD,eAAe,aAAa,CAAC,8BAA8B,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAC9E,MAAM,MAAM,GAAG,CAAC,MAAM,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACtE,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC;QACtC,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,KAAK;QACpB,QAAQ,EAAE,CAAC,GAAG,mBAAmB,CAAC;KACnC,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type Logger } from '@hile/logger';
2
+ declare const _default: import("@hile/core").ServiceRegisterProps<Logger>;
3
+ export default _default;
4
+ //# sourceMappingURL=logger.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.service.d.ts","sourceRoot":"","sources":["../../src/services/logger.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { defineService } from '@hile/core';
2
+ import { createLogger } from '@hile/logger';
3
+ export default defineService('zlooks.baidu-submit.logger', async (shutdown) => {
4
+ const { logger, teardown } = createLogger({ level: 'info', pretty: false });
5
+ shutdown(teardown);
6
+ return logger;
7
+ });
8
+ //# sourceMappingURL=logger.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../src/services/logger.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAe,MAAM,cAAc,CAAC;AAEzD,eAAe,aAAa,CAC1B,4BAA4B,EAC5B,KAAK,EAAE,QAAQ,EAAmB,EAAE;IAClC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5E,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC,CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@hile/core").ServiceRegisterProps<import("@hile/mcp/micro").McpProviderAttachment>;
2
+ export default _default;
3
+ //# sourceMappingURL=mcp-provider.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-provider.service.d.ts","sourceRoot":"","sources":["../../src/services/mcp-provider.service.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { defineService, loadService } from '@hile/core';
2
+ import { attachMcpProvider } from '@hile/mcp/micro';
3
+ import { BAIDU_SUBMIT_RECORD_RESOURCE, BAIDU_SUBMIT_STATUS_RESOURCE, createBaiduSubmitClient, } from '../contracts.js';
4
+ import { createBaiduSubmitMcpProvider } from '../mcp/provider.js';
5
+ import applicationService from './application.service.js';
6
+ import submissionRuntimeService from './submission-runtime.service.js';
7
+ export default defineService('zlooks.baidu-submit.mcp-provider', async (shutdown) => {
8
+ const { store } = await loadService(submissionRuntimeService);
9
+ const { application, contractBinding } = await loadService(applicationService);
10
+ const attachment = await attachMcpProvider(application, createBaiduSubmitMcpProvider(createBaiduSubmitClient(contractBinding.local)), { invocationSecurity: { mode: 'trusted-internal' } });
11
+ const unsubscribe = store.subscribe(async (id) => {
12
+ await Promise.allSettled([
13
+ attachment.notifyResourceUpdated(BAIDU_SUBMIT_STATUS_RESOURCE),
14
+ attachment.notifyResourceUpdated(BAIDU_SUBMIT_RECORD_RESOURCE, { id }),
15
+ ]);
16
+ });
17
+ shutdown(async () => {
18
+ unsubscribe();
19
+ await attachment.close();
20
+ });
21
+ return attachment;
22
+ });
23
+ //# sourceMappingURL=mcp-provider.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-provider.service.js","sourceRoot":"","sources":["../../src/services/mcp-provider.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAC1D,OAAO,wBAAwB,MAAM,iCAAiC,CAAC;AAEvE,eAAe,aAAa,CAAC,kCAAkC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAClF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAC9D,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,MAAM,iBAAiB,CACxC,WAAW,EACX,4BAA4B,CAAC,uBAAuB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAC5E,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,CACrD,CAAC;IACF,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAC/C,MAAM,OAAO,CAAC,UAAU,CAAC;YACvB,UAAU,CAAC,qBAAqB,CAAC,4BAA4B,CAAC;YAC9D,UAAU,CAAC,qBAAqB,CAAC,4BAA4B,EAAE,EAAE,EAAE,EAAE,CAAC;SACvE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,WAAW,EAAE,CAAC;QACd,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { SubmissionStore } from '../persistence/submission-store.js';
2
+ import { SubmissionWorker } from '../submission/submission-worker.js';
3
+ declare const _default: import("@hile/core").ServiceRegisterProps<{
4
+ readonly store: SubmissionStore;
5
+ readonly worker: SubmissionWorker;
6
+ }>;
7
+ export default _default;
8
+ //# sourceMappingURL=submission-runtime.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submission-runtime.service.d.ts","sourceRoot":"","sources":["../../src/services/submission-runtime.service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { defineService, loadService } from '@hile/core';
3
+ import { EventClient } from '@zlooks.cn/event-client';
4
+ import { startBlogSubscriptions } from '../events/blog-subscriptions.js';
5
+ import { SubmissionStore } from '../persistence/submission-store.js';
6
+ import { BaiduSubmitClient } from '../submission/baidu-submit-client.js';
7
+ import { SubmissionWorker } from '../submission/submission-worker.js';
8
+ import applicationService from './application.service.js';
9
+ import configService from './config.service.js';
10
+ import databaseService from './database.service.js';
11
+ import loggerService from './logger.service.js';
12
+ export default defineService('zlooks.baidu-submit.runtime', async (shutdown) => {
13
+ const [database, configs, { application }, logger] = await Promise.all([
14
+ loadService(databaseService),
15
+ loadService(configService),
16
+ loadService(applicationService),
17
+ loadService(loggerService),
18
+ ]);
19
+ const store = new SubmissionStore(database);
20
+ await store.activate();
21
+ const events = new EventClient(application);
22
+ const subscriptions = startBlogSubscriptions(events, store, () => configs.snapshot().publicHost.origin, logger);
23
+ const worker = new SubmissionWorker(store, new BaiduSubmitClient(), () => configs.snapshot().baiduSubmit, `baidu-submit-${randomUUID()}`, logger);
24
+ worker.start();
25
+ shutdown(async () => {
26
+ await Promise.all([
27
+ subscriptions.close(),
28
+ worker.close(),
29
+ ]);
30
+ });
31
+ return { store, worker };
32
+ });
33
+ //# sourceMappingURL=submission-runtime.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submission-runtime.service.js","sourceRoot":"","sources":["../../src/services/submission-runtime.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAC1D,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,eAAe,MAAM,uBAAuB,CAAC;AACpD,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAEhD,eAAe,aAAa,CAAC,6BAA6B,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAC7E,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrE,WAAW,CAAC,eAAe,CAAC;QAC5B,WAAW,CAAC,aAAa,CAAC;QAC1B,WAAW,CAAC,kBAAkB,CAAC;QAC/B,WAAW,CAAC,aAAa,CAAC;KAC3B,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,sBAAsB,CAC1C,MAAM,EACN,KAAK,EACL,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,MAAM,EAC1C,MAAM,CACP,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,gBAAgB,CACjC,KAAK,EACL,IAAI,iBAAiB,EAAE,EACvB,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,WAAW,EACpC,gBAAgB,UAAU,EAAE,EAAE,EAC9B,MAAM,CACP,CAAC;IACF,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,aAAa,CAAC,KAAK,EAAE;YACrB,MAAM,CAAC,KAAK,EAAE;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAW,CAAC;AACpC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ export type BaiduSubmitResult = Readonly<{
2
+ outcome: 'accepted';
3
+ acceptedCount: number;
4
+ remaining: number;
5
+ message: string | null;
6
+ } | {
7
+ outcome: 'rejected';
8
+ acceptedCount: number;
9
+ remaining: number | null;
10
+ code: 'WRONG_SITE_OR_INVALID' | 'NO_URL_ACCEPTED' | 'HTTP_REJECTED';
11
+ message: string;
12
+ } | {
13
+ outcome: 'unknown';
14
+ code: 'TRANSPORT_ERROR' | 'INVALID_RESPONSE' | 'HTTP_ERROR';
15
+ message: string;
16
+ }>;
17
+ type Fetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
18
+ export declare class BaiduSubmitClient {
19
+ private readonly fetch;
20
+ constructor(fetch?: Fetch);
21
+ submit(input: Readonly<{
22
+ site: string;
23
+ token: string;
24
+ url: string;
25
+ signal: AbortSignal;
26
+ }>): Promise<BaiduSubmitResult>;
27
+ }
28
+ export {};
29
+ //# sourceMappingURL=baidu-submit-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baidu-submit-client.d.ts","sourceRoot":"","sources":["../../src/submission/baidu-submit-client.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CACpC;IACE,OAAO,EAAE,UAAU,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,GACD;IACE,OAAO,EAAE,UAAU,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,uBAAuB,GAAG,iBAAiB,GAAG,eAAe,CAAC;IACpE,OAAO,EAAE,MAAM,CAAC;CACjB,GACD;IACE,OAAO,EAAE,SAAS,CAAC;IACnB,IAAI,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,YAAY,CAAC;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB,CACJ,CAAC;AAEF,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEtF,qBAAa,iBAAiB;IACT,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAzC,YAAoC,KAAK,GAAE,KAAwB,EAAI;IAE1D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC;QAClC,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,WAAW,CAAC;KACrB,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2E9B;CACF"}