Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
r2-opds-js
Advanced tools
NodeJS implementation (written in TypeScript) of OPDS functionality for the Readium2 architecture ( https://github.com/readium/architecture/ ).
node --version
and npm --version
)yarn --version
)https://github.com/readium/r2-opds-js
There is no github.io site for this project (no gh-pages branch).
https://www.npmjs.com/package/r2-opds-js
Command line install:
npm install r2-opds-js
OR
yarn add r2-opds-js
...or manually add in your package.json
:
"dependencies": {
"r2-opds-js": "latest"
}
The JavaScript code distributed in the NPM package is usable as-is (no transpilation required), as it is automatically-generated from the TypeScript source.
Several ECMAScript flavours are provided out-of-the-box: ES5, ES6-2015, ES7-2016, ES8-2017:
https://unpkg.com/r2-opds-js/dist/
(alternatively, GitHub mirror with semantic-versioning release tags: https://github.com/edrlab/r2-opds-js-dist/tree/develop/dist/ )
The JavaScript code is not bundled, and it uses require()
statement for imports (NodeJS style).
More information about NodeJS compatibility:
Note that web-browser Javascript is currently not supported (only NodeJS runtimes).
The type definitions (aka "typings") are included as *.d.ts
files in ./node_modules/r2-opds-js/dist/**
, so this package can be used directly in a TypeScript project.
https://david-dm.org/readium/r2-opds-js
A package-lock.json is provided (modern NPM replacement for npm-shrinkwrap.json
).
A yarn.lock file is currently not provided at the root of the source tree.
TODO (unit tests?) https://travis-ci.org/readium/r2-opds-js
Badge: [![Travis](https://travis-ci.org/readium/r2-opds-js.svg?branch=develop)](https://travis-ci.org/readium/r2-opds-js)
NPM package (latest published):
https://unpkg.com/r2-opds-js/dist/gitrev.json
Alternatively, GitHub mirror with semantic-versioning release tags:
https://raw.githack.com/edrlab/r2-opds-js-dist/develop/dist/gitrev.json
Command line steps (NPM, but similar with YARN):
cd r2-opds-js
git status
(please ensure there are no local changes, especially in package-lock.json
and the dependency versions in package.json
)rm -rf node_modules
(to start from a clean slate)npm install
, or alternatively npm ci
(both commands initialize the node_modules
tree of package dependencies, based on the strict package-lock.json
definition)npm run build:all
(invoke the main build script: clean, lint, compile)ls dist
(that's the build output which gets published as NPM package)Due to the "factory" registration pattern in the TA-JSON library dependency (and its corresponding XML fork/adaptation),
the functions initGlobalConverters_GENERIC()
and initGlobalConverters_OPDS()
must be called before invoking the actual OPDS1/2 parsers.
https://github.com/readium/r2-opds-js/blob/develop/src/opds/init-globals.ts
// npm install r2-opds-js
// "@opds" is a dist path alias, for example EcmaScript6/ES2015 'node_modules/r2-opds-js/dist/es6-es2015/src/opds/'
import { initGlobalConverters_GENERIC, initGlobalConverters_OPDS } from "@opds/init-globals";
initGlobalConverters_GENERIC();
initGlobalConverters_OPDS();
The XML (Atom) markup of an OPDS1 "feed" (or "entry") can be loaded/parsed into an in-memory data model.
https://github.com/readium/r2-opds-js/tree/develop/src/opds/opds1
// npm install xmldom
import * as xmldom from "xmldom";
// npm install r2-utils-js
// "@utils" is a dist path alias, for example EcmaScript6/ES2015 'node_modules/r2-utils-js/dist/es6-es2015/src/_utils/'
import { XML } from "@utils/xml-js-mapper";
// npm install r2-opds-js
// "@opds" is a dist path alias, for example EcmaScript6/ES2015 'node_modules/r2-opds-js/dist/es6-es2015/src/opds/'
import { OPDS } from "@opds/opds1/opds";
import { Entry } from "@opds/opds1/opds-entry";
const xmlDom = new xmldom.DOMParser().parseFromString(xmlStr);
if (!xmlDom || !xmlDom.documentElement) {
return;
}
const isEntry = xmlDom.documentElement.localName === "entry";
if (isEntry) {
let opds1Entry = XML.deserialize<Entry>(xmlDom, Entry);
// ...
} else {
let opds1Feed = XML.deserialize<OPDS>(xmlDom, OPDS);
// ...
}
The JSON serialization of an OPDS2 "feed" (or "publication") can be loaded/parsed into an in-memory data model.
https://github.com/readium/r2-opds-js/tree/develop/src/opds/opds2
import { TaJsonDeserialize, TaJsonSerialize } from "@r2-lcp-js/serializable";
// npm install r2-opds-js
// "@opds" is a dist path alias, for example EcmaScript6/ES2015 'node_modules/r2-opds-js/dist/es6-es2015/src/opds/'
import { OPDSFeed } from "@opds/opds2/opds2";
import { OPDSPublication } from "@opds/opds2/opds2-publication";
// feed
var opds2Feed: OPDSFeed;
const opds2Feed_JSON = TaJsonSerialize(opds2Feed);
// ...and the reverse:
opds2Feed = TaJsonDeserialize<OPDSFeed>(opds2Feed_JSON, OPDSFeed);
// publication
var opds2Publication: OPDSPublication;
const opds2Publication_JSON = TaJsonSerialize(opds2Publication);
// ...and the reverse:
opds2Publication = TaJsonDeserialize<OPDSPublication>(opds2Publication_JSON, OPDSPublication);
An OPDS1 "feed" (or "entry") can be converted into an OPDS2 representation.
https://github.com/readium/r2-opds-js/blob/develop/src/opds/converter.ts
// npm install xmldom
import * as xmldom from "xmldom";
// npm install r2-utils-js
// "@utils" is a dist path alias, for example EcmaScript6/ES2015 'node_modules/r2-utils-js/dist/es6-es2015/src/_utils/'
import { XML } from "@utils/xml-js-mapper";
// npm install r2-opds-js
// "@opds" is a dist path alias, for example EcmaScript6/ES2015 'node_modules/r2-opds-js/dist/es6-es2015/src/opds/'
import { OPDS } from "@opds/opds1/opds";
import { Entry } from "@opds/opds1/opds-entry";
import { OPDSFeed } from "@opds/opds2/opds2";
import { OPDSPublication } from "@opds/opds2/opds2-publication";
import { convertOpds1ToOpds2, convertOpds1ToOpds2_EntryToPublication } from "@opds/converter";
const xmlDom = new xmldom.DOMParser().parseFromString(xmlStr);
if (!xmlDom || !xmlDom.documentElement) {
return;
}
const isEntry = xmlDom.documentElement.localName === "entry";
if (isEntry) {
let opds1Entry = XML.deserialize<Entry>(xmlDom, Entry);
let opds2Publication: OPDSPublication = convertOpds1ToOpds2_EntryToPublication(opds1Entry);
// ...
} else {
let opds1Feed = XML.deserialize<OPDS>(xmlDom, OPDS);
var opds2Feed: OPDSFeed = convertOpds1ToOpds2(opds1Feed);
// ...
}
1.0.44
Build environment: NodeJS
20.17.0
, NPM10.8.3
Changes:
Git revision info:
Git commit history:
Git diff:
FAQs
Readium 2 'opds' for NodeJS (TypeScript)
The npm package r2-opds-js receives a total of 535 weekly downloads. As such, r2-opds-js popularity was classified as not popular.
We found that r2-opds-js demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.