Skip to content

Commit df5d393

Browse files
authored
fix(store-sync): skip invalid utf-8 characters in strings before inserting into postgres (#3562)
1 parent 8d0ce55 commit df5d393

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

.changeset/tall-days-doubt.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@latticexyz/store-sync": patch
3+
---
4+
5+
Since Postgres doesn't support `\x00` bytes in strings, the decoded postgres indexer now removes `\x00` bytes from decoded strings.

packages/store-sync/src/postgres-decoded/createStorageAdapter.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { setupTables } from "../postgres/setupTables";
1313
import { getTables } from "./getTables";
1414
import { hexToResource, resourceToLabel } from "@latticexyz/common";
1515
import { GetRpcClientOptions } from "@latticexyz/block-logs-stream";
16+
import { removeNullCharacters } from "./removeNullCharacters";
1617

1718
// Currently assumes one DB per chain ID
1819

@@ -111,13 +112,13 @@ export async function createStorageAdapter({
111112
__keyBytes: keyBytes,
112113
__lastUpdatedBlockNumber: blockNumber,
113114
...key,
114-
...value,
115+
...removeNullCharacters(table.valueSchema, value),
115116
})
116117
.onConflictDoUpdate({
117118
target: sqlTable.__keyBytes,
118119
set: {
119120
__lastUpdatedBlockNumber: blockNumber,
120-
...value,
121+
...removeNullCharacters(table.valueSchema, value),
121122
},
122123
})
123124
.execute();
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { SchemaToPrimitives, ValueSchema } from "@latticexyz/protocol-parser/internal";
2+
3+
export function removeNullCharacters<TSchema extends ValueSchema>(
4+
schema: TSchema,
5+
value: SchemaToPrimitives<TSchema>,
6+
): SchemaToPrimitives<TSchema> {
7+
return Object.fromEntries(
8+
Object.entries(value).map(([key, value]) => [key, schema[key] === "string" ? value.replaceAll("\x00", "") : value]),
9+
) as SchemaToPrimitives<TSchema>;
10+
}

0 commit comments

Comments
 (0)