@claw-network/node 0.2.0
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/README.md +49 -0
- package/dist/api/api-key-store.d.ts +74 -0
- package/dist/api/api-key-store.d.ts.map +1 -0
- package/dist/api/api-key-store.js +170 -0
- package/dist/api/api-key-store.js.map +1 -0
- package/dist/api/auth.d.ts +30 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +115 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/legacy.d.ts +26 -0
- package/dist/api/legacy.d.ts.map +1 -0
- package/dist/api/legacy.js +281 -0
- package/dist/api/legacy.js.map +1 -0
- package/dist/api/middleware.d.ts +35 -0
- package/dist/api/middleware.d.ts.map +1 -0
- package/dist/api/middleware.js +75 -0
- package/dist/api/middleware.js.map +1 -0
- package/dist/api/response.d.ts +85 -0
- package/dist/api/response.d.ts.map +1 -0
- package/dist/api/response.js +185 -0
- package/dist/api/response.js.map +1 -0
- package/dist/api/router.d.ts +45 -0
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/router.js +183 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/routes/admin.d.ts +11 -0
- package/dist/api/routes/admin.d.ts.map +1 -0
- package/dist/api/routes/admin.js +124 -0
- package/dist/api/routes/admin.js.map +1 -0
- package/dist/api/routes/contracts.d.ts +7 -0
- package/dist/api/routes/contracts.d.ts.map +1 -0
- package/dist/api/routes/contracts.js +665 -0
- package/dist/api/routes/contracts.js.map +1 -0
- package/dist/api/routes/dao.d.ts +7 -0
- package/dist/api/routes/dao.d.ts.map +1 -0
- package/dist/api/routes/dao.js +549 -0
- package/dist/api/routes/dao.js.map +1 -0
- package/dist/api/routes/dev.d.ts +9 -0
- package/dist/api/routes/dev.d.ts.map +1 -0
- package/dist/api/routes/dev.js +273 -0
- package/dist/api/routes/dev.js.map +1 -0
- package/dist/api/routes/escrows.d.ts +7 -0
- package/dist/api/routes/escrows.d.ts.map +1 -0
- package/dist/api/routes/escrows.js +454 -0
- package/dist/api/routes/escrows.js.map +1 -0
- package/dist/api/routes/identities.d.ts +7 -0
- package/dist/api/routes/identities.d.ts.map +1 -0
- package/dist/api/routes/identities.js +245 -0
- package/dist/api/routes/identities.js.map +1 -0
- package/dist/api/routes/markets-capabilities.d.ts +7 -0
- package/dist/api/routes/markets-capabilities.d.ts.map +1 -0
- package/dist/api/routes/markets-capabilities.js +477 -0
- package/dist/api/routes/markets-capabilities.js.map +1 -0
- package/dist/api/routes/markets-disputes.d.ts +7 -0
- package/dist/api/routes/markets-disputes.d.ts.map +1 -0
- package/dist/api/routes/markets-disputes.js +102 -0
- package/dist/api/routes/markets-disputes.js.map +1 -0
- package/dist/api/routes/markets-info.d.ts +7 -0
- package/dist/api/routes/markets-info.d.ts.map +1 -0
- package/dist/api/routes/markets-info.js +523 -0
- package/dist/api/routes/markets-info.js.map +1 -0
- package/dist/api/routes/markets-search.d.ts +7 -0
- package/dist/api/routes/markets-search.d.ts.map +1 -0
- package/dist/api/routes/markets-search.js +38 -0
- package/dist/api/routes/markets-search.js.map +1 -0
- package/dist/api/routes/markets-tasks.d.ts +7 -0
- package/dist/api/routes/markets-tasks.d.ts.map +1 -0
- package/dist/api/routes/markets-tasks.js +539 -0
- package/dist/api/routes/markets-tasks.js.map +1 -0
- package/dist/api/routes/node.d.ts +7 -0
- package/dist/api/routes/node.d.ts.map +1 -0
- package/dist/api/routes/node.js +53 -0
- package/dist/api/routes/node.js.map +1 -0
- package/dist/api/routes/nonce.d.ts +10 -0
- package/dist/api/routes/nonce.d.ts.map +1 -0
- package/dist/api/routes/nonce.js +65 -0
- package/dist/api/routes/nonce.js.map +1 -0
- package/dist/api/routes/reputations.d.ts +7 -0
- package/dist/api/routes/reputations.d.ts.map +1 -0
- package/dist/api/routes/reputations.js +243 -0
- package/dist/api/routes/reputations.js.map +1 -0
- package/dist/api/routes/transfers.d.ts +7 -0
- package/dist/api/routes/transfers.d.ts.map +1 -0
- package/dist/api/routes/transfers.js +88 -0
- package/dist/api/routes/transfers.js.map +1 -0
- package/dist/api/routes/wallets.d.ts +7 -0
- package/dist/api/routes/wallets.d.ts.map +1 -0
- package/dist/api/routes/wallets.js +132 -0
- package/dist/api/routes/wallets.js.map +1 -0
- package/dist/api/schemas/common.d.ts +45 -0
- package/dist/api/schemas/common.d.ts.map +1 -0
- package/dist/api/schemas/common.js +30 -0
- package/dist/api/schemas/common.js.map +1 -0
- package/dist/api/schemas/contracts.d.ts +284 -0
- package/dist/api/schemas/contracts.d.ts.map +1 -0
- package/dist/api/schemas/contracts.js +79 -0
- package/dist/api/schemas/contracts.js.map +1 -0
- package/dist/api/schemas/dao.d.ts +271 -0
- package/dist/api/schemas/dao.d.ts.map +1 -0
- package/dist/api/schemas/dao.js +78 -0
- package/dist/api/schemas/dao.js.map +1 -0
- package/dist/api/schemas/identity.d.ts +75 -0
- package/dist/api/schemas/identity.d.ts.map +1 -0
- package/dist/api/schemas/identity.js +32 -0
- package/dist/api/schemas/identity.js.map +1 -0
- package/dist/api/schemas/markets.d.ts +822 -0
- package/dist/api/schemas/markets.d.ts.map +1 -0
- package/dist/api/schemas/markets.js +246 -0
- package/dist/api/schemas/markets.js.map +1 -0
- package/dist/api/schemas/wallet.d.ts +163 -0
- package/dist/api/schemas/wallet.d.ts.map +1 -0
- package/dist/api/schemas/wallet.js +54 -0
- package/dist/api/schemas/wallet.js.map +1 -0
- package/dist/api/server.d.ts +45 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +131 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/types.d.ts +69 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +196 -0
- package/dist/api/types.js.map +1 -0
- package/dist/daemon.d.ts +11 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +248 -0
- package/dist/daemon.js.map +1 -0
- package/dist/index.d.ts +137 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +795 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/index.d.ts +10 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +7 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/indexer.d.ts +60 -0
- package/dist/indexer/indexer.d.ts.map +1 -0
- package/dist/indexer/indexer.js +408 -0
- package/dist/indexer/indexer.js.map +1 -0
- package/dist/indexer/query.d.ts +141 -0
- package/dist/indexer/query.d.ts.map +1 -0
- package/dist/indexer/query.js +244 -0
- package/dist/indexer/query.js.map +1 -0
- package/dist/indexer/store.d.ts +95 -0
- package/dist/indexer/store.d.ts.map +1 -0
- package/dist/indexer/store.js +250 -0
- package/dist/indexer/store.js.map +1 -0
- package/dist/logger.d.ts +13 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +37 -0
- package/dist/logger.js.map +1 -0
- package/dist/p2p/sync.d.ts +105 -0
- package/dist/p2p/sync.d.ts.map +1 -0
- package/dist/p2p/sync.js +875 -0
- package/dist/p2p/sync.js.map +1 -0
- package/dist/policy/liquidity-policy.d.ts +17 -0
- package/dist/policy/liquidity-policy.d.ts.map +1 -0
- package/dist/policy/liquidity-policy.js +112 -0
- package/dist/policy/liquidity-policy.js.map +1 -0
- package/dist/services/chain-config.d.ts +226 -0
- package/dist/services/chain-config.d.ts.map +1 -0
- package/dist/services/chain-config.js +105 -0
- package/dist/services/chain-config.js.map +1 -0
- package/dist/services/contract-provider.d.ts +44 -0
- package/dist/services/contract-provider.d.ts.map +1 -0
- package/dist/services/contract-provider.js +167 -0
- package/dist/services/contract-provider.js.map +1 -0
- package/dist/services/contracts-service.d.ts +192 -0
- package/dist/services/contracts-service.d.ts.map +1 -0
- package/dist/services/contracts-service.js +336 -0
- package/dist/services/contracts-service.js.map +1 -0
- package/dist/services/dao-service.d.ts +245 -0
- package/dist/services/dao-service.d.ts.map +1 -0
- package/dist/services/dao-service.js +389 -0
- package/dist/services/dao-service.js.map +1 -0
- package/dist/services/identity-service.d.ts +150 -0
- package/dist/services/identity-service.d.ts.map +1 -0
- package/dist/services/identity-service.js +286 -0
- package/dist/services/identity-service.js.map +1 -0
- package/dist/services/index.d.ts +20 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +15 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/reputation-service.d.ts +128 -0
- package/dist/services/reputation-service.d.ts.map +1 -0
- package/dist/services/reputation-service.js +204 -0
- package/dist/services/reputation-service.js.map +1 -0
- package/dist/services/wallet-service.d.ts +201 -0
- package/dist/services/wallet-service.d.ts.map +1 -0
- package/dist/services/wallet-service.js +402 -0
- package/dist/services/wallet-service.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Legacy event-sourced helper functions.
|
|
3
|
+
*
|
|
4
|
+
* These power the fallback path when on-chain services are unavailable.
|
|
5
|
+
* Extracted from the original server.ts monolith.
|
|
6
|
+
*/
|
|
7
|
+
import { didFromPublicKey, listKeyRecords, multibaseDecode, resolveStoragePaths, } from '@claw-network/core';
|
|
8
|
+
import { createWalletState, applyWalletEvent, isMarketType, isListingStatus, isListingVisibility, isTaskType, isInfoType, isContentFormat, isAccessMethodType, isCapabilityType, } from '@claw-network/protocol';
|
|
9
|
+
import { parseCsv, parseBoolean } from './types.js';
|
|
10
|
+
// ─── Event Parsing ──────────────────────────────────────────────
|
|
11
|
+
export function parseEvent(bytes) {
|
|
12
|
+
try {
|
|
13
|
+
if (bytes instanceof Uint8Array) {
|
|
14
|
+
return JSON.parse(new TextDecoder().decode(bytes));
|
|
15
|
+
}
|
|
16
|
+
if (typeof bytes === 'string')
|
|
17
|
+
return JSON.parse(bytes);
|
|
18
|
+
if (bytes && typeof bytes === 'object')
|
|
19
|
+
return bytes;
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function resolveLocalIdentity(dataDir) {
|
|
27
|
+
const paths = resolveStoragePaths(dataDir);
|
|
28
|
+
const records = await listKeyRecords(paths);
|
|
29
|
+
if (!records.length)
|
|
30
|
+
return null;
|
|
31
|
+
const sorted = records
|
|
32
|
+
.map((record) => ({ record, createdAt: Date.parse(record.createdAt ?? '') }))
|
|
33
|
+
.sort((a, b) => {
|
|
34
|
+
const left = Number.isFinite(a.createdAt) ? a.createdAt : Number.MAX_SAFE_INTEGER;
|
|
35
|
+
const right = Number.isFinite(b.createdAt) ? b.createdAt : Number.MAX_SAFE_INTEGER;
|
|
36
|
+
return left - right;
|
|
37
|
+
});
|
|
38
|
+
const primary = sorted[0]?.record;
|
|
39
|
+
if (!primary?.publicKey)
|
|
40
|
+
return null;
|
|
41
|
+
let publicKeyBytes;
|
|
42
|
+
try {
|
|
43
|
+
publicKeyBytes = multibaseDecode(primary.publicKey);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const did = didFromPublicKey(publicKeyBytes);
|
|
49
|
+
const created = Number.isFinite(sorted[0]?.createdAt ?? NaN)
|
|
50
|
+
? sorted[0]?.createdAt
|
|
51
|
+
: Date.now();
|
|
52
|
+
return { did, publicKey: primary.publicKey, created, updated: created, platformLinks: [], capabilities: [] };
|
|
53
|
+
}
|
|
54
|
+
export async function buildIdentityView(eventStore, did) {
|
|
55
|
+
let publicKey = null;
|
|
56
|
+
let createdAt = null;
|
|
57
|
+
let updatedAt = null;
|
|
58
|
+
const platformLinks = [];
|
|
59
|
+
const capabilities = [];
|
|
60
|
+
let cursor = null;
|
|
61
|
+
for (;;) {
|
|
62
|
+
const { events, cursor: next } = await eventStore.getEventLogRange(cursor, 200);
|
|
63
|
+
if (!events.length)
|
|
64
|
+
break;
|
|
65
|
+
for (const bytes of events) {
|
|
66
|
+
const envelope = parseEvent(bytes);
|
|
67
|
+
if (!envelope)
|
|
68
|
+
continue;
|
|
69
|
+
const type = envelope.type;
|
|
70
|
+
const payload = envelope.payload;
|
|
71
|
+
if (!payload)
|
|
72
|
+
continue;
|
|
73
|
+
const payloadDid = payload.did;
|
|
74
|
+
const ts = typeof envelope.ts === 'number' ? envelope.ts : Date.now();
|
|
75
|
+
if (type === 'identity.create' && payloadDid === did) {
|
|
76
|
+
publicKey = payload.publicKey ?? publicKey;
|
|
77
|
+
if (createdAt === null)
|
|
78
|
+
createdAt = ts;
|
|
79
|
+
updatedAt = ts;
|
|
80
|
+
}
|
|
81
|
+
else if (type === 'identity.update' && payloadDid === did) {
|
|
82
|
+
updatedAt = ts;
|
|
83
|
+
}
|
|
84
|
+
else if (type === 'identity.platform.link' && payloadDid === did) {
|
|
85
|
+
const platform = payload.platformId;
|
|
86
|
+
const handle = payload.platformUsername;
|
|
87
|
+
if (platform && handle) {
|
|
88
|
+
platformLinks.push({ platform, handle, verified: false, verifiedAt: ts });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if (type === 'identity.capability.register' && payloadDid === did) {
|
|
92
|
+
const name = payload.name;
|
|
93
|
+
const pricing = payload.pricing;
|
|
94
|
+
if (name && pricing) {
|
|
95
|
+
const cap = {
|
|
96
|
+
id: typeof envelope.hash === 'string' ? envelope.hash : `cap-${ts}`,
|
|
97
|
+
name, pricing, verified: false, registeredAt: ts,
|
|
98
|
+
};
|
|
99
|
+
if (payload.description)
|
|
100
|
+
cap.description = payload.description;
|
|
101
|
+
capabilities.push(cap);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (!next)
|
|
106
|
+
break;
|
|
107
|
+
cursor = next;
|
|
108
|
+
}
|
|
109
|
+
if (!publicKey)
|
|
110
|
+
return null;
|
|
111
|
+
const created = createdAt ?? updatedAt ?? Date.now();
|
|
112
|
+
return { did, publicKey, created, updated: updatedAt ?? created, platformLinks, capabilities };
|
|
113
|
+
}
|
|
114
|
+
export async function buildIdentityCapabilities(eventStore, did) {
|
|
115
|
+
const capabilities = [];
|
|
116
|
+
let cursor = null;
|
|
117
|
+
for (;;) {
|
|
118
|
+
const { events, cursor: next } = await eventStore.getEventLogRange(cursor, 200);
|
|
119
|
+
if (!events.length)
|
|
120
|
+
break;
|
|
121
|
+
for (const bytes of events) {
|
|
122
|
+
const envelope = parseEvent(bytes);
|
|
123
|
+
if (!envelope || envelope.type !== 'identity.capability.register')
|
|
124
|
+
continue;
|
|
125
|
+
const payload = envelope.payload;
|
|
126
|
+
if (!payload)
|
|
127
|
+
continue;
|
|
128
|
+
if (did && payload.did !== did)
|
|
129
|
+
continue;
|
|
130
|
+
const name = payload.name;
|
|
131
|
+
const pricing = payload.pricing;
|
|
132
|
+
if (!name || !pricing)
|
|
133
|
+
continue;
|
|
134
|
+
const ts = typeof envelope.ts === 'number' ? envelope.ts : Date.now();
|
|
135
|
+
const cap = {
|
|
136
|
+
id: typeof envelope.hash === 'string' ? envelope.hash : `cap-${ts}`,
|
|
137
|
+
name, pricing, verified: false, registeredAt: ts,
|
|
138
|
+
};
|
|
139
|
+
if (payload.description)
|
|
140
|
+
cap.description = payload.description;
|
|
141
|
+
capabilities.push(cap);
|
|
142
|
+
}
|
|
143
|
+
if (!next)
|
|
144
|
+
break;
|
|
145
|
+
cursor = next;
|
|
146
|
+
}
|
|
147
|
+
return capabilities;
|
|
148
|
+
}
|
|
149
|
+
// ─── Wallet State Builder ───────────────────────────────────────
|
|
150
|
+
export async function buildWalletState(eventStore) {
|
|
151
|
+
let state = createWalletState();
|
|
152
|
+
let cursor = null;
|
|
153
|
+
for (;;) {
|
|
154
|
+
const { events, cursor: next } = await eventStore.getEventLogRange(cursor, 200);
|
|
155
|
+
if (!events.length)
|
|
156
|
+
break;
|
|
157
|
+
for (const bytes of events) {
|
|
158
|
+
const envelope = parseEvent(bytes);
|
|
159
|
+
if (envelope) {
|
|
160
|
+
try {
|
|
161
|
+
state = applyWalletEvent(state, envelope);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Skip events that fail during state reconstruction (e.g. out-of-order funds)
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (!next)
|
|
169
|
+
break;
|
|
170
|
+
cursor = next;
|
|
171
|
+
}
|
|
172
|
+
return state;
|
|
173
|
+
}
|
|
174
|
+
// ─── Market Search Query Parser ─────────────────────────────────
|
|
175
|
+
function safeParsePagination(value, fallback, max) {
|
|
176
|
+
if (!value)
|
|
177
|
+
return fallback;
|
|
178
|
+
const parsed = Number.parseInt(value, 10);
|
|
179
|
+
if (Number.isNaN(parsed) || parsed < 0)
|
|
180
|
+
return fallback;
|
|
181
|
+
return Math.min(parsed, max);
|
|
182
|
+
}
|
|
183
|
+
function parseTokenParam(value, field) {
|
|
184
|
+
if (!value)
|
|
185
|
+
return undefined;
|
|
186
|
+
const trimmed = value.trim();
|
|
187
|
+
if (!/^[0-9]+$/.test(trimmed))
|
|
188
|
+
throw new Error(`${field} must be an integer token amount`);
|
|
189
|
+
return trimmed;
|
|
190
|
+
}
|
|
191
|
+
function parseNumberParam(value, field) {
|
|
192
|
+
if (!value)
|
|
193
|
+
return undefined;
|
|
194
|
+
const parsed = Number(value);
|
|
195
|
+
if (!Number.isFinite(parsed))
|
|
196
|
+
throw new Error(`${field} must be a number`);
|
|
197
|
+
return parsed;
|
|
198
|
+
}
|
|
199
|
+
export function parseMarketSearchQuery(params) {
|
|
200
|
+
const markets = parseCsv(params.get('markets'));
|
|
201
|
+
const tags = parseCsv(params.get('tags'));
|
|
202
|
+
const skills = parseCsv(params.get('skills'));
|
|
203
|
+
const taskTypes = parseCsv(params.get('taskTypes') ?? params.get('taskType'));
|
|
204
|
+
const infoTypes = parseCsv(params.get('infoTypes') ?? params.get('infoType'));
|
|
205
|
+
const contentFormats = parseCsv(params.get('contentFormats') ?? params.get('contentFormat'));
|
|
206
|
+
const accessMethods = parseCsv(params.get('accessMethods') ?? params.get('accessMethod'));
|
|
207
|
+
const capabilityTypeParam = params.get('capabilityType');
|
|
208
|
+
const statuses = parseCsv(params.get('statuses') ?? params.get('status'));
|
|
209
|
+
const visibility = parseCsv(params.get('visibility'));
|
|
210
|
+
const marketTypes = markets?.map((e) => {
|
|
211
|
+
if (!isMarketType(e))
|
|
212
|
+
throw new Error(`unknown market type: ${e}`);
|
|
213
|
+
return e;
|
|
214
|
+
});
|
|
215
|
+
const listingStatuses = statuses?.map((e) => {
|
|
216
|
+
if (!isListingStatus(e))
|
|
217
|
+
throw new Error(`unknown listing status: ${e}`);
|
|
218
|
+
return e;
|
|
219
|
+
});
|
|
220
|
+
const listingVisibility = visibility?.map((e) => {
|
|
221
|
+
if (!isListingVisibility(e))
|
|
222
|
+
throw new Error(`unknown visibility: ${e}`);
|
|
223
|
+
return e;
|
|
224
|
+
});
|
|
225
|
+
const taskTypeValues = taskTypes?.map((e) => {
|
|
226
|
+
if (!isTaskType(e))
|
|
227
|
+
throw new Error(`unknown task type: ${e}`);
|
|
228
|
+
return e;
|
|
229
|
+
});
|
|
230
|
+
const infoTypeValues = infoTypes?.map((e) => {
|
|
231
|
+
if (!isInfoType(e))
|
|
232
|
+
throw new Error(`unknown info type: ${e}`);
|
|
233
|
+
return e;
|
|
234
|
+
});
|
|
235
|
+
const contentFormatValues = contentFormats?.map((e) => {
|
|
236
|
+
if (!isContentFormat(e))
|
|
237
|
+
throw new Error(`unknown content format: ${e}`);
|
|
238
|
+
return e;
|
|
239
|
+
});
|
|
240
|
+
const accessMethodValues = accessMethods?.map((e) => {
|
|
241
|
+
if (!isAccessMethodType(e))
|
|
242
|
+
throw new Error(`unknown access method: ${e}`);
|
|
243
|
+
return e;
|
|
244
|
+
});
|
|
245
|
+
let capabilityType;
|
|
246
|
+
if (capabilityTypeParam) {
|
|
247
|
+
if (!isCapabilityType(capabilityTypeParam))
|
|
248
|
+
throw new Error(`unknown capability type: ${capabilityTypeParam}`);
|
|
249
|
+
capabilityType = capabilityTypeParam;
|
|
250
|
+
}
|
|
251
|
+
const page = safeParsePagination(params.get('page'), 1, 1_000_000);
|
|
252
|
+
const pageSize = safeParsePagination(params.get('pageSize') ?? params.get('per_page'), 20, 1000);
|
|
253
|
+
const includeFacets = parseBoolean(params.get('includeFacets'));
|
|
254
|
+
const minPrice = parseTokenParam(params.get('minPrice') ?? params.get('priceMin'), 'minPrice');
|
|
255
|
+
const maxPrice = parseTokenParam(params.get('maxPrice') ?? params.get('priceMax'), 'maxPrice');
|
|
256
|
+
const minReputation = parseNumberParam(params.get('minReputation'), 'minReputation');
|
|
257
|
+
const minRating = parseNumberParam(params.get('minRating'), 'minRating');
|
|
258
|
+
const sort = params.get('sort') ?? undefined;
|
|
259
|
+
return {
|
|
260
|
+
keyword: params.get('keyword') ?? undefined,
|
|
261
|
+
markets: marketTypes,
|
|
262
|
+
category: params.get('category') ?? undefined,
|
|
263
|
+
tags,
|
|
264
|
+
priceRange: minPrice || maxPrice ? { min: minPrice, max: maxPrice } : undefined,
|
|
265
|
+
minReputation,
|
|
266
|
+
minRating,
|
|
267
|
+
skills,
|
|
268
|
+
taskTypes: taskTypeValues,
|
|
269
|
+
capabilityType,
|
|
270
|
+
infoTypes: infoTypeValues,
|
|
271
|
+
contentFormats: contentFormatValues,
|
|
272
|
+
accessMethods: accessMethodValues,
|
|
273
|
+
sort: sort,
|
|
274
|
+
page,
|
|
275
|
+
pageSize,
|
|
276
|
+
includeFacets,
|
|
277
|
+
statuses: listingStatuses,
|
|
278
|
+
visibility: listingVisibility,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=legacy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../src/api/legacy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP middleware: CORS, error boundary, request logging.
|
|
3
|
+
*/
|
|
4
|
+
import type { Middleware } from './router.js';
|
|
5
|
+
export interface CorsOptions {
|
|
6
|
+
/** Allowed origins. `['*']` (default) permits all origins. */
|
|
7
|
+
origins?: string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Create a CORS middleware.
|
|
11
|
+
*
|
|
12
|
+
* By default, allows all origins (`*`). Pass specific origins for
|
|
13
|
+
* production deployments to restrict cross-origin access.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createCors(options?: CorsOptions): Middleware;
|
|
16
|
+
/** Backward-compatible constant — permissive CORS for development. */
|
|
17
|
+
export declare const cors: Middleware;
|
|
18
|
+
export interface ErrorBoundaryOptions {
|
|
19
|
+
/**
|
|
20
|
+
* When true, error details are hidden from clients (returns generic
|
|
21
|
+
* "Internal Server Error"). Recommended for mainnet / production.
|
|
22
|
+
*/
|
|
23
|
+
hideDetails?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create an error-boundary middleware.
|
|
27
|
+
*
|
|
28
|
+
* @param options.hideDetails — suppress `err.message` in the response.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createErrorBoundary(options?: ErrorBoundaryOptions): Middleware;
|
|
31
|
+
/** Backward-compatible constant — exposes error details (dev only). */
|
|
32
|
+
export declare const errorBoundary: Middleware;
|
|
33
|
+
/** Optional request logging middleware. */
|
|
34
|
+
export declare function requestLogger(log: (msg: string) => void): Middleware;
|
|
35
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/api/middleware.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAO9C,MAAM,WAAW,WAAW;IAC1B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,CA8B5D;AAED,sEAAsE;AACtE,eAAO,MAAM,IAAI,EAAE,UAAyB,CAAC;AAM7C,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,UAAU,CAgB9E;AAED,uEAAuE;AACvE,eAAO,MAAM,aAAa,EAAE,UAAkC,CAAC;AAE/D,2CAA2C;AAC3C,wBAAgB,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,UAAU,CAOpE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP middleware: CORS, error boundary, request logging.
|
|
3
|
+
*/
|
|
4
|
+
import { internalError } from './response.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create a CORS middleware.
|
|
7
|
+
*
|
|
8
|
+
* By default, allows all origins (`*`). Pass specific origins for
|
|
9
|
+
* production deployments to restrict cross-origin access.
|
|
10
|
+
*/
|
|
11
|
+
export function createCors(options) {
|
|
12
|
+
const allowed = options?.origins ?? ['*'];
|
|
13
|
+
const allowAll = allowed.includes('*');
|
|
14
|
+
return async (req, res, next) => {
|
|
15
|
+
const origin = req.headers.origin ?? '';
|
|
16
|
+
if (allowAll) {
|
|
17
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
18
|
+
}
|
|
19
|
+
else if (origin && allowed.includes(origin)) {
|
|
20
|
+
res.setHeader('Access-Control-Allow-Origin', origin);
|
|
21
|
+
res.setHeader('Vary', 'Origin');
|
|
22
|
+
}
|
|
23
|
+
else if (origin) {
|
|
24
|
+
// Origin not in allow-list — still send headers but without Allow-Origin
|
|
25
|
+
// so the browser blocks the response.
|
|
26
|
+
res.setHeader('Vary', 'Origin');
|
|
27
|
+
}
|
|
28
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS');
|
|
29
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Api-Key');
|
|
30
|
+
res.setHeader('Access-Control-Max-Age', '86400');
|
|
31
|
+
if (req.method === 'OPTIONS') {
|
|
32
|
+
res.writeHead(204);
|
|
33
|
+
res.end();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
await next();
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Backward-compatible constant — permissive CORS for development. */
|
|
40
|
+
export const cors = createCors();
|
|
41
|
+
/**
|
|
42
|
+
* Create an error-boundary middleware.
|
|
43
|
+
*
|
|
44
|
+
* @param options.hideDetails — suppress `err.message` in the response.
|
|
45
|
+
*/
|
|
46
|
+
export function createErrorBoundary(options) {
|
|
47
|
+
const hide = options?.hideDetails ?? false;
|
|
48
|
+
return async (_req, res, next) => {
|
|
49
|
+
try {
|
|
50
|
+
await next();
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
const message = hide
|
|
54
|
+
? 'An unexpected error occurred'
|
|
55
|
+
: err instanceof Error
|
|
56
|
+
? err.message
|
|
57
|
+
: 'Unknown error';
|
|
58
|
+
if (!res.headersSent) {
|
|
59
|
+
internalError(res, message);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** Backward-compatible constant — exposes error details (dev only). */
|
|
65
|
+
export const errorBoundary = createErrorBoundary();
|
|
66
|
+
/** Optional request logging middleware. */
|
|
67
|
+
export function requestLogger(log) {
|
|
68
|
+
return async (req, res, next) => {
|
|
69
|
+
const start = Date.now();
|
|
70
|
+
await next();
|
|
71
|
+
const ms = Date.now() - start;
|
|
72
|
+
log(`${req.method} ${req.url} ${res.statusCode} ${ms}ms`);
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/api/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standardized HTTP response helpers.
|
|
3
|
+
*
|
|
4
|
+
* All 2xx responses use the envelope: { data, meta?, links? }
|
|
5
|
+
* All errors use RFC 7807 Problem Details: { type, title, status, detail, instance }
|
|
6
|
+
*/
|
|
7
|
+
import type { ServerResponse } from 'node:http';
|
|
8
|
+
export interface PaginationMeta {
|
|
9
|
+
page: number;
|
|
10
|
+
perPage: number;
|
|
11
|
+
total: number;
|
|
12
|
+
totalPages: number;
|
|
13
|
+
}
|
|
14
|
+
export interface Links {
|
|
15
|
+
self: string;
|
|
16
|
+
next?: string | null;
|
|
17
|
+
prev?: string | null;
|
|
18
|
+
first?: string | null;
|
|
19
|
+
last?: string | null;
|
|
20
|
+
[key: string]: string | null | undefined;
|
|
21
|
+
}
|
|
22
|
+
export interface SingleResponse<T> {
|
|
23
|
+
data: T;
|
|
24
|
+
links?: Links;
|
|
25
|
+
}
|
|
26
|
+
export interface CollectionResponse<T> {
|
|
27
|
+
data: T[];
|
|
28
|
+
meta: {
|
|
29
|
+
pagination: PaginationMeta;
|
|
30
|
+
};
|
|
31
|
+
links: Links;
|
|
32
|
+
}
|
|
33
|
+
export interface ProblemDetail {
|
|
34
|
+
type: string;
|
|
35
|
+
title: string;
|
|
36
|
+
status: number;
|
|
37
|
+
detail?: string;
|
|
38
|
+
instance?: string;
|
|
39
|
+
}
|
|
40
|
+
export declare const ErrorTypes: {
|
|
41
|
+
readonly VALIDATION: "https://clawnet.dev/errors/validation-error";
|
|
42
|
+
readonly UNAUTHORIZED: "https://clawnet.dev/errors/unauthorized";
|
|
43
|
+
readonly FORBIDDEN: "https://clawnet.dev/errors/forbidden";
|
|
44
|
+
readonly TOO_MANY_REQUESTS: "https://clawnet.dev/errors/too-many-requests";
|
|
45
|
+
readonly NOT_FOUND: "https://clawnet.dev/errors/not-found";
|
|
46
|
+
readonly CONFLICT: "https://clawnet.dev/errors/conflict";
|
|
47
|
+
readonly UNPROCESSABLE: "https://clawnet.dev/errors/unprocessable-entity";
|
|
48
|
+
readonly INTERNAL: "https://clawnet.dev/errors/internal-error";
|
|
49
|
+
readonly METHOD_NOT_ALLOWED: "https://clawnet.dev/errors/method-not-allowed";
|
|
50
|
+
};
|
|
51
|
+
/** 200 OK — single resource */
|
|
52
|
+
export declare function ok<T>(res: ServerResponse, data: T, links?: Links): void;
|
|
53
|
+
/** 201 Created — resource just created */
|
|
54
|
+
export declare function created<T>(res: ServerResponse, data: T, links?: Links): void;
|
|
55
|
+
/** 204 No Content — successful action with no body (e.g. DELETE) */
|
|
56
|
+
export declare function noContent(res: ServerResponse): void;
|
|
57
|
+
/** 200 OK — paginated collection */
|
|
58
|
+
export declare function paginated<T>(res: ServerResponse, data: T[], opts: {
|
|
59
|
+
page: number;
|
|
60
|
+
perPage: number;
|
|
61
|
+
total: number;
|
|
62
|
+
basePath: string;
|
|
63
|
+
query?: Record<string, string>;
|
|
64
|
+
}): void;
|
|
65
|
+
export declare function problem(res: ServerResponse, p: ProblemDetail): void;
|
|
66
|
+
export declare function badRequest(res: ServerResponse, detail: string, instance?: string): void;
|
|
67
|
+
export declare function unauthorized(res: ServerResponse, detail?: string, instance?: string): void;
|
|
68
|
+
export declare function forbidden(res: ServerResponse, detail?: string, instance?: string): void;
|
|
69
|
+
export declare function tooManyRequests(res: ServerResponse, detail?: string, instance?: string, retryAfterSeconds?: number): void;
|
|
70
|
+
export declare function notFound(res: ServerResponse, detail?: string, instance?: string): void;
|
|
71
|
+
export declare function conflict(res: ServerResponse, detail: string, instance?: string): void;
|
|
72
|
+
export declare function unprocessable(res: ServerResponse, detail: string, instance?: string): void;
|
|
73
|
+
export declare function methodNotAllowed(res: ServerResponse, allowed: string[], instance?: string): void;
|
|
74
|
+
export declare function internalError(res: ServerResponse, detail?: string, instance?: string): void;
|
|
75
|
+
export interface PaginationParams {
|
|
76
|
+
page: number;
|
|
77
|
+
perPage: number;
|
|
78
|
+
offset: number;
|
|
79
|
+
}
|
|
80
|
+
export declare function parsePagination(searchParams: URLSearchParams): PaginationParams;
|
|
81
|
+
export declare function parseSort(searchParams: URLSearchParams): {
|
|
82
|
+
field: string;
|
|
83
|
+
order: 'asc' | 'desc';
|
|
84
|
+
} | undefined;
|
|
85
|
+
//# sourceMappingURL=response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/api/response.ts"],"names":[],"mappings":"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"}
|