#!/usr/bin/env node

/// Usage: oe-npm-cache <cache-dir> <type> <key> <file-name>
///    <type> ... meta - metainformation about package
///               tgz  - tarball

const process = require("node:process");

module.paths.unshift("@@libdir@@/node_modules/npm/node_modules");

const cacache = require('cacache')
const fs = require('fs')

// argv[0] is 'node', argv[1] is this script
const cache_dir = process.argv[2]
const type      = process.argv[3]
const key       = process.argv[4]
const file      = process.argv[5]

const data = fs.readFileSync(file)

// metadata content is highly nodejs dependent; when cache entries are not
// found, place debug statements in 'make-fetch-happen/lib/cache/policy.js'
// (CachePolicy::satisfies())
const xlate = {
    'meta': {
	'key_prefix': 'make-fetch-happen:request-cache:',
	'metadata': function() {
	    return {
		time: Date.now(),
		url:  key,
		reqHeaders: {
		    'accept': 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*',
		},
		resHeaders: {
		    "content-type": "application/json",
		    "status": 200,
		},
		options: {
		    compress: true,
		}
	    };
	},
    },

    'tgz': {
	'key_prefix': 'make-fetch-happen:request-cache:',
	'metadata': function() {
	    return {
		time: Date.now(),
		url:  key,
		reqHeaders: {
		    'accept': '*/*',
		},
		resHeaders: {
		    "content-type": "application/octet-stream",
		    "status": 200,
		},
		options: {
		    compress: true,
		},
	    };
	},
    },
};

const info = xlate[type];
let opts = {}

if (info.metadata) {
    opts['metadata'] = info.metadata();
}

cacache.put(cache_dir, info.key_prefix + key, data, opts)
    .then(integrity => {
	console.log(`Saved content of ${key} (${file}).`);
})
