const acceptPreferred = [topic.contentType, acceptWildcard].filter((x) => x).join(', ');
return Communication._axiosConfig('GET', topic.url, undefined, {}, {
[Enum.Header.Accept]: acceptPreferred,
const acceptPreferred = [topic.contentType, acceptWildcard].filter((x) => x).join(', ');
return Communication._axiosConfig('GET', topic.url, undefined, {}, {
[Enum.Header.Accept]: acceptPreferred,
- this.logger.error(_scope, 'no such topic id', { verification, requestId });
- throw new Errors.InternalInconsistencyError('no such topic id');
+ this.logger.error(_scope, Enum.Message.NoSuchTopicId, { verification, requestId });
+ throw new Errors.InternalInconsistencyError(Enum.Message.NoSuchTopicId);
const topic = await this.db.topicGetById(dbCtx, topicId);
if (topic === undefined) {
const topic = await this.db.topicGetById(dbCtx, topicId);
if (topic === undefined) {
- this.logger.error(_scope, 'no such topic id', logInfoData);
- throw new Errors.InternalInconsistencyError('no such topic id');
+ this.logger.error(_scope, Enum.Message.NoSuchTopicId, logInfoData);
+ throw new Errors.InternalInconsistencyError(Enum.Message.NoSuchTopicId);
+ if (response.status === 304) {
+ this.logger.info(_scope, 'content has not changed, per server', logInfoData);
+ await this.db.topicFetchComplete(dbCtx, topicId);
+ return;
+ }
+
const contentHash = Communication.contentHash(response.data, topic.contentHashAlgorithm);
logInfoData.contentHash = contentHash;
if (topic.contentHash === contentHash) {
const contentHash = Communication.contentHash(response.data, topic.contentHashAlgorithm);
logInfoData.contentHash = contentHash;
if (topic.contentHash === contentHash) {
await this.db.transaction(dbCtx, async (txCtx) => {
await this.db.topicSetContent(txCtx, {
await this.db.transaction(dbCtx, async (txCtx) => {
await this.db.topicSetContent(txCtx, {
content: Buffer.from(response.data),
contentHash,
...(contentType && { contentType }),
content: Buffer.from(response.data),
contentHash,
...(contentType && { contentType }),