@internetarchive/metadata-service 1.0.5 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +16 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/backend/default-metadata-backend.js +1 -7
- package/dist/src/backend/default-metadata-backend.js.map +1 -1
- package/dist/src/responses/metadata-response.d.ts +22 -0
- package/dist/src/responses/metadata-response.js +5 -0
- package/dist/src/responses/metadata-response.js.map +1 -1
- package/dist/test/default-metadata-backend.test.js +2 -2
- package/dist/test/default-metadata-backend.test.js.map +1 -1
- package/dist/test/mock-response-generator.js +11 -0
- package/dist/test/mock-response-generator.js.map +1 -1
- package/dist/test/responses/metadata-response.test.d.ts +1 -0
- package/dist/test/responses/metadata-response.test.js +48 -0
- package/dist/test/responses/metadata-response.test.js.map +1 -0
- package/index.ts +4 -0
- package/package.json +2 -2
- package/src/backend/default-metadata-backend.ts +1 -7
- package/src/responses/metadata-response.ts +34 -0
- package/test/default-metadata-backend.test.ts +2 -2
- package/test/mock-response-generator.ts +11 -0
- package/test/responses/metadata-response.test.ts +55 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"WebFetch(domain:github.com)",
|
|
5
|
+
"Bash(gh api *)",
|
|
6
|
+
"Bash(git -C /Users/jason/Projects/IA/iaux/iaux-metadata-service status)",
|
|
7
|
+
"Bash(git -C /Users/jason/Projects/IA/iaux/iaux-metadata-service log --oneline -10)",
|
|
8
|
+
"Bash(git -C /Users/jason/Projects/IA/iaux/iaux-metadata-service remote -v)",
|
|
9
|
+
"Bash(git *)",
|
|
10
|
+
"Bash(host local.archive.org)",
|
|
11
|
+
"Bash(dig +short local.archive.org)",
|
|
12
|
+
"Bash(mkcert -CAROOT)",
|
|
13
|
+
"WebFetch(domain:archive.org)"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { MetadataResponse } from './src/responses/metadata-response';
|
|
2
|
+
export type { AlternateLocation, AlternateLocations, } from './src/responses/metadata-response';
|
|
2
3
|
export { File, Review, SpeechMusicASREntry, } from '@internetarchive/iaux-item-metadata';
|
|
3
4
|
export { DefaultMetadataBackend } from './src/backend/default-metadata-backend';
|
|
4
5
|
export { MetadataService } from './src/metadata-service';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAMrE,OAAO,EACL,IAAI,EACJ,MAAM,GAEP,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC","sourcesContent":["export { MetadataResponse } from './src/responses/metadata-response';\nexport type {\n AlternateLocation,\n AlternateLocations,\n} from './src/responses/metadata-response';\n\nexport {\n File,\n Review,\n SpeechMusicASREntry,\n} from '@internetarchive/iaux-item-metadata';\n\nexport { DefaultMetadataBackend } from './src/backend/default-metadata-backend';\nexport { MetadataService } from './src/metadata-service';\nexport { MetadataServiceError } from './src/metadata-service-error';\nexport { MetadataServiceInterface } from './src/metadata-service-interface';\n"]}
|
|
@@ -33,13 +33,7 @@ export class DefaultMetadataBackend {
|
|
|
33
33
|
async fetchMetadata(identifier, keypath) {
|
|
34
34
|
const path = keypath ? `/${keypath}` : '';
|
|
35
35
|
const url = `https://${this.baseUrl}/metadata/${identifier}${path}`;
|
|
36
|
-
|
|
37
|
-
// so don't include credentials until that is fixed
|
|
38
|
-
return this.fetchUrl(url, {
|
|
39
|
-
requestOptions: {
|
|
40
|
-
credentials: 'omit',
|
|
41
|
-
},
|
|
42
|
-
});
|
|
36
|
+
return this.fetchUrl(url);
|
|
43
37
|
}
|
|
44
38
|
/**
|
|
45
39
|
* Fires a request to the URL (with this backend's options applied) and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-metadata-backend.js","sourceRoot":"","sources":["../../../src/backend/default-metadata-backend.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAGnC;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAOjC,YAAY,OAIX;;QACC,IAAI,CAAC,OAAO,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,mCAAI,aAAa,CAAC;QAEjD,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,kBAAkB,MAAK,SAAS,EAAE,CAAC;YAC9C,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,0EAA0E;YAC1E,wEAAwE;YACxE,gCAAgC;YAChC,6FAA6F;YAC7F,IAAI,CAAC,kBAAkB;gBACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,sCAAsC,CAAC;oBAClE,IAAI,CAAC;QACT,CAAC;QAED,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,MAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,aAAa,CACjB,UAAkB,EAClB,OAAgB;QAEhB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,WAAW,IAAI,CAAC,OAAO,aAAa,UAAU,GAAG,IAAI,EAAE,CAAC;QACpE,
|
|
1
|
+
{"version":3,"file":"default-metadata-backend.js","sourceRoot":"","sources":["../../../src/backend/default-metadata-backend.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { Result } from '@internetarchive/result-type';\nimport {\n MetadataServiceError,\n MetadataServiceErrorType,\n} from '../metadata-service-error';\nimport { MetadataBackendInterface } from './metadata-backend-interface';\n\n/**\n * The DefaultSearchBackend performs a `window.fetch` request to archive.org\n */\nexport class DefaultMetadataBackend implements MetadataBackendInterface {\n private baseUrl: string;\n\n private includeCredentials: boolean;\n\n private requestScope?: string;\n\n constructor(options?: {\n baseUrl?: string;\n includeCredentials?: boolean;\n scope?: string;\n }) {\n this.baseUrl = options?.baseUrl ?? 'archive.org';\n\n if (options?.includeCredentials !== undefined) {\n this.includeCredentials = options.includeCredentials;\n } else {\n // include credentials if the request is coming from an archive.org domain\n // since credentialed requests are only allowed from archive.org domains\n // due to CORS restrictions, see\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSNotSupportingCredentials\n this.includeCredentials =\n window.location.href.match(/^https?:\\/\\/.*archive\\.org(:[0-9]+)?/) !==\n null;\n }\n\n if (options?.scope !== undefined) {\n this.requestScope = options.scope;\n } else {\n const currentUrl = new URL(window.location.href);\n const scope = currentUrl.searchParams.get('scope');\n if (scope) {\n this.requestScope = scope;\n }\n }\n }\n\n /** @inheritdoc */\n async fetchMetadata(\n identifier: string,\n keypath?: string,\n ): Promise<Result<any, MetadataServiceError>> {\n const path = keypath ? `/${keypath}` : '';\n const url = `https://${this.baseUrl}/metadata/${identifier}${path}`;\n return this.fetchUrl(url);\n }\n\n /**\n * Fires a request to the URL (with this backend's options applied) and\n * asynchronously returns a Result object containing either the raw response\n * JSON or a MetadataServiceError.\n */\n protected async fetchUrl(\n url: string,\n options?: {\n requestOptions?: RequestInit;\n },\n ): Promise<Result<any, MetadataServiceError>> {\n const finalUrl = new URL(url);\n if (this.requestScope) {\n finalUrl.searchParams.set('scope', this.requestScope);\n }\n\n let response: Response;\n // first try the fetch and return a networkError if it fails\n try {\n const fetchOptions = options?.requestOptions ?? {\n credentials: this.includeCredentials ? 'include' : 'same-origin',\n };\n response = await fetch(finalUrl.href, fetchOptions);\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : typeof err === 'string'\n ? err\n : 'Unknown error';\n return this.getErrorResult(\n MetadataServiceErrorType.networkError,\n message,\n );\n }\n\n // then try json decoding and return a decodingError if it fails\n try {\n const json = await response.json();\n // the advanced search endpoint doesn't return an HTTP Error 400\n // and instead returns an HTTP 200 with an `error` key in the payload\n const error = json['error'];\n if (error) {\n const forensics = json['forensics'];\n return this.getErrorResult(\n MetadataServiceErrorType.searchEngineError,\n error,\n forensics,\n );\n } else {\n // success\n return { success: json };\n }\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : typeof err === 'string'\n ? err\n : 'Unknown error';\n return this.getErrorResult(\n MetadataServiceErrorType.decodingError,\n message,\n );\n }\n }\n\n private getErrorResult(\n errorType: MetadataServiceErrorType,\n message?: string,\n details?: any,\n ): Result<any, MetadataServiceError> {\n const error = new MetadataServiceError(errorType, message, details);\n const result = { error };\n return result;\n }\n}\n"]}
|
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
import { File, Metadata, Review, SpeechMusicASREntry } from '@internetarchive/iaux-item-metadata';
|
|
2
|
+
/**
|
|
3
|
+
* A single alternate download location: a server and the directory on it that
|
|
4
|
+
* holds the item's files.
|
|
5
|
+
*/
|
|
6
|
+
export type AlternateLocation = {
|
|
7
|
+
server: string;
|
|
8
|
+
dir: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Alternate download locations for an item, beyond the primary `server`/`dir`.
|
|
12
|
+
* `servers` lists all known mirrors; `workable` is the subset currently
|
|
13
|
+
* reachable for downloads.
|
|
14
|
+
*/
|
|
15
|
+
export type AlternateLocations = {
|
|
16
|
+
servers: AlternateLocation[];
|
|
17
|
+
workable: AlternateLocation[];
|
|
18
|
+
};
|
|
2
19
|
/**
|
|
3
20
|
* The main top-level reponse when fetching Metadata
|
|
4
21
|
*
|
|
@@ -21,5 +38,10 @@ export declare class MetadataResponse {
|
|
|
21
38
|
readonly workable_servers: string[];
|
|
22
39
|
readonly speech_vs_music_asr?: SpeechMusicASREntry[];
|
|
23
40
|
readonly reviews?: Review[];
|
|
41
|
+
readonly alternate_locations?: AlternateLocations;
|
|
42
|
+
readonly clips?: Record<string, unknown>;
|
|
43
|
+
readonly plays?: Record<string, unknown>;
|
|
44
|
+
readonly simplelists?: Record<string, unknown>;
|
|
45
|
+
readonly solo?: boolean;
|
|
24
46
|
constructor(json: Record<string, any>);
|
|
25
47
|
}
|
|
@@ -27,6 +27,11 @@ export class MetadataResponse {
|
|
|
27
27
|
this.reviews = (_b = json.reviews) === null || _b === void 0 ? void 0 : _b.map(
|
|
28
28
|
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
29
29
|
(entry) => new Review(entry));
|
|
30
|
+
this.alternate_locations = json.alternate_locations;
|
|
31
|
+
this.clips = json.clips;
|
|
32
|
+
this.plays = json.plays;
|
|
33
|
+
this.simplelists = json.simplelists;
|
|
34
|
+
this.solo = json.solo;
|
|
30
35
|
}
|
|
31
36
|
}
|
|
32
37
|
//# sourceMappingURL=metadata-response.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-response.js","sourceRoot":"","sources":["../../../src/responses/metadata-response.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,MAAM,GAEP,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata-response.js","sourceRoot":"","sources":["../../../src/responses/metadata-response.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,MAAM,GAEP,MAAM,qCAAqC,CAAC;AAqB7C;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IA0C3B,iEAAiE;IACjE,YAAY,IAAyB;;QACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACpB,iEAAiE;QACjE,IAAI,CAAC,KAAK,GAAG,MAAA,IAAI,CAAC,KAAK,0CAAE,GAAG,CAAC,CAAC,IAAyB,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC9C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,MAAA,IAAI,CAAC,OAAO,0CAAE,GAAG;QAC9B,iEAAiE;QACjE,CAAC,KAA0B,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAClD,CAAC;QACF,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACpD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF","sourcesContent":["import {\n File,\n Metadata,\n Review,\n SpeechMusicASREntry,\n} from '@internetarchive/iaux-item-metadata';\n\n/**\n * A single alternate download location: a server and the directory on it that\n * holds the item's files.\n */\nexport type AlternateLocation = {\n server: string;\n dir: string;\n};\n\n/**\n * Alternate download locations for an item, beyond the primary `server`/`dir`.\n * `servers` lists all known mirrors; `workable` is the subset currently\n * reachable for downloads.\n */\nexport type AlternateLocations = {\n servers: AlternateLocation[];\n workable: AlternateLocation[];\n};\n\n/**\n * The main top-level reponse when fetching Metadata\n *\n * @export\n * @class MetadataResponse\n */\nexport class MetadataResponse {\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n readonly rawResponse: Readonly<Record<string, any>>;\n\n readonly created: number;\n\n readonly d1: string;\n\n readonly d2: string;\n\n readonly dir: string;\n\n readonly files: File[];\n\n readonly files_count: number;\n\n readonly item_last_updated: number;\n\n readonly item_size: number;\n\n readonly metadata: Metadata;\n\n readonly server: string;\n\n readonly uniq: number;\n\n readonly workable_servers: string[];\n\n readonly speech_vs_music_asr?: SpeechMusicASREntry[];\n\n readonly reviews?: Review[];\n\n readonly alternate_locations?: AlternateLocations;\n\n readonly clips?: Record<string, unknown>;\n\n readonly plays?: Record<string, unknown>;\n\n readonly simplelists?: Record<string, unknown>;\n\n readonly solo?: boolean;\n\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n constructor(json: Record<string, any>) {\n this.rawResponse = json;\n this.created = json.created;\n this.d1 = json.d1;\n this.d2 = json.d2;\n this.dir = json.dir;\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n this.files = json.files?.map((file: Record<string, any>) => new File(file));\n this.files_count = json.files_count;\n this.item_last_updated = json.item_last_updated;\n this.item_size = json.item_size;\n this.metadata = new Metadata(json.metadata);\n this.server = json.server;\n this.uniq = json.uniq;\n this.workable_servers = json.workable_servers;\n this.speech_vs_music_asr = json.speech_vs_music_asr;\n this.reviews = json.reviews?.map(\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n (entry: Record<string, any>) => new Review(entry),\n );\n this.alternate_locations = json.alternate_locations;\n this.clips = json.clips;\n this.plays = json.plays;\n this.simplelists = json.simplelists;\n this.solo = json.solo;\n }\n}\n"]}
|
|
@@ -68,7 +68,7 @@ describe('DefaultMetadataBackend', () => {
|
|
|
68
68
|
expect(urlCalled.includes('scope=foo')).to.be.true;
|
|
69
69
|
window.fetch = fetchBackup;
|
|
70
70
|
});
|
|
71
|
-
it('
|
|
71
|
+
it('credentials for metadata endpoint', async () => {
|
|
72
72
|
const fetchBackup = window.fetch;
|
|
73
73
|
let urlCalled;
|
|
74
74
|
let urlConfig;
|
|
@@ -83,7 +83,7 @@ describe('DefaultMetadataBackend', () => {
|
|
|
83
83
|
includeCredentials: true,
|
|
84
84
|
});
|
|
85
85
|
await backend.fetchMetadata('foo');
|
|
86
|
-
expect(urlConfig === null || urlConfig === void 0 ? void 0 : urlConfig.credentials).to.equal('
|
|
86
|
+
expect(urlConfig === null || urlConfig === void 0 ? void 0 : urlConfig.credentials).to.equal('include');
|
|
87
87
|
window.fetch = fetchBackup;
|
|
88
88
|
});
|
|
89
89
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-metadata-backend.test.js","sourceRoot":"","sources":["../../test/default-metadata-backend.test.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;;QAClC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;QACjC,MAAM,CAAC,KAAK,GAAG,GAAsB,EAAE;YACrC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;gBAC3B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,kBAAkB,CAAC,CAAC;gBAClD,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,MAAA,MAAM,CAAC,OAAO,0CAAE,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;;QACrF,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;QACjC,MAAM,CAAC,KAAK,GAAG,GAAsB,EAAE;YACrC,MAAM,eAAe,CAAC;QACxB,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,MAAA,MAAM,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAA,MAAM,CAAC,KAAK,0CAAE,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;;QACpF,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;QACjC,MAAM,CAAC,KAAK,GAAG,GAAsB,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,MAAA,MAAM,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAA,MAAM,CAAC,KAAK,0CAAE,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;;QAC7E,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;QACjC,MAAM,CAAC,KAAK,GAAG,GAAsB,EAAE;YACrC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;YACtC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,MAAA,MAAM,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;QACjC,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,MAAM,CAAC,KAAK,GAAG,CACb,KAAwB,EACxB,IAA8B,EACX,EAAE;YACrB,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;YACtC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,sBAAsB,CAAC;YACzC,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACnD,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"default-metadata-backend.test.js","sourceRoot":"","sources":["../../test/default-metadata-backend.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport { expect } from '@open-wc/testing';\nimport { DefaultMetadataBackend } from '../src/backend/default-metadata-backend';\nimport { MetadataServiceErrorType } from '../src/metadata-service-error';\n\ndescribe('DefaultMetadataBackend', () => {\n it('can fetch metadata', async () => {\n const fetchBackup = window.fetch;\n window.fetch = (): Promise<Response> => {\n return new Promise(resolve => {\n const response = new Response('{ \"foo\": \"bar\" }');\n resolve(response);\n });\n };\n\n const backend = new DefaultMetadataBackend();\n const result = await backend.fetchMetadata('foo');\n expect(result.success?.foo).to.equal('bar');\n window.fetch = fetchBackup;\n });\n\n it('returns a networkError if theres a problem fetching using String type', async () => {\n const fetchBackup = window.fetch;\n window.fetch = (): Promise<Response> => {\n throw 'network error';\n };\n\n const backend = new DefaultMetadataBackend();\n const result = await backend.fetchMetadata('foo');\n expect(result.error?.type).to.equal(MetadataServiceErrorType.networkError);\n expect(result.error?.message).to.equal('network error');\n window.fetch = fetchBackup;\n });\n\n it('returns a networkError if theres a problem fetching using Error type', async () => {\n const fetchBackup = window.fetch;\n window.fetch = (): Promise<Response> => {\n throw new Error('network error');\n };\n\n const backend = new DefaultMetadataBackend();\n const result = await backend.fetchMetadata('foo');\n expect(result.error?.type).to.equal(MetadataServiceErrorType.networkError);\n expect(result.error?.message).to.equal('network error');\n window.fetch = fetchBackup;\n });\n\n it('returns a decodingError if theres a problem decoding the json', async () => {\n const fetchBackup = window.fetch;\n window.fetch = (): Promise<Response> => {\n const response = new Response('boop');\n return new Promise(resolve => resolve(response));\n };\n\n const backend = new DefaultMetadataBackend();\n const result = await backend.fetchMetadata('foo');\n expect(result.error?.type).to.equal(MetadataServiceErrorType.decodingError);\n window.fetch = fetchBackup;\n });\n\n it('appends the scope if provided', async () => {\n const fetchBackup = window.fetch;\n let urlCalled = '';\n window.fetch = (\n input: RequestInfo | URL,\n init?: RequestInit | undefined,\n ): Promise<Response> => {\n urlCalled = input.toString();\n const response = new Response('boop');\n return new Promise(resolve => resolve(response));\n };\n\n const backend = new DefaultMetadataBackend({\n scope: 'foo',\n });\n const result = await backend.fetchMetadata('foo');\n expect(urlCalled.includes('scope=foo')).to.be.true;\n window.fetch = fetchBackup;\n });\n\n it('credentials for metadata endpoint', async () => {\n const fetchBackup = window.fetch;\n let urlCalled: RequestInfo | URL;\n let urlConfig: RequestInit | undefined;\n window.fetch = (\n input: RequestInfo | URL,\n init?: RequestInit | undefined,\n ): Promise<Response> => {\n urlCalled = input;\n urlConfig = init;\n const response = new Response('boop');\n return new Promise(resolve => resolve(response));\n };\n\n const backend = new DefaultMetadataBackend({\n scope: 'foo',\n includeCredentials: true,\n });\n await backend.fetchMetadata('foo');\n expect(urlConfig?.credentials).to.equal('include');\n window.fetch = fetchBackup;\n });\n});\n"]}
|
|
@@ -56,6 +56,17 @@ export class MockResponseGenerator {
|
|
|
56
56
|
server: 'ia800201.us.archive.org',
|
|
57
57
|
uniq: 162444403,
|
|
58
58
|
workable_servers: ['ia800201.us.archive.org', 'ia600201.us.archive.org'],
|
|
59
|
+
alternate_locations: {
|
|
60
|
+
servers: [
|
|
61
|
+
{ server: 'ia800201.us.archive.org', dir: '/27/items/foo' },
|
|
62
|
+
{ server: 'ia600201.us.archive.org', dir: '/27/items/foo' },
|
|
63
|
+
],
|
|
64
|
+
workable: [{ server: 'ia800201.us.archive.org', dir: '/27/items/foo' }],
|
|
65
|
+
},
|
|
66
|
+
clips: { '60|120': [1, 2, 3] },
|
|
67
|
+
plays: {},
|
|
68
|
+
simplelists: {},
|
|
69
|
+
solo: false,
|
|
59
70
|
};
|
|
60
71
|
}
|
|
61
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-response-generator.js","sourceRoot":"","sources":["../../test/mock-response-generator.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,OAAO,qBAAqB;IAChC,4BAA4B,CAAC,UAAkB;QAC7C,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,EAAE,EAAE,yBAAyB;YAC7B,EAAE,EAAE,yBAAyB;YAC7B,GAAG,EAAE,wCAAwC;YAC7C,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE,WAAW;oBACnB,QAAQ,EAAE,SAAS;oBACnB,GAAG,EAAE,kCAAkC;oBACvC,KAAK,EAAE,YAAY;oBACnB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,UAAU;oBACjB,IAAI,EAAE,0CAA0C;iBACjD;gBACD;oBACE,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE,WAAW;oBACnB,QAAQ,EAAE,SAAS;oBACnB,GAAG,EAAE,kCAAkC;oBACvC,KAAK,EAAE,YAAY;oBACnB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,UAAU;oBACjB,IAAI,EAAE,0CAA0C;iBACjD;aACF;YACD,WAAW,EAAE,CAAC;YACd,iBAAiB,EAAE,UAAU;YAC7B,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE;gBACR,OAAO,EACL,gFAAgF;gBAClF,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,wCAAwC;gBAC/C,WAAW,EAAE,wCAAwC;gBACrD,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE,8DAA8D;gBACtE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,eAAe;gBACvB,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,YAAY;gBACrB,UAAU,EAAE,qBAAqB;gBACjC,UAAU;gBACV,QAAQ,EAAE,oBAAoB;gBAC9B,SAAS,EAAE,qBAAqB;gBAChC,UAAU,EAAE,qBAAqB;gBACjC,UAAU,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;gBACrC,eAAe,EAAE,YAAY;aAC9B;YACD,MAAM,EAAE,yBAAyB;YACjC,IAAI,EAAE,SAAS;YACf,gBAAgB,EAAE,CAAC,yBAAyB,EAAE,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"mock-response-generator.js","sourceRoot":"","sources":["../../test/mock-response-generator.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,OAAO,qBAAqB;IAChC,4BAA4B,CAAC,UAAkB;QAC7C,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,EAAE,EAAE,yBAAyB;YAC7B,EAAE,EAAE,yBAAyB;YAC7B,GAAG,EAAE,wCAAwC;YAC7C,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE,WAAW;oBACnB,QAAQ,EAAE,SAAS;oBACnB,GAAG,EAAE,kCAAkC;oBACvC,KAAK,EAAE,YAAY;oBACnB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,UAAU;oBACjB,IAAI,EAAE,0CAA0C;iBACjD;gBACD;oBACE,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE,WAAW;oBACnB,QAAQ,EAAE,SAAS;oBACnB,GAAG,EAAE,kCAAkC;oBACvC,KAAK,EAAE,YAAY;oBACnB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,UAAU;oBACjB,IAAI,EAAE,0CAA0C;iBACjD;aACF;YACD,WAAW,EAAE,CAAC;YACd,iBAAiB,EAAE,UAAU;YAC7B,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE;gBACR,OAAO,EACL,gFAAgF;gBAClF,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,wCAAwC;gBAC/C,WAAW,EAAE,wCAAwC;gBACrD,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE,8DAA8D;gBACtE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,eAAe;gBACvB,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,YAAY;gBACrB,UAAU,EAAE,qBAAqB;gBACjC,UAAU;gBACV,QAAQ,EAAE,oBAAoB;gBAC9B,SAAS,EAAE,qBAAqB;gBAChC,UAAU,EAAE,qBAAqB;gBACjC,UAAU,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC;gBACrC,eAAe,EAAE,YAAY;aAC9B;YACD,MAAM,EAAE,yBAAyB;YACjC,IAAI,EAAE,SAAS;YACf,gBAAgB,EAAE,CAAC,yBAAyB,EAAE,yBAAyB,CAAC;YACxE,mBAAmB,EAAE;gBACnB,OAAO,EAAE;oBACP,EAAE,MAAM,EAAE,yBAAyB,EAAE,GAAG,EAAE,eAAe,EAAE;oBAC3D,EAAE,MAAM,EAAE,yBAAyB,EAAE,GAAG,EAAE,eAAe,EAAE;iBAC5D;gBACD,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC;aACxE;YACD,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;YAC9B,KAAK,EAAE,EAAE;YACT,WAAW,EAAE,EAAE;YACf,IAAI,EAAE,KAAK;SACZ,CAAC;IACJ,CAAC;CACF","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nexport class MockResponseGenerator {\n generateMockMetadataResponse(identifier: string): any {\n return {\n created: 1586477049,\n d1: 'ia600201.us.archive.org',\n d2: 'ia800201.us.archive.org',\n dir: '/27/items/rss-383924main_TWAN_09_04_09',\n files: [\n {\n name: 'foo.jpg',\n source: 'derivative',\n format: 'Thumbnail',\n original: 'foo.mp4',\n md5: '48067b43a547d3e90cb433a04ba84d5d',\n mtime: '1256675427',\n size: '1135',\n crc32: '40870038',\n sha1: '6445c2a6f51c8314c1872ec1f7daf33c5cfabd06',\n },\n {\n name: 'bar.jpg',\n source: 'derivative',\n format: 'Thumbnail',\n original: 'bar.mp4',\n md5: '5bf69912d7b796fe309cde32e61230bc',\n mtime: '1256675429',\n size: '6329',\n crc32: 'ba5f361a',\n sha1: 'cddab0e2daab29978e5efdeff735240a44aa7c80',\n },\n ],\n files_count: 2,\n item_last_updated: 1463797130,\n item_size: 99872691,\n metadata: {\n feed_id:\n '/0/rss_feeds/NASACast_Video/nasacast_video:sts128_landing/NASAcast_vodcast.rss',\n mediatype: 'movies',\n title: \"NASA TV's This Week @NASA, September 4\",\n description: \"NASA TV's This Week @NASA, September 4\",\n creator: 'NASA',\n source: 'http://www.nasa.gov/multimedia/podcasting/twan_09_04_09.html',\n date: '9/4/2009',\n year: '2009',\n rights: 'Public Domain',\n language: 'en-us',\n updater: 'BonnieReal',\n updatedate: '2009-10-27 20:23:01',\n identifier,\n uploader: 'bonnie@archive.org',\n addeddate: '2009-10-27 20:25:55',\n publicdate: '2009-10-27 20:41:27',\n collection: ['nasa', 'nasacastvideo'],\n backup_location: 'ia903604_7',\n },\n server: 'ia800201.us.archive.org',\n uniq: 162444403,\n workable_servers: ['ia800201.us.archive.org', 'ia600201.us.archive.org'],\n alternate_locations: {\n servers: [\n { server: 'ia800201.us.archive.org', dir: '/27/items/foo' },\n { server: 'ia600201.us.archive.org', dir: '/27/items/foo' },\n ],\n workable: [{ server: 'ia800201.us.archive.org', dir: '/27/items/foo' }],\n },\n clips: { '60|120': [1, 2, 3] },\n plays: {},\n simplelists: {},\n solo: false,\n };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { expect } from '@open-wc/testing';
|
|
2
|
+
import { MetadataResponse } from '../../src/responses/metadata-response';
|
|
3
|
+
describe('MetadataResponse', () => {
|
|
4
|
+
it('parses alternate_locations into servers and workable lists', async () => {
|
|
5
|
+
var _a, _b, _c, _d;
|
|
6
|
+
const response = new MetadataResponse({
|
|
7
|
+
metadata: { identifier: 'foo' },
|
|
8
|
+
alternate_locations: {
|
|
9
|
+
servers: [
|
|
10
|
+
{ server: 'ia801234.us.archive.org', dir: '/12/items/foo' },
|
|
11
|
+
{ server: 'ia601234.us.archive.org', dir: '/12/items/foo' },
|
|
12
|
+
],
|
|
13
|
+
workable: [{ server: 'ia801234.us.archive.org', dir: '/12/items/foo' }],
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
expect((_a = response.alternate_locations) === null || _a === void 0 ? void 0 : _a.servers).to.have.lengthOf(2);
|
|
17
|
+
expect((_b = response.alternate_locations) === null || _b === void 0 ? void 0 : _b.servers[0].server).to.equal('ia801234.us.archive.org');
|
|
18
|
+
expect((_c = response.alternate_locations) === null || _c === void 0 ? void 0 : _c.servers[0].dir).to.equal('/12/items/foo');
|
|
19
|
+
expect((_d = response.alternate_locations) === null || _d === void 0 ? void 0 : _d.workable).to.have.lengthOf(1);
|
|
20
|
+
});
|
|
21
|
+
it('exposes the clips, plays, and simplelists maps', async () => {
|
|
22
|
+
const response = new MetadataResponse({
|
|
23
|
+
metadata: { identifier: 'foo' },
|
|
24
|
+
clips: { '60|120': [1, 2, 3] },
|
|
25
|
+
plays: { total: 5 },
|
|
26
|
+
simplelists: {},
|
|
27
|
+
});
|
|
28
|
+
expect(response.clips).to.deep.equal({ '60|120': [1, 2, 3] });
|
|
29
|
+
expect(response.plays).to.deep.equal({ total: 5 });
|
|
30
|
+
expect(response.simplelists).to.deep.equal({});
|
|
31
|
+
});
|
|
32
|
+
it('exposes the solo flag', async () => {
|
|
33
|
+
const response = new MetadataResponse({
|
|
34
|
+
metadata: { identifier: 'foo' },
|
|
35
|
+
solo: true,
|
|
36
|
+
});
|
|
37
|
+
expect(response.solo).to.be.true;
|
|
38
|
+
});
|
|
39
|
+
it('leaves the top-level fields undefined when absent', async () => {
|
|
40
|
+
const response = new MetadataResponse({ metadata: { identifier: 'foo' } });
|
|
41
|
+
expect(response.alternate_locations).to.be.undefined;
|
|
42
|
+
expect(response.clips).to.be.undefined;
|
|
43
|
+
expect(response.plays).to.be.undefined;
|
|
44
|
+
expect(response.simplelists).to.be.undefined;
|
|
45
|
+
expect(response.solo).to.be.undefined;
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=metadata-response.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-response.test.js","sourceRoot":"","sources":["../../../test/responses/metadata-response.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\n\nimport { MetadataResponse } from '../../src/responses/metadata-response';\n\ndescribe('MetadataResponse', () => {\n it('parses alternate_locations into servers and workable lists', async () => {\n const response = new MetadataResponse({\n metadata: { identifier: 'foo' },\n alternate_locations: {\n servers: [\n { server: 'ia801234.us.archive.org', dir: '/12/items/foo' },\n { server: 'ia601234.us.archive.org', dir: '/12/items/foo' },\n ],\n workable: [{ server: 'ia801234.us.archive.org', dir: '/12/items/foo' }],\n },\n });\n expect(response.alternate_locations?.servers).to.have.lengthOf(2);\n expect(response.alternate_locations?.servers[0].server).to.equal(\n 'ia801234.us.archive.org',\n );\n expect(response.alternate_locations?.servers[0].dir).to.equal(\n '/12/items/foo',\n );\n expect(response.alternate_locations?.workable).to.have.lengthOf(1);\n });\n\n it('exposes the clips, plays, and simplelists maps', async () => {\n const response = new MetadataResponse({\n metadata: { identifier: 'foo' },\n clips: { '60|120': [1, 2, 3] },\n plays: { total: 5 },\n simplelists: {},\n });\n expect(response.clips).to.deep.equal({ '60|120': [1, 2, 3] });\n expect(response.plays).to.deep.equal({ total: 5 });\n expect(response.simplelists).to.deep.equal({});\n });\n\n it('exposes the solo flag', async () => {\n const response = new MetadataResponse({\n metadata: { identifier: 'foo' },\n solo: true,\n });\n expect(response.solo).to.be.true;\n });\n\n it('leaves the top-level fields undefined when absent', async () => {\n const response = new MetadataResponse({ metadata: { identifier: 'foo' } });\n expect(response.alternate_locations).to.be.undefined;\n expect(response.clips).to.be.undefined;\n expect(response.plays).to.be.undefined;\n expect(response.simplelists).to.be.undefined;\n expect(response.solo).to.be.undefined;\n });\n});\n"]}
|
package/index.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@internetarchive/metadata-service",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "A service for fetching metadata about items in the Internet Archive",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@internetarchive/field-parsers": "^0.1.4",
|
|
30
|
-
"@internetarchive/iaux-item-metadata": "^1.
|
|
30
|
+
"@internetarchive/iaux-item-metadata": "^1.3.0",
|
|
31
31
|
"@internetarchive/result-type": "^0.0.1",
|
|
32
32
|
"typescript-memoize": "^1.1.1"
|
|
33
33
|
},
|
|
@@ -53,13 +53,7 @@ export class DefaultMetadataBackend implements MetadataBackendInterface {
|
|
|
53
53
|
): Promise<Result<any, MetadataServiceError>> {
|
|
54
54
|
const path = keypath ? `/${keypath}` : '';
|
|
55
55
|
const url = `https://${this.baseUrl}/metadata/${identifier}${path}`;
|
|
56
|
-
|
|
57
|
-
// so don't include credentials until that is fixed
|
|
58
|
-
return this.fetchUrl(url, {
|
|
59
|
-
requestOptions: {
|
|
60
|
-
credentials: 'omit',
|
|
61
|
-
},
|
|
62
|
-
});
|
|
56
|
+
return this.fetchUrl(url);
|
|
63
57
|
}
|
|
64
58
|
|
|
65
59
|
/**
|
|
@@ -5,6 +5,25 @@ import {
|
|
|
5
5
|
SpeechMusicASREntry,
|
|
6
6
|
} from '@internetarchive/iaux-item-metadata';
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* A single alternate download location: a server and the directory on it that
|
|
10
|
+
* holds the item's files.
|
|
11
|
+
*/
|
|
12
|
+
export type AlternateLocation = {
|
|
13
|
+
server: string;
|
|
14
|
+
dir: string;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Alternate download locations for an item, beyond the primary `server`/`dir`.
|
|
19
|
+
* `servers` lists all known mirrors; `workable` is the subset currently
|
|
20
|
+
* reachable for downloads.
|
|
21
|
+
*/
|
|
22
|
+
export type AlternateLocations = {
|
|
23
|
+
servers: AlternateLocation[];
|
|
24
|
+
workable: AlternateLocation[];
|
|
25
|
+
};
|
|
26
|
+
|
|
8
27
|
/**
|
|
9
28
|
* The main top-level reponse when fetching Metadata
|
|
10
29
|
*
|
|
@@ -43,6 +62,16 @@ export class MetadataResponse {
|
|
|
43
62
|
|
|
44
63
|
readonly reviews?: Review[];
|
|
45
64
|
|
|
65
|
+
readonly alternate_locations?: AlternateLocations;
|
|
66
|
+
|
|
67
|
+
readonly clips?: Record<string, unknown>;
|
|
68
|
+
|
|
69
|
+
readonly plays?: Record<string, unknown>;
|
|
70
|
+
|
|
71
|
+
readonly simplelists?: Record<string, unknown>;
|
|
72
|
+
|
|
73
|
+
readonly solo?: boolean;
|
|
74
|
+
|
|
46
75
|
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
47
76
|
constructor(json: Record<string, any>) {
|
|
48
77
|
this.rawResponse = json;
|
|
@@ -64,5 +93,10 @@ export class MetadataResponse {
|
|
|
64
93
|
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
65
94
|
(entry: Record<string, any>) => new Review(entry),
|
|
66
95
|
);
|
|
96
|
+
this.alternate_locations = json.alternate_locations;
|
|
97
|
+
this.clips = json.clips;
|
|
98
|
+
this.plays = json.plays;
|
|
99
|
+
this.simplelists = json.simplelists;
|
|
100
|
+
this.solo = json.solo;
|
|
67
101
|
}
|
|
68
102
|
}
|
|
@@ -79,7 +79,7 @@ describe('DefaultMetadataBackend', () => {
|
|
|
79
79
|
window.fetch = fetchBackup;
|
|
80
80
|
});
|
|
81
81
|
|
|
82
|
-
it('
|
|
82
|
+
it('credentials for metadata endpoint', async () => {
|
|
83
83
|
const fetchBackup = window.fetch;
|
|
84
84
|
let urlCalled: RequestInfo | URL;
|
|
85
85
|
let urlConfig: RequestInit | undefined;
|
|
@@ -98,7 +98,7 @@ describe('DefaultMetadataBackend', () => {
|
|
|
98
98
|
includeCredentials: true,
|
|
99
99
|
});
|
|
100
100
|
await backend.fetchMetadata('foo');
|
|
101
|
-
expect(urlConfig?.credentials).to.equal('
|
|
101
|
+
expect(urlConfig?.credentials).to.equal('include');
|
|
102
102
|
window.fetch = fetchBackup;
|
|
103
103
|
});
|
|
104
104
|
});
|
|
@@ -57,6 +57,17 @@ export class MockResponseGenerator {
|
|
|
57
57
|
server: 'ia800201.us.archive.org',
|
|
58
58
|
uniq: 162444403,
|
|
59
59
|
workable_servers: ['ia800201.us.archive.org', 'ia600201.us.archive.org'],
|
|
60
|
+
alternate_locations: {
|
|
61
|
+
servers: [
|
|
62
|
+
{ server: 'ia800201.us.archive.org', dir: '/27/items/foo' },
|
|
63
|
+
{ server: 'ia600201.us.archive.org', dir: '/27/items/foo' },
|
|
64
|
+
],
|
|
65
|
+
workable: [{ server: 'ia800201.us.archive.org', dir: '/27/items/foo' }],
|
|
66
|
+
},
|
|
67
|
+
clips: { '60|120': [1, 2, 3] },
|
|
68
|
+
plays: {},
|
|
69
|
+
simplelists: {},
|
|
70
|
+
solo: false,
|
|
60
71
|
};
|
|
61
72
|
}
|
|
62
73
|
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { expect } from '@open-wc/testing';
|
|
2
|
+
|
|
3
|
+
import { MetadataResponse } from '../../src/responses/metadata-response';
|
|
4
|
+
|
|
5
|
+
describe('MetadataResponse', () => {
|
|
6
|
+
it('parses alternate_locations into servers and workable lists', async () => {
|
|
7
|
+
const response = new MetadataResponse({
|
|
8
|
+
metadata: { identifier: 'foo' },
|
|
9
|
+
alternate_locations: {
|
|
10
|
+
servers: [
|
|
11
|
+
{ server: 'ia801234.us.archive.org', dir: '/12/items/foo' },
|
|
12
|
+
{ server: 'ia601234.us.archive.org', dir: '/12/items/foo' },
|
|
13
|
+
],
|
|
14
|
+
workable: [{ server: 'ia801234.us.archive.org', dir: '/12/items/foo' }],
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
expect(response.alternate_locations?.servers).to.have.lengthOf(2);
|
|
18
|
+
expect(response.alternate_locations?.servers[0].server).to.equal(
|
|
19
|
+
'ia801234.us.archive.org',
|
|
20
|
+
);
|
|
21
|
+
expect(response.alternate_locations?.servers[0].dir).to.equal(
|
|
22
|
+
'/12/items/foo',
|
|
23
|
+
);
|
|
24
|
+
expect(response.alternate_locations?.workable).to.have.lengthOf(1);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('exposes the clips, plays, and simplelists maps', async () => {
|
|
28
|
+
const response = new MetadataResponse({
|
|
29
|
+
metadata: { identifier: 'foo' },
|
|
30
|
+
clips: { '60|120': [1, 2, 3] },
|
|
31
|
+
plays: { total: 5 },
|
|
32
|
+
simplelists: {},
|
|
33
|
+
});
|
|
34
|
+
expect(response.clips).to.deep.equal({ '60|120': [1, 2, 3] });
|
|
35
|
+
expect(response.plays).to.deep.equal({ total: 5 });
|
|
36
|
+
expect(response.simplelists).to.deep.equal({});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('exposes the solo flag', async () => {
|
|
40
|
+
const response = new MetadataResponse({
|
|
41
|
+
metadata: { identifier: 'foo' },
|
|
42
|
+
solo: true,
|
|
43
|
+
});
|
|
44
|
+
expect(response.solo).to.be.true;
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('leaves the top-level fields undefined when absent', async () => {
|
|
48
|
+
const response = new MetadataResponse({ metadata: { identifier: 'foo' } });
|
|
49
|
+
expect(response.alternate_locations).to.be.undefined;
|
|
50
|
+
expect(response.clips).to.be.undefined;
|
|
51
|
+
expect(response.plays).to.be.undefined;
|
|
52
|
+
expect(response.simplelists).to.be.undefined;
|
|
53
|
+
expect(response.solo).to.be.undefined;
|
|
54
|
+
});
|
|
55
|
+
});
|