@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.
- package/dist/command/index.d.ts +3 -0
- package/dist/command/index.d.ts.map +1 -0
- package/dist/command/index.js +14 -0
- package/dist/command/index.js.map +1 -0
- package/dist/config/config-command.d.ts +20 -0
- package/dist/config/config-command.d.ts.map +1 -0
- package/dist/config/config-command.js +57 -0
- package/dist/config/config-command.js.map +1 -0
- package/dist/contracts.d.ts +502 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +142 -0
- package/dist/contracts.js.map +1 -0
- package/dist/events/blog-subscriptions.d.ts +7 -0
- package/dist/events/blog-subscriptions.d.ts.map +1 -0
- package/dist/events/blog-subscriptions.js +49 -0
- package/dist/events/blog-subscriptions.js.map +1 -0
- package/dist/mcp/provider.d.ts +5 -0
- package/dist/mcp/provider.d.ts.map +1 -0
- package/dist/mcp/provider.js +162 -0
- package/dist/mcp/provider.js.map +1 -0
- package/dist/messages/status/read.msg.d.ts +47 -0
- package/dist/messages/status/read.msg.d.ts.map +1 -0
- package/dist/messages/status/read.msg.js +6 -0
- package/dist/messages/status/read.msg.js.map +1 -0
- package/dist/messages/submissions/read.msg.d.ts +42 -0
- package/dist/messages/submissions/read.msg.d.ts.map +1 -0
- package/dist/messages/submissions/read.msg.js +6 -0
- package/dist/messages/submissions/read.msg.js.map +1 -0
- package/dist/messages/submissions/retry.msg.d.ts +74 -0
- package/dist/messages/submissions/retry.msg.d.ts.map +1 -0
- package/dist/messages/submissions/retry.msg.js +6 -0
- package/dist/messages/submissions/retry.msg.js.map +1 -0
- package/dist/messages/submissions/search.msg.d.ts +52 -0
- package/dist/messages/submissions/search.msg.d.ts.map +1 -0
- package/dist/messages/submissions/search.msg.js +6 -0
- package/dist/messages/submissions/search.msg.js.map +1 -0
- package/dist/models/read-status.model.d.ts +33 -0
- package/dist/models/read-status.model.d.ts.map +1 -0
- package/dist/models/read-status.model.js +11 -0
- package/dist/models/read-status.model.js.map +1 -0
- package/dist/models/read-submission.model.d.ts +6 -0
- package/dist/models/read-submission.model.d.ts.map +1 -0
- package/dist/models/read-submission.model.js +13 -0
- package/dist/models/read-submission.model.js.map +1 -0
- package/dist/models/retry-submission.model.d.ts +7 -0
- package/dist/models/retry-submission.model.d.ts.map +1 -0
- package/dist/models/retry-submission.model.js +17 -0
- package/dist/models/retry-submission.model.js.map +1 -0
- package/dist/models/search-submissions.model.d.ts +31 -0
- package/dist/models/search-submissions.model.d.ts.map +1 -0
- package/dist/models/search-submissions.model.js +13 -0
- package/dist/models/search-submissions.model.js.map +1 -0
- package/dist/persistence/entities.d.ts +32 -0
- package/dist/persistence/entities.d.ts.map +1 -0
- package/dist/persistence/entities.js +49 -0
- package/dist/persistence/entities.js.map +1 -0
- package/dist/persistence/submission-store.d.ts +41 -0
- package/dist/persistence/submission-store.d.ts.map +1 -0
- package/dist/persistence/submission-store.js +266 -0
- package/dist/persistence/submission-store.js.map +1 -0
- package/dist/services/application.service.d.ts +8 -0
- package/dist/services/application.service.d.ts.map +1 -0
- package/dist/services/application.service.js +28 -0
- package/dist/services/application.service.js.map +1 -0
- package/dist/services/baidu-submit.boot.d.ts +3 -0
- package/dist/services/baidu-submit.boot.d.ts.map +1 -0
- package/dist/services/baidu-submit.boot.js +11 -0
- package/dist/services/baidu-submit.boot.js.map +1 -0
- package/dist/services/config.service.d.ts +20 -0
- package/dist/services/config.service.d.ts.map +1 -0
- package/dist/services/config.service.js +44 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/database.service.d.ts +3 -0
- package/dist/services/database.service.d.ts.map +1 -0
- package/dist/services/database.service.js +23 -0
- package/dist/services/database.service.js.map +1 -0
- package/dist/services/logger.service.d.ts +4 -0
- package/dist/services/logger.service.d.ts.map +1 -0
- package/dist/services/logger.service.js +8 -0
- package/dist/services/logger.service.js.map +1 -0
- package/dist/services/mcp-provider.service.d.ts +3 -0
- package/dist/services/mcp-provider.service.d.ts.map +1 -0
- package/dist/services/mcp-provider.service.js +23 -0
- package/dist/services/mcp-provider.service.js.map +1 -0
- package/dist/services/submission-runtime.service.d.ts +8 -0
- package/dist/services/submission-runtime.service.d.ts.map +1 -0
- package/dist/services/submission-runtime.service.js +33 -0
- package/dist/services/submission-runtime.service.js.map +1 -0
- package/dist/submission/baidu-submit-client.d.ts +29 -0
- package/dist/submission/baidu-submit-client.d.ts.map +1 -0
- package/dist/submission/baidu-submit-client.js +132 -0
- package/dist/submission/baidu-submit-client.js.map +1 -0
- package/dist/submission/submission-worker.d.ts +17 -0
- package/dist/submission/submission-worker.d.ts.map +1 -0
- package/dist/submission/submission-worker.js +75 -0
- package/dist/submission/submission-worker.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { submissionProviderMetricSchema } from '../contracts.js';
|
|
3
|
+
const BAIDU_SUBMIT_ENDPOINT = 'http://data.zz.baidu.com/urls';
|
|
4
|
+
const RESPONSE_LIMIT = 32_768;
|
|
5
|
+
const REQUEST_TIMEOUT_MS = 5_000;
|
|
6
|
+
const providerResponseSchema = z.object({
|
|
7
|
+
remain: submissionProviderMetricSchema,
|
|
8
|
+
success: submissionProviderMetricSchema,
|
|
9
|
+
not_same_site: z.array(z.string()).max(10_000).optional(),
|
|
10
|
+
not_valid: z.array(z.string()).max(10_000).optional(),
|
|
11
|
+
}).refine(({ success, not_same_site: wrongSite, not_valid: invalid }) => (success + (wrongSite?.length ?? 0) + (invalid?.length ?? 0) <= 1), 'One-URL submission returned impossible counts').readonly();
|
|
12
|
+
export class BaiduSubmitClient {
|
|
13
|
+
fetch;
|
|
14
|
+
constructor(fetch = globalThis.fetch) {
|
|
15
|
+
this.fetch = fetch;
|
|
16
|
+
}
|
|
17
|
+
async submit(input) {
|
|
18
|
+
input.signal.throwIfAborted();
|
|
19
|
+
const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);
|
|
20
|
+
const signal = AbortSignal.any([input.signal, timeout]);
|
|
21
|
+
try {
|
|
22
|
+
const endpoint = new URL(BAIDU_SUBMIT_ENDPOINT);
|
|
23
|
+
endpoint.searchParams.set('site', input.site);
|
|
24
|
+
endpoint.searchParams.set('token', input.token);
|
|
25
|
+
const response = await this.fetch(endpoint, {
|
|
26
|
+
method: 'POST',
|
|
27
|
+
headers: { 'content-type': 'text/plain; charset=utf-8' },
|
|
28
|
+
body: input.url,
|
|
29
|
+
redirect: 'error',
|
|
30
|
+
signal,
|
|
31
|
+
});
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
if (response.status >= 400 && response.status < 500) {
|
|
34
|
+
return {
|
|
35
|
+
outcome: 'rejected',
|
|
36
|
+
acceptedCount: 0,
|
|
37
|
+
remaining: null,
|
|
38
|
+
code: 'HTTP_REJECTED',
|
|
39
|
+
message: `Baidu rejected the request with HTTP ${response.status}`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
outcome: 'unknown',
|
|
44
|
+
code: 'HTTP_ERROR',
|
|
45
|
+
message: `Baidu returned HTTP ${response.status}`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const text = await readBoundedText(response);
|
|
49
|
+
if (text === null)
|
|
50
|
+
return invalidResponse();
|
|
51
|
+
let json;
|
|
52
|
+
try {
|
|
53
|
+
json = JSON.parse(text);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return invalidResponse();
|
|
57
|
+
}
|
|
58
|
+
const parsed = providerResponseSchema.safeParse(json);
|
|
59
|
+
if (!parsed.success)
|
|
60
|
+
return invalidResponse();
|
|
61
|
+
const wrongSite = parsed.data.not_same_site?.length ?? 0;
|
|
62
|
+
const invalid = parsed.data.not_valid?.length ?? 0;
|
|
63
|
+
if (wrongSite + invalid > 0) {
|
|
64
|
+
return {
|
|
65
|
+
outcome: 'rejected',
|
|
66
|
+
acceptedCount: parsed.data.success,
|
|
67
|
+
remaining: parsed.data.remain,
|
|
68
|
+
code: 'WRONG_SITE_OR_INVALID',
|
|
69
|
+
message: `${wrongSite} wrong-site URL(s), ${invalid} invalid URL(s)`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (parsed.data.success === 0) {
|
|
73
|
+
return {
|
|
74
|
+
outcome: 'rejected',
|
|
75
|
+
acceptedCount: 0,
|
|
76
|
+
remaining: parsed.data.remain,
|
|
77
|
+
code: 'NO_URL_ACCEPTED',
|
|
78
|
+
message: 'Baidu accepted no URL',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
outcome: 'accepted',
|
|
83
|
+
acceptedCount: parsed.data.success,
|
|
84
|
+
remaining: parsed.data.remain,
|
|
85
|
+
message: null,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
input.signal.throwIfAborted();
|
|
90
|
+
return {
|
|
91
|
+
outcome: 'unknown',
|
|
92
|
+
code: 'TRANSPORT_ERROR',
|
|
93
|
+
message: 'Baidu submission result is unknown',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function invalidResponse() {
|
|
99
|
+
return {
|
|
100
|
+
outcome: 'unknown',
|
|
101
|
+
code: 'INVALID_RESPONSE',
|
|
102
|
+
message: 'Baidu returned an invalid response',
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
async function readBoundedText(response) {
|
|
106
|
+
const declaredLength = Number(response.headers.get('content-length'));
|
|
107
|
+
if (Number.isFinite(declaredLength) && declaredLength > RESPONSE_LIMIT)
|
|
108
|
+
return null;
|
|
109
|
+
if (!response.body)
|
|
110
|
+
return '';
|
|
111
|
+
const reader = response.body.getReader();
|
|
112
|
+
const decoder = new TextDecoder();
|
|
113
|
+
let bytes = 0;
|
|
114
|
+
let text = '';
|
|
115
|
+
try {
|
|
116
|
+
while (true) {
|
|
117
|
+
const chunk = await reader.read();
|
|
118
|
+
if (chunk.done)
|
|
119
|
+
return text + decoder.decode();
|
|
120
|
+
bytes += chunk.value.byteLength;
|
|
121
|
+
if (bytes > RESPONSE_LIMIT) {
|
|
122
|
+
await reader.cancel().catch(() => undefined);
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
text += decoder.decode(chunk.value, { stream: true });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
reader.releaseLock();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=baidu-submit-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baidu-submit-client.js","sourceRoot":"","sources":["../../src/submission/baidu-submit-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Logger } from '@hile/logger';
|
|
2
|
+
import type { BaiduSubmitConfig } from '../contracts.js';
|
|
3
|
+
import type { SubmissionStore } from '../persistence/submission-store.js';
|
|
4
|
+
import type { BaiduSubmitClient } from './baidu-submit-client.js';
|
|
5
|
+
export declare class SubmissionWorker {
|
|
6
|
+
#private;
|
|
7
|
+
private readonly store;
|
|
8
|
+
private readonly client;
|
|
9
|
+
private readonly config;
|
|
10
|
+
private readonly workerId;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
constructor(store: SubmissionStore, client: BaiduSubmitClient, config: () => BaiduSubmitConfig, workerId: string, logger: Logger);
|
|
13
|
+
start(): void;
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
private run;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=submission-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submission-worker.d.ts","sourceRoot":"","sources":["../../src/submission/submission-worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAKlE,qBAAa,gBAAgB;;IAKzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,YACmB,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,MAAM,iBAAiB,EAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAC7B;IAEG,KAAK,IAAI,IAAI,CAEnB;IAEY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlC;YAEa,GAAG;CA8DlB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
const IDLE_DELAY_MS = 500;
|
|
2
|
+
const LEASE_MS = 30_000;
|
|
3
|
+
export class SubmissionWorker {
|
|
4
|
+
store;
|
|
5
|
+
client;
|
|
6
|
+
config;
|
|
7
|
+
workerId;
|
|
8
|
+
logger;
|
|
9
|
+
#controller = new AbortController();
|
|
10
|
+
#running;
|
|
11
|
+
constructor(store, client, config, workerId, logger) {
|
|
12
|
+
this.store = store;
|
|
13
|
+
this.client = client;
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.workerId = workerId;
|
|
16
|
+
this.logger = logger;
|
|
17
|
+
}
|
|
18
|
+
start() {
|
|
19
|
+
this.#running ??= this.run();
|
|
20
|
+
}
|
|
21
|
+
async close() {
|
|
22
|
+
this.#controller.abort();
|
|
23
|
+
await this.#running;
|
|
24
|
+
}
|
|
25
|
+
async run() {
|
|
26
|
+
while (!this.#controller.signal.aborted) {
|
|
27
|
+
try {
|
|
28
|
+
await this.store.recoverExpired();
|
|
29
|
+
const record = await this.store.claimNext(this.workerId, LEASE_MS);
|
|
30
|
+
if (!record) {
|
|
31
|
+
await delay(IDLE_DELAY_MS, this.#controller.signal);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const config = this.config();
|
|
35
|
+
if (new URL(record.url).origin !== config.site) {
|
|
36
|
+
await this.store.completeRejected(record.id, record.leaseToken, 'SITE_CHANGED', 'Submission URL origin does not match the configured site', 0, null);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const result = await this.client.submit({
|
|
40
|
+
site: config.site,
|
|
41
|
+
token: config.token,
|
|
42
|
+
url: record.url,
|
|
43
|
+
signal: this.#controller.signal,
|
|
44
|
+
});
|
|
45
|
+
if (result.outcome === 'accepted') {
|
|
46
|
+
await this.store.completeAccepted(record.id, record.leaseToken, result.acceptedCount, result.remaining, result.message);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (result.outcome === 'rejected') {
|
|
50
|
+
await this.store.completeRejected(record.id, record.leaseToken, result.code, result.message, result.acceptedCount, result.remaining);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
await this.store.completeUnknown(record.id, record.leaseToken, result.code, result.message);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (this.#controller.signal.aborted)
|
|
57
|
+
return;
|
|
58
|
+
this.logger.error({ err: error, event: 'baidu-submit.worker.failed' }, 'Baidu submission worker iteration failed');
|
|
59
|
+
await delay(IDLE_DELAY_MS, this.#controller.signal);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function delay(milliseconds, signal) {
|
|
65
|
+
return new Promise((resolve) => {
|
|
66
|
+
if (signal.aborted)
|
|
67
|
+
return resolve();
|
|
68
|
+
const timer = setTimeout(resolve, milliseconds);
|
|
69
|
+
signal.addEventListener('abort', () => {
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
resolve();
|
|
72
|
+
}, { once: true });
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=submission-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submission-worker.js","sourceRoot":"","sources":["../../src/submission/submission-worker.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zlooks.cn/baidu-submit-server",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=24.0.0"
|
|
8
|
+
},
|
|
9
|
+
"bin": {
|
|
10
|
+
"zlooks-baidu-submit-server": "dist/command/index.js"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist"
|
|
14
|
+
],
|
|
15
|
+
"zlooks": {
|
|
16
|
+
"kind": "service",
|
|
17
|
+
"description": "百度链接自动提交服务",
|
|
18
|
+
"dependsOn": [
|
|
19
|
+
"@zlooks.cn/event-server"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "pnpm run clean && tsc -p tsconfig.json && fix-esm-import-path --preserve-import-type ./dist",
|
|
24
|
+
"clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
27
|
+
"dev": "hile start --dev --env-file ~/.zlooks.cn/.env",
|
|
28
|
+
"start": "hile start --env-file ~/.zlooks.cn/.env"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@hile/cli": "4.0.8",
|
|
32
|
+
"@hile/core": "4.0.2",
|
|
33
|
+
"@hile/logger": "4.0.2",
|
|
34
|
+
"@hile/mcp": "1.0.6",
|
|
35
|
+
"@hile/message-loader": "4.0.7",
|
|
36
|
+
"@hile/micro": "4.0.7",
|
|
37
|
+
"@hile/micro-contract": "1.0.1",
|
|
38
|
+
"@hile/model": "4.0.4",
|
|
39
|
+
"@hile/typeorm": "4.0.2",
|
|
40
|
+
"@inquirer/prompts": "8.7.0",
|
|
41
|
+
"@zlooks.cn/blog-shared": "1.0.3",
|
|
42
|
+
"@zlooks.cn/event-client": "1.0.3",
|
|
43
|
+
"@zlooks.cn/infrastructure": "1.0.0",
|
|
44
|
+
"@zlooks.cn/public-host-contract": "1.0.0",
|
|
45
|
+
"@zlooks.cn/registry-config": "1.0.1",
|
|
46
|
+
"@zlooks.cn/service-command": "1.0.2",
|
|
47
|
+
"detect-port": "2.1.0",
|
|
48
|
+
"pg": "8.23.0",
|
|
49
|
+
"typeorm": "1.1.0",
|
|
50
|
+
"zod": "4.4.3"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@hile/context": "4.0.3",
|
|
54
|
+
"@types/node": "26.2.0",
|
|
55
|
+
"fix-esm-import-path": "1.10.3",
|
|
56
|
+
"pg-mem": "3.0.14",
|
|
57
|
+
"typescript": "7.0.2",
|
|
58
|
+
"vitest": "4.1.11"
|
|
59
|
+
},
|
|
60
|
+
"gitHead": "93c1087350b97ab47fd9596c1e39da4ade741a49"
|
|
61
|
+
}
|