I’m trying to get anything to run on the Windows OS after importing IPFS, but I’m stuck on the import statement.
ReferenceError: TextDecoder is not defined
> 1 | const IPFS = require('ipfs');
I’m using Node version v14.16.1. Are there extra requirements to get a working ‘Hello world’ example running in Windows?
1 Like
Hello jinhale! Could you tell me what steps you performed so I may attempt to replicate them? (How did you install Node, how are you running the js?)
I installed a new project, npx create-react-app ipfs-foo --template typescript
, then I installed IPFS in the newly created project, yarn add ipfs
, then I created a new file src\utils.ts
:
const IPFS = require('ipfs');
interface ipfsMemoInterface {
[index:string]: any,
}
const ipfsCreateMemo = {};
export async function createIpfs(props = {}) {
const memo = String(Object.entries(props)) || 'createIpfs';
if (memo in ipfsCreateMemo === false) {
console.log(Object.keys(IPFS)); // This verifies that IPFS is imported correctly
// The error always happens next
ipfsCreateMemo[memo] = await IPFS.create();
}
// never gets to this point
return ipfsCreateMemo[memo];
}
export async function getLatest() {
const ipfs = await createIpfs();
return ipfs.refs.local();
}
and I created src\utils.test.ts
:
import createIpfs from './utils';
test('Test IPFS create method', async () => {
// expect.assertions(1);
const mockCreateIpfs = jest.fn(async () => await createIpfs());
await mockCreateIpfs();
expect(mockCreateIpfs).toHaveReturned();
});
test("Read the latest", async () => {
const mockGetLatest = jest.fn(async () => await getLatest());
await mockGetLatest();
expect(mockGetLatest).toHaveReturned();
});
finally I ran npm test
which runs a script, react-scripts test
, and the result is that the tests fail to even run (0 tests are run out of 2)!
I can replicate this error now using npm version 7.7.6 and node version v12.21.0 on Linux and a very simple setup:
Run npm init
, then yarn add ipfs ipfs-core
and yarn add --dev jest
.
// index.js
const IPFS = require('ipfs-core');
const ipfsMemo = {};
async function getIPFS(options) {
const memo = JSON.stringify(options);
if (memo in ipfsMemo) {
return ipfsMemo;
}
const ipfs = await IPFS.create(options);
ipfsMemo[memo] = ipfs;
return ipfsMemo[memo];
}
async function getLatest() {
const node = await getIPFS();
return await node.refs.local();
}
module.exports = {
getIPFS, getLatest,
};
// index.test.js
const { getLatest, getIPFS, } = require('./index.js');
describe("Test IPFS is configured correctly", () => {
test('itialialize IPFS nodes', async () => {
const node1 = await getIPFS();
const node2 = await getIPFS();
expect(node2).toBeNull();
});
});
Run npm test
.
I’m surprised that the error happens whether I use ipfs
or 'ipfs-core`.
Does this just mean that IPFS is not compatible with NodeJS? Is support just limited to a narrow set of browsers?
I’m testing using jest
in case that wasn’t clear. Is Jest fundamentally incompatible somehow? If that’s the case how could I do unit tests? Do I have to roll my own testing framework?
I get the same error if I try to add a unit test of IPFS like before in the 101 example.
I don’t have any experience with Jest, however a minimal NodeJS example:
npm install ipfs-core
const IPFS = require('ipfs-core')
const fs = require('fs');
async function toIPFS() {
const node = await IPFS.create()
const data = fs.readFileSync('./Icon.png')
const results = await node.add(data)
console.log(results.cid.string)
}
toIPFS();
Run with: node index.js
Icon.png
is just my avatar, it should output the CID (QmcuGJ7ukmuTnVkYrPSc32irpwKpM78p3DSwvQn9J12SX3
) and work without a hitch. Not sure why you’re getting TextDecoder is not defined
.
FWIW: NodeJS v16.0.0, npm 7.11.1.
1 Like
Using Node similar to yours and not Jest, does indeed work. I simply needed to replace require
expressions with import
statements.
Node v 16.0.0 npm v 7.10.0
1 Like
I’m also experiencing this issue when attempting to run jest version 27.0.6 with typescript.
1 Like