@futdevpro/nts-dynamo 1.15.358 → 1.15.362
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/build/_collections/email-account.util.d.ts +70 -0
- package/build/_collections/email-account.util.d.ts.map +1 -0
- package/build/_collections/email-account.util.js +113 -0
- package/build/_collections/email-account.util.js.map +1 -0
- package/build/_modules/git-sync/_models/git-sync.interface.d.ts +94 -0
- package/build/_modules/git-sync/_models/git-sync.interface.d.ts.map +1 -0
- package/build/_modules/git-sync/_models/git-sync.interface.js +3 -0
- package/build/_modules/git-sync/_models/git-sync.interface.js.map +1 -0
- package/build/_modules/git-sync/git-sync-input.util.d.ts +28 -0
- package/build/_modules/git-sync/git-sync-input.util.d.ts.map +1 -0
- package/build/_modules/git-sync/git-sync-input.util.js +146 -0
- package/build/_modules/git-sync/git-sync-input.util.js.map +1 -0
- package/build/_modules/git-sync/git-sync.service.d.ts +54 -0
- package/build/_modules/git-sync/git-sync.service.d.ts.map +1 -0
- package/build/_modules/git-sync/git-sync.service.js +274 -0
- package/build/_modules/git-sync/git-sync.service.js.map +1 -0
- package/build/_modules/git-sync/index.d.ts +8 -0
- package/build/_modules/git-sync/index.d.ts.map +1 -0
- package/build/_modules/git-sync/index.js +11 -0
- package/build/_modules/git-sync/index.js.map +1 -0
- package/build/_modules/imap/_models/imap-mailbox-status.interface.d.ts +10 -0
- package/build/_modules/imap/_models/imap-mailbox-status.interface.d.ts.map +1 -0
- package/build/_modules/imap/_models/imap-mailbox-status.interface.js +3 -0
- package/build/_modules/imap/_models/imap-mailbox-status.interface.js.map +1 -0
- package/build/_modules/imap/_models/imap-message-meta.interface.d.ts +18 -0
- package/build/_modules/imap/_models/imap-message-meta.interface.d.ts.map +1 -0
- package/build/_modules/imap/_models/imap-message-meta.interface.js +3 -0
- package/build/_modules/imap/_models/imap-message-meta.interface.js.map +1 -0
- package/build/_modules/imap/_models/imap-sync.interface.d.ts +22 -0
- package/build/_modules/imap/_models/imap-sync.interface.d.ts.map +1 -0
- package/build/_modules/imap/_models/imap-sync.interface.js +3 -0
- package/build/_modules/imap/_models/imap-sync.interface.js.map +1 -0
- package/build/_modules/imap/_models/imap-transport.interface.d.ts +16 -0
- package/build/_modules/imap/_models/imap-transport.interface.d.ts.map +1 -0
- package/build/_modules/imap/_models/imap-transport.interface.js +3 -0
- package/build/_modules/imap/_models/imap-transport.interface.js.map +1 -0
- package/build/_modules/imap/imap-flow.transport.d.ts +58 -0
- package/build/_modules/imap/imap-flow.transport.d.ts.map +1 -0
- package/build/_modules/imap/imap-flow.transport.js +156 -0
- package/build/_modules/imap/imap-flow.transport.js.map +1 -0
- package/build/_modules/imap/imap-inbox.service.d.ts +36 -0
- package/build/_modules/imap/imap-inbox.service.d.ts.map +1 -0
- package/build/_modules/imap/imap-inbox.service.js +81 -0
- package/build/_modules/imap/imap-inbox.service.js.map +1 -0
- package/build/_modules/imap/index.d.ts +11 -0
- package/build/_modules/imap/index.d.ts.map +1 -0
- package/build/_modules/imap/index.js +14 -0
- package/build/_modules/imap/index.js.map +1 -0
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/package.json +26 -3
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyNTS_GitSync_Service = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
|
|
8
|
+
const global_settings_const_1 = require("../../_collections/global-settings.const");
|
|
9
|
+
const secret_redaction_util_1 = require("../../_collections/secret-redaction.util");
|
|
10
|
+
const git_sync_input_util_1 = require("./git-sync-input.util");
|
|
11
|
+
/** Config applied to EVERY git command: byte-exact content, no prompt, no host credential helper. */
|
|
12
|
+
const BASE_CONFIG = [
|
|
13
|
+
'-c', 'core.autocrlf=false', '-c', 'core.safecrlf=false', '-c', 'credential.helper=',
|
|
14
|
+
];
|
|
15
|
+
/** One rejected push is retried (the remote moved between fetch and push); more means contention — report it. */
|
|
16
|
+
const MAX_ATTEMPTS = 2;
|
|
17
|
+
/**
|
|
18
|
+
* BFR-OLDLIGHTSITE-003 — synchronises a caller-built file set into a git repository as ONE commit, pushed.
|
|
19
|
+
*
|
|
20
|
+
* @description Per call: clone (first use) or fetch → force-reset the owned workdir to the remote branch → write the
|
|
21
|
+
* files byte-exact → remove tracked files the caller no longer lists under its `prune` directories → ONE commit →
|
|
22
|
+
* push (fast-forward only: a push is never forced). Nothing changed → no commit (`unchanged`). The remote moved
|
|
23
|
+
* between fetch and push → the whole step runs once more on the new head.
|
|
24
|
+
*
|
|
25
|
+
* The token (`<credentialRef>_TOKEN`, FDP Keystore) reaches git ONLY as an environment-scoped `http.extraHeader`
|
|
26
|
+
* (`GIT_CONFIG_*`): never in an argument (visible in the process list), never in the URL, never in `.git/config`.
|
|
27
|
+
* Every error text is redacted — the token literal included.
|
|
28
|
+
*/
|
|
29
|
+
class DyNTS_GitSync_Service {
|
|
30
|
+
settings;
|
|
31
|
+
runner;
|
|
32
|
+
timeoutMs;
|
|
33
|
+
/** The calls of this instance run one after another — they share one workdir. */
|
|
34
|
+
queue = Promise.resolve();
|
|
35
|
+
/** Validates the settings (a 400 on a configuration error); the token is only read when `sync` runs. */
|
|
36
|
+
constructor(settings) {
|
|
37
|
+
const problems = git_sync_input_util_1.DyNTS_GitSyncInput_Util.settingsProblems(settings);
|
|
38
|
+
if (problems.length) {
|
|
39
|
+
throw new fsm_dynamo_1.DyFM_Error({
|
|
40
|
+
status: 400,
|
|
41
|
+
errorCode: `${global_settings_const_1.DyNTS_global_settings.systemShortCodeName}|DyNTS-GITSYNC-CF0`,
|
|
42
|
+
message: `GitSync settings rejected: ${problems.join('; ')}`,
|
|
43
|
+
userMessage: 'The repository synchronisation is misconfigured.',
|
|
44
|
+
additionalContent: { problems: problems },
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
this.settings = { ...settings, repoUrl: settings.repoUrl.trim(), workdir: (0, path_1.resolve)(settings.workdir) };
|
|
48
|
+
this.runner = settings.runner ?? DyNTS_GitSync_Service.defaultRunner;
|
|
49
|
+
this.timeoutMs = Math.max(1000, settings.timeoutMs ?? 120000);
|
|
50
|
+
}
|
|
51
|
+
/** The default runner: the `git` binary, no shell, bounded time and output. */
|
|
52
|
+
static defaultRunner = (args, options) => (new Promise((done) => {
|
|
53
|
+
(0, child_process_1.execFile)('git', args, {
|
|
54
|
+
cwd: options.cwd, env: options.env, timeout: options.timeoutMs, maxBuffer: 64 * 1024 * 1024, windowsHide: true,
|
|
55
|
+
}, (error, stdout, stderr) => {
|
|
56
|
+
const code = error ? Reflect.get(error, 'code') : 0;
|
|
57
|
+
done({
|
|
58
|
+
exitCode: typeof code === 'number' ? code : error ? -1 : 0,
|
|
59
|
+
stdout: String(stdout ?? ''),
|
|
60
|
+
stderr: String(stderr ?? '') || (error ? error.message : ''),
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}));
|
|
64
|
+
/**
|
|
65
|
+
* One synchronisation step — see the class description. Concurrent calls on the same instance are queued (one
|
|
66
|
+
* workdir); ⚠️ two INSTANCES or processes must not share a workdir.
|
|
67
|
+
*/
|
|
68
|
+
async sync(request) {
|
|
69
|
+
const run = this.queue.then(() => this.syncNow(request));
|
|
70
|
+
this.queue = run.catch(() => undefined);
|
|
71
|
+
try {
|
|
72
|
+
return await run;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error instanceof fsm_dynamo_1.DyFM_Error) {
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
// a filesystem failure (permission, disk full, a file where a directory is needed) — rich and redacted
|
|
79
|
+
throw new fsm_dynamo_1.DyFM_Error({
|
|
80
|
+
status: 500,
|
|
81
|
+
errorCode: `${global_settings_const_1.DyNTS_global_settings.systemShortCodeName}|DyNTS-GITSYNC-FS0`,
|
|
82
|
+
message: `GitSync failed in ${this.settings.workdir}: `
|
|
83
|
+
+ this.redact(fsm_dynamo_1.DyFM_Error.getErrorMessage(error)),
|
|
84
|
+
userMessage: 'The repository synchronisation failed. Please try again later.',
|
|
85
|
+
error: secret_redaction_util_1.DyNTS_SecretRedaction_Util.redactErrorForLog(error),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async syncNow(request) {
|
|
90
|
+
const plan = git_sync_input_util_1.DyNTS_GitSyncInput_Util.plan(request);
|
|
91
|
+
const env = this.gitEnv(git_sync_input_util_1.DyNTS_GitSyncInput_Util.resolveCredential(this.settings));
|
|
92
|
+
const log = [];
|
|
93
|
+
const started = Date.now();
|
|
94
|
+
for (let attempt = 1;; attempt++) {
|
|
95
|
+
await this.prepareWorkdir(env, log);
|
|
96
|
+
await this.writeFiles(plan.files);
|
|
97
|
+
const removedFiles = await this.pruneFiles(plan, env, log);
|
|
98
|
+
const paths = [
|
|
99
|
+
...plan.files.map((file) => file.path), ...removedFiles,
|
|
100
|
+
];
|
|
101
|
+
if (paths.length) {
|
|
102
|
+
await this.git('stage', ['add', '--all', '--', ...paths], env, log);
|
|
103
|
+
}
|
|
104
|
+
const changes = this.parseNameStatus((await this.git('diff', ['diff', '--cached', '--no-renames', '--name-status', '-z'], env, log)).stdout);
|
|
105
|
+
if (!changes.changed.length && !changes.removed.length) {
|
|
106
|
+
return {
|
|
107
|
+
status: 'unchanged', commit: await this.head(env, log), changedFiles: [], removedFiles: [],
|
|
108
|
+
attempts: attempt, durationMs: Date.now() - started, log: log,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
await this.git('commit', [
|
|
112
|
+
'-c', `user.name=${this.settings.author.name}`, '-c', `user.email=${this.settings.author.email}`,
|
|
113
|
+
'commit', '--quiet', '-m', plan.message,
|
|
114
|
+
], env, log);
|
|
115
|
+
const push = await this.git('push', ['push', '--porcelain', 'origin', `HEAD:refs/heads/${this.settings.branch}`], env, log, true);
|
|
116
|
+
if (!push.exitCode) {
|
|
117
|
+
return {
|
|
118
|
+
status: 'pushed', commit: await this.head(env, log), changedFiles: changes.changed,
|
|
119
|
+
removedFiles: changes.removed, attempts: attempt, durationMs: Date.now() - started, log: log,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const rejected = /rejected|non-fast-forward|fetch first|stale info/i.test(push.stdout + push.stderr);
|
|
123
|
+
if (!rejected || attempt >= MAX_ATTEMPTS) {
|
|
124
|
+
throw this.failure('push', push, log, rejected ? 409 : 502);
|
|
125
|
+
}
|
|
126
|
+
fsm_dynamo_1.DyFM_Log.warn(`[DyNTS GitSync] the remote branch ${this.settings.branch} moved during the sync — retrying once`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** Clone on first use; otherwise verify the clone's origin, fetch and force-reset to the remote branch. */
|
|
130
|
+
async prepareWorkdir(env, log) {
|
|
131
|
+
const workdir = this.settings.workdir;
|
|
132
|
+
const entries = (0, fs_1.existsSync)(workdir) ? await fs_1.promises.readdir(workdir) : [];
|
|
133
|
+
if (!entries.length) {
|
|
134
|
+
await fs_1.promises.mkdir((0, path_1.dirname)(workdir), { recursive: true });
|
|
135
|
+
await this.git('clone', [
|
|
136
|
+
'clone', '--quiet', '--no-tags', '--single-branch', '--branch', this.settings.branch, '--',
|
|
137
|
+
this.settings.repoUrl, workdir,
|
|
138
|
+
], env, log, false, (0, path_1.dirname)(workdir));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (!entries.includes('.git')) {
|
|
142
|
+
throw this.refusal(`the workdir ${workdir} exists, is not empty and is not a git clone — refusing to touch it`, log);
|
|
143
|
+
}
|
|
144
|
+
const origin = (await this.git('origin', ['remote', 'get-url', 'origin'], env, log)).stdout.trim();
|
|
145
|
+
if (origin.replace(/\/+$/, '') !== this.settings.repoUrl.replace(/\/+$/, '')) {
|
|
146
|
+
throw this.refusal(`the workdir ${workdir} is a clone of a DIFFERENT repository — refusing to touch it`, log);
|
|
147
|
+
}
|
|
148
|
+
const remoteRef = `refs/remotes/origin/${this.settings.branch}`;
|
|
149
|
+
await this.git('fetch', [
|
|
150
|
+
'fetch', '--quiet', '--no-tags', 'origin', `+refs/heads/${this.settings.branch}:${remoteRef}`,
|
|
151
|
+
], env, log);
|
|
152
|
+
await this.git('reset', ['checkout', '--quiet', '--force', '-B', this.settings.branch, remoteRef], env, log);
|
|
153
|
+
}
|
|
154
|
+
/** Writes every file byte-exact; a symbolic link on the way is refused (it could point outside the workdir). */
|
|
155
|
+
async writeFiles(files) {
|
|
156
|
+
for (const file of files) {
|
|
157
|
+
const target = this.inside(file.path);
|
|
158
|
+
await this.assertNoLink(file.path);
|
|
159
|
+
await fs_1.promises.mkdir((0, path_1.dirname)(target), { recursive: true });
|
|
160
|
+
await fs_1.promises.writeFile(target, file.content, 'utf8');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/** Removes the tracked files under the prune directories that the caller no longer lists. */
|
|
164
|
+
async pruneFiles(plan, env, log) {
|
|
165
|
+
if (!plan.prune.length) {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
const wanted = new Set(plan.files.map((file) => file.path));
|
|
169
|
+
const tracked = (await this.git('list', ['ls-files', '-z', '--', ...plan.prune.map((dir) => `${dir}/`)], env, log)).stdout.split('\0').filter((path) => !!path);
|
|
170
|
+
const removed = tracked.filter((path) => !wanted.has(path)).sort();
|
|
171
|
+
for (const path of removed) {
|
|
172
|
+
await fs_1.promises.rm(this.inside(path), { force: true });
|
|
173
|
+
}
|
|
174
|
+
return removed;
|
|
175
|
+
}
|
|
176
|
+
/** The absolute path of a repository-relative one — and a last check that it stays inside the workdir. */
|
|
177
|
+
inside(path) {
|
|
178
|
+
const target = (0, path_1.join)(this.settings.workdir, ...path.split('/'));
|
|
179
|
+
if (!target.startsWith(this.settings.workdir + path_1.sep)) {
|
|
180
|
+
throw this.refusal(`${path} resolves outside the workdir`, []);
|
|
181
|
+
}
|
|
182
|
+
return target;
|
|
183
|
+
}
|
|
184
|
+
/** Refuses a path whose existing parent is a symbolic link. */
|
|
185
|
+
async assertNoLink(path) {
|
|
186
|
+
const segments = path.split('/');
|
|
187
|
+
for (let depth = 1; depth < segments.length; depth++) {
|
|
188
|
+
const stat = await fs_1.promises.lstat(this.inside(segments.slice(0, depth).join('/'))).catch(() => null);
|
|
189
|
+
if (stat?.isSymbolicLink()) {
|
|
190
|
+
throw this.refusal(`${segments.slice(0, depth).join('/')} is a symbolic link — refusing to write through it`, []);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/** `git diff --name-status -z` → added/modified and deleted paths, sorted. */
|
|
195
|
+
parseNameStatus(output) {
|
|
196
|
+
const parts = output.split('\0').filter((part) => !!part);
|
|
197
|
+
const changed = [];
|
|
198
|
+
const removed = [];
|
|
199
|
+
for (let index = 0; index + 1 < parts.length; index += 2) {
|
|
200
|
+
(parts[index] === 'D' ? removed : changed).push(parts[index + 1]);
|
|
201
|
+
}
|
|
202
|
+
return { changed: changed.sort(), removed: removed.sort() };
|
|
203
|
+
}
|
|
204
|
+
async head(env, log) {
|
|
205
|
+
return (await this.git('head', ['rev-parse', 'HEAD'], env, log)).stdout.trim();
|
|
206
|
+
}
|
|
207
|
+
/** The child environment: no prompt, and the token — if any — as an URL-scoped extra header. */
|
|
208
|
+
gitEnv(credential) {
|
|
209
|
+
const env = { ...process.env, GIT_TERMINAL_PROMPT: '0', GCM_INTERACTIVE: 'never' };
|
|
210
|
+
if (credential.status === 'absent' || credential.status === 'invalid') {
|
|
211
|
+
const detail = credential.status === 'absent'
|
|
212
|
+
? `set ${credential.missingKeys.join(', ')} in the FDP Keystore`
|
|
213
|
+
: credential.problems.join('; ');
|
|
214
|
+
throw new fsm_dynamo_1.DyFM_Error({
|
|
215
|
+
status: 503,
|
|
216
|
+
errorCode: `${global_settings_const_1.DyNTS_global_settings.systemShortCodeName}|DyNTS-GITSYNC-CR0`,
|
|
217
|
+
message: `GitSync credential ${credential.credentialRef} is not usable: ${detail}`,
|
|
218
|
+
userMessage: 'The repository synchronisation is not configured on this server.',
|
|
219
|
+
additionalContent: { credential: credential },
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
if (credential.status === 'configured') {
|
|
223
|
+
const token = String((this.settings.env ?? process.env)[credential.tokenKey]).trim();
|
|
224
|
+
const basic = Buffer.from(`${this.settings.tokenUser ?? 'x-access-token'}:${token}`).toString('base64');
|
|
225
|
+
env.GIT_CONFIG_COUNT = '1';
|
|
226
|
+
env.GIT_CONFIG_KEY_0 = `http.${new URL(this.settings.repoUrl).origin}/.extraHeader`;
|
|
227
|
+
env.GIT_CONFIG_VALUE_0 = `Authorization: Basic ${basic}`;
|
|
228
|
+
this.secrets = [token, basic];
|
|
229
|
+
}
|
|
230
|
+
return env;
|
|
231
|
+
}
|
|
232
|
+
/** Values that must never appear in a log or error text (the token and its header form). */
|
|
233
|
+
secrets = [];
|
|
234
|
+
/** Runs one git command, logs it, and throws a rich, redacted error on failure (unless `allowFailure`). */
|
|
235
|
+
async git(step, args, env, log, allowFailure = false, cwd = this.settings.workdir) {
|
|
236
|
+
const started = Date.now();
|
|
237
|
+
const result = await this.runner([...BASE_CONFIG, ...args], { cwd: cwd, env: env, timeoutMs: this.timeoutMs });
|
|
238
|
+
log.push({
|
|
239
|
+
step: step, command: this.redact(`git ${args.join(' ')}`), exitCode: result.exitCode, ms: Date.now() - started,
|
|
240
|
+
});
|
|
241
|
+
if (result.exitCode && !allowFailure) {
|
|
242
|
+
throw this.failure(step, result, log, 502);
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
failure(step, result, log, status) {
|
|
247
|
+
const output = this.redact(`${result.stderr} ${result.stdout}`.trim()).slice(0, 2000);
|
|
248
|
+
return new fsm_dynamo_1.DyFM_Error({
|
|
249
|
+
status: status,
|
|
250
|
+
errorCode: `${global_settings_const_1.DyNTS_global_settings.systemShortCodeName}|DyNTS-GITSYNC-${status === 409 ? 'RJ0' : 'GT0'}`,
|
|
251
|
+
message: `GitSync ${step} failed (exit ${result.exitCode}) for ${this.redact(this.settings.repoUrl)}`
|
|
252
|
+
+ ` ${this.settings.branch}: ${output}`,
|
|
253
|
+
userMessage: status === 409
|
|
254
|
+
? 'The repository changed during the synchronisation. Please try again.'
|
|
255
|
+
: 'The repository synchronisation failed. Please try again later.',
|
|
256
|
+
additionalContent: { step: step, exitCode: result.exitCode, log: log },
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
refusal(reason, log) {
|
|
260
|
+
return new fsm_dynamo_1.DyFM_Error({
|
|
261
|
+
status: 409,
|
|
262
|
+
errorCode: `${global_settings_const_1.DyNTS_global_settings.systemShortCodeName}|DyNTS-GITSYNC-WD0`,
|
|
263
|
+
message: `GitSync refused: ${reason}`,
|
|
264
|
+
userMessage: 'The repository synchronisation is misconfigured.',
|
|
265
|
+
additionalContent: { log: log },
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
/** The generic secret redaction, plus the literal token values of this sync. */
|
|
269
|
+
redact(text) {
|
|
270
|
+
return this.secrets.reduce((current, secret) => (secret ? current.split(secret).join('[redacted]') : current), secret_redaction_util_1.DyNTS_SecretRedaction_Util.redactText(text));
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
exports.DyNTS_GitSync_Service = DyNTS_GitSync_Service;
|
|
274
|
+
//# sourceMappingURL=git-sync.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-sync.service.js","sourceRoot":"","sources":["../../../src/_modules/git-sync/git-sync.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BFR-OLDLIGHTSITE-003 — `@futdevpro/nts-dynamo/git-sync`: a caller-built file set synchronised into a git repository
|
|
3
|
+
* as ONE pushed commit, with the token from the FDP Keystore (`<credentialRef>_TOKEN`). Needs the `git` binary.
|
|
4
|
+
*/
|
|
5
|
+
export * from './_models/git-sync.interface';
|
|
6
|
+
export * from './git-sync-input.util';
|
|
7
|
+
export * from './git-sync.service';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/git-sync/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
/**
|
|
5
|
+
* BFR-OLDLIGHTSITE-003 — `@futdevpro/nts-dynamo/git-sync`: a caller-built file set synchronised into a git repository
|
|
6
|
+
* as ONE pushed commit, with the token from the FDP Keystore (`<credentialRef>_TOKEN`). Needs the `git` binary.
|
|
7
|
+
*/
|
|
8
|
+
tslib_1.__exportStar(require("./_models/git-sync.interface"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./git-sync-input.util"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./git-sync.service"), exports);
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/git-sync/index.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uEAA6C;AAC7C,gEAAsC;AACtC,6DAAmC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** BFR-OLDLIGHTSITE-002 — the mailbox state a sync decision needs. */
|
|
2
|
+
export interface DyNTS_ImapMailboxStatus_Interface {
|
|
3
|
+
/** UIDVALIDITY as a STRING (it is a bigint on the wire; a string is JSON-safe for storing a cursor). */
|
|
4
|
+
uidValidity: string;
|
|
5
|
+
/** The predicted next UID (every existing message has a smaller one). */
|
|
6
|
+
uidNext: number;
|
|
7
|
+
unseen: number;
|
|
8
|
+
messages: number;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=imap-mailbox-status.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imap-mailbox-status.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/imap/_models/imap-mailbox-status.interface.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,WAAW,iCAAiC;IAChD,wGAAwG;IACxG,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imap-mailbox-status.interface.js","sourceRoot":"","sources":["../../../../src/_modules/imap/_models/imap-mailbox-status.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** BFR-OLDLIGHTSITE-002 — one inbox message, METADATA only (no body, no attachment). */
|
|
2
|
+
export interface DyNTS_ImapMessageMeta_Interface {
|
|
3
|
+
/** The IMAP UID (stable inside one UIDVALIDITY). */
|
|
4
|
+
uid: number;
|
|
5
|
+
/** The `Message-ID` header ('' when missing). */
|
|
6
|
+
messageId: string;
|
|
7
|
+
subject: string;
|
|
8
|
+
/** Sender addresses (`name <address>` or the bare address). */
|
|
9
|
+
from: string[];
|
|
10
|
+
to: string[];
|
|
11
|
+
/** The envelope date, else the server's internal date; `null` when neither parses. */
|
|
12
|
+
date: Date | null;
|
|
13
|
+
/** The `\Seen` flag. */
|
|
14
|
+
seen: boolean;
|
|
15
|
+
/** Size in octets (0 when the server did not report it). */
|
|
16
|
+
size: number;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=imap-message-meta.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imap-message-meta.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/imap/_models/imap-message-meta.interface.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,MAAM,WAAW,+BAA+B;IAC9C,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,sFAAsF;IACtF,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,wBAAwB;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imap-message-meta.interface.js","sourceRoot":"","sources":["../../../../src/_modules/imap/_models/imap-message-meta.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { DyNTS_ImapMessageMeta_Interface } from './imap-message-meta.interface';
|
|
2
|
+
/** BFR-OLDLIGHTSITE-002 — where a sync stopped; the caller stores it and passes it back next time. */
|
|
3
|
+
export interface DyNTS_ImapSyncCursor_Interface {
|
|
4
|
+
uidValidity: string;
|
|
5
|
+
/** The highest UID already delivered (0 = none). */
|
|
6
|
+
lastUid: number;
|
|
7
|
+
}
|
|
8
|
+
/** BFR-OLDLIGHTSITE-002 — one sync step. */
|
|
9
|
+
export interface DyNTS_ImapSyncResult_Interface {
|
|
10
|
+
/** Store this; pass it to the next `syncInbox` call. */
|
|
11
|
+
cursor: DyNTS_ImapSyncCursor_Interface;
|
|
12
|
+
/** New messages since the cursor, ascending by UID. */
|
|
13
|
+
messages: DyNTS_ImapMessageMeta_Interface[];
|
|
14
|
+
/**
|
|
15
|
+
* `true` when the old cursor could not be continued (first sync, or the mailbox's UIDVALIDITY changed — the server
|
|
16
|
+
* renumbered it): the caller must treat `messages` as a fresh start, not as an increment.
|
|
17
|
+
*/
|
|
18
|
+
reset: boolean;
|
|
19
|
+
/** More new messages are waiting (the batch was full) — call again with the returned cursor. */
|
|
20
|
+
hasMore: boolean;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=imap-sync.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imap-sync.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/imap/_models/imap-sync.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAEhF,sGAAsG;AACtG,MAAM,WAAW,8BAA8B;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,4CAA4C;AAC5C,MAAM,WAAW,8BAA8B;IAC7C,wDAAwD;IACxD,MAAM,EAAE,8BAA8B,CAAC;IACvC,uDAAuD;IACvD,QAAQ,EAAE,+BAA+B,EAAE,CAAC;IAC5C;;;OAGG;IACH,KAAK,EAAE,OAAO,CAAC;IACf,gGAAgG;IAChG,OAAO,EAAE,OAAO,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imap-sync.interface.js","sourceRoot":"","sources":["../../../../src/_modules/imap/_models/imap-sync.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { DyNTS_ImapMailboxStatus_Interface } from './imap-mailbox-status.interface';
|
|
2
|
+
import { DyNTS_ImapMessageMeta_Interface } from './imap-message-meta.interface';
|
|
3
|
+
/**
|
|
4
|
+
* BFR-OLDLIGHTSITE-002 — what the inbox service needs from an IMAP connection. The default implementation is
|
|
5
|
+
* `DyNTS_ImapFlow_Transport` (imapflow); a test replaces it with an in-memory fake.
|
|
6
|
+
*/
|
|
7
|
+
export interface DyNTS_ImapTransport_Interface {
|
|
8
|
+
status(mailbox: string): Promise<DyNTS_ImapMailboxStatus_Interface>;
|
|
9
|
+
/**
|
|
10
|
+
* Messages with UID ≥ `fromUid`, ascending, at most `limit`. ⚠️ An implementation may ALSO return the newest message
|
|
11
|
+
* when `fromUid` is beyond the last UID (IMAP `N:*` semantics) — the service filters, the transport need not.
|
|
12
|
+
*/
|
|
13
|
+
fetchMetaFromUid(mailbox: string, fromUid: number, limit: number): Promise<DyNTS_ImapMessageMeta_Interface[]>;
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=imap-transport.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imap-transport.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/imap/_models/imap-transport.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAEhF;;;GAGG;AACH,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iCAAiC,CAAC,CAAC;IACpE;;;OAGG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC,CAAC;IAC9G,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imap-transport.interface.js","sourceRoot":"","sources":["../../../../src/_modules/imap/_models/imap-transport.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { FetchMessageObject, ImapFlow, ImapFlowOptions } from 'imapflow';
|
|
2
|
+
import { DyNTS_EmailAccountResolution_Type } from '../../_collections/email-account.util';
|
|
3
|
+
import { DyNTS_ImapMailboxStatus_Interface } from './_models/imap-mailbox-status.interface';
|
|
4
|
+
import { DyNTS_ImapMessageMeta_Interface } from './_models/imap-message-meta.interface';
|
|
5
|
+
import { DyNTS_ImapTransport_Interface } from './_models/imap-transport.interface';
|
|
6
|
+
/** The part of `ImapFlow` this transport uses (a test passes a fake). */
|
|
7
|
+
export type DyNTS_ImapFlowClient_Type = Pick<ImapFlow, 'connect' | 'logout' | 'status' | 'getMailboxLock' | 'fetch'>;
|
|
8
|
+
/** Builds the client of one connection (the default loads imapflow lazily; a test passes a fake). */
|
|
9
|
+
export type DyNTS_ImapFlowClientFactory_Type = (options: ImapFlowOptions) => Promise<DyNTS_ImapFlowClient_Type>;
|
|
10
|
+
/** Connection settings of one IMAP account. */
|
|
11
|
+
export interface DyNTS_ImapFlowTransport_Settings_Interface {
|
|
12
|
+
host: string;
|
|
13
|
+
port: number;
|
|
14
|
+
user: string;
|
|
15
|
+
pass: string;
|
|
16
|
+
/** Implicit TLS; default: `true` on port 993, else STARTTLS when offered. */
|
|
17
|
+
secure?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* BFR-OLDLIGHTSITE-002 — the default IMAP transport, over `imapflow` (an OPTIONAL peer dependency: only a project that
|
|
21
|
+
* imports `@futdevpro/nts-dynamo/imap` needs it installed).
|
|
22
|
+
*
|
|
23
|
+
* @description One connection per call (connect → lock the mailbox → work → release → logout), so a long-running
|
|
24
|
+
* server never holds a stale IMAP session. imapflow's own logger is OFF: it would print protocol traffic, which can
|
|
25
|
+
* include the login.
|
|
26
|
+
*/
|
|
27
|
+
export declare class DyNTS_ImapFlow_Transport implements DyNTS_ImapTransport_Interface {
|
|
28
|
+
private readonly settings;
|
|
29
|
+
private readonly clientFactory;
|
|
30
|
+
constructor(settings: DyNTS_ImapFlowTransport_Settings_Interface, clientFactory?: DyNTS_ImapFlowClientFactory_Type);
|
|
31
|
+
/** The lazy import of the optional peer (a literal specifier — the `verify:lazy-peers` gate checks it). */
|
|
32
|
+
static importImapFlow: () => Promise<{
|
|
33
|
+
ImapFlow: typeof ImapFlow;
|
|
34
|
+
}>;
|
|
35
|
+
/** A real imapflow client; a missing `imapflow` is a 501 `DyNTS-OPT-MIS` that says what to install. */
|
|
36
|
+
static defaultClientFactory(options: ImapFlowOptions): Promise<DyNTS_ImapFlowClient_Type>;
|
|
37
|
+
/**
|
|
38
|
+
* The transport of a Keystore-referenced account — the SAME key pattern as the SMTP accounts
|
|
39
|
+
* (`<REF>_HOST` / `_PORT` / `_USER` / `_PASS`, see `DyNTS_EmailAccount_Util`). Not configured → `transport: null` and
|
|
40
|
+
* the resolution (key NAMES only).
|
|
41
|
+
*/
|
|
42
|
+
static fromCredentialRef(ref: {
|
|
43
|
+
credentialRef: string;
|
|
44
|
+
env?: NodeJS.ProcessEnv;
|
|
45
|
+
secure?: boolean;
|
|
46
|
+
}): {
|
|
47
|
+
transport: DyNTS_ImapFlow_Transport | null;
|
|
48
|
+
resolution: DyNTS_EmailAccountResolution_Type;
|
|
49
|
+
};
|
|
50
|
+
status(mailbox: string): Promise<DyNTS_ImapMailboxStatus_Interface>;
|
|
51
|
+
fetchMetaFromUid(mailbox: string, fromUid: number, limit: number): Promise<DyNTS_ImapMessageMeta_Interface[]>;
|
|
52
|
+
/** Connections are per call — nothing to close. */
|
|
53
|
+
close(): Promise<void>;
|
|
54
|
+
/** imapflow's message → our metadata (addresses as `name <address>`, the date parsed, `\Seen` → seen). */
|
|
55
|
+
static toMeta(message: FetchMessageObject): DyNTS_ImapMessageMeta_Interface;
|
|
56
|
+
private withClient;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=imap-flow.transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imap-flow.transport.d.ts","sourceRoot":"","sources":["../../../src/_modules/imap/imap-flow.transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAAE,QAAQ,EAAE,eAAe,EAC9C,MAAM,UAAU,CAAC;AAElB,OAAO,EAA2B,iCAAiC,EAAE,MAAM,uCAAuC,CAAC;AAEnH,OAAO,EAAE,iCAAiC,EAAE,MAAM,yCAAyC,CAAC;AAC5F,OAAO,EAAE,+BAA+B,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,yEAAyE;AACzE,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,gBAAgB,GAAG,OAAO,CAAC,CAAC;AAErH,qGAAqG;AACrG,MAAM,MAAM,gCAAgC,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;AAEhH,+CAA+C;AAC/C,MAAM,WAAW,0CAA0C;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,qBAAa,wBAAyB,YAAW,6BAA6B;IAG1E,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa;gBADb,QAAQ,EAAE,0CAA0C,EACpD,aAAa,GAAE,gCAAgF;IAGlH,2GAA2G;IAC3G,MAAM,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,QAAQ,CAAA;KAAE,CAAC,CACA;IAEnE,uGAAuG;WAC1F,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAS/F;;;;OAIG;IACH,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG;QACnG,SAAS,EAAE,wBAAwB,GAAG,IAAI,CAAC;QAC3C,UAAU,EAAE,iCAAiC,CAAC;KAC/C;IAoBK,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iCAAiC,CAAC;IAenE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAwBnH,mDAAmD;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,0GAA0G;IAC1G,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,kBAAkB,GAAG,+BAA+B;YAqB7D,UAAU;CAiBzB"}
|