( content: string, decode: Codec<T>['decode'], )
| 102 | * @returns Recovery result with records, errors, and partial tail |
| 103 | */ |
| 104 | export function recoverFromContent<T>( |
| 105 | content: string, |
| 106 | decode: Codec<T>['decode'], |
| 107 | ): RecoverResult<T> { |
| 108 | const lines = content.split('\n'); |
| 109 | const clean = content.endsWith('\n'); |
| 110 | |
| 111 | const out = lines.slice(0, -1).reduce( |
| 112 | (a, l, i) => { |
| 113 | if (!l) { |
| 114 | return a; |
| 115 | } |
| 116 | try { |
| 117 | return { |
| 118 | ...a, |
| 119 | records: [...a.records, decode(l)], |
| 120 | }; |
| 121 | } catch (error) { |
| 122 | return { |
| 123 | ...a, |
| 124 | errors: [ |
| 125 | ...a.errors, |
| 126 | { lineNo: i + 1, line: l, error: error as Error }, |
| 127 | ], |
| 128 | }; |
| 129 | } |
| 130 | }, |
| 131 | { records: [] as T[], errors: [] as RecoverResult<T>['errors'] }, |
| 132 | ); |
| 133 | |
| 134 | const tail = lines.at(-1); |
| 135 | return { |
| 136 | ...out, |
| 137 | partialTail: clean || !tail ? null : tail, |
| 138 | }; |
| 139 | } |
| 140 | |
| 141 | /** |
| 142 | * Write-Ahead Log implementation for crash-safe append-only logging. |
no outgoing calls
no test coverage detected