Skip to content

Commit 1cc90ac

Browse files
committed
test: confirm re-org bug fix with event replay
1 parent ed5b0c0 commit 1cc90ac

File tree

8 files changed

+554
-251
lines changed

8 files changed

+554
-251
lines changed

src/api/init.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Server, createServer } from 'http';
22
import { Socket } from 'net';
33
import * as express from 'express';
44
import * as expressWinston from 'express-winston';
5+
import * as winston from 'winston';
56
import { v4 as uuid } from 'uuid';
67
import * as cors from 'cors';
78
import { addAsync, ExpressWithAsync } from '@awaitjs/express';
@@ -50,19 +51,20 @@ export interface ApiServer {
5051
terminate: () => Promise<void>;
5152
}
5253

53-
export async function startApiServer({
54-
datastore,
55-
chainId,
56-
httpLogLevel,
57-
}: {
54+
export async function startApiServer(opts: {
5855
datastore: DataStore;
5956
chainId: ChainID;
57+
/** If not specified, this is read from the STACKS_BLOCKCHAIN_API_HOST env var. */
58+
serverHost?: string;
59+
/** If not specified, this is read from the STACKS_BLOCKCHAIN_API_PORT env var. */
60+
serverPort?: number;
6061
httpLogLevel?: LogLevel;
6162
}): Promise<ApiServer> {
62-
const app = addAsync(express());
63+
const { datastore, chainId, serverHost, serverPort, httpLogLevel } = opts;
6364

64-
const apiHost = process.env['STACKS_BLOCKCHAIN_API_HOST'];
65-
const apiPort = parseInt(process.env['STACKS_BLOCKCHAIN_API_PORT'] ?? '');
65+
const app = addAsync(express());
66+
const apiHost = serverHost ?? process.env['STACKS_BLOCKCHAIN_API_HOST'];
67+
const apiPort = serverPort ?? parseInt(process.env['STACKS_BLOCKCHAIN_API_PORT'] ?? '');
6668

6769
if (!apiHost) {
6870
throw new Error(
@@ -214,7 +216,7 @@ export async function startApiServer({
214216

215217
app.use(
216218
expressWinston.errorLogger({
217-
winstonInstance: logger,
219+
winstonInstance: logger as winston.Logger,
218220
metaField: (null as unknown) as string,
219221
blacklistedMetaFields: ['trace', 'os', 'process'],
220222
})

src/datastore/postgres-store.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2865,7 +2865,7 @@ export class PgDataStore
28652865
);
28662866
if (result.rowCount !== 1) {
28672867
const errMsg = `A duplicate transaction was attempted to be inserted into the mempool_txs table: ${tx.tx_id}`;
2868-
logger.error(errMsg);
2868+
logger.warn(errMsg);
28692869
} else {
28702870
updatedTxs.push(tx);
28712871
}

src/event-stream/event-server.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import * as bodyParser from 'body-parser';
66
import { addAsync } from '@awaitjs/express';
77
import PQueue from 'p-queue';
88
import * as expressWinston from 'express-winston';
9+
import * as winston from 'winston';
910

1011
import { hexToBuffer, logError, logger, digestSha512_256, I32_MAX, LogLevel } from '../helpers';
1112
import {
@@ -711,6 +712,11 @@ function createMessageProcessorQueue(): EventMessageHandler {
711712
return handler;
712713
}
713714

715+
export type EventStreamServer = net.Server & {
716+
serverAddress: net.AddressInfo;
717+
closeAsync: () => Promise<void>;
718+
};
719+
714720
export async function startEventServer(opts: {
715721
datastore: DataStore;
716722
chainId: ChainID;
@@ -720,7 +726,7 @@ export async function startEventServer(opts: {
720726
/** If not specified, this is read from the STACKS_CORE_EVENT_PORT env var. */
721727
serverPort?: number;
722728
httpLogLevel?: LogLevel;
723-
}): Promise<net.Server & { closeAsync: () => Promise<void> }> {
729+
}): Promise<EventStreamServer> {
724730
const db = opts.datastore;
725731
const messageHandler = opts.messageHandler ?? createMessageProcessorQueue();
726732

@@ -842,7 +848,7 @@ export async function startEventServer(opts: {
842848

843849
app.use(
844850
expressWinston.errorLogger({
845-
winstonInstance: logger,
851+
winstonInstance: logger as winston.Logger,
846852
metaField: (null as unknown) as string,
847853
blacklistedMetaFields: ['trace', 'os', 'process'],
848854
})
@@ -871,5 +877,9 @@ export async function startEventServer(opts: {
871877
server.close(error => (error ? reject(error) : resolve()));
872878
});
873879
};
874-
return Object.assign(server, { closeAsync: closeFn });
880+
const eventStreamServer: EventStreamServer = Object.assign(server, {
881+
serverAddress: addr as net.AddressInfo,
882+
closeAsync: closeFn,
883+
});
884+
return eventStreamServer;
875885
}

src/helpers.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ import * as btc from 'bitcoinjs-lib';
1111
import * as BN from 'bn.js';
1212
import { ChainID } from '@stacks/transactions';
1313
import BigNumber from 'bignumber.js';
14-
import { NpmConfigSetLevels } from 'winston/lib/winston/config';
14+
import {
15+
CliConfigSetColors,
16+
NpmConfigSetLevels,
17+
SyslogConfigSetLevels,
18+
} from 'winston/lib/winston/config';
1519

1620
export const isDevEnv = process.env.NODE_ENV === 'development';
1721
export const isTestEnv = process.env.NODE_ENV === 'test';
@@ -136,6 +140,11 @@ type OmitIndex<T, I extends string | number> = {
136140
type KnownKeys<T> = keyof OmitIndex<OmitIndex<T, number>, string>;
137141

138142
export type LogLevel = KnownKeys<NpmConfigSetLevels>;
143+
type DisabledLogLevels = Exclude<
144+
KnownKeys<SyslogConfigSetLevels> | KnownKeys<CliConfigSetColors>,
145+
LogLevel
146+
>;
147+
type LoggerInterface = Omit<winston.Logger, DisabledLogLevels> & { level: LogLevel };
139148

140149
export const defaultLogLevel: LogLevel = isDevEnv || isTestEnv ? 'debug' : 'verbose';
141150

@@ -152,7 +161,7 @@ export const logger = winston.createLogger({
152161
handleExceptions: true,
153162
}),
154163
],
155-
});
164+
}) as LoggerInterface;
156165

157166
export function logError(message: string, ...errorData: any[]) {
158167
if (isDevEnv) {

src/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,6 @@ async function handleProgramArgs() {
252252
serverPort: 0,
253253
httpLogLevel: 'debug',
254254
});
255-
const { port: eventServerPort } = eventServer.address() as net.AddressInfo;
256255

257256
const readStream = fs.createReadStream(filePath);
258257
const rawEventsIterator = PgDataStore.getRawEventRequests(readStream, status => {
@@ -267,7 +266,7 @@ async function handleProgramArgs() {
267266
for (const rawEvent of rawEvents) {
268267
await httpPostRequest({
269268
host: '127.0.0.1',
270-
port: eventServerPort,
269+
port: eventServer.serverAddress.port,
271270
path: rawEvent.event_path,
272271
headers: { 'Content-Type': 'application/json' },
273272
body: Buffer.from(rawEvent.payload, 'utf8'),

0 commit comments

Comments
 (0)